annotate src/load-save.cc @ 1961:41ff3c38af7e

[project @ 1996-02-16 04:03:01 by jwe]
author jwe
date Fri, 16 Feb 1996 04:04:52 +0000
parents 0e6a0a271998
children 665a44bb6a56
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1 // load-save.cc -*- C++ -*-
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2 /*
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
3
1884
e62277bf5fe0 [project @ 1996-02-05 18:17:59 by jwe]
jwe
parents: 1792
diff changeset
4 Copyright (C) 1996 John W. Eaton
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
5
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
7
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
11 later version.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
12
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
16 for more details.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
17
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
1315
611d403c7f3d [project @ 1995-06-25 19:56:32 by jwe]
jwe
parents: 1312
diff changeset
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
21
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
22 */
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
23
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
1192
b6360f2d4fa6 [project @ 1995-03-30 21:38:35 by jwe]
jwe
parents: 1180
diff changeset
25 #include <config.h>
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
26 #endif
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
27
1343
94bedeb289e5 [project @ 1995-09-04 00:29:21 by jwe]
jwe
parents: 1315
diff changeset
28 #include <cfloat>
94bedeb289e5 [project @ 1995-09-04 00:29:21 by jwe]
jwe
parents: 1315
diff changeset
29 #include <climits>
94bedeb289e5 [project @ 1995-09-04 00:29:21 by jwe]
jwe
parents: 1315
diff changeset
30 #include <cstring>
94bedeb289e5 [project @ 1995-09-04 00:29:21 by jwe]
jwe
parents: 1315
diff changeset
31 #include <cctype>
94bedeb289e5 [project @ 1995-09-04 00:29:21 by jwe]
jwe
parents: 1315
diff changeset
32
1728
42b4f904f1af [project @ 1996-01-09 11:36:01 by jwe]
jwe
parents: 1690
diff changeset
33 #include <string>
42b4f904f1af [project @ 1996-01-09 11:36:01 by jwe]
jwe
parents: 1690
diff changeset
34
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
35 #include <iostream.h>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
36 #include <fstream.h>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
37 #include <strstream.h>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
38
1961
41ff3c38af7e [project @ 1996-02-16 04:03:01 by jwe]
jwe
parents: 1957
diff changeset
39 #include "byte-swap.h"
41ff3c38af7e [project @ 1996-02-16 04:03:01 by jwe]
jwe
parents: 1957
diff changeset
40 #include "data-conv.h"
41ff3c38af7e [project @ 1996-02-16 04:03:01 by jwe]
jwe
parents: 1957
diff changeset
41 #include "float-fmt.h"
1792
e6d79e281f7d [project @ 1996-01-26 02:33:22 by jwe]
jwe
parents: 1755
diff changeset
42 #include "oct-glob.h"
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
43 #include "str-vec.h"
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
44
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
45 #include "defun.h"
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
46 #include "error.h"
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 775
diff changeset
47 #include "gripes.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
48 #include "help.h"
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
49 #include "load-save.h"
1742
a02f140ed897 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents: 1728
diff changeset
50 #include "mappers.h"
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
51 #include "oct-obj.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
52 #include "pager.h"
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
53 #include "pt-exp.h"
1352
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
54 #include "symtab.h"
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
55 #include "sysdep.h"
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
56 #include "unwind-prot.h"
19c10b8657d5 [project @ 1995-09-05 08:11:57 by jwe]
jwe
parents: 1343
diff changeset
57 #include "user-prefs.h"
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
58 #include "utils.h"
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
59
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
60 // Used when converting Inf to something that gnuplot can read.
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
61
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
62 #ifndef OCT_RBV
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
63 #define OCT_RBV DBL_MAX / 100.0
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
64 #endif
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
65
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
66 enum load_save_format
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
67 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
68 LS_ASCII,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
69 LS_BINARY,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
70 LS_MAT_BINARY,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
71 LS_UNKNOWN,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
72 };
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
73
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
74 // Return nonzero if S is a valid identifier.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
75
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
76 static int
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
77 valid_identifier (char *s)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
78 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
79 if (! s || ! (isalnum (*s) || *s == '_'))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
80 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
81
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
82 while (*++s != '\0')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
83 if (! (isalnum (*s) || *s == '_'))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
84 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
85
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
86 return 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
87 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
88
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
89 // Return nonzero if any element of M is not an integer. Also extract
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
90 // the largest and smallest values and return them in MAX_VAL and MIN_VAL.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
91
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
92 static int
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
93 all_parts_int (const Matrix& m, double& max_val, double& min_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
94 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
95 int nr = m.rows ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
96 int nc = m.columns ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
97
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
98 if (nr > 0 && nc > 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
99 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
100 max_val = m.elem (0, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
101 min_val = m.elem (0, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
102 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
103 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
104 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
105
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
106 for (int j = 0; j < nc; j++)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
107 for (int i = 0; i < nr; i++)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
108 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
109 double val = m.elem (i, j);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
110
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
111 if (val > max_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
112 max_val = val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
113
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
114 if (val < min_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
115 min_val = val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
116
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
117 if (D_NINT (val) != val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
118 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
119 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
120 return 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
121 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
122
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
123 // Return nonzero if any element of CM has a non-integer real or
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
124 // imaginary part. Also extract the largest and smallest (real or
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
125 // imaginary) values and return them in MAX_VAL and MIN_VAL.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
126
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
127 static int
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
128 all_parts_int (const ComplexMatrix& m, double& max_val, double& min_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
129 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
130 int nr = m.rows ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
131 int nc = m.columns ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
132
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
133 if (nr > 0 && nc > 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
134 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
135 Complex val = m.elem (0, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
136
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
137 double r_val = real (val);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
138 double i_val = imag (val);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
139
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
140 max_val = r_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
141 min_val = r_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
142
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
143 if (i_val > max_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
144 max_val = i_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
145
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
146 if (i_val < max_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
147 min_val = i_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
148 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
149 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
150 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
151
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
152 for (int j = 0; j < nc; j++)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
153 for (int i = 0; i < nr; i++)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
154 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
155 Complex val = m.elem (i, j);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
156
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
157 double r_val = real (val);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
158 double i_val = imag (val);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
159
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
160 if (r_val > max_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
161 max_val = r_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
162
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
163 if (i_val > max_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
164 max_val = i_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
165
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
166 if (r_val < min_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
167 min_val = r_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
168
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
169 if (i_val < min_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
170 min_val = i_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
171
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
172 if (D_NINT (r_val) != r_val || D_NINT (i_val) != i_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
173 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
174 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
175 return 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
176 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
177
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
178 static int
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
179 too_large_for_float (const Matrix& m)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
180 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
181 int nr = m.rows ();
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
182 int nc = m.columns ();
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
183
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
184 for (int j = 0; j < nc; j++)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
185 for (int i = 0; i < nr; i++)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
186 {
1312
3a02b029b618 [project @ 1995-06-25 05:28:49 by jwe]
jwe
parents: 1311
diff changeset
187 double val = m.elem (i, j);
3a02b029b618 [project @ 1995-06-25 05:28:49 by jwe]
jwe
parents: 1311
diff changeset
188
3a02b029b618 [project @ 1995-06-25 05:28:49 by jwe]
jwe
parents: 1311
diff changeset
189 if (val > FLT_MAX || val < FLT_MIN)
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
190 return 1;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
191 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
192
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
193 return 0;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
194 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
195
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
196 static int
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
197 too_large_for_float (const ComplexMatrix& m)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
198 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
199 int nr = m.rows ();
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
200 int nc = m.columns ();
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
201
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
202 for (int j = 0; j < nc; j++)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
203 for (int i = 0; i < nr; i++)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
204 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
205 Complex val = m.elem (i, j);
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
206
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
207 double r_val = real (val);
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
208 double i_val = imag (val);
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
209
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
210 if (r_val > FLT_MAX
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
211 || i_val > FLT_MAX
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
212 || r_val < FLT_MIN
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
213 || i_val < FLT_MIN)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
214 return 1;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
215 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
216
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
217 return 0;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
218 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
219
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
220 // XXX FIXME XXX -- shouldn't this be implemented in terms of other
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
221 // functions that are already available?
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
222
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
223 // Install a variable with name NAME and the value specified TC in the
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
224 // symbol table. If FORCE is nonzero, replace any existing definition
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
225 // for NAME. If GLOBAL is nonzero, make the variable global.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
226 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
227 // Assumes TC is defined.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
228
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
229 static void
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
230 install_loaded_variable (int force, char *name, const tree_constant& tc,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
231 int global, char *doc)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
232 {
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
233 // Is there already a symbol by this name? If so, what is it?
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
234
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
235 symbol_record *lsr = curr_sym_tab->lookup (name, 0, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
236
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
237 int is_undefined = 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
238 int is_variable = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
239 int is_function = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
240 int is_global = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
241
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
242 if (lsr)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
243 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
244 is_undefined = ! lsr->is_defined ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
245 is_variable = lsr->is_variable ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
246 is_function = lsr->is_function ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
247 is_global = lsr->is_linked_to_global ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
248 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
249
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
250 symbol_record *sr = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
251
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
252 if (global)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
253 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
254 if (is_global || is_undefined)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
255 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
256 if (force || is_undefined)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
257 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
258 lsr = curr_sym_tab->lookup (name, 1, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
259 link_to_global_variable (lsr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
260 sr = lsr;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
261 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
262 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
263 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
264 warning ("load: global variable name `%s' exists.", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
265 warning ("use `load -force' to overwrite");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
266 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
267 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
268 else if (is_function)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
269 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
270 if (force)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
271 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
272 lsr = curr_sym_tab->lookup (name, 1, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
273 link_to_global_variable (lsr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
274 sr = lsr;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
275 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
276 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
277 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
278 warning ("load: `%s' is currently a function in this scope", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
279 warning ("`load -force' will load variable and hide function");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
280 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
281 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
282 else if (is_variable)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
283 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
284 if (force)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
285 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
286 lsr = curr_sym_tab->lookup (name, 1, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
287 link_to_global_variable (lsr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
288 sr = lsr;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
289 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
290 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
291 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
292 warning ("load: local variable name `%s' exists.", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
293 warning ("use `load -force' to overwrite");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
294 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
295 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
296 else
774
9541a1fe575c [project @ 1994-10-05 22:35:46 by jwe]
jwe
parents: 767
diff changeset
297 error ("load: unable to load data for unknown symbol type");
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
298 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
299 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
300 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
301 if (is_global)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
302 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
303 if (force || is_undefined)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
304 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
305 lsr = curr_sym_tab->lookup (name, 1, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
306 link_to_global_variable (lsr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
307 sr = lsr;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
308 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
309 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
310 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
311 warning ("load: global variable name `%s' exists.", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
312 warning ("use `load -force' to overwrite");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
313 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
314 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
315 else if (is_function)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
316 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
317 if (force)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
318 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
319 lsr = curr_sym_tab->lookup (name, 1, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
320 link_to_global_variable (lsr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
321 sr = lsr;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
322 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
323 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
324 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
325 warning ("load: `%s' is currently a function in this scope", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
326 warning ("`load -force' will load variable and hide function");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
327 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
328 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
329 else if (is_variable || is_undefined)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
330 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
331 if (force || is_undefined)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
332 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
333 lsr = curr_sym_tab->lookup (name, 1, 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
334 sr = lsr;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
335 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
336 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
337 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
338 warning ("load: local variable name `%s' exists.", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
339 warning ("use `load -force' to overwrite");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
340 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
341 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
342 else
774
9541a1fe575c [project @ 1994-10-05 22:35:46 by jwe]
jwe
parents: 767
diff changeset
343 error ("load: unable to load data for unknown symbol type");
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
344 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
345
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
346 if (sr)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
347 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
348 tree_constant *tmp_tc = new tree_constant (tc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
349 sr->define (tmp_tc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
350 if (doc)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
351 sr->document (doc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
352 return;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
353 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
354 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
355 error ("load: unable to load variable `%s'", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
356
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
357 return;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
358 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
359
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
360 // Functions for reading ascii data.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
361
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
362 // Skip white space and comments on stream IS.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
363
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
364 static void
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
365 skip_comments (istream& is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
366 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
367 char c = '\0';
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
368 while (is.get (c))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
369 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
370 if (c == ' ' || c == '\t' || c == '\n')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
371 ; // Skip whitespace on way to beginning of next line.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
372 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
373 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
374 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
375
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
376 for (;;)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
377 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
378 if (is && c == '#')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
379 while (is.get (c) && c != '\n')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
380 ; // Skip to beginning of next line, ignoring everything.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
381 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
382 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
383 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
384 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
385
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
386 // Extract a KEYWORD and its value from stream IS, returning the
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
387 // associated value in a new string.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
388 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
389 // Input should look something like:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
390 //
918
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
391 // #[ \t]*keyword[ \t]*:[ \t]*string-value[ \t]*\n
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
392
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
393 static char *
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
394 extract_keyword (istream& is, char *keyword)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
395 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
396 ostrstream buf;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
397
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
398 char *retval = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
399
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
400 char c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
401 while (is.get (c))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
402 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
403 if (c == '#')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
404 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
405 while (is.get (c) && (c == ' ' || c == '\t' || c == '#'))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
406 ; // Skip whitespace and comment characters.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
407
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
408 if (isalpha (c))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
409 buf << c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
410
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
411 while (is.get (c) && isalpha (c))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
412 buf << c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
413
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
414 buf << ends;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
415 char *tmp = buf.str ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
416 int match = (strncmp (tmp, keyword, strlen (keyword)) == 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
417 delete [] tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
418
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
419 if (match)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
420 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
421 ostrstream value;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
422 while (is.get (c) && (c == ' ' || c == '\t' || c == ':'))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
423 ; // Skip whitespace and the colon.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
424
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
425 if (c != '\n')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
426 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
427 value << c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
428 while (is.get (c) && c != '\n')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
429 value << c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
430 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
431 value << ends;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
432 retval = value.str ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
433 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
434 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
435 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
436 }
918
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
437
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
438 if (retval)
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
439 {
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
440 int len = strlen (retval);
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
441 if (len > 0)
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
442 {
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
443 char *ptr = retval + len - 1;
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
444 while (*ptr == ' ' || *ptr == '\t')
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
445 ptr--;
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
446 *(ptr+1) = '\0';
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
447 }
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
448 }
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
449
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
450 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
451 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
452
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
453 // Match KEYWORD on stream IS, placing the associated value in VALUE,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
454 // returning 1 if successful and 0 otherwise.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
455 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
456 // Input should look something like:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
457 //
918
1ba7f3818e4b [project @ 1994-11-11 20:17:27 by jwe]
jwe
parents: 911
diff changeset
458 // [ \t]*keyword[ \t]*int-value.*\n
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
459
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
460 static int
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
461 extract_keyword (istream& is, char *keyword, int& value)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
462 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
463 ostrstream buf;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
464
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
465 int status = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
466 value = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
467
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
468 char c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
469 while (is.get (c))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
470 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
471 if (c == '#')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
472 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
473 while (is.get (c) && (c == ' ' || c == '\t' || c == '#'))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
474 ; // Skip whitespace and comment characters.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
475
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
476 if (isalpha (c))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
477 buf << c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
478
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
479 while (is.get (c) && isalpha (c))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
480 buf << c;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
481
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
482 buf << ends;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
483 char *tmp = buf.str ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
484 int match = (strncmp (tmp, keyword, strlen (keyword)) == 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
485 delete [] tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
486
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
487 if (match)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
488 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
489 while (is.get (c) && (c == ' ' || c == '\t' || c == ':'))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
490 ; // Skip whitespace and the colon.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
491
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
492 is.putback (c);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
493 if (c != '\n')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
494 is >> value;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
495 if (is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
496 status = 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
497 while (is.get (c) && c != '\n')
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
498 ; // Skip to beginning of next line;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
499 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
500 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
501 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
502 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
503 return status;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
504 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
505
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
506 // Extract one value (scalar, matrix, string, etc.) from stream IS and
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
507 // place it in TC, returning the name of the variable. If the value
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
508 // is tagged as global in the file, return nonzero in GLOBAL.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
509 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
510 // FILENAME is used for error messages.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
511 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
512 // The data is expected to be in the following format:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
513 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
514 // The input file must have a header followed by some data.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
515 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
516 // All lines in the header must begin with a `#' character.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
517 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
518 // The header must contain a list of keyword and value pairs with the
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
519 // keyword and value separated by a colon.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
520 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
521 // Keywords must appear in the following order:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
522 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
523 // # name: <name>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
524 // # type: <type>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
525 // # <info>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
526 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
527 // Where:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
528 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
529 // <name> : a valid identifier
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
530 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
531 // <type> : <typename>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
532 // | global <typename>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
533 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
534 // <typename> : scalar
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
535 // | complex scalar
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
536 // | matrix
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
537 // | complex matrix
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
538 // | string
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
539 // | range
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
540 // | string array
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
541 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
542 // <info> : <matrix info>
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
543 // | <string info>
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
544 // | <string array info>
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
545 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
546 // <matrix info> : # rows: <integer>
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
547 // : # columns: <integer>
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
548 //
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
549 // <string info> : # length: <integer>
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
550 //
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
551 // <string array info> : # elements: <integer>
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
552 // : # length: <integer> (once before each string)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
553 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
554 // Formatted ASCII data follows the header.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
555 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
556 // Example:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
557 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
558 // # name: foo
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
559 // # type: matrix
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
560 // # rows: 2
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
561 // # columns: 2
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
562 // 2 4
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
563 // 1 3
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
564 //
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
565 // Example:
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
566 //
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
567 // # name: foo
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
568 // # type: string array
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
569 // # elements: 5
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
570 // # length: 4
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
571 // this
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
572 // # length: 2
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
573 // is
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
574 // # length: 1
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
575 // a
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
576 // # length: 6
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
577 // string
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
578 // # length: 5
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
579 // array
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
580 //
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
581 // XXX FIXME XXX -- this format is fairly rigid, and doesn't allow for
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
582 // arbitrary comments, etc. Someone should fix that.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
583
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
584 static char *
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
585 read_ascii_data (istream& is, const string& filename, int& global,
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
586 tree_constant& tc)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
587 {
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
588 // Read name for this entry or break on EOF.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
589
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
590 char *name = extract_keyword (is, "name");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
591
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
592 if (! name)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
593 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
594
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
595 if (! *name)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
596 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
597 error ("load: empty name keyword found in file `%s'",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
598 filename.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
599 delete [] name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
600 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
601 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
602
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
603
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
604 if (! valid_identifier (name))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
605 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
606 error ("load: bogus identifier `%s' found in file `%s'", name,
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
607 filename.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
608 delete [] name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
609 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
610 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
611
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
612 // Look for type keyword.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
613
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
614 char *tag = extract_keyword (is, "type");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
615
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
616 if (tag && *tag)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
617 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
618 char *ptr = strchr (tag, ' ');
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
619 if (ptr)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
620 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
621 *ptr = '\0';
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
622 global = (strncmp (tag, "global", 6) == 0);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
623 *ptr = ' ';
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
624 if (global)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
625 ptr++;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
626 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
627 ptr = tag;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
628 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
629 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
630 ptr = tag;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
631
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
632 if (strncmp (ptr, "scalar", 6) == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
633 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
634 double tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
635 is >> tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
636 if (is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
637 tc = tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
638 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
639 error ("load: failed to load scalar constant");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
640 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
641 else if (strncmp (ptr, "matrix", 6) == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
642 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
643 int nr = 0, nc = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
644
1275
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
645 if (extract_keyword (is, "rows", nr) && nr >= 0
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
646 && extract_keyword (is, "columns", nc) && nc >= 0)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
647 {
1275
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
648 if (nr > 0 && nc > 0)
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
649 {
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
650 Matrix tmp (nr, nc);
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
651 is >> tmp;
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
652 if (is)
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
653 tc = tmp;
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
654 else
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
655 error ("load: failed to load matrix constant");
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
656 }
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
657 else if (nr == 0 || nc == 0)
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
658 tc = Matrix (nr, nc);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
659 else
1275
d607adf5af66 [project @ 1995-04-21 19:59:03 by jwe]
jwe
parents: 1226
diff changeset
660 panic_impossible ();
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
661 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
662 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
663 error ("load: failed to extract number of rows and columns");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
664 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
665 else if (strncmp (ptr, "complex scalar", 14) == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
666 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
667 Complex tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
668 is >> tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
669 if (is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
670 tc = tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
671 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
672 error ("load: failed to load complex scalar constant");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
673 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
674 else if (strncmp (ptr, "complex matrix", 14) == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
675 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
676 int nr = 0, nc = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
677
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
678 if (extract_keyword (is, "rows", nr) && nr > 0
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
679 && extract_keyword (is, "columns", nc) && nc > 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
680 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
681 ComplexMatrix tmp (nr, nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
682 is >> tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
683 if (is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
684 tc = tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
685 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
686 error ("load: failed to load complex matrix constant");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
687 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
688 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
689 error ("load: failed to extract number of rows and columns");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
690 }
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
691 else if (strncmp (ptr, "string array", 12) == 0)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
692 {
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
693 int elements;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
694 if (extract_keyword (is, "elements", elements) && elements > 0)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
695 {
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
696 // XXX FIXME XXX -- need to be able to get max length
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
697 // before doing anything.
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
698
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
699 charMatrix chm (elements, 0);
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
700 int max_len = 0;
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
701 for (int i = 0; i < elements; i++)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
702 {
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
703 int len;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
704 if (extract_keyword (is, "length", len) && len > 0)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
705 {
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
706 char *tmp = new char [len];
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
707 if (! is.read (tmp, len))
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
708 {
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
709 error ("load: failed to load string constant");
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
710 break;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
711 }
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
712 else
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
713 {
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
714 if (len > max_len)
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
715 {
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
716 max_len = len;
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
717 chm.resize (elements, max_len, 0);
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
718 }
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
719 chm.insert (tmp, i, 0);
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
720 }
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
721 delete [] tmp;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
722 }
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
723 else
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
724 error ("load: failed to extract string length for element %d", i+1);
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
725 }
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
726
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
727 if (! error_state)
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
728 tc = chm;
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
729 }
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
730 else
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
731 error ("load: failed to extract number of string elements");
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
732 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
733 else if (strncmp (ptr, "string", 6) == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
734 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
735 int len;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
736 if (extract_keyword (is, "length", len) && len > 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
737 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
738 char *tmp = new char [len+1];
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
739 is.get (tmp, len+1, EOF);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
740 if (is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
741 tc = tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
742 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
743 error ("load: failed to load string constant");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
744 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
745 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
746 error ("load: failed to extract string length");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
747 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
748 else if (strncmp (ptr, "range", 5) == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
749 {
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
750 // # base, limit, range comment added by save().
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
751
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
752 skip_comments (is);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
753 Range tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
754 is >> tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
755 if (is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
756 tc = tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
757 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
758 error ("load: failed to load range constant");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
759 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
760 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
761 error ("load: unknown constant type `%s'", tag);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
762 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
763 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
764 error ("load: failed to extract keyword specifying value type");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
765
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
766 delete [] tag;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
767
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
768 if (error_state)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
769 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
770 error ("load: reading file %s", filename.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
771 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
772 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
773
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
774 return name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
775 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
776
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
777 // Extract one value (scalar, matrix, string, etc.) from stream IS and
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
778 // place it in TC, returning the name of the variable. If the value
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
779 // is tagged as global in the file, return nonzero in GLOBAL. If SWAP
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
780 // is nonzero, swap bytes after reading.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
781 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
782 // The data is expected to be in the following format:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
783 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
784 // Header (one per file):
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
785 // =====================
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
786 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
787 // object type bytes
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
788 // ------ ---- -----
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
789 // magic number string 10
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
790 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
791 // float format integer 1
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
792 //
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
793 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
794 // Data (one set for each item):
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
795 // ============================
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
796 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
797 // object type bytes
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
798 // ------ ---- -----
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
799 // name_length integer 4
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
800 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
801 // name string name_length
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
802 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
803 // doc_length integer 4
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
804 //
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
805 // doc string doc_length
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
806 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
807 // global flag integer 1
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
808 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
809 // data type integer 1
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
810 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
811 // data (one of):
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
812 //
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
813 // scalar:
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
814 // data real 8
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
815 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
816 // complex scalar:
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
817 // data complex 16
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
818 //
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
819 // matrix:
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
820 // rows integer 4
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
821 // columns integer 4
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
822 // data real r*c*8
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
823 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
824 // complex matrix:
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
825 // rows integer 4
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
826 // columns integer 4
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
827 // data complex r*c*16
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
828 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
829 // string:
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
830 // length int 4
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
831 // data string length
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
832 //
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
833 // range:
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
834 // base real 8
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
835 // limit real 8
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
836 // increment real 8
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
837 //
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
838 // string array
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
839 // elements int 4
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
840 //
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
841 // for each element:
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
842 // length int 4
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
843 // data string length
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
844 //
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
845 // FILENAME is used for error messages.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
846
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
847 static char *
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
848 read_binary_data (istream& is, int swap, floating_point_format fmt,
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
849 const string& filename, int& global,
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
850 tree_constant& tc, char *&doc)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
851 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
852 char tmp = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
853
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
854 FOUR_BYTE_INT name_len = 0, doc_len = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
855 char *name = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
856
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
857 doc = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
858
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
859 // We expect to fail here, at the beginning of a record, so not
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
860 // being able to read another name should not result in an error.
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
861
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
862 is.read (&name_len, 4);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
863 if (! is)
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
864 return 0;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
865 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
866 swap_4_bytes ((char *) &name_len);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
867
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
868 name = new char [name_len+1];
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
869 name[name_len] = '\0';
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
870 if (! is.read (name, name_len))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
871 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
872
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
873 is.read (&doc_len, 4);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
874 if (! is)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
875 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
876 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
877 swap_4_bytes ((char *) &doc_len);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
878
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
879 doc = new char [doc_len+1];
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
880 doc[doc_len] = '\0';
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
881 if (! is.read (doc, doc_len))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
882 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
883
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
884 if (! is.read (&tmp, 1))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
885 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
886 global = tmp ? 1 : 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
887
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
888 tmp = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
889 if (! is.read (&tmp, 1))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
890 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
891
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
892 switch (tmp)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
893 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
894 case 1:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
895 {
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
896 if (! is.read (&tmp, 1))
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
897 goto data_read_error;
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
898 double dtmp;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
899 read_doubles (is, &dtmp, (save_type) tmp, 1, swap, fmt);
774
9541a1fe575c [project @ 1994-10-05 22:35:46 by jwe]
jwe
parents: 767
diff changeset
900 if (error_state || ! is)
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
901 goto data_read_error;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
902 tc = dtmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
903 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
904 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
905
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
906 case 2:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
907 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
908 FOUR_BYTE_INT nr, nc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
909 if (! is.read (&nr, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
910 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
911 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
912 swap_4_bytes ((char *) &nr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
913 if (! is.read (&nc, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
914 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
915 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
916 swap_4_bytes ((char *) &nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
917 if (! is.read (&tmp, 1))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
918 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
919 Matrix m (nr, nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
920 double *re = m.fortran_vec ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
921 int len = nr * nc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
922 read_doubles (is, re, (save_type) tmp, len, swap, fmt);
774
9541a1fe575c [project @ 1994-10-05 22:35:46 by jwe]
jwe
parents: 767
diff changeset
923 if (error_state || ! is)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
924 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
925 tc = m;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
926 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
927 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
928
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
929 case 3:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
930 {
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
931 if (! is.read (&tmp, 1))
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
932 goto data_read_error;
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
933 Complex ctmp;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
934 read_doubles (is, (double *) &ctmp, (save_type) tmp, 2, swap, fmt);
774
9541a1fe575c [project @ 1994-10-05 22:35:46 by jwe]
jwe
parents: 767
diff changeset
935 if (error_state || ! is)
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
936 goto data_read_error;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
937 tc = ctmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
938 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
939 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
940
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
941 case 4:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
942 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
943 FOUR_BYTE_INT nr, nc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
944 if (! is.read (&nr, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
945 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
946 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
947 swap_4_bytes ((char *) &nr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
948 if (! is.read (&nc, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
949 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
950 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
951 swap_4_bytes ((char *) &nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
952 if (! is.read (&tmp, 1))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
953 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
954 ComplexMatrix m (nr, nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
955 Complex *im = m.fortran_vec ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
956 int len = nr * nc;
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
957 read_doubles (is, (double *) im, (save_type) tmp, 2*len,
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
958 swap, fmt);
774
9541a1fe575c [project @ 1994-10-05 22:35:46 by jwe]
jwe
parents: 767
diff changeset
959 if (error_state || ! is)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
960 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
961 tc = m;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
962 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
963 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
964
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
965 case 5:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
966 {
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
967 FOUR_BYTE_INT len;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
968 if (! is.read (&len, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
969 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
970 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
971 swap_4_bytes ((char *) &len);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
972 char *s = new char [len+1];
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
973 if (! is.read (s, len))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
974 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
975 delete [] s;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
976 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
977 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
978 s[len] = '\0';
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
979 tc = s;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
980 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
981 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
982
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
983 case 6:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
984 {
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
985 if (! is.read (&tmp, 1))
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
986 goto data_read_error;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
987 double bas, lim, inc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
988 if (! is.read (&bas, 8))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
989 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
990 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
991 swap_8_bytes ((char *) &bas);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
992 if (! is.read (&lim, 8))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
993 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
994 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
995 swap_8_bytes ((char *) &lim);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
996 if (! is.read (&inc, 8))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
997 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
998 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
999 swap_8_bytes ((char *) &inc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1000 Range r (bas, lim, inc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1001 tc = r;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1002 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1003 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1004
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1005 case 7:
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1006 {
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1007 FOUR_BYTE_INT elements;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1008 if (! is.read (&elements, 4))
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1009 goto data_read_error;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1010 if (swap)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1011 swap_4_bytes ((char *) &elements);
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1012 charMatrix chm (elements, 0);
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1013 int max_len = 0;
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1014 for (int i = 0; i < elements; i++)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1015 {
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1016 FOUR_BYTE_INT len;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1017 if (! is.read (&len, 4))
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1018 goto data_read_error;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1019 if (swap)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1020 swap_4_bytes ((char *) &len);
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1021 char *tmp = new char [len];
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1022 if (! is.read (tmp, len))
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1023 {
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1024 delete [] tmp;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1025 goto data_read_error;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1026 }
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1027 if (len > max_len)
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1028 {
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1029 max_len = len;
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1030 chm.resize (elements, max_len, 0);
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1031 }
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1032 chm.insert (tmp, i, 0);
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1033 delete [] tmp;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1034 }
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1035 tc = chm;
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1036 }
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1037 break;
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1038
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1039 default:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1040 data_read_error:
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1041 error ("load: trouble reading binary file `%s'", filename.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1042 delete [] name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1043 name = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1044 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1045 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1046
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1047 return name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1048 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1049
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1050 // Read LEN elements of data from IS in the format specified by
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1051 // PRECISION, placing the result in DATA. If SWAP is nonzero, swap
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1052 // the bytes of each element before copying to DATA. FLT_FMT
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1053 // specifies the format of the data if we are reading floating point
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1054 // numbers.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1055
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1056 static void
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1057 read_mat_binary_data (istream& is, double *data, int precision,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1058 int len, int swap, floating_point_format flt_fmt)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1059 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1060 switch (precision)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1061 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1062 case 0:
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1063 read_doubles (is, data, LS_DOUBLE, len, swap, flt_fmt);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1064 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1065
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1066 case 1:
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1067 read_doubles (is, data, LS_FLOAT, len, swap, flt_fmt);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1068 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1069
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1070 case 2:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1071 read_doubles (is, data, LS_INT, len, swap, flt_fmt);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1072 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1073
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1074 case 3:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1075 read_doubles (is, data, LS_SHORT, len, swap, flt_fmt);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1076 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1077
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1078 case 4:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1079 read_doubles (is, data, LS_U_SHORT, len, swap, flt_fmt);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1080 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1081
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1082 case 5:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1083 read_doubles (is, data, LS_U_CHAR, len, swap, flt_fmt);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1084 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1085
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1086 default:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1087 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1088 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1089 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1090
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1091 static int
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1092 read_mat_file_header (istream& is, int& swap, FOUR_BYTE_INT& mopt,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1093 FOUR_BYTE_INT& nr, FOUR_BYTE_INT& nc,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1094 FOUR_BYTE_INT& imag, FOUR_BYTE_INT& len,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1095 int quiet = 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1096 {
671
e9adf666b647 [project @ 1994-09-07 19:32:26 by jwe]
jwe
parents: 667
diff changeset
1097 swap = 0;
e9adf666b647 [project @ 1994-09-07 19:32:26 by jwe]
jwe
parents: 667
diff changeset
1098
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1099 // We expect to fail here, at the beginning of a record, so not
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1100 // being able to read another mopt value should not result in an
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1101 // error.
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1102
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1103 is.read (&mopt, 4);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1104 if (! is)
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1105 return 1;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1106
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1107 if (! is.read (&nr, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1108 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1109
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1110 if (! is.read (&nc, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1111 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1112
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1113 if (! is.read (&imag, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1114 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1115
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1116 if (! is.read (&len, 4))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1117 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1118
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1119 // If mopt is nonzero and the byte order is swapped, mopt will be
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1120 // bigger than we expect, so we swap bytes.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1121 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1122 // If mopt is zero, it means the file was written on a little endian
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1123 // machine, and we only need to swap if we are running on a big endian
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1124 // machine.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1125 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1126 // Gag me.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1127
1415
f18474c64e72 [project @ 1995-09-15 10:09:57 by jwe]
jwe
parents: 1380
diff changeset
1128 if (octave_words_big_endian && mopt == 0)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1129 swap = 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1130
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1131 // mopt is signed, therefore byte swap may result in negative value.
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1132
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1133 if (mopt > 9999 || mopt < 0)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1134 swap = 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1135
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1136 if (swap)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1137 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1138 swap_4_bytes ((char *) &mopt);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1139 swap_4_bytes ((char *) &nr);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1140 swap_4_bytes ((char *) &nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1141 swap_4_bytes ((char *) &imag);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1142 swap_4_bytes ((char *) &len);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1143 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1144
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1145 if (mopt > 9999 || mopt < 0 || imag > 1 || imag < 0)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1146 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1147 if (! quiet)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1148 error ("load: can't read binary file");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1149 return -1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1150 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1151
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1152 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1153
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1154 data_read_error:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1155 return -1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1156 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1157
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1158 // We don't just use a cast here, because we need to be able to detect
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1159 // possible errors.
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1160
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1161 static floating_point_format
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1162 get_floating_point_format (int mach)
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1163 {
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1164 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
619
8778be2e70e7 [project @ 1994-08-15 04:54:17 by jwe]
jwe
parents: 618
diff changeset
1165
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1166 switch (mach)
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1167 {
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1168 case 0:
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1169 flt_fmt = OCTAVE_IEEE_LITTLE;
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1170 break;
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1171
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1172 case 1:
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1173 flt_fmt = OCTAVE_IEEE_BIG;
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1174 break;
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1175
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1176 case 2:
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1177 flt_fmt = OCTAVE_VAX_D;
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1178 break;
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1179
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1180 case 3:
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1181 flt_fmt = OCTAVE_VAX_G;
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1182 break;
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1183
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1184 case 4:
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1185 flt_fmt = OCTAVE_CRAY;
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1186 break;
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1187
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1188 default:
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1189 flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1190 break;
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1191 }
619
8778be2e70e7 [project @ 1994-08-15 04:54:17 by jwe]
jwe
parents: 618
diff changeset
1192
8778be2e70e7 [project @ 1994-08-15 04:54:17 by jwe]
jwe
parents: 618
diff changeset
1193 return flt_fmt;
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1194 }
619
8778be2e70e7 [project @ 1994-08-15 04:54:17 by jwe]
jwe
parents: 618
diff changeset
1195
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1196 // Extract one value (scalar, matrix, string, etc.) from stream IS and
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1197 // place it in TC, returning the name of the variable.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1198 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1199 // The data is expected to be in Matlab's .mat format, though not all
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1200 // the features of that format are supported.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1201 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1202 // FILENAME is used for error messages.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1203 //
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1204 // This format provides no way to tag the data as global.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1205
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1206 static char *
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1207 read_mat_binary_data (istream& is, const string& filename,
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1208 tree_constant& tc)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1209 {
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1210 // These are initialized here instead of closer to where they are
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1211 // first used to avoid errors from gcc about goto crossing
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1212 // initialization of variable.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1213
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1214 Matrix re;
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1215 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1216 char *name = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1217 int swap = 0, type = 0, prec = 0, mach = 0, dlen = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1218
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1219 FOUR_BYTE_INT mopt, nr, nc, imag, len;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1220
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1221 int err = read_mat_file_header (is, swap, mopt, nr, nc, imag, len);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1222 if (err)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1223 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1224 if (err < 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1225 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1226 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1227 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1228 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1229
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1230 type = mopt % 10; // Full, sparse, etc.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1231 mopt /= 10; // Eliminate first digit.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1232 prec = mopt % 10; // double, float, int, etc.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1233 mopt /= 100; // Skip unused third digit too.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1234 mach = mopt % 10; // IEEE, VAX, etc.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1235
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1236 flt_fmt = get_floating_point_format (mach);
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1237 if (flt_fmt == OCTAVE_UNKNOWN_FLT_FMT)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1238 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1239 error ("load: unrecognized binary format!");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1240 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1241 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1242
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1243 if (type != 0 && type != 1)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1244 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1245 error ("load: can't read sparse matrices");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1246 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1247 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1248
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1249 if (imag && type == 1)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1250 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1251 error ("load: encountered complex matrix with string flag set!");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1252 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1253 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1254
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1255 name = new char [len];
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1256 if (! is.read (name, len))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1257 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1258
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1259 dlen = nr * nc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1260 if (dlen < 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1261 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1262
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1263 re.resize (nr, nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1264
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1265 read_mat_binary_data (is, re.fortran_vec (), prec, dlen, swap, flt_fmt);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1266
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1267 if (! is || error_state)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1268 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1269 error ("load: reading matrix data for `%s'", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1270 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1271 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1272
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1273 if (imag)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1274 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1275 Matrix im (nr, nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1276
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1277 read_mat_binary_data (is, im.fortran_vec (), prec, dlen, swap, flt_fmt);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1278
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1279 if (! is || error_state)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1280 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1281 error ("load: reading imaginary matrix data for `%s'", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1282 goto data_read_error;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1283 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1284
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1285 ComplexMatrix ctmp (nr, nc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1286
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1287 for (int j = 0; j < nc; j++)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1288 for (int i = 0; i < nr; i++)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1289 ctmp.elem (i, j) = Complex (re.elem (i, j), im.elem (i, j));
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1290
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1291 tc = ctmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1292 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1293 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1294 tc = re;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1295
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1296 if (type == 1)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1297 tc = tc.convert_to_str ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1298
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1299 return name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1300
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1301 data_read_error:
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1302 error ("load: trouble reading binary file `%s'", filename.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1303 delete [] name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1304 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1305 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1306
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1307 // Return nonzero if NAME matches one of the given globbing PATTERNS.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1308
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1309 static int
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1310 matches_patterns (const string_vector& patterns, int pat_idx,
1792
e6d79e281f7d [project @ 1996-01-26 02:33:22 by jwe]
jwe
parents: 1755
diff changeset
1311 int num_pat, const string& name)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1312 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1313 for (int i = pat_idx; i < num_pat; i++)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1314 {
1792
e6d79e281f7d [project @ 1996-01-26 02:33:22 by jwe]
jwe
parents: 1755
diff changeset
1315 glob_match pattern (patterns[i]);
e6d79e281f7d [project @ 1996-01-26 02:33:22 by jwe]
jwe
parents: 1755
diff changeset
1316 if (pattern.match (name))
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1317 return 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1318 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1319 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1320 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1321
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1322 static int
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1323 read_binary_file_header (istream& is, int& swap,
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1324 floating_point_format& flt_fmt, int quiet = 0)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1325 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1326 int magic_len = 10;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1327 char magic [magic_len+1];
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1328 is.read (magic, magic_len);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1329 magic[magic_len] = '\0';
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1330 if (strncmp (magic, "Octave-1-L", magic_len) == 0)
1415
f18474c64e72 [project @ 1995-09-15 10:09:57 by jwe]
jwe
parents: 1380
diff changeset
1331 swap = octave_words_big_endian;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1332 else if (strncmp (magic, "Octave-1-B", magic_len) == 0)
1415
f18474c64e72 [project @ 1995-09-15 10:09:57 by jwe]
jwe
parents: 1380
diff changeset
1333 swap = ! octave_words_big_endian;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1334 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1335 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1336 if (! quiet)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1337 error ("load: can't read binary file");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1338 return -1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1339 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1340
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1341 char tmp = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1342 is.read (&tmp, 1);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1343
617
5acc6db54c8f [project @ 1994-08-15 04:32:29 by jwe]
jwe
parents: 604
diff changeset
1344 flt_fmt = get_floating_point_format (tmp);
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1345 if (flt_fmt == OCTAVE_UNKNOWN_FLT_FMT)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1346 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1347 if (! quiet)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1348 error ("load: unrecognized binary format!");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1349 return -1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1350 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1351
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1352 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1353 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1354
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1355 static load_save_format
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
1356 get_file_format (const string& fname, const string& orig_fname)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1357 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1358 load_save_format retval = LS_UNKNOWN;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1359
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
1360 ifstream file (fname.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1361
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1362 if (! file)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1363 {
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
1364 error ("load: couldn't open input file `%s'", orig_fname.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1365 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1366 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1367
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1368 int swap;
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1369 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1370
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1371 if (read_binary_file_header (file, swap, flt_fmt, 1) == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1372 retval = LS_BINARY;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1373 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1374 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1375 file.seekg (0, ios::beg);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1376
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1377 FOUR_BYTE_INT mopt, nr, nc, imag, len;
1180
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1378
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1379 int err = read_mat_file_header (file, swap, mopt, nr, nc, imag, len, 1);
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1380
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1381 if (! err)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1382 retval = LS_MAT_BINARY;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1383 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1384 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1385 file.seekg (0, ios::beg);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1386
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1387 char *tmp = extract_keyword (file, "name");
1180
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1388
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1389 if (tmp)
1180
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1390 {
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1391 retval = LS_ASCII;
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1392 delete [] tmp;
0a9c94ee69e8 [project @ 1995-03-24 06:20:14 by jwe]
jwe
parents: 1159
diff changeset
1393 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1394 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1395 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1396
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1397 file.close ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1398
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1399 if (retval == LS_UNKNOWN)
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
1400 error ("load: unable to determine file format for `%s'",
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
1401 orig_fname.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1402
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1403 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1404 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1405
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1406 static Octave_object
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1407 do_load (istream& stream, const string& orig_fname, int force,
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1408 load_save_format format, floating_point_format flt_fmt,
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1409 int list_only, int swap, int verbose, const string_vector& argv,
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1410 int argv_idx, int argc, int nargout)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1411 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1412 Octave_object retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1413
621
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1414 ostrstream output_buf;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1415 int count = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1416 for (;;)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1417 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1418 int global = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1419 tree_constant tc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1420
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1421 char *name = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1422 char *doc = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1423
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1424 switch (format)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1425 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1426 case LS_ASCII:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1427 name = read_ascii_data (stream, orig_fname, global, tc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1428 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1429
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1430 case LS_BINARY:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1431 name = read_binary_data (stream, swap, flt_fmt, orig_fname,
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1432 global, tc, doc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1433 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1434
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1435 case LS_MAT_BINARY:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1436 name = read_mat_binary_data (stream, orig_fname, tc);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1437 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1438
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1439 default:
775
d1acd4a89bf7 [project @ 1994-10-05 22:46:06 by jwe]
jwe
parents: 774
diff changeset
1440 gripe_unrecognized_data_fmt ("load");
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1441 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1442 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1443
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
1444 if (error_state || stream.eof () || ! name)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1445 {
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
1446 delete [] name;
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
1447 delete [] doc;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1448 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1449 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1450 else if (! error_state && name)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1451 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1452 if (tc.is_defined ())
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1453 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1454 if (argv_idx == argc
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1455 || matches_patterns (argv, argv_idx, argc, name))
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1456 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1457 count++;
621
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1458 if (list_only)
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1459 {
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1460 if (verbose)
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1461 {
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1462 if (count == 1)
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1463 output_buf
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1464 << "type rows cols name\n"
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1465 << "==== ==== ==== ====\n";
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1466
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1467 output_buf.form ("%-16s", tc.type_as_string ());
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1468 output_buf.form ("%7d", tc.rows ());
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1469 output_buf.form ("%7d", tc.columns ());
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1470 output_buf << " ";
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1471 }
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1472 output_buf << name << "\n";
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1473 }
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1474 else
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1475 {
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1476 install_loaded_variable (force, name, tc, global, doc);
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1477 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1478 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1479 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1480 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1481 error ("load: unable to load variable `%s'", name);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1482 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1483 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1484 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1485 if (count == 0)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1486 error ("load: are you sure `%s' is an Octave data file?",
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1487 orig_fname.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1488
867
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
1489 delete [] name;
b6b78f85743a [project @ 1994-11-02 14:20:02 by jwe]
jwe
parents: 863
diff changeset
1490 delete [] doc;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1491 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1492 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1493
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1494 delete [] name;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1495 delete [] doc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1496 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1497
621
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1498 if (list_only && count)
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1499 {
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1500 if (nargout > 0)
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1501 {
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1502 output_buf << ends;
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1503 char *msg = output_buf.str ();
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1504 retval = msg;
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1505 delete [] msg;
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1506 }
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1507 else
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1508 maybe_page_output (output_buf);
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1509 }
9e90d4df19e2 [project @ 1994-08-16 14:55:18 by jwe]
jwe
parents: 620
diff changeset
1510
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1511 return retval;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1512 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1513
1957
0e6a0a271998 [project @ 1996-02-15 01:08:15 by jwe]
jwe
parents: 1884
diff changeset
1514 DEFUN_TEXT (load, args, nargout,
910
5de3b53c0e02 [project @ 1994-11-10 01:48:13 by jwe]
jwe
parents: 909
diff changeset
1515 "load [-force] [-ascii] [-binary] [-mat-binary] file [pattern ...]\n\
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1516 \n\
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1517 Load variables from a file.\n\
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1518 \n\
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1519 If no argument is supplied to select a format, load tries to read the
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1520 named file as an Octave binary, then as a .mat file, and then as an
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1521 Octave text file.\n\
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1522 \n\
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1523 If the option -force is given, variables with the same names as those
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1524 found in the file will be replaced with the values read from the file.")
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1525 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1526 Octave_object retval;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1527
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1528 int argc = args.length () + 1;
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1529
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1530 string_vector argv = make_argv (args, "load");
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1531
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1532 if (error_state)
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1533 return retval;
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1534
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1535 int force = 0;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1536
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1537 // It isn't necessary to have the default load format stored in a
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1538 // user preference variable since we can determine the type of file
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1539 // as we are reading.
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1540
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1541 load_save_format format = LS_UNKNOWN;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1542
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1543 int list_only = 0;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1544 int verbose = 0;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1545
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1546 int i;
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1547 for (i = 1; i < argc; i++)
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1548 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1549 if (argv[i] == "-force" || argv[i] == "-f")
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1550 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1551 force++;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1552 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1553 else if (argv[i] == "-list" || argv[i] == "-l")
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1554 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1555 list_only = 1;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1556 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1557 else if (argv[i] == "-verbose" || argv[i] == "-v")
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1558 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1559 verbose = 1;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1560 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1561 else if (argv[i] == "-ascii" || argv[i] == "-a")
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1562 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1563 format = LS_ASCII;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1564 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1565 else if (argv[i] == "-binary" || argv[i] == "-b")
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1566 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1567 format = LS_BINARY;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1568 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1569 else if (argv[i] == "-mat-binary" || argv[i] == "-m")
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1570 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1571 format = LS_MAT_BINARY;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1572 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1573 else
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1574 break;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1575 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1576
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1577 if (i == argc)
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1578 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1579 error ("load: you must specify a single file to read");
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1580 return retval;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1581 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1582
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1583 string orig_fname = argv[i];
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1584
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1585 floating_point_format flt_fmt = OCTAVE_UNKNOWN_FLT_FMT;
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1586
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1587 int swap = 0;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1588
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1589 if (argv[i] == "-")
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1590 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1591 i++;
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1592
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1593 if (format != LS_UNKNOWN)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1594 {
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1595 // XXX FIXME XXX -- if we have already seen EOF on a
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1596 // previous call, how do we fix up the state of cin so that
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1597 // we can get additional input? I'm afraid that we can't
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
1598 // fix this using cin only.
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1599
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1600 retval = do_load (cin, orig_fname, force, format, flt_fmt,
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1601 list_only, swap, verbose, argv, i, argc,
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1602 nargout);
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1603 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1604 else
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1605 error ("load: must specify file format if reading from stdin");
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1606 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1607 else
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1608 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1609 string fname = oct_tilde_expand (argv[i]);
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1610
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1611 if (format == LS_UNKNOWN)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1612 format = get_file_format (fname, orig_fname);
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1613
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1614 if (format != LS_UNKNOWN)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1615 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1616 i++;
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1617
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1618 unsigned mode = ios::in;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1619 if (format == LS_BINARY || format == LS_MAT_BINARY)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1620 mode |= ios::bin;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1621
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
1622 ifstream file (fname.c_str (), mode);
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1623
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1624 if (file)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1625 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1626 if (format == LS_BINARY)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1627 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1628 if (read_binary_file_header (file, swap, flt_fmt) < 0)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1629 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1630 file.close ();
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1631 return retval;
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1632 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1633 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1634
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1635 retval = do_load (file, orig_fname, force, format,
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1636 flt_fmt, list_only, swap, verbose,
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1637 argv, i, argc, nargout);
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1638
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1639 file.close ();
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1640 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1641 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1642 error ("load: couldn't open input file `%s'",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1643 orig_fname.c_str ());
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1644 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
1645 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1646
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1647 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1648 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1649
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1650 // Return nonzero if PATTERN has any special globbing chars in it.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1651
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1652 static int
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1653 glob_pattern_p (const string& pattern)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1654 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1655 int open = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1656
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1657 int len = pattern.length ();
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1658
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1659 for (int i = 0; i < len; i++)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1660 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1661 char c = pattern[i];
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1662
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1663 switch (c)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1664 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1665 case '?':
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1666 case '*':
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1667 return 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1668
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1669 case '[': // Only accept an open brace if there is a close
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1670 open++; // brace to match it. Bracket expressions must be
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1671 continue; // complete, according to Posix.2
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1672
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1673 case ']':
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1674 if (open)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1675 return 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1676 continue;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1677
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1678 case '\\':
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1679 if (i == len - 1)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1680 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1681
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1682 default:
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1683 continue;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1684 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1685 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1686
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1687 return 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1688 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1689
618
ca6e72746161 [project @ 1994-08-15 04:44:32 by jwe]
jwe
parents: 617
diff changeset
1690 // MAX_VAL and MIN_VAL are assumed to have integral values even though
ca6e72746161 [project @ 1994-08-15 04:44:32 by jwe]
jwe
parents: 617
diff changeset
1691 // they are stored in doubles.
ca6e72746161 [project @ 1994-08-15 04:44:32 by jwe]
jwe
parents: 617
diff changeset
1692
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1693 static save_type
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1694 get_save_type (double max_val, double min_val)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1695 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1696 save_type st = LS_DOUBLE;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1697
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1698 if (max_val < 256 && min_val > -1)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1699 st = LS_U_CHAR;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1700 else if (max_val < 65536 && min_val > -1)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1701 st = LS_U_SHORT;
618
ca6e72746161 [project @ 1994-08-15 04:44:32 by jwe]
jwe
parents: 617
diff changeset
1702 else if (max_val < 4294967295 && min_val > -1)
ca6e72746161 [project @ 1994-08-15 04:44:32 by jwe]
jwe
parents: 617
diff changeset
1703 st = LS_U_INT;
ca6e72746161 [project @ 1994-08-15 04:44:32 by jwe]
jwe
parents: 617
diff changeset
1704 else if (max_val < 128 && min_val >= -128)
ca6e72746161 [project @ 1994-08-15 04:44:32 by jwe]
jwe
parents: 617
diff changeset
1705 st = LS_CHAR;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1706 else if (max_val < 32768 && min_val >= -32768)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1707 st = LS_SHORT;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1708 else if (max_val < 2147483648 && min_val > -2147483648)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1709 st = LS_INT;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1710
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1711 return st;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1712 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1713
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1714 // Save the data from TC along with the corresponding NAME, help
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1715 // string DOC, and global flag MARK_AS_GLOBAL on stream OS in the
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1716 // binary format described above for read_binary_data.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1717
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1718 static int
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1719 save_binary_data (ostream& os, const tree_constant& tc,
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1720 const string& name, const string& doc,
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1721 int mark_as_global, int save_as_floats)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1722 {
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1723 int fail = 0;
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1724
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1725 FOUR_BYTE_INT name_len = name.length ();
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1726
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1727 os.write (&name_len, 4);
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1728 os << name;
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1729
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1730 FOUR_BYTE_INT doc_len = doc.length ();
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1731
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1732 os.write (&doc_len, 4);
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1733 os << doc;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1734
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1735 char tmp;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1736
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1737 tmp = mark_as_global;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1738 os.write (&tmp, 1);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1739
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1740 if (tc.is_real_scalar ())
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1741 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1742 tmp = 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1743 os.write (&tmp, 1);
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1744 tmp = (char) LS_DOUBLE;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1745 os.write (&tmp, 1);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1746 double tmp = tc.double_value ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1747 os.write (&tmp, 8);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1748 }
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1749 else if (tc.is_real_matrix ())
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1750 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1751 tmp = 2;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1752 os.write (&tmp, 1);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1753 Matrix m = tc.matrix_value ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1754 FOUR_BYTE_INT nr = m.rows ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1755 FOUR_BYTE_INT nc = m.columns ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1756 os.write (&nr, 4);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1757 os.write (&nc, 4);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1758 int len = nr * nc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1759 save_type st = LS_DOUBLE;
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1760 if (save_as_floats)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1761 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1762 if (too_large_for_float (m))
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1763 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1764 warning ("save: some values too large to save as floats --");
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1765 warning ("save: saving as doubles instead");
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1766 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1767 else
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1768 st = LS_FLOAT;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1769 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1770 else if (len > 8192) // XXX FIXME XXX -- make this configurable.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1771 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1772 double max_val, min_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1773 if (all_parts_int (m, max_val, min_val))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1774 st = get_save_type (max_val, min_val);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1775 }
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1776 const double *mtmp = m.data ();
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1777 write_doubles (os, mtmp, st, len);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1778 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1779 else if (tc.is_complex_scalar ())
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1780 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1781 tmp = 3;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1782 os.write (&tmp, 1);
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1783 tmp = (char) LS_DOUBLE;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1784 os.write (&tmp, 1);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1785 Complex tmp = tc.complex_value ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1786 os.write (&tmp, 16);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1787 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1788 else if (tc.is_complex_matrix ())
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1789 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1790 tmp = 4;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1791 os.write (&tmp, 1);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1792 ComplexMatrix m = tc.complex_matrix_value ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1793 FOUR_BYTE_INT nr = m.rows ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1794 FOUR_BYTE_INT nc = m.columns ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1795 os.write (&nr, 4);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1796 os.write (&nc, 4);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1797 int len = nr * nc;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1798 save_type st = LS_DOUBLE;
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1799 if (save_as_floats)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1800 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1801 if (too_large_for_float (m))
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1802 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1803 warning ("save: some values too large to save as floats --");
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1804 warning ("save: saving as doubles instead");
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1805 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1806 else
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1807 st = LS_FLOAT;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1808 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1809 else if (len > 4096) // XXX FIXME XXX -- make this configurable.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1810 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1811 double max_val, min_val;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1812 if (all_parts_int (m, max_val, min_val))
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1813 st = get_save_type (max_val, min_val);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1814 }
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1815 const Complex *mtmp = m.data ();
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1816 write_doubles (os, (const double *) mtmp, st, 2*len);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1817 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1818 else if (tc.is_string ())
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1819 {
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1820 tmp = 7;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1821 os.write (&tmp, 1);
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1822 FOUR_BYTE_INT nr = tc.rows ();
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1823 os.write (&nr, 4);
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1824 charMatrix chm = tc.all_strings ();
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1825 for (int i = 0; i < nr; i++)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1826 {
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
1827 FOUR_BYTE_INT len = chm.cols ();
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1828 os.write (&len, 4);
1728
42b4f904f1af [project @ 1996-01-09 11:36:01 by jwe]
jwe
parents: 1690
diff changeset
1829 string tstr = chm.row_as_string (i);
42b4f904f1af [project @ 1996-01-09 11:36:01 by jwe]
jwe
parents: 1690
diff changeset
1830 const char *tmp = tstr.data ();
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1831 os.write (tmp, len);
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
1832 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1833 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1834 else if (tc.is_range ())
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1835 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1836 tmp = 6;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1837 os.write (&tmp, 1);
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1838 tmp = (char) LS_DOUBLE;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
1839 os.write (&tmp, 1);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1840 Range r = tc.range_value ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1841 double bas = r.base ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1842 double lim = r.limit ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1843 double inc = r.inc ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1844 os.write (&bas, 8);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1845 os.write (&lim, 8);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1846 os.write (&inc, 8);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1847 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1848 else
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1849 {
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1850 gripe_wrong_type_arg ("save", tc);
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1851 fail = 1;
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1852 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1853
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1854 return (os && ! fail);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1855 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
1856
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1857 // Save the data from TC along with the corresponding NAME on stream OS
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1858 // in the MatLab binary format.
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1859
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1860 static int
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1861 save_mat_binary_data (ostream& os, const tree_constant& tc,
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1862 const string& name)
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1863 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1864 int fail = 0;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1865
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1866 FOUR_BYTE_INT mopt = 0;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1867
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1868 mopt += tc.is_string () ? 1 : 0;
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
1869 mopt += 1000 * get_floating_point_format (native_float_format);
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1870
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1871 os.write (&mopt, 4);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1872
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1873 FOUR_BYTE_INT nr = tc.rows ();
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1874 os.write (&nr, 4);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1875
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1876 FOUR_BYTE_INT nc = tc.columns ();
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1877 os.write (&nc, 4);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1878
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1879 int len = nr * nc;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1880
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1881 FOUR_BYTE_INT imag = tc.is_complex_type () ? 1 : 0;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1882 os.write (&imag, 4);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1883
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1884 FOUR_BYTE_INT name_len = name.length ();
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1885
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1886 os.write (&name_len, 4);
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
1887 os << name;
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1888
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1889 if (tc.is_real_scalar ())
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1890 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1891 double tmp = tc.double_value ();
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1892 os.write (&tmp, 8);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1893 }
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1894 else if (tc.is_real_matrix ())
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1895 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1896 Matrix m = tc.matrix_value ();
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1897 os.write (m.data (), 8 * len);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1898 }
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1899 else if (tc.is_complex_scalar ())
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1900 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1901 Complex tmp = tc.complex_value ();
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1902 os.write (&tmp, 16);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1903 }
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1904 else if (tc.is_complex_matrix ())
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1905 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1906 ComplexMatrix m_cmplx = tc.complex_matrix_value ();
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1907 Matrix m = ::real(m_cmplx);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1908 os.write (m.data (), 8 * len);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1909 m = ::imag(m_cmplx);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1910 os.write (m.data (), 8 * len);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1911 }
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1912 else if (tc.is_string ())
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1913 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1914 begin_unwind_frame ("save_mat_binary_data");
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1915 unwind_protect_int (user_pref.implicit_str_to_num_ok);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1916 user_pref.implicit_str_to_num_ok = 1;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1917 Matrix m = tc.matrix_value ();
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1918 os.write (m.data (), 8 * len);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1919 run_unwind_frame ("save_mat_binary_data");
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1920 }
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1921 else if (tc.is_range ())
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1922 {
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1923 Range r = tc.range_value ();
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1924 double base = r.base ();
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1925 double inc = r.inc ();
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1926 int nel = r.nelem ();
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1927 for (int i = 0; i < nel; i++)
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1928 {
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1929 double x = base + i * inc;
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1930 os.write (&x, 8);
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1931 }
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
1932 }
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1933 else
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1934 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1935 gripe_wrong_type_arg ("save", tc);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1936 fail = 1;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1937 }
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1938
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1939 return (os && ! fail);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1940 }
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
1941
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1942 static void
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1943 ascii_save_type (ostream& os, char *type, int mark_as_global)
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1944 {
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1945 if (mark_as_global)
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1946 os << "# type: global ";
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1947 else
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1948 os << "# type: ";
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1949
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1950 os << type << "\n";
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1951 }
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
1952
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1953 static Matrix
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1954 strip_infnan (const Matrix& m)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1955 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1956 int nr = m.rows ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1957 int nc = m.columns ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1958
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1959 Matrix retval (nr, nc);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1960
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1961 int k = 0;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1962 for (int i = 0; i < nr; i++)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1963 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1964 for (int j = 0; j < nc; j++)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1965 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1966 double d = m.elem (i, j);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1967 if (xisnan (d))
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1968 goto next_row;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1969 else
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1970 retval.elem (k, j) = xisinf (d) ? (d > 0 ? OCT_RBV : -OCT_RBV) : d;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1971 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1972 k++;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1973
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1974 next_row:
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1975 continue;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1976 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1977
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1978 if (k > 0)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1979 retval.resize (k, nc);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1980
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1981 return retval;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1982 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1983
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1984 static ComplexMatrix
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1985 strip_infnan (const ComplexMatrix& m)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1986 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1987 int nr = m.rows ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1988 int nc = m.columns ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1989
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1990 ComplexMatrix retval (nr, nc);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1991
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1992 int k = 0;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1993 for (int i = 0; i < nr; i++)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1994 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1995 for (int j = 0; j < nc; j++)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1996 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1997 Complex c = m.elem (i, j);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1998 if (xisnan (c))
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
1999 goto next_row;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2000 else
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2001 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2002 double re = real (c);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2003 double im = imag (c);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2004
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2005 re = xisinf (re) ? (re > 0 ? OCT_RBV : -OCT_RBV) : re;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2006 im = xisinf (im) ? (im > 0 ? OCT_RBV : -OCT_RBV) : im;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2007
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2008 retval.elem (k, j) = Complex (re, im);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2009 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2010 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2011 k++;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2012
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2013 next_row:
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2014 continue;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2015 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2016
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2017 if (k > 0)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2018 retval.resize (k, nc);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2019
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2020 return retval;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2021 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2022
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2023 // Save the data from TC along with the corresponding NAME, and global
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2024 // flag MARK_AS_GLOBAL on stream OS in the plain text format described
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2025 // above for load_ascii_data. If NAME is empty, the name: line is not
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2026 // generated. PRECISION specifies the number of decimal digits to print.
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2027 // If STRIP_NAN_AND_INF is nonzero, rows containing NaNs are deleted,
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2028 // and Infinite values are converted to +/-OCT_RBV (A Real Big Value,
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2029 // but not so big that gnuplot can't handle it when trying to compute
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2030 // axis ranges, etc.).
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2031 //
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2032 // Assumes ranges and strings cannot contain Inf or NaN values.
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2033 //
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2034 // Returns 1 for success and 0 for failure.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2035
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2036 // XXX FIXME XXX -- should probably write the help string here too.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2037
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2038 int
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2039 save_ascii_data (ostream& os, const tree_constant& tc,
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2040 const string& name, int strip_nan_and_inf,
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2041 int mark_as_global, int precision)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2042 {
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2043 int success = 1;
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2044
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2045 if (! precision)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2046 precision = user_pref.save_precision;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2047
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2048 if (! name.empty ())
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2049 os << "# name: " << name << "\n";
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2050
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2051 long old_precision = os.precision ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2052 os.precision (precision);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2053
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2054 if (tc.is_real_scalar ())
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2055 {
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2056 ascii_save_type (os, "scalar", mark_as_global);
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2057
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2058 double d = tc.double_value ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2059 if (strip_nan_and_inf)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2060 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2061 if (xisnan (d))
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2062 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2063 error ("only value to plot is NaN");
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2064 success = 0;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2065 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2066 else
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2067 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2068 d = xisinf (d) ? (d > 0 ? OCT_RBV : -OCT_RBV) : d;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2069 os << d << "\n";
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2070 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2071 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2072 else
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2073 os << d << "\n";
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2074 }
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2075 else if (tc.is_real_matrix ())
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2076 {
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2077 ascii_save_type (os, "matrix", mark_as_global);
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2078 os << "# rows: " << tc.rows () << "\n"
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2079 << "# columns: " << tc.columns () << "\n";
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2080
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2081 Matrix tmp = tc.matrix_value ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2082 if (strip_nan_and_inf)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2083 tmp = strip_infnan (tmp);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2084
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2085 os << tmp;
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2086 }
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2087 else if (tc.is_complex_scalar ())
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2088 {
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2089 ascii_save_type (os, "complex scalar", mark_as_global);
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2090
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2091 Complex c = tc.complex_value ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2092 if (strip_nan_and_inf)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2093 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2094 if (xisnan (c))
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2095 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2096 error ("only value to plot is NaN");
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2097 success = 0;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2098 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2099 else
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2100 {
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2101 double re = real (c);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2102 double im = imag (c);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2103
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2104 re = xisinf (re) ? (re > 0 ? OCT_RBV : -OCT_RBV) : re;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2105 im = xisinf (im) ? (im > 0 ? OCT_RBV : -OCT_RBV) : im;
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2106
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2107 c = Complex (re, im);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2108
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2109 os << c << "\n";
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2110 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2111 }
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2112 else
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2113 os << c << "\n";
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2114 }
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2115 else if (tc.is_complex_matrix ())
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2116 {
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2117 ascii_save_type (os, "complex matrix", mark_as_global);
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2118 os << "# rows: " << tc.rows () << "\n"
875
7dd6a8fedfed [project @ 1994-11-04 15:26:13 by jwe]
jwe
parents: 872
diff changeset
2119 << "# columns: " << tc.columns () << "\n";
7dd6a8fedfed [project @ 1994-11-04 15:26:13 by jwe]
jwe
parents: 872
diff changeset
2120
7dd6a8fedfed [project @ 1994-11-04 15:26:13 by jwe]
jwe
parents: 872
diff changeset
2121 ComplexMatrix tmp = tc.complex_matrix_value ();
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2122 if (strip_nan_and_inf)
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2123 tmp = strip_infnan (tmp);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2124
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2125 os << tmp;
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2126 }
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2127 else if (tc.is_string ())
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2128 {
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
2129 ascii_save_type (os, "string array", mark_as_global);
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
2130 charMatrix chm = tc.all_strings ();
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
2131 int elements = chm.rows ();
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
2132 os << "# elements: " << elements << "\n";
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
2133 for (int i = 0; i < elements; i++)
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
2134 {
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
2135 int len = chm.cols ();
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
2136 os << "# length: " << len << "\n";
1728
42b4f904f1af [project @ 1996-01-09 11:36:01 by jwe]
jwe
parents: 1690
diff changeset
2137 string tstr = chm.row_as_string (i);
1742
a02f140ed897 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents: 1728
diff changeset
2138 const char *tmp = tstr.data ();
1572
0d9e10d10bd7 [project @ 1995-10-19 04:31:30 by jwe]
jwe
parents: 1488
diff changeset
2139 os.write (tmp, len);
1427
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
2140 os << "\n";
a2305feef016 [project @ 1995-09-19 03:51:16 by jwe]
jwe
parents: 1415
diff changeset
2141 }
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2142 }
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2143 else if (tc.is_range ())
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2144 {
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2145 ascii_save_type (os, "range", mark_as_global);
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2146 Range tmp = tc.range_value ();
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2147 os << "# base, limit, increment\n"
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2148 << tmp.base () << " "
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2149 << tmp.limit () << " "
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2150 << tmp.inc () << "\n";
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2151 }
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2152 else
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2153 {
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2154 gripe_wrong_type_arg ("save", tc);
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2155 success = 0;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2156 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2157
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2158 os.precision (old_precision);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2159
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2160 return (os && success);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2161 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2162
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2163 // Save the info from sr on stream os in the format specified by fmt.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2164
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2165 static void
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2166 do_save (ostream& os, symbol_record *sr, load_save_format fmt,
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2167 int save_as_floats)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2168 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2169 if (! sr->is_variable ())
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2170 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2171 error ("save: can only save variables, not functions");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2172 return;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2173 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2174
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2175 string name = sr->name ();
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2176 string help = sr->help ();
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2177 int global = sr->is_linked_to_global ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2178 tree_constant tc = *((tree_constant *) sr->def ());
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2179
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2180 if (tc.is_undefined ())
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2181 return;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2182
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2183 switch (fmt)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2184 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2185 case LS_ASCII:
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2186 save_ascii_data (os, tc, name, 0, global);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2187 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2188
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2189 case LS_BINARY:
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2190 save_binary_data (os, tc, name, help, global, save_as_floats);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2191 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2192
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2193 case LS_MAT_BINARY:
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2194 save_mat_binary_data (os, tc, name);
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2195 break;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2196
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2197 default:
775
d1acd4a89bf7 [project @ 1994-10-05 22:46:06 by jwe]
jwe
parents: 774
diff changeset
2198 gripe_unrecognized_data_fmt ("save");
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2199 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2200 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2201 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2202
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2203 // Save variables with names matching PATTERN on stream OS in the
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2204 // format specified by FMT. If SAVE_BUILTINS is nonzero, also save
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2205 // builtin variables with names that match PATTERN.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2206
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2207 static int
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2208 save_vars (ostream& os, const string& pattern, int save_builtins,
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2209 load_save_format fmt, int save_as_floats)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2210 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2211 int count;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2212
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2213 symbol_record **vars = curr_sym_tab->glob
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2214 (count, pattern, symbol_def::USER_VARIABLE, SYMTAB_ALL_SCOPES);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2215
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2216 int saved = count;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2217
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2218 int i;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2219
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2220 for (i = 0; i < count; i++)
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2221 {
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2222 do_save (os, vars[i], fmt, save_as_floats);
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2223
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2224 if (error_state)
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2225 break;
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2226 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2227
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2228 delete [] vars;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2229
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2230 if (! error_state && save_builtins)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2231 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2232 symbol_record **vars = global_sym_tab->glob
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2233 (count, pattern, symbol_def::BUILTIN_VARIABLE, SYMTAB_ALL_SCOPES);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2234
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2235 saved += count;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2236
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2237 for (i = 0; i < count; i++)
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2238 {
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2239 do_save (os, vars[i], fmt, save_as_floats);
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2240
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2241 if (error_state)
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2242 break;
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2243 }
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2244
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2245 delete [] vars;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2246 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2247
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2248 return saved;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2249 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2250
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2251 static load_save_format
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2252 get_default_save_format (void)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2253 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2254 load_save_format retval = LS_ASCII;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2255
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2256 string fmt = user_pref.default_save_format;
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2257
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2258 if (fmt == "binary")
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2259 retval = LS_BINARY;
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2260 else if (fmt == "mat-binary" || fmt =="mat_binary")
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
2261 retval = LS_MAT_BINARY;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2262
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2263 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2264 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2265
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2266 static void
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2267 write_binary_header (ostream& stream, load_save_format format)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2268 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2269 if (format == LS_BINARY)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2270 {
1415
f18474c64e72 [project @ 1995-09-15 10:09:57 by jwe]
jwe
parents: 1380
diff changeset
2271 stream << (octave_words_big_endian ? "Octave-1-B" : "Octave-1-L");
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2272
1226
2457d4ba0691 [project @ 1995-04-10 00:41:14 by jwe]
jwe
parents: 1192
diff changeset
2273 char tmp = (char) native_float_format;
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2274 stream.write (&tmp, 1);
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2275 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2276 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2277
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2278 static void
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2279 save_vars (const string_vector& argv, int argv_idx, int argc,
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2280 ostream& os, int save_builtins, load_save_format fmt,
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2281 int save_as_floats)
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2282 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2283 write_binary_header (os, fmt);
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2284
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2285 if (argv_idx == argc)
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2286 {
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2287 save_vars (os, "*", save_builtins, fmt, save_as_floats);
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2288 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2289 else
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2290 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2291 for (int i = argv_idx; i < argc; i++)
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2292 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2293 if (! save_vars (os, argv[i], save_builtins, fmt, save_as_floats))
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2294 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2295 warning ("save: no such variable `%s'", argv[i].c_str ());
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2296 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2297 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2298 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2299 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2300
1380
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2301 void
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2302 save_user_variables (void)
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2303 {
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2304 // XXX FIXME XXX -- should choose better file name?
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2305
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2306 const char *fname = "octave-core";
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2307
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2308 message (0, "attempting to save variables to `%s'...", fname);
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2309
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2310 load_save_format format = get_default_save_format ();
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2311
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2312 unsigned mode = ios::out|ios::trunc;
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2313 if (format == LS_BINARY || format == LS_MAT_BINARY)
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2314 mode |= ios::bin;
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2315
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2316 ofstream file (fname, mode);
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2317
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2318 if (file)
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2319 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2320 save_vars (string_vector (), 0, 0, file, 0, format, 0);
1380
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2321 message (0, "save to `%s' complete", fname);
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2322 }
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2323 else
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2324 warning ("unable to open `%s' for writing...", fname);
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2325 }
79f80c6229be [project @ 1995-09-12 07:03:33 by jwe]
jwe
parents: 1363
diff changeset
2326
1957
0e6a0a271998 [project @ 1996-02-15 01:08:15 by jwe]
jwe
parents: 1884
diff changeset
2327 DEFUN_TEXT (save, args, ,
910
5de3b53c0e02 [project @ 1994-11-10 01:48:13 by jwe]
jwe
parents: 909
diff changeset
2328 "save [-ascii] [-binary] [-float-binary] [-mat-binary] \n\
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2329 [-save-builtins] file [pattern ...]\n\
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2330 \n\
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2331 save variables in a file")
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2332 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2333 Octave_object retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2334
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2335 int argc = args.length () + 1;
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2336
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2337 string_vector argv = make_argv (args, "save");
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2338
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2339 if (error_state)
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2340 return retval;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2341
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
2342 // Here is where we would get the default save format if it were
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
2343 // stored in a user preference variable.
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2344
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2345 int save_builtins = 0;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2346
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2347 int save_as_floats = 0;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2348
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2349 load_save_format format = get_default_save_format ();
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2350
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2351 int i;
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2352 for (i = 1; i < argc; i++)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2353 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2354 if (argv[i] == "-ascii" || argv[i] == "-a")
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2355 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2356 format = LS_ASCII;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2357 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2358 else if (argv[i] == "-binary" || argv[i] == "-b")
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2359 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2360 format = LS_BINARY;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2361 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2362 else if (argv[i] == "-mat-binary" || argv[i] == "-m")
667
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2363 {
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2364 format = LS_MAT_BINARY;
b19a14bbd862 [project @ 1994-09-07 04:09:03 by jwe]
jwe
parents: 660
diff changeset
2365 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2366 else if (argv[i] == "-float-binary" || argv[i] == "-f")
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2367 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2368 format = LS_BINARY;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2369 save_as_floats = 1;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2370 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2371 else if (argv[i] == "-save-builtins")
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2372 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2373 save_builtins = 1;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2374 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2375 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2376 break;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2377 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2378
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2379 if (argc < 1)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2380 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2381 print_usage ("save");
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2382 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2383 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2384
630
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2385 if (save_as_floats && format == LS_ASCII)
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2386 {
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2387 error ("save: cannot specify both -ascii and -float-binary");
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2388 return retval;
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2389 }
985a9c61f137 [project @ 1994-08-19 20:44:28 by jwe]
jwe
parents: 621
diff changeset
2390
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2391 if (argv[i] == "-")
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2392 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2393 i++;
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2394
1358
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
2395 // XXX FIXME XXX -- should things intended for the screen end up
dc9c01f66a19 [project @ 1995-09-05 21:10:01 by jwe]
jwe
parents: 1352
diff changeset
2396 // in a tree_constant (string)?
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2397
1043
b8dd808bc61f [project @ 1995-01-18 15:56:40 by jwe]
jwe
parents: 1009
diff changeset
2398 ostrstream buf;
b8dd808bc61f [project @ 1995-01-18 15:56:40 by jwe]
jwe
parents: 1009
diff changeset
2399
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2400 save_vars (argv, i, argc, buf, save_builtins, format,
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2401 save_as_floats);
1043
b8dd808bc61f [project @ 1995-01-18 15:56:40 by jwe]
jwe
parents: 1009
diff changeset
2402
b8dd808bc61f [project @ 1995-01-18 15:56:40 by jwe]
jwe
parents: 1009
diff changeset
2403 maybe_page_output (buf);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2404 }
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2405
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2406 // Guard against things like `save a*', which are probably mistakes...
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2407
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2408 else if (i == argc - 1 && glob_pattern_p (argv[i]))
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2409 {
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2410 print_usage ("save");
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2411 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2412 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2413 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2414 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2415 string fname = oct_tilde_expand (argv[i]);
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2416
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2417 i++;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2418
911
a9b2b0f9abf6 [project @ 1994-11-10 04:08:18 by jwe]
jwe
parents: 910
diff changeset
2419 unsigned mode = ios::out|ios::trunc;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2420 if (format == LS_BINARY || format == LS_MAT_BINARY)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2421 mode |= ios::bin;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2422
1750
fd0d12493223 [project @ 1996-01-13 09:31:07 by jwe]
jwe
parents: 1742
diff changeset
2423 ofstream file (fname.c_str (), mode);
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2424
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2425 if (file)
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2426 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2427 save_vars (argv, i, argc, file, save_builtins, format,
863
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2428 save_as_floats);
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2429 }
a2e030473d6d [project @ 1994-10-31 23:41:05 by jwe]
jwe
parents: 777
diff changeset
2430 else
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2431 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1750
diff changeset
2432 error ("save: couldn't open output file `%s'", fname.c_str ());
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2433 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2434 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2435 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2436
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2437 return retval;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2438 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2439
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2440 // Maybe this should be a static function in tree-plot.cc?
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2441
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2442 // If TC is matrix, save it on stream OS in a format useful for
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2443 // making a 3-dimensional plot with gnuplot. If PARAMETRIC is
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2444 // nonzero, assume a parametric 3-dimensional plot will be generated.
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2445
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2446 int
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2447 save_three_d (ostream& os, const tree_constant& tc, int parametric)
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2448 {
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2449 int fail = 0;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2450
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2451 int nr = tc.rows ();
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2452 int nc = tc.columns ();
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2453
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2454 if (tc.is_real_matrix ())
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2455 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2456 os << "# 3D data...\n"
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2457 << "# type: matrix\n"
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2458 << "# total rows: " << nr << "\n"
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2459 << "# total columns: " << nc << "\n";
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2460
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2461 if (parametric)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2462 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2463 int extras = nc % 3;
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2464 if (extras)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2465 warning ("ignoring last %d columns", extras);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2466
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2467 Matrix tmp = tc.matrix_value ();
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2468 tmp = strip_infnan (tmp);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2469 nr = tmp.rows ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2470
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2471 for (int i = 0; i < nc-extras; i += 3)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2472 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2473 os << tmp.extract (0, i, nr-1, i+2);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2474 if (i+3 < nc-extras)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2475 os << "\n";
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2476 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2477 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2478 else
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2479 {
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2480 Matrix tmp = tc.matrix_value ();
872
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2481 tmp = strip_infnan (tmp);
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2482 nr = tmp.rows ();
fb24794ef0e2 [project @ 1994-11-04 00:59:24 by jwe]
jwe
parents: 867
diff changeset
2483
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2484 for (int i = 0; i < nc; i++)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2485 {
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2486 os << tmp.extract (0, i, nr-1, i);
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2487 if (i+1 < nc)
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2488 os << "\n";
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2489 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2490 }
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2491 }
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2492 else
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2493 {
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2494 ::error ("for now, I can only save real matrices in 3D format");
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2495 fail = 1;
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2496 }
620
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2497
8e4e7e5f307e [project @ 1994-08-16 04:36:32 by jwe]
jwe
parents: 619
diff changeset
2498 return (os && ! fail);
604
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2499 }
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2500
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2501 /*
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2502 ;;; Local Variables: ***
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2503 ;;; mode: C++ ***
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2504 ;;; page-delimiter: "^/\\*" ***
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2505 ;;; End: ***
1acdc9e50cd2 [project @ 1994-08-13 20:10:39 by jwe]
jwe
parents:
diff changeset
2506 */