diff src/load-save.cc @ 3136:af7ec9d3a5e6

[project @ 1998-02-01 20:11:06 by jwe]
author jwe
date Sun, 01 Feb 1998 20:11:08 +0000
parents 9c5160c83bd2
children 0d640dc625c7
line wrap: on
line diff
--- a/src/load-save.cc
+++ b/src/load-save.cc
@@ -464,14 +464,19 @@
 
 static char *
 read_ascii_data (istream& is, const string& filename, bool& global,
-		 octave_value& tc)
+		 octave_value& tc, int count)
 {
   // Read name for this entry or break on EOF.
 
   char *name = extract_keyword (is, "name");
 
   if (! name)
-    return 0;
+    {
+      if (count == 0)
+	error ("load: no data found in file `%s'", filename.c_str ());
+
+      return 0;
+    }
 
   if (! *name)
     {
@@ -584,10 +589,10 @@
 	      for (int i = 0; i < elements; i++)
 		{
 		  int len;
-		  if (extract_keyword (is, "length", len) && len > 0)
+		  if (extract_keyword (is, "length", len) && len >= 0)
 		    {
 		      char *tmp = new char [len+1];
-		      if (! is.read (tmp, len))
+		      if (len > 0 && ! is.read (tmp, len))
 			{
 			  error ("load: failed to load string constant");
 			  break;
@@ -1263,6 +1268,7 @@
   bool swap = false;
   int type = 0;
   int prec = 0;
+  int order = 0;
   int mach = 0;
   int dlen = 0;
 
@@ -1277,11 +1283,13 @@
 	return 0;
     }
 
-  type = mopt % 10; // Full, sparse, etc.
-  mopt /= 10;       // Eliminate first digit.
-  prec = mopt % 10; // double, float, int, etc.
-  mopt /= 100;      // Skip unused third digit too.
-  mach = mopt % 10; // IEEE, VAX, etc.
+  type = mopt % 10;  // Full, sparse, etc.
+  mopt /= 10;        // Eliminate first digit.
+  prec = mopt % 10;  // double, float, int, etc.
+  mopt /= 10;        // Eliminate second digit.
+  order = mopt % 10; // Row or column major ordering.
+  mopt /= 10;        // Eliminate third digit.
+  mach = mopt % 10;  // IEEE, VAX, etc.
 
   flt_fmt = mopt_digit_to_float_format (mach);
 
@@ -1316,6 +1324,13 @@
   if (dlen < 0)
     goto data_read_error;
 
+  if (order)
+    {
+      int tmp = nr;
+      nr = nc;
+      nc = tmp;
+    }
+
   re.resize (nr, nc);
 
   read_mat_binary_data (is, re.fortran_vec (), prec, dlen, swap, flt_fmt);
@@ -1344,10 +1359,10 @@
 	for (int i = 0; i < nr; i++)
 	  ctmp (i, j) = Complex (re (i, j), im (i, j));
 
-      tc = ctmp;
+      tc = order ? ctmp.transpose () : ctmp;
     }
   else
-    tc = re;
+    tc = order ? re.transpose () : re;
 
   if (type == 1)
     tc = tc.convert_to_str ();
@@ -1497,7 +1512,7 @@
       switch (format)
 	{
 	case LS_ASCII:
-	  name = read_ascii_data (stream, orig_fname, global, tc);
+	  name = read_ascii_data (stream, orig_fname, global, tc, count);
 	  break;
 
 	case LS_BINARY:
@@ -1529,7 +1544,12 @@
 	{
 	  if (tc.is_defined ())
 	    {
-	      if (argv_idx == argc
+	      if (format == LS_MAT_ASCII && argv_idx < argc)
+		warning ("load: loaded ASCII file `%s' -- ignoring extra args",
+			 orig_fname.c_str());
+
+	      if (format == LS_MAT_ASCII
+		  || argv_idx == argc
 		  || matches_patterns (argv, argv_idx, argc, name))
 		{
 		  count++;