diff src/oct-stream.cc @ 4420:3dfdbcaf4582

[project @ 2003-05-28 18:24:42 by jwe]
author jwe
date Wed, 28 May 2003 18:24:42 +0000
parents 1cae4472c624
children 82f8aae8cf20
line wrap: on
line diff
--- a/src/oct-stream.cc	Wed May 28 16:28:06 2003 +0000
+++ b/src/oct-stream.cc	Wed May 28 18:24:42 2003 +0000
@@ -1341,15 +1341,24 @@
 		    { \
 		      max_size *= 2; \
  \
-		      if (nr > 0) \
-			mval.resize (nr, max_size / nr, 0.0); \
-		      else \
+		      if (all_char_conv) \
 			{ \
-			  if (all_char_conv && one_elt_size_spec) \
+			  if (one_elt_size_spec) \
 			    mval.resize (1, max_size, 0.0); \
+			  else if (nr > 0) \
+			    mval.resize (nr, max_size / nr, 0.0); \
 			  else \
-			    mval.resize (max_size, 1, 0.0); \
+			    panic_impossible (); \
 			} \
+		      else if (nr > 0) \
+			{ \
+			  if (nc <= 0) \
+			    mval.resize (nr, max_size / nr, 0.0); \
+			  else \
+			    panic_impossible (); \
+			} \
+		      else \
+			mval.resize (max_size, 1, 0.0); \
  \
 		      data = mval.fortran_vec (); \
 		    } \
@@ -1396,46 +1405,59 @@
 
   if (all_char_conv)
     {
+      // Any of these could be resized later (if we have %s
+      // conversions, we may read more than one element for each
+      // conversion).
+
       if (one_elt_size_spec)
 	{
 	  max_size = 512;
 	  mval.resize (1, max_size, 0.0);
-	  data = mval.fortran_vec ();
 
 	  if (nr > 0)
 	    max_conv = nr;
 	}
-      else if (nr > 0 && nc > 0)
+      else if (nr > 0)
 	{
-	  mval.resize (nr, nc, 0.0);
-	  data = mval.fortran_vec ();
-	  max_size = max_conv = nr * nc;
+	  if (nc > 0)
+	    {
+	      mval.resize (nr, nc, 0.0);
+	      max_size = max_conv = nr * nc;
+	    }
+	  else
+	    {
+	      mval.resize (nr, 32, 0.0);
+	      max_size = nr * 32;
+	    }
 	}
+      else
+	panic_impossible ();
     }
   else if (nr > 0)
     {
       if (nc > 0)
 	{
+	  // Will not resize later.
 	  mval.resize (nr, nc, 0.0);
-	  data = mval.fortran_vec ();
 	  max_size = nr * nc;
-
 	  max_conv = max_size;
 	}
       else
 	{
+	  // Maybe resize later.
 	  mval.resize (nr, 32, 0.0);
-	  data = mval.fortran_vec ();
 	  max_size = nr * 32;
 	}
     }
   else
     {
+      // Maybe resize later.
       mval.resize (32, 1, 0.0);
-      data = mval.fortran_vec ();
       max_size = 32;
     }
 
+  data = mval.fortran_vec ();
+
   if (isp)
     {
       std::istream& is = *isp;
@@ -1469,15 +1491,24 @@
 		{
 		  max_size *= 2;
 
-		  if (nr > 0)
-		    mval.resize (nr, max_size / nr, 0.0);
-		  else
+		  if (all_char_conv)
 		    {
-		      if (all_char_conv && one_elt_size_spec)
+		      if (one_elt_size_spec)
 			mval.resize (1, max_size, 0.0);
+		      else if (nr > 0)
+			mval.resize (nr, max_size / nr, 0.0);
 		      else
-			mval.resize (max_size, 1, 0.0);
+			panic_impossible ();
 		    }
+		  else if (nr > 0)
+		    {
+		      if (nc <= 0)
+			mval.resize (nr, max_size / nr, 0.0);
+		      else
+			panic_impossible ();
+		    }
+		  else
+		    mval.resize (max_size, 1, 0.0);
 
 		  data = mval.fortran_vec ();
 		}