This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [rfa] linespec.c, part 4
- From: Elena Zannoni <ezannoni at redhat dot com>
- To: David Carlton <carlton at math dot stanford dot edu>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Fri, 15 Nov 2002 16:35:17 -0500
- Subject: Re: [rfa] linespec.c, part 4
- References: <ro18yzyxx65.fsf@jackfruit.Stanford.EDU>
David Carlton writes:
> Here's the next part: pulling out code to make the function
> locate_first_half. Some comments:
>
> * This code modifies the variables 'p' and 'is_quote_enclosed'. I
> decided to treat those asymmetrically: it returns the new value for
> p, whereas it passes is_quote_enclosed by reference. Basically, I'm
> expressing the opinion that this code is "really" calculating p, and
> the fact that it also is convenient to set the flag
> is_quote_enclosed here is kind of an accident. As Elena commented,
> we'll probably eventually want to move is_quote_enclosed up to
> set_flags anyways.
>
yes
> * The code that I extracted initialized 's' to NULL, but didn't touch
> s otherwise; I moved that initialization up to the declaration of s
> inside decode_line_1 instead.
>
yes
> * The code refers to 'p1', which is also referred to elsewhere in
> decode_line_1. But it's not to hard to check that the other uses of
> p1 are unrelated to its use here.
>
ok
thanks. Check it in.
Elena
> David Carlton
> carlton@math.stanford.edu
>
> 2002-11-12 David Carlton <carlton@math.stanford.edu>
>
> * linespec.c (locate_first_half): New function.
> (decode_line_1): Move code into locate_first_half.
>
> Index: linespec.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/linespec.c,v
> retrieving revision 1.28
> diff -u -p -r1.28 linespec.c
> --- linespec.c 11 Nov 2002 23:20:07 -0000 1.28
> +++ linespec.c 12 Nov 2002 22:01:48 -0000
> @@ -46,6 +46,8 @@ static void set_flags (char *arg, int *i
>
> static struct symtabs_and_lines decode_indirect (char **argptr);
>
> +static char *locate_first_half (char **argptr, int *is_quote_enclosed);
> +
> static void cplusplus_error (const char *name, const char *fmt, ...) ATTR_FORMAT (printf, 2, 3);
>
> static int total_number_of_methods (struct type *type);
> @@ -530,11 +532,11 @@ decode_line_1 (char **argptr, int funfir
> struct symtabs_and_lines values;
> struct symtab_and_line val;
> register char *p, *p1;
> - char *q, *ii, *p2;
> + char *q, *p2;
> #if 0
> char *q1;
> #endif
> - register struct symtab *s;
> + register struct symtab *s = NULL;
>
> register struct symbol *sym;
> /* The symtab that SYM was found in. */
> @@ -550,8 +552,8 @@ decode_line_1 (char **argptr, int funfir
> /* This says whether or not something in *ARGPTR is quoted with
> completer_quotes (i.e. with single quotes). */
> int is_quoted;
> + /* Is part of *ARGPTR is enclosed in double quotes? */
> int is_quote_enclosed;
> - int has_comma = 0;
> struct symbol **sym_arr;
> struct type *t;
> char *saved_arg = *argptr;
> @@ -576,84 +578,14 @@ decode_line_1 (char **argptr, int funfir
>
> set_flags (*argptr, &is_quoted, &paren_pointer);
>
> - /* Maybe we were called with a line range FILENAME:LINENUM,FILENAME:LINENUM
> - and we must isolate the first half. Outer layers will call again later
> - for the second half.
> + /* Check to see if it's a multipart linespec (with colons or
> + periods). */
>
> - Don't count commas that appear in argument lists of overloaded
> - functions, or in quoted strings. It's stupid to go to this much
> - trouble when the rest of the function is such an obvious roach hotel. */
> - ii = find_toplevel_char (*argptr, ',');
> - has_comma = (ii != 0);
> + /* Locate the end of the first half of the linespec. */
>
> - /* Temporarily zap out second half to not
> - * confuse the code below.
> - * This is undone below. Do not change ii!!
> - */
> - if (has_comma)
> - {
> - *ii = '\0';
> - }
> + p = locate_first_half (argptr, &is_quote_enclosed);
>
> - /* Maybe arg is FILE : LINENUM or FILE : FUNCTION */
> - /* May also be CLASS::MEMBER, or NAMESPACE::NAME */
> - /* Look for ':', but ignore inside of <> */
> -
> - s = NULL;
> - p = *argptr;
> - if (p[0] == '"')
> - {
> - is_quote_enclosed = 1;
> - (*argptr)++;
> - p++;
> - }
> - else
> - is_quote_enclosed = 0;
> - for (; *p; p++)
> - {
> - if (p[0] == '<')
> - {
> - char *temp_end = find_template_name_end (p);
> - if (!temp_end)
> - error ("malformed template specification in command");
> - p = temp_end;
> - }
> - /* Check for the end of the first half of the linespec. End of line,
> - a tab, a double colon or the last single colon, or a space. But
> - if enclosed in double quotes we do not break on enclosed spaces */
> - if (!*p
> - || p[0] == '\t'
> - || ((p[0] == ':')
> - && ((p[1] == ':') || (strchr (p + 1, ':') == NULL)))
> - || ((p[0] == ' ') && !is_quote_enclosed))
> - break;
> - if (p[0] == '.' && strchr (p, ':') == NULL) /* Java qualified method. */
> - {
> - /* Find the *last* '.', since the others are package qualifiers. */
> - for (p1 = p; *p1; p1++)
> - {
> - if (*p1 == '.')
> - p = p1;
> - }
> - break;
> - }
> - }
> - while (p[0] == ' ' || p[0] == '\t')
> - p++;
> -
> - /* if the closing double quote was left at the end, remove it */
> - if (is_quote_enclosed)
> - {
> - char *closing_quote = strchr (p - 1, '"');
> - if (closing_quote && closing_quote[1] == '\0')
> - *closing_quote = '\0';
> - }
> -
> - /* Now that we've safely parsed the first half,
> - * put back ',' so outer layers can see it
> - */
> - if (has_comma)
> - *ii = ',';
> + /* Does it look like there actually were two parts? */
>
> if ((p[0] == ':' || p[0] == '.') && paren_pointer == NULL)
> {
> @@ -1251,6 +1183,101 @@ decode_indirect (char **argptr)
> values.sals[0].section = find_pc_overlay (pc);
>
> return values;
> +}
> +
> +
> +
> +/* Locate the first half of the linespec, ending in a colon, period,
> + or whitespace. (More or less.) Also, check to see if *ARGPTR is
> + enclosed in double quotes; if so, set is_quote_enclosed, advance
> + ARGPTR past that and zero out the trailing double quote. */
> +
> +static char *
> +locate_first_half (char **argptr, int *is_quote_enclosed)
> +{
> + char *ii;
> + char *p, *p1;
> + int has_comma;
> +
> + /* Maybe we were called with a line range FILENAME:LINENUM,FILENAME:LINENUM
> + and we must isolate the first half. Outer layers will call again later
> + for the second half.
> +
> + Don't count commas that appear in argument lists of overloaded
> + functions, or in quoted strings. It's stupid to go to this much
> + trouble when the rest of the function is such an obvious roach hotel. */
> + ii = find_toplevel_char (*argptr, ',');
> + has_comma = (ii != 0);
> +
> + /* Temporarily zap out second half to not
> + * confuse the code below.
> + * This is undone below. Do not change ii!!
> + */
> + if (has_comma)
> + {
> + *ii = '\0';
> + }
> +
> + /* Maybe arg is FILE : LINENUM or FILE : FUNCTION */
> + /* May also be CLASS::MEMBER, or NAMESPACE::NAME */
> + /* Look for ':', but ignore inside of <> */
> +
> + p = *argptr;
> + if (p[0] == '"')
> + {
> + *is_quote_enclosed = 1;
> + (*argptr)++;
> + p++;
> + }
> + else
> + *is_quote_enclosed = 0;
> + for (; *p; p++)
> + {
> + if (p[0] == '<')
> + {
> + char *temp_end = find_template_name_end (p);
> + if (!temp_end)
> + error ("malformed template specification in command");
> + p = temp_end;
> + }
> + /* Check for the end of the first half of the linespec. End of line,
> + a tab, a double colon or the last single colon, or a space. But
> + if enclosed in double quotes we do not break on enclosed spaces */
> + if (!*p
> + || p[0] == '\t'
> + || ((p[0] == ':')
> + && ((p[1] == ':') || (strchr (p + 1, ':') == NULL)))
> + || ((p[0] == ' ') && !*is_quote_enclosed))
> + break;
> + if (p[0] == '.' && strchr (p, ':') == NULL) /* Java qualified method. */
> + {
> + /* Find the *last* '.', since the others are package qualifiers. */
> + for (p1 = p; *p1; p1++)
> + {
> + if (*p1 == '.')
> + p = p1;
> + }
> + break;
> + }
> + }
> + while (p[0] == ' ' || p[0] == '\t')
> + p++;
> +
> + /* if the closing double quote was left at the end, remove it */
> + if (*is_quote_enclosed)
> + {
> + char *closing_quote = strchr (p - 1, '"');
> + if (closing_quote && closing_quote[1] == '\0')
> + *closing_quote = '\0';
> + }
> +
> + /* Now that we've safely parsed the first half,
> + * put back ',' so outer layers can see it
> + */
> + if (has_comma)
> + *ii = ',';
> +
> + return p;
> }
>
>