# HG changeset patch # User jwe # Date 798755706 0 # Node ID db4f4009d6e8cef42a19d776b1e31e91c5d0880a # Parent cbdf7db9855476c5e882b57335ff93d458df7ea8 [project @ 1995-04-24 20:35:06 by jwe] diff -r cbdf7db98554 -r db4f4009d6e8 src/data.cc --- a/src/data.cc Mon Apr 24 15:31:24 1995 +0000 +++ b/src/data.cc Mon Apr 24 20:35:06 1995 +0000 @@ -753,14 +753,11 @@ if (nargin == 2) { retval = 0.0; - if (args(0).is_map ()) + if (args(0).is_map () && args(1).is_string ()) { - if (args(1).is_string ()) - { - Octave_map m = args(0).map_value (); - char *s = args(1).string_value (); - retval = (double) (s && m.contains (s)); - } + char *s = args(1).string_value (); + tree_constant tmp = args(0).lookup_map_element (s, 0, 1); + retval = (double) tmp.is_defined (); } } else diff -r cbdf7db98554 -r db4f4009d6e8 src/pt-const.cc --- a/src/pt-const.cc Mon Apr 24 15:31:24 1995 +0000 +++ b/src/pt-const.cc Mon Apr 24 20:35:06 1995 +0000 @@ -25,6 +25,7 @@ #include #endif +#include #include #include @@ -109,7 +110,40 @@ } tree_constant -tree_constant::lookup_map_element (SLList& list) +tree_constant::lookup_map_element (const char *ref, int insert, + int silent) +{ + tree_constant retval; + + if (ref) + { + char *tmp = strsave (ref); + + SLList list; + + char *beg = tmp; + char *end = 0; + do + { + end = strchr (beg, '.'); + if (end) + *end = '\0'; + + list.append (strsave (beg)); + } + while (end && (beg = end + 1)); + + retval = lookup_map_element (list, insert, silent); + + delete [] tmp; + } + + return retval; +} + +tree_constant +tree_constant::lookup_map_element (SLList& list, int insert, + int silent) { tree_constant retval; @@ -122,7 +156,9 @@ list.next (p); - tree_constant tmp = tmp_rep->lookup_map_element (elt); + tree_constant tmp; + + tmp = tmp_rep->lookup_map_element (elt, insert, silent); if (error_state) break; diff -r cbdf7db98554 -r db4f4009d6e8 src/pt-const.h --- a/src/pt-const.h Mon Apr 24 15:31:24 1995 +0000 +++ b/src/pt-const.h Mon Apr 24 20:35:06 1995 +0000 @@ -255,10 +255,7 @@ // Is at least one of the dimensions of this constant zero? int is_empty (void) const - { - return ((! (is_magic_colon () || is_all_va_args () || is_unknown ())) - && (rows () == 0 || columns () == 0)); - } + { return rep->is_empty (); } // Are the dimensions of this constant zero by zero? @@ -290,7 +287,11 @@ Octave_map map_value (void) const; - tree_constant lookup_map_element (SLList& list); + tree_constant lookup_map_element (const char *ref, int insert = 0, + int silent = 0); + + tree_constant lookup_map_element (SLList& list, + int insert = 0, int silent = 0); ColumnVector vector_value (int force_string_conversion = 0, int force_vector_conversion = 0) const diff -r cbdf7db98554 -r db4f4009d6e8 src/tc-rep.cc --- a/src/tc-rep.cc Mon Apr 24 15:31:24 1995 +0000 +++ b/src/tc-rep.cc Mon Apr 24 20:35:06 1995 +0000 @@ -1081,7 +1081,7 @@ } tree_constant& -TC_REP::lookup_map_element (const char *name, int insert) +TC_REP::lookup_map_element (const char *name, int insert, int silent) { static tree_constant retval; @@ -1093,10 +1093,10 @@ return a_map->contents (idx); else if (insert) return (*a_map) [name]; - else + else if (! silent) error ("structure has no member `%s'", name); } - else + else if (! silent) error ("invalid structure access attempted"); return retval; diff -r cbdf7db98554 -r db4f4009d6e8 src/tc-rep.h --- a/src/tc-rep.h Mon Apr 24 15:31:24 1995 +0000 +++ b/src/tc-rep.h Mon Apr 24 20:35:06 1995 +0000 @@ -176,6 +176,12 @@ int is_true (void) const; + int is_empty (void) const + { + return ((! (is_magic_colon () || is_all_va_args () || is_unknown ())) + && (rows () == 0 || columns () == 0)); + } + double double_value (int force_string_conversion = 0) const; Matrix matrix_value (int force_string_conversion = 0) const; Complex complex_value (int force_string_conversion = 0) const; @@ -184,7 +190,8 @@ Range range_value (void) const; Octave_map map_value (void) const; - tree_constant& lookup_map_element (const char *name, int insert = 0); + tree_constant& lookup_map_element (const char *name, int insert = 0, + int silent = 0); ColumnVector vector_value (int force_string_conversion = 0, int force_vector_conversion = 0) const; diff -r cbdf7db98554 -r db4f4009d6e8 src/variables.cc --- a/src/variables.cc Mon Apr 24 15:31:24 1995 +0000 +++ b/src/variables.cc Mon Apr 24 20:35:06 1995 +0000 @@ -224,14 +224,22 @@ return retval; } - char *name = args(0).string_value (); + char *name = strsave (args(0).string_value ()); if (error_state) { error ("exist: expecting string argument"); + delete [] name; return retval; } + char *struct_elts = strchr (name, '.'); + if (struct_elts) + { + *struct_elts = '\0'; + struct_elts++; + } + symbol_record *sr = curr_sym_tab->lookup (name, 0, 0); if (! sr) sr = global_sym_tab->lookup (name, 0, 0); @@ -239,7 +247,22 @@ retval = 0.0; if (sr && sr->is_variable () && sr->is_defined ()) - retval = 1.0; + { + retval = 1.0; + tree_fvc *def = sr->def (); + if (struct_elts) + { + retval = 0.0; + if (def->is_constant ()) + { + tree_constant *tmp = (tree_constant *) def; + tree_constant ult; + ult = tmp->lookup_map_element (struct_elts, 0, 1); + if (ult.is_defined ()) + retval = 1.0; + } + } + } else if (sr && sr->is_function ()) retval = 2.0; else @@ -258,6 +281,8 @@ } } + delete [] name; + return retval; }