This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[rfa] linespec.c, part 6


Here's the next part of the exciting linespec series of patches.  This
one factors out the code dealing with filenames into a function
symtab_from_filename.  (And it gets rid of a few register
declarations, but never mind that.)

I didn't change the code when I extracted it, so the only thing to be
careful about is uses of variables.  The code that I extracted does
modify 'p', but 'p' isn't referenced again in decode_line_1 until the
code following the comment starting with "Arg token is not digits";
and every branch of the conditional following that comment resets 'p'
from scratch.  Similarly, the code that I extracted modifies 'copy',
but one can easily check that the value of 'copy' is reset later.

David Carlton
carlton@math.stanford.edu

2002-12-05  David Carlton  <carlton@math.stanford.edu>

	* linespec.c (symtab_from_filename): New function.
	(decode_line_1): Move code into symtab_from_filename.

Index: linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.30
diff -u -p -r1.30 linespec.c
--- linespec.c	5 Dec 2002 22:25:49 -0000	1.30
+++ linespec.c	6 Dec 2002 00:15:06 -0000
@@ -70,6 +70,9 @@ static char *find_toplevel_char (char *s
 static struct symtabs_and_lines decode_line_2 (struct symbol *[],
 					       int, int, char ***);
 
+static struct symtab *symtab_from_filename (char **argptr,
+					    char *p, int is_quote_enclosed);
+
 static struct
 symtabs_and_lines symbol_found (int funfirstline,
 				char ***canonical,
@@ -539,15 +542,15 @@ decode_line_1 (char **argptr, int funfir
 {
   struct symtabs_and_lines values;
   struct symtab_and_line val;
-  register char *p, *p1;
+  char *p;
   char *q;
-  register struct symtab *s = NULL;
+  struct symtab *s = NULL;
 
-  register struct symbol *sym;
+  struct symbol *sym;
   /* The symtab that SYM was found in.  */
   struct symtab *sym_symtab;
 
-  register struct minimal_symbol *msymbol;
+  struct minimal_symbol *msymbol;
   char *copy;
   /* This is NULL if there are no parens in *ARGPTR, or a pointer to
      the closing parenthesis if there are parens.  */
@@ -591,40 +594,17 @@ decode_line_1 (char **argptr, int funfir
     {
       if (is_quoted)
 	*argptr = *argptr + 1;
+      
+      /* Is it a C++ or Java compound data structure?  */
+
       if (p[0] == '.' || p[1] == ':')
-	/*  C++ */
-	/*  ... or Java */
 	return decode_compound (argptr, funfirstline, canonical,
 				saved_arg, p);
 
-      /* Extract the file name.  */
-      p1 = p;
-      while (p != *argptr && p[-1] == ' ')
-	--p;
-      if ((*p == '"') && is_quote_enclosed)
-	--p;
-      copy = (char *) alloca (p - *argptr + 1);
-      memcpy (copy, *argptr, p - *argptr);
-      /* It may have the ending quote right after the file name */
-      if (is_quote_enclosed && copy[p - *argptr - 1] == '"')
-	copy[p - *argptr - 1] = 0;
-      else
-	copy[p - *argptr] = 0;
-
-      /* Find that file's data.  */
-      s = lookup_symtab (copy);
-      if (s == 0)
-	{
-	  if (!have_full_symbols () && !have_partial_symbols ())
-	    error ("No symbol table is loaded.  Use the \"file\" command.");
-	  error ("No source file named %s.", copy);
-	}
+      /* No, the first part is a filename; set s to be that file's
+	 symtab.  Also, move argptr past the filename.  */
 
-      /* Discard the file name from the arg.  */
-      p = p1 + 1;
-      while (*p == ' ' || *p == '\t')
-	p++;
-      *argptr = p;
+      s = symtab_from_filename (argptr, p, is_quote_enclosed);
     }
 #if 0
   /* No one really seems to know why this was added. It certainly
@@ -1317,6 +1297,50 @@ decode_compound (char **argptr, int funf
 		   "Can't find member of namespace, class, struct, or union named \"%s\"\n",
 		   copy);
 }
+
+
+
+/* Return the symtab associated to the filename given by the substring
+   of *ARGPTR ending at P, and advance ARGPTR past that filename.  */
+
+static struct symtab *
+symtab_from_filename (char **argptr, char *p, int is_quote_enclosed)
+{
+  char *p1;
+  char *copy;
+  struct symtab *s;
+  
+  p1 = p;
+  while (p != *argptr && p[-1] == ' ')
+    --p;
+  if ((*p == '"') && is_quote_enclosed)
+    --p;
+  copy = (char *) alloca (p - *argptr + 1);
+  memcpy (copy, *argptr, p - *argptr);
+  /* It may have the ending quote right after the file name */
+  if (is_quote_enclosed && copy[p - *argptr - 1] == '"')
+    copy[p - *argptr - 1] = 0;
+  else
+    copy[p - *argptr] = 0;
+
+  /* Find that file's data.  */
+  s = lookup_symtab (copy);
+  if (s == 0)
+    {
+      if (!have_full_symbols () && !have_partial_symbols ())
+	error ("No symbol table is loaded.  Use the \"file\" command.");
+      error ("No source file named %s.", copy);
+    }
+
+  /* Discard the file name from the arg.  */
+  p = p1 + 1;
+  while (*p == ' ' || *p == '\t')
+    p++;
+  *argptr = p;
+
+  return s;
+}
+
 
 
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]