annotate src/pt-fvc.cc @ 1827:effa9400766f

[project @ 1996-02-02 14:07:51 by jwe]
author jwe
date Fri, 02 Feb 1996 14:10:10 +0000
parents 3a9462b655f1
children 8c6cea97eb80
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1742
a02f140ed897 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents: 1741
diff changeset
1 // pt-fvc.cc -*- C++ -*-
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
2 /*
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
3
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
4 Copyright (C) 1996 John W. Eaton
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
5
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
7
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
11 later version.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
12
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
16 for more details.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
17
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
21
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
22 */
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
23
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
24 #if defined (__GNUG__)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
25 #pragma implementation
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
26 #endif
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
27
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
28 #ifdef HAVE_CONFIG_H
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
29 #include <config.h>
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
30 #endif
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
31
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
32 #include <iostream.h>
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
33 #include <strstream.h>
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
34
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
35 #include <SLList.h>
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
36
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
37 #include "dynamic-ld.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
38 #include "error.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
39 #include "gripes.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
40 #include "oct-obj.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
41 #include "pager.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
42 #include "symtab.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
43 #include "pt-const.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
44 #include "pt-fvc.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
45 #include "user-prefs.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
46 #include "utils.h"
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
47
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
48 // But first, some extra functions used by the tree classes.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
49
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
50 static bool
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
51 any_element_less_than (const Matrix& a, double val)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
52 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
53 int nr = a.rows ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
54 int nc = a.columns ();
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
55
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
56 for (int j = 0; j < nc; j++)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
57 for (int i = 0; i < nr; i++)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
58 if (a.elem (i, j) < val)
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
59 return true;
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
60
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
61 return false;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
62 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
63
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
64 static bool
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
65 any_element_greater_than (const Matrix& a, double val)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
66 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
67 int nr = a.rows ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
68 int nc = a.columns ();
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
69
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
70 for (int j = 0; j < nc; j++)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
71 for (int i = 0; i < nr; i++)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
72 if (a.elem (i, j) > val)
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
73 return true;
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
74
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
75 return false;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
76 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
77
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
78 // Make sure that all arguments have values.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
79
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
80 // Are any of the arguments `:'?
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
81
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
82 static bool
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
83 any_arg_is_magic_colon (const Octave_object& args)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
84 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
85 int nargin = args.length ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
86
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
87 for (int i = 0; i < nargin; i++)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
88 if (args(i).is_magic_colon ())
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
89 return true;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
90
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
91 return false;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
92 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
93
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
94 // Symbols from the symbol table.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
95
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
96 string
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
97 tree_identifier::name (void) const
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
98 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
99 string retval;
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
100 if (sym)
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
101 retval = sym->name ();
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
102 return retval;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
103 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
104
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
105 tree_identifier *
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
106 tree_identifier::define (tree_constant *t)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
107 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
108 int status = sym->define (t);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
109 return status ? this : 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
110 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
111
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
112 tree_identifier *
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
113 tree_identifier::define (tree_function *t)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
114 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
115 int status = sym->define (t);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
116 return status ? this : 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
117 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
118
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
119 void
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
120 tree_identifier::document (const string& s)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
121 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
122 if (sym)
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
123 sym->document (s);
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
124 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
125
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
126 tree_constant
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
127 tree_identifier::assign (tree_constant& rhs)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
128 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
129 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
130
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
131 if (rhs.is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
132 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
133 if (! sym->is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
134 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
135 if (! (sym->is_formal_parameter ()
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
136 || sym->is_linked_to_global ()))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
137 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
138 link_to_builtin_variable (sym);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
139 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
140 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
141 else if (sym->is_function ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
142 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
143 sym->clear ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
144 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
145
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
146 tree_constant *tmp = new tree_constant (rhs);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
147
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
148 if (sym->define (tmp))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
149 retval = rhs;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
150 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
151 delete tmp;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
152 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
153
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
154 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
155 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
156
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
157 tree_constant
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
158 tree_identifier::assign (tree_constant& rhs, const Octave_object& args)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
159 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
160 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
161
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
162 if (rhs.is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
163 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
164 if (! sym->is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
165 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
166 if (! (sym->is_formal_parameter ()
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
167 || sym->is_linked_to_global ()))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
168 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
169 link_to_builtin_variable (sym);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
170 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
171 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
172 else if (sym->is_function ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
173 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
174 sym->clear ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
175 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
176
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
177 if (sym->is_variable () && sym->is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
178 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
179 tree_fvc *tmp = sym->def ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
180 retval = tmp->assign (rhs, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
181 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
182 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
183 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
184 assert (! sym->is_defined ());
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
185
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
186 if (! user_pref.resize_on_range_error)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
187 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
188 ::error ("indexed assignment to previously undefined variables");
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
189 ::error ("is only possible when resize_on_range_error is true");
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
190 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
191 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
192 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
193 tree_constant *tmp = new tree_constant ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
194 retval = tmp->assign (rhs, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
195 if (retval.is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
196 sym->define (tmp);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
197 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
198 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
199 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
200
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
201 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
202 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
203
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
204 tree_constant
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
205 tree_identifier::assign (SLList<string> list, tree_constant& rhs)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
206 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
207 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
208
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
209 if (rhs.is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
210 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
211 if (sym->is_function ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
212 sym->clear ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
213
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
214 tree_fvc *curr_val = sym->def ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
215
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
216 tree_constant *tmp = 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
217 if (curr_val && curr_val->is_constant ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
218 tmp = (tree_constant *) curr_val;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
219 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
220 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
221 tmp = new tree_constant ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
222 if (! sym->define (tmp))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
223 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
224 delete tmp;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
225 tmp = 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
226 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
227 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
228
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
229 if (tmp)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
230 retval = tmp->assign_map_element (list, rhs);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
231 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
232
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
233 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
234 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
235
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
236 tree_constant
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
237 tree_identifier::assign (SLList<string> list, tree_constant& rhs,
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
238 const Octave_object& args)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
239 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
240 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
241
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
242 if (rhs.is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
243 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
244 if (sym->is_function ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
245 sym->clear ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
246
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
247 if (sym->is_variable () && sym->is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
248 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
249 tree_fvc *curr_val = sym->def ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
250
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
251 tree_constant *tmp;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
252 if (curr_val && curr_val->is_constant ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
253 tmp = (tree_constant *) curr_val;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
254 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
255 panic_impossible ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
256
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
257 retval = tmp->assign_map_element (list, rhs, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
258 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
259 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
260 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
261 assert (! sym->is_defined ());
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
262
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
263 if (! user_pref.resize_on_range_error)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
264 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
265 ::error ("indexed assignment to previously undefined variables");
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
266 ::error ("is only possible when resize_on_range_error is true");
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
267 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
268 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
269 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
270 tree_constant *tmp = new tree_constant ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
271
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
272 retval = tmp->assign_map_element (list, rhs, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
273
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
274 if (retval.is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
275 sym->define (tmp);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
276 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
277 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
278 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
279
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
280 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
281 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
282
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
283 bool
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
284 tree_identifier::is_defined (void)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
285 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
286 return (sym && sym->is_defined ());
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
287 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
288
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
289 void
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
290 tree_identifier::bump_value (tree_expression::type etype)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
291 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
292 if (sym)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
293 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
294 if (sym->is_read_only ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
295 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
296 ::error ("can't redefined read-only variable `%s'",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
297 name ().c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
298 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
299 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
300 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
301 tree_fvc *tmp = sym->def ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
302 if (tmp)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
303 tmp->bump_value (etype);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
304 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
305 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
306 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
307
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
308 void
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
309 tree_identifier::eval_undefined_error (void)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
310 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
311 int l = line ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
312 int c = column ();
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
313
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
314 if (l == -1 && c == -1)
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
315 ::error ("`%s' undefined", name ().c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
316 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
317 ::error ("`%s' undefined near line %d column %d",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
318 name ().c_str (), l, c);
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
319 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
320
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
321 // Try to find a definition for an identifier. Here's how:
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
322 //
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
323 // * If the identifier is already defined and is a function defined
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
324 // in an function file that has been modified since the last time
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
325 // we parsed it, parse it again.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
326 //
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
327 // * If the identifier is not defined, try to find a builtin
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
328 // variable or an already compiled function with the same name.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
329 //
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
330 // * If the identifier is still undefined, try looking for an
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
331 // function file to parse.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
332 //
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
333 // * On systems that support dynamic linking, we prefer .oct files
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
334 // over .m files.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
335
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
336 tree_fvc *
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
337 tree_identifier::do_lookup (bool& script_file_executed, bool exec_script)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
338 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
339 script_file_executed = lookup (sym, exec_script);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
340
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
341 tree_fvc *retval = 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
342
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
343 if (! script_file_executed)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
344 retval = sym->def ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
345
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
346 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
347 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
348
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
349 void
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
350 tree_identifier::link_to_global (void)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
351 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
352 if (sym)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
353 link_to_global_variable (sym);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
354 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
355
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
356 void
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
357 tree_identifier::mark_as_formal_parameter (void)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
358 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
359 if (sym)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
360 sym->mark_as_formal_parameter ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
361 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
362
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
363 tree_constant
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
364 tree_identifier::eval (bool print)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
365 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
366 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
367
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
368 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
369 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
370
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
371 bool script_file_executed = false;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
372
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
373 tree_fvc *object_to_eval = do_lookup (script_file_executed);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
374
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
375 if (! script_file_executed)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
376 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
377 if (object_to_eval)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
378 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
379 int nargout = maybe_do_ans_assign ? 0 : 1;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
380
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
381 if (nargout)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
382 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
383 Octave_object tmp_args;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
384 Octave_object tmp = object_to_eval->eval (0, nargout, tmp_args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
385
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
386 if (tmp.length () > 0)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
387 retval = tmp(0);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
388 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
389 else
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
390 retval = object_to_eval->eval (false);
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
391 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
392 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
393 eval_undefined_error ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
394 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
395
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
396 if (! error_state && retval.is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
397 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
398 if (maybe_do_ans_assign && ! object_to_eval->is_constant ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
399 bind_ans (retval, print);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
400 else if (print)
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
401 retval.print_with_name (name ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
402 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
403
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
404 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
405 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
406
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
407 Octave_object
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
408 tree_identifier::eval (bool print, int nargout, const Octave_object& args)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
409 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
410 Octave_object retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
411
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
412 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
413 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
414
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
415 bool script_file_executed = false;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
416
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
417 tree_fvc *object_to_eval = do_lookup (script_file_executed);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
418
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
419 if (! script_file_executed)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
420 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
421 if (object_to_eval)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
422 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
423 if (maybe_do_ans_assign && nargout == 1)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
424 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
425
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
426 // Don't count the output arguments that we create
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
427 // automatically.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
428
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
429 nargout = 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
430
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
431 retval = object_to_eval->eval (0, nargout, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
432
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
433 if (retval.length () > 0 && retval(0).is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
434 bind_ans (retval(0), print);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
435 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
436 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
437 retval = object_to_eval->eval (print, nargout, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
438 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
439 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
440 eval_undefined_error ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
441 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
442
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
443 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
444 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
445
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
446 void
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
447 tree_identifier::print_code (ostream& os)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
448 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
449 print_code_indent (os);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
450
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
451 if (in_parens)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
452 os << "(";
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
453
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
454 string nm = name ();
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
455 os << (nm.empty () ? string ("(empty)") : nm);
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
456
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
457 if (in_parens)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
458 os << ")";
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
459 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
460
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
461 // Indirect references to values (structure elements).
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
462
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
463 tree_indirect_ref::~tree_indirect_ref (void)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
464 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
465 if (! preserve_ident)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
466 delete id;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
467 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
468
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
469 tree_indirect_ref *
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
470 tree_indirect_ref::chain (const string& elt)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
471 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
472 refs.append (elt);
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
473 return this;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
474 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
475
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
476 string
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
477 tree_indirect_ref::name (void) const
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
478 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
479 string id_nm = id->name ();
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
480
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
481 if (refs.empty ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
482 return id_nm;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
483 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
484 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
485 for (Pix p = refs.first (); p != 0; refs.next (p))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
486 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
487 id_nm.append (".");
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
488 id_nm.append (refs (p));
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
489 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
490
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
491 return id_nm;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
492 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
493 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
494
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
495 tree_constant
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
496 tree_indirect_ref::assign (tree_constant& t)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
497 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
498 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
499
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
500 if (refs.empty ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
501 retval = id->assign (t);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
502 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
503 retval = id->assign (refs, t);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
504
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
505 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
506 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
507
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
508 tree_constant
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
509 tree_indirect_ref::assign (tree_constant& t, const Octave_object& args)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
510 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
511 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
512
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
513 if (refs.empty ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
514 retval = id->assign (t, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
515 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
516 retval = id->assign (refs, t, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
517
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
518 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
519 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
520
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
521 tree_constant
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
522 tree_indirect_ref::eval (bool print)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
523 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
524 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
525
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
526 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
527 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
528
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
529 if (refs.empty ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
530 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
531 retval = id->eval (print);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
532 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
533 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
534 {
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
535 bool script_file_executed;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
536
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
537 tree_fvc *object_to_eval = id->do_lookup (script_file_executed, 0);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
538
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
539 if (object_to_eval)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
540 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
541 retval = object_to_eval->lookup_map_element (refs);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
542
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
543 if (! error_state && print)
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
544 retval.print_with_name (name ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
545 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
546 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
547 id->eval_undefined_error ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
548 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
549
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
550 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
551 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
552
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
553 Octave_object
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
554 tree_indirect_ref::eval (bool print, int nargout, const Octave_object& args)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
555 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
556 Octave_object retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
557
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
558 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
559 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
560
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
561 if (refs.empty ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
562 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
563 retval = id->eval (print, nargout, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
564 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
565 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
566 {
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
567 bool script_file_executed;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
568
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
569 tree_fvc *object_to_eval = id->do_lookup (script_file_executed, 0);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
570
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
571 if (object_to_eval)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
572 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
573 tree_constant tmp = object_to_eval->lookup_map_element (refs);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
574
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
575 if (! error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
576 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
577 retval = tmp.eval (0, nargout, args);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
578
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
579 if (! error_state && print)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
580 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
581 tmp = retval (0);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
582 if (tmp.is_defined ())
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
583 tmp.print_with_name (name ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
584 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
585 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
586 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
587 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
588 id->eval_undefined_error ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
589 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
590
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
591 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
592 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
593
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
594 void
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
595 tree_indirect_ref::print_code (ostream& os)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
596 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
597 print_code_indent (os);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
598
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
599 if (in_parens)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
600 os << "(";
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
601
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
602 string nm = id ? id->name () : string ("(null)");
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
603 os << (nm.empty () ? string ("(empty)") : nm);
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
604
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
605 for (Pix p = refs.first (); p != 0; refs.next (p))
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
606 os << "." << refs (p);
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
607
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
608 if (in_parens)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
609 os << ")";
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
610 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
611
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
612 // Builtin functions.
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
613
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
614 tree_builtin::tree_builtin (const string& nm)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
615 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
616 is_mapper = 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
617 fcn = 0;
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
618 my_name = nm;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
619 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
620
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
621 tree_builtin::tree_builtin (Mapper_fcn& m_fcn, const string &nm)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
622 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
623 mapper_fcn = m_fcn;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
624 is_mapper = 1;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
625 fcn = 0;
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
626 my_name = nm;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
627 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
628
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
629 tree_builtin::tree_builtin (Octave_builtin_fcn g_fcn, const string& nm)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
630 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
631 is_mapper = 0;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
632 fcn = g_fcn;
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
633 my_name = nm;
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
634 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
635
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
636 tree_constant
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
637 tree_builtin::eval (bool /* print */)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
638 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
639 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
640
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
641 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
642 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
643
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
644 if (fcn)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
645 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
646 eval_fcn:
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
647
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
648 Octave_object args;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
649 Octave_object tmp = (*fcn) (args, 0);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
650 if (tmp.length () > 0)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
651 retval = tmp(0);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
652 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
653 else if (is_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
654 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
655 ::error ("%s: too few arguments", my_name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
656 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
657 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
658 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
659 fcn = load_octave_builtin (my_name);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
660
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
661 if (fcn)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
662 goto eval_fcn;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
663 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
664 ::error ("unable to load builtin function %s", my_name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
665 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
666
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
667 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
668 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
669
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
670 static tree_constant
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
671 apply_mapper_fcn (const tree_constant& arg, Mapper_fcn& m_fcn,
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
672 bool /* print */)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
673 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
674 tree_constant retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
675
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
676 if (arg.is_real_type ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
677 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
678 if (arg.is_scalar_type ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
679 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
680 double d = arg.double_value ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
681
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
682 if (m_fcn.can_return_complex_for_real_arg
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
683 && (d < m_fcn.lower_limit || d > m_fcn.upper_limit))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
684 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
685 if (m_fcn.c_c_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
686 retval = m_fcn.c_c_mapper (Complex (d));
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
687 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
688 error ("%s: unable to handle real arguments",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
689 m_fcn.name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
690 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
691 else if (m_fcn.d_d_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
692 retval = m_fcn.d_d_mapper (d);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
693 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
694 error ("%s: unable to handle real arguments",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
695 m_fcn.name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
696 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
697 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
698 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
699 Matrix m = arg.matrix_value ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
700
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
701 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
702 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
703
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
704 if (m_fcn.can_return_complex_for_real_arg
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
705 && (any_element_less_than (m, m_fcn.lower_limit)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
706 || any_element_greater_than (m, m_fcn.upper_limit)))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
707 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
708 if (m_fcn.c_c_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
709 retval = map (m_fcn.c_c_mapper, ComplexMatrix (m));
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
710 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
711 error ("%s: unable to handle real arguments",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
712 m_fcn.name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
713 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
714 else if (m_fcn.d_d_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
715 retval = map (m_fcn.d_d_mapper, m);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
716 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
717 error ("%s: unable to handle real arguments",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
718 m_fcn.name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
719 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
720 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
721 else if (arg.is_complex_type ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
722 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
723 if (arg.is_scalar_type ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
724 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
725 Complex c = arg.complex_value ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
726
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
727 if (m_fcn.d_c_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
728 retval = m_fcn.d_c_mapper (c);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
729 else if (m_fcn.c_c_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
730 retval = m_fcn.c_c_mapper (c);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
731 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
732 error ("%s: unable to handle complex arguments",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
733 m_fcn.name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
734 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
735 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
736 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
737 ComplexMatrix cm = arg.complex_matrix_value ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
738
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
739 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
740 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
742 if (m_fcn.d_c_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
743 retval = map (m_fcn.d_c_mapper, cm);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
744 else if (m_fcn.c_c_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
745 retval = map (m_fcn.c_c_mapper, cm);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
746 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
747 error ("%s: unable to handle complex arguments",
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
748 m_fcn.name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
749 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
750 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
751 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
752 gripe_wrong_type_arg ("mapper", arg);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
753
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
754 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
755 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
756
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
757 Octave_object
1827
effa9400766f [project @ 1996-02-02 14:07:51 by jwe]
jwe
parents: 1755
diff changeset
758 tree_builtin::eval (bool /* print */, int nargout, const Octave_object& args)
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
759 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
760 Octave_object retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
761
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
762 if (error_state)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
763 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
764
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
765 int nargin = args.length ();
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
766
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
767 if (fcn)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
768 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
769 eval_fcn:
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
770
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
771 if (any_arg_is_magic_colon (args))
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
772 ::error ("invalid use of colon in function argument list");
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
773 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
774 retval = (*fcn) (args, nargout);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
775 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
776 else if (is_mapper)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
777 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
778 // XXX FIXME XXX -- should we just assume nargin_max == 1?
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
779 //
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
780 // if (nargin > nargin_max)
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
781 // ::error ("%s: too many arguments", my_name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
782 // else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
783 if (nargin > 0 && args(0).is_defined ())
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
784 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
785 tree_constant tmp = apply_mapper_fcn (args(0), mapper_fcn, 0);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
786 retval(0) = tmp;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
787 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
788 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
789 {
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
790 ::error ("%s: too few arguments", my_name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
791 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
792 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
793 else
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
794 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
795 fcn = load_octave_builtin (my_name);
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
796
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
797 if (fcn)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
798 goto eval_fcn;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
799 else
1755
3a9462b655f1 [project @ 1996-01-22 04:47:22 by jwe]
jwe
parents: 1742
diff changeset
800 ::error ("unable to load builtin function %s", my_name.c_str ());
1741
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
801 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
802
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
803 return retval;
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
804 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
805
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
806 void
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
807 tree_builtin::print_code (ostream& os)
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
808 {
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
809 os << my_name << " can't be printed because it is a builtin function\n";
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
810 }
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
811
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
812 /*
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
813 ;;; Local Variables: ***
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
814 ;;; mode: C++ ***
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
815 ;;; page-delimiter: "^/\\*" ***
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
816 ;;; End: ***
6ec1465f60f0 [project @ 1996-01-12 11:09:39 by jwe]
jwe
parents:
diff changeset
817 */