diff src/file-io.cc @ 1086:75fc98220389

[project @ 1995-01-31 04:17:15 by jwe]
author jwe
date Tue, 31 Jan 1995 04:17:15 +0000
parents e34efb49a229
children b2b7c5264ac2
line wrap: on
line diff
--- a/src/file-io.cc
+++ b/src/file-io.cc
@@ -165,7 +165,7 @@
 
       if (! error_state)
 	{
-	  if ((double) NINT (file_num) != file_num)
+	  if (D_NINT (file_num) != file_num)
 	    error ("file number not an integer value");
 	  else
 	    {
@@ -398,6 +398,12 @@
   if (error_state)
     return retval;
 
+  if (xisnan (dlen))
+    {
+      error ("fgets: NaN invalid as length");
+      return retval;
+    }
+
   int length = NINT (dlen);
 
   if ((double) length != dlen)
@@ -620,6 +626,12 @@
   if (error_state)
     return retval;
 
+  if (xisnan (doff))
+    {
+      error ("fseek: NaN invalid as offset");
+      return retval;
+    }
+
   long offset = NINT (doff);
 
   if ((double) offset != doff)
@@ -635,6 +647,12 @@
       if (error_state)
 	return retval;
 
+      if (xisnan (dorig))
+	{
+	  error ("fseek: NaN invalid as origin");
+	  return retval;
+	}
+
       origin = NINT (dorig);
 
       if ((double) dorig != origin)
@@ -774,7 +792,7 @@
 
       double tmp_len = args(fmt_arg_count++).double_value ();
 
-      if (error_state)
+      if (error_state || xisnan (tmp_len))
 	{
 	  error ("%s: `*' must be replaced by an integer", type);
 	  return -1;
@@ -815,7 +833,7 @@
 
       double tmp_len = args(fmt_arg_count++).double_value ();
 
-      if (error_state)
+      if (error_state || xisnan (tmp_len))
 	{
 	  error ("%s: `*' must be replaced by an integer", type);
 	  return -1;
@@ -858,9 +876,12 @@
       {
 	double d = args(fmt_arg_count++).double_value ();
 
+	if (error_state || xisnan (d))
+	  goto invalid_conversion;
+
 	int val = NINT (d);
 
-	if (error_state || (double) val != d)
+	if ((double) val != d)
 	  goto invalid_conversion;
 	else
 	  {
@@ -1618,24 +1639,53 @@
 
       if (xisinf (dnr))
 	{
-	  nc = NINT (dnc);
-	  int n = num_items_remaining (fptr, prec);
-	  nr = n / nc;
-	  if (n > nr * nc)
-	    nr++;
+	  if (xisnan (dnc))
+	    {
+	      error ("fread: NaN invalid as the number of columns");
+	      return retval;
+	    }
+	  else
+	    {
+	      nc = NINT (dnc);
+	      int n = num_items_remaining (fptr, prec);
+	      nr = n / nc;
+	      if (n > nr * nc)
+		nr++;
+	    }
 	}
       else if (xisinf (dnc))
 	{
-	  nr = NINT (dnr);
-	  int n = num_items_remaining (fptr, prec);
-	  nc = n / nr;
-	  if (n > nc * nr)
-	    nc++;
+	  if (xisnan (dnr))
+	    {
+	      error ("fread: NaN invalid as the number of rows");
+	      return retval;
+	    }
+	  else
+	    {
+	      nr = NINT (dnr);
+	      int n = num_items_remaining (fptr, prec);
+	      nc = n / nr;
+	      if (n > nc * nr)
+		nc++;
+	    }
 	}
       else
 	{
-	  nr = NINT (dnr);
-	  nc = NINT (dnc);
+	  if (xisnan (dnr))
+	    {
+	      error ("fread: NaN invalid as the number of rows");
+	      return retval;
+	    }
+	  else
+	    nr = NINT (dnr);
+
+	  if (xisnan (dnc))
+	    {
+	      error ("fread: NaN invalid as the number of columns");
+	      return retval;
+	    }
+	  else
+	    nc = NINT (dnc);
 	}
     }
   else