diff src/variables.cc @ 3681:df54d394acc0

[project @ 2000-06-26 17:46:58 by jwe]
author jwe
date Mon, 26 Jun 2000 17:47:00 +0000
parents 8cea69ad95ae
children f9ea3dcf58ee
line wrap: on
line diff
--- a/src/variables.cc	Thu Jun 08 20:06:17 2000 +0000
+++ b/src/variables.cc	Mon Jun 26 17:47:00 2000 +0000
@@ -1078,6 +1078,31 @@
 
 // Deleting names from the symbol tables.
 
+static inline bool
+var_matches_any_pattern (const std::string& nm,
+			 const string_vector& argv, int argc, int idx)
+{
+  bool retval = false;
+
+  for (int k = idx; k < argc; k++)
+    {
+      std::string patstr = argv[k];
+
+      if (! patstr.empty ())
+	{
+	  glob_match pattern (patstr);
+
+	  if (pattern.match (nm))
+	    {
+	      retval = true;
+	      break;
+	    }
+	}
+    }
+
+  return retval;
+}
+
 DEFUN_TEXT (clear, args, ,
   "-*- texinfo -*-\n\
 @deffn {Command} clear [-x] pattern @dots{}\n\
@@ -1181,46 +1206,94 @@
       // pattern matching code if the string doesn't contain any
       // globbing patterns.
 
-      for (int k = idx; k < argc; k++)
+      if (exclusive)
 	{
-	  std::string patstr = argv[k];
+	  int lcount = lvars.length ();
+
+	  for (int i = 0; i < lcount; i++)
+	    {
+	      std::string nm = lvars[i];
 
-	  if (! patstr.empty ())
+	      if (! var_matches_any_pattern (nm, argv, argc, idx))
+		curr_sym_tab->clear (nm);
+	    }
+
+	  int gcount = gvars.length ();
+
+	  for (int i = 0; i < gcount; i++)
 	    {
-	      glob_match pattern (patstr);
+	      std::string nm = gvars[i];
 
-	      int lcount = lvars.length ();
-
-	      for (int i = 0; i < lcount; i++)
+	      if (! var_matches_any_pattern (nm, argv, argc, idx))
 		{
-		  std::string nm = lvars[i];
-		  int match = pattern.match (nm);
-		  if ((exclusive && ! match) || (! exclusive && match))
-		    curr_sym_tab->clear (nm);
+		  int count = curr_sym_tab->clear (nm);
+
+		  if (count > 0)
+		    global_sym_tab->clear (nm, clear_user_functions);
 		}
+	    }
+
+	  int fcount = fcns.length ();
+
+	  for (int i = 0; i < fcount; i++)
+	    {
+	      std::string nm = fcns[i];
+
+	      if (! var_matches_any_pattern (nm, argv, argc, idx))
+		{
+		  curr_sym_tab->clear (nm);
 
-	      int gcount = gvars.length ();
-	      for (int i = 0; i < gcount; i++)
+		  global_sym_tab->clear (nm, clear_user_functions);
+		}
+	    }
+	}
+      else
+	{
+	  for (int k = idx; k < argc; k++)
+	    {
+	      std::string patstr = argv[k];
+
+	      if (! patstr.empty ())
 		{
-		  std::string nm = gvars[i];
-		  int match = pattern.match (nm);
-		  if ((exclusive && ! match) || (! exclusive && match))
+		  glob_match pattern (patstr);
+
+		  int lcount = lvars.length ();
+
+		  for (int i = 0; i < lcount; i++)
 		    {
-		      int count = curr_sym_tab->clear (nm);
-		      if (count > 0)
-			global_sym_tab->clear (nm, clear_user_functions);
+		      std::string nm = lvars[i];
+
+		      if (pattern.match (nm))
+			curr_sym_tab->clear (nm);
 		    }
-		}
+
+		  int gcount = gvars.length ();
+
+		  for (int i = 0; i < gcount; i++)
+		    {
+		      std::string nm = gvars[i];
+
+		      if (pattern.match (nm))
+			{
+			  int count = curr_sym_tab->clear (nm);
 
-	      int fcount = fcns.length ();
-	      for (int i = 0; i < fcount; i++)
-		{
-		  std::string nm = fcns[i];
-		  int match = pattern.match (nm);
-		  if ((exclusive && ! match) || (! exclusive && match))
+			  if (count > 0)
+			    global_sym_tab->clear (nm, clear_user_functions);
+			}
+		    }
+
+		  int fcount = fcns.length ();
+
+		  for (int i = 0; i < fcount; i++)
 		    {
-		      curr_sym_tab->clear (nm);
-		      global_sym_tab->clear (nm, clear_user_functions);
+		      std::string nm = fcns[i];
+
+		      if (pattern.match (nm))
+			{
+			  curr_sym_tab->clear (nm);
+
+			  global_sym_tab->clear (nm, clear_user_functions);
+			}
 		    }
 		}
 	    }