diff src/variables.cc @ 2921:64dd86522a1d

[project @ 1997-05-02 02:52:54 by jwe]
author jwe
date Fri, 02 May 1997 02:52:55 +0000
parents 057273789b87
children 66ef74ee5d9f
line wrap: on
line diff
--- a/src/variables.cc	Thu May 01 19:19:58 1997 +0000
+++ b/src/variables.cc	Fri May 02 02:52:55 1997 +0000
@@ -318,6 +318,153 @@
   return retval;
 }
 
+string_vector
+get_struct_elts (const string& text)
+{
+  int n = 1;
+
+  size_t pos = 0;
+
+  size_t len = text.length ();
+
+  while ((pos = text.find ('.', pos)) != NPOS)
+    {
+      if (++pos == len)
+	break;
+
+      n++;
+    }
+
+  string_vector retval (n);
+
+  pos = 0;
+
+  for (int i = 0; i < n; i++)
+    {
+      size_t len = text.find ('.', pos);
+
+      if (len != NPOS)
+	len -= pos;
+
+      retval[i] = text.substr (pos, len);
+
+      if (len != NPOS)
+	pos += len + 1;
+    }
+
+  return retval;
+}
+
+string_vector
+generate_struct_completions (const string& text, string& prefix, string& hint)
+{
+  string_vector names;
+
+  size_t pos = text.rfind ('.');
+
+  string id;
+  string_vector elts;
+
+  if (pos == NPOS)
+    {
+      hint = text;
+      prefix = text;
+      elts.resize (1, text);
+    }
+  else
+    {
+      if (pos == text.length ())
+	hint = "";
+      else
+	hint = text.substr (pos+1);
+
+      prefix = text.substr (0, pos);
+
+      elts = get_struct_elts (prefix);
+    }
+
+  id = elts[0];
+
+  symbol_record *sr = curr_sym_tab->lookup (id);
+
+  if (! sr)
+    sr = global_sym_tab->lookup (id);
+
+  if (sr && sr->is_defined ())
+    {
+      octave_symbol *tmp = sr->def ();
+
+      octave_value vtmp;
+
+      if (tmp->is_constant ())
+	vtmp = tmp->eval ();
+
+      if (vtmp.is_map ())
+	{
+	  for (int i = 1; i < elts.length (); i++)
+	    {
+	      vtmp = vtmp.struct_elt_val (elts[i], true);
+
+	      if (! vtmp.is_map ())
+		break;
+	    }
+
+	  if (vtmp.is_map ())
+	    {
+	      Octave_map m = vtmp.map_value ();
+
+	      names = m.make_name_list ();
+	    }
+	}
+    }
+
+  return names;
+}
+
+bool
+looks_like_struct (const string& text)
+{
+  bool retval = true;
+
+  string_vector elts = get_struct_elts (text);
+
+  string id = elts[0];
+
+  symbol_record *sr = curr_sym_tab->lookup (id);
+
+  if (! sr)
+    sr = global_sym_tab->lookup (id);
+
+  if (sr && sr->is_defined ())
+    {
+      octave_symbol *tmp = sr->def ();
+
+      octave_value vtmp;
+
+      if (tmp->is_constant ())
+	vtmp = tmp->eval ();
+
+      if (vtmp.is_map ())
+	{
+	  for (int i = 1; i < elts.length (); i++)
+	    {
+	      vtmp = vtmp.struct_elt_val (elts[i], true);
+
+	      if (! vtmp.is_map ())
+		{
+		  retval = false;
+		  break;
+		}
+	    }
+	}
+      else
+	retval = false;
+    }
+  else
+    retval = false;
+
+  return retval;	
+}
 
 DEFUN (is_global, args, ,
   "is_global (X): return 1 if the string X names a global variable\n\