diff src/oct-stream.cc @ 2712:2ff2b536cc9d

[project @ 1997-02-21 21:38:21 by jwe]
author jwe
date Fri, 21 Feb 1997 21:38:21 +0000
parents 3e611118ce15
children 99dd10f4eaaf
line wrap: on
line diff
--- a/src/oct-stream.cc
+++ b/src/oct-stream.cc
@@ -1224,67 +1224,16 @@
 	}
     }
   else
-    invalid_operation ("fscanf", "writing");
-
-  return retval;
-}
-
-template <class T>
-octave_value
-do_oscanf_num_conv (istream& is, const char *fmt, T valptr, bool discard)
-{
-  octave_value retval;
-
-  is.scan (fmt, valptr);
-
-  if (is)
-    {
-      if (! discard)
-	retval = (double) (*valptr);
-    }
-  else
-    error ("fscanf: conversion failed");
+    invalid_operation ("fscanf", "reading");
 
   return retval;
 }
 
-template octave_value
-do_oscanf_num_conv (istream&, const char*, int*, bool);
-
-#if 0
-template octave_value
-do_oscanf_num_conv (istream&, const char*, float*, bool);
-#endif
-
-template octave_value
-do_oscanf_num_conv (istream&, const char*, double*, bool);
-
-static inline octave_value
-do_oscanf_str_conv (istream& is, const char *fmt, char *sptr,
-		    int maxlen, bool discard)
+bool
+octave_base_stream::do_oscanf (const scanf_format_elt *elt,
+			       octave_value& retval)
 {
-  octave_value retval;
-
-  is.scan (fmt, sptr);
-
-  if (is)
-    {
-      if (! discard)
-	{
-	  sptr[maxlen] = '\0';
-	  retval = sptr;
-	}
-    }
-  else
-    error ("fscanf: conversion failed");
-
-  return retval;
-}
-
-octave_value
-octave_base_stream::do_oscanf (const scanf_format_elt *elt)
-{
-  octave_value retval;
+  bool quit = false;
 
   istream *isp = input_stream ();
 
@@ -1306,7 +1255,8 @@
 	      {
 		int dummy;
 
-		is.scan (fmt, &dummy);
+		if (! is.scan (fmt, &dummy))
+		  quit = true;
 	      }
 	      break;
 
@@ -1314,7 +1264,13 @@
 	      {
 		int tmp;
 
-		retval = do_oscanf_num_conv (is, fmt, &tmp, discard);
+		if (is.scan (fmt, &tmp))
+		  {
+		    if (! discard)
+		      retval = (double) tmp;
+		  }
+		else
+		  quit = true;
 	      }
 	      break;
 
@@ -1322,7 +1278,13 @@
 	      {
 		double tmp;
 
-		retval = do_oscanf_num_conv (is, fmt, &tmp, discard);
+		if (is.scan (fmt, &tmp))
+		  {
+		    if (! discard)
+		      retval = tmp;
+		  }
+		else
+		  quit = true;
 	      }
 	      break;
 
@@ -1334,7 +1296,16 @@
 
 		char *tmp = new char[width + 1];
 
-		retval = do_oscanf_str_conv (is, fmt, tmp, width, discard);
+		if (is.scan (fmt, tmp))
+		  {
+		    if (! discard)
+		      {
+			tmp[width] = '\0';
+			retval = tmp;
+		      }
+		  }
+		else
+		  quit = true;
 
 		is.setf (flags);
 
@@ -1349,7 +1320,16 @@
 		int width = elt->width ? elt->width : 65535;
 		char *tmp = new char [width+1];
 
-		retval = do_oscanf_str_conv (is, fmt, tmp, width, discard);
+		if (is.scan (fmt, tmp))
+		  {
+		    if (! discard)
+		      {
+			tmp[width] = '\0';
+			retval = tmp;
+		      }
+		  }
+		else
+		  quit = true;
 
 		delete [] tmp;
 	      }
@@ -1383,7 +1363,7 @@
 	}
     }
 
-  return retval;
+  return quit;
 }
 
 octave_value_list
@@ -1451,30 +1431,44 @@
 
 	    int num_values = 0;
 
+	    bool quit = false;
+
 	    for (int i = 0; i < nconv; i++)
 	      {
-		octave_value tmp = do_oscanf (elt);
-
-		if (tmp.is_defined ())
-		  retval (num_values++) = tmp;
-
-		if (! ok ())
+		octave_value tmp;
+
+		quit = do_oscanf (elt, tmp);
+
+		if (quit)
 		  break;
-
-		elt = fmt_list.next ();
+		else
+		  {
+		    if (tmp.is_defined ())
+		      retval (num_values++) = tmp;
+
+		    if (! ok ())
+		      break;
+		    elt = fmt_list.next ();
+		  }
 	      }
 
 	    retval.resize (num_values);
 
-	    // Pick up any trailing stuff.
-	    if (ok () && len > nconv)
-	      do_oscanf (elt);
+	    if (! quit)
+	      {
+		// Pick up any trailing stuff.
+		if (ok () && len > nconv)
+		  {
+		    octave_value tmp;
+		    do_oscanf (elt, tmp);
+		  }
+	      }
 	  }
 	  break;
 	}
     }
   else
-    invalid_operation ("fscanf", "writing");
+    invalid_operation ("fscanf", "reading");
 
   return retval;
 }