From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14280 invoked by alias); 11 Dec 2002 19:56:22 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 14273 invoked from network); 11 Dec 2002 19:56:21 -0000 Received: from unknown (HELO jackfruit.Stanford.EDU) (171.64.38.136) by sources.redhat.com with SMTP; 11 Dec 2002 19:56:21 -0000 Received: (from carlton@localhost) by jackfruit.Stanford.EDU (8.11.6/8.11.6) id gBBJuKZ22447; Wed, 11 Dec 2002 11:56:20 -0800 X-Authentication-Warning: jackfruit.Stanford.EDU: carlton set sender to carlton@math.stanford.edu using -f To: gdb-patches@sources.redhat.com Cc: Elena Zannoni Subject: [rfa] linespec.c, part 7 From: David Carlton Date: Wed, 11 Dec 2002 12:07:00 -0000 Message-ID: User-Agent: Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Common Lisp) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-12/txt/msg00363.txt.bz2 Here's the next linespec.c patch; it handles the case where the argument is numeric. It's quite straightforward: I basically just moved some code to a separate function. I also copied the declarations of 'val' and 'values', from decode_line_1, together with the 'init_sal(&val);' call. David Carlton carlton@math.stanford.edu 2002-12-11 David Carlton * linespec.c (decode_line_1): Move code into decode_all_digits. (decode_all_digits): New function. Index: linespec.c =================================================================== RCS file: /cvs/src/src/gdb/linespec.c,v retrieving revision 1.31 diff -u -p -r1.31 linespec.c --- linespec.c 9 Dec 2002 19:49:00 -0000 1.31 +++ linespec.c 11 Dec 2002 19:51:32 -0000 @@ -74,6 +74,14 @@ static struct symtab *symtab_from_filena char *p, int is_quote_enclosed); static struct +symtabs_and_lines decode_all_digits (char **argptr, + struct symtab *default_symtab, + int default_line, + char ***canonical, + struct symtab *s, + char *q); + +static struct symtabs_and_lines symbol_found (int funfirstline, char ***canonical, char *copy, @@ -653,77 +661,9 @@ decode_line_1 (char **argptr, int funfir q++; if (q != *argptr && (*q == 0 || *q == ' ' || *q == '\t' || *q == ',')) - { - /* We found a token consisting of all digits -- at least one digit. */ - enum sign - { - none, plus, minus - } - sign = none; - - /* We might need a canonical line spec if no file was specified. */ - int need_canonical = (s == 0) ? 1 : 0; - - /* This is where we need to make sure that we have good defaults. - We must guarantee that this section of code is never executed - when we are called with just a function name, since - set_default_source_symtab_and_line uses - select_source_symtab that calls us with such an argument */ - - if (s == 0 && default_symtab == 0) - { - /* Make sure we have at least a default source file. */ - set_default_source_symtab_and_line (); - initialize_defaults (&default_symtab, &default_line); - } - - if (**argptr == '+') - sign = plus, (*argptr)++; - else if (**argptr == '-') - sign = minus, (*argptr)++; - val.line = atoi (*argptr); - switch (sign) - { - case plus: - if (q == *argptr) - val.line = 5; - if (s == 0) - val.line = default_line + val.line; - break; - case minus: - if (q == *argptr) - val.line = 15; - if (s == 0) - val.line = default_line - val.line; - else - val.line = 1; - break; - case none: - break; /* No need to adjust val.line. */ - } - - while (*q == ' ' || *q == '\t') - q++; - *argptr = q; - if (s == 0) - s = default_symtab; - - /* It is possible that this source file has more than one symtab, - and that the new line number specification has moved us from the - default (in s) to a new one. */ - val.symtab = find_line_symtab (s, val.line, NULL, NULL); - if (val.symtab == 0) - val.symtab = s; - - val.pc = 0; - values.sals = (struct symtab_and_line *) - xmalloc (sizeof (struct symtab_and_line)); - values.sals[0] = val; - values.nelts = 1; - if (need_canonical) - build_canonical_line_spec (values.sals, NULL, canonical); - return values; - } + /* We found a token consisting of all digits -- at least one digit. */ + return decode_all_digits (argptr, default_symtab, default_line, + canonical, s, q); /* Arg token is not digits => try it as a variable name Find the next token (everything up to end or next whitespace). */ @@ -1341,6 +1281,92 @@ symtab_from_filename (char **argptr, cha return s; } + + +/* This decodes a line where the argument is all digits (possibly + preceded by a sign). Q should point to the end of those digits; + the other arguments are as usual. */ + +static struct symtabs_and_lines +decode_all_digits (char **argptr, struct symtab *default_symtab, + int default_line, char ***canonical, + struct symtab *s, char *q) + +{ + struct symtabs_and_lines values; + struct symtab_and_line val; + + enum sign + { + none, plus, minus + } + sign = none; + + /* We might need a canonical line spec if no file was specified. */ + int need_canonical = (s == 0) ? 1 : 0; + + init_sal (&val); + + /* This is where we need to make sure that we have good defaults. + We must guarantee that this section of code is never executed + when we are called with just a function name, since + set_default_source_symtab_and_line uses + select_source_symtab that calls us with such an argument */ + + if (s == 0 && default_symtab == 0) + { + /* Make sure we have at least a default source file. */ + set_default_source_symtab_and_line (); + initialize_defaults (&default_symtab, &default_line); + } + + if (**argptr == '+') + sign = plus, (*argptr)++; + else if (**argptr == '-') + sign = minus, (*argptr)++; + val.line = atoi (*argptr); + switch (sign) + { + case plus: + if (q == *argptr) + val.line = 5; + if (s == 0) + val.line = default_line + val.line; + break; + case minus: + if (q == *argptr) + val.line = 15; + if (s == 0) + val.line = default_line - val.line; + else + val.line = 1; + break; + case none: + break; /* No need to adjust val.line. */ + } + + while (*q == ' ' || *q == '\t') + q++; + *argptr = q; + if (s == 0) + s = default_symtab; + + /* It is possible that this source file has more than one symtab, + and that the new line number specification has moved us from the + default (in s) to a new one. */ + val.symtab = find_line_symtab (s, val.line, NULL, NULL); + if (val.symtab == 0) + val.symtab = s; + + val.pc = 0; + values.sals = (struct symtab_and_line *) + xmalloc (sizeof (struct symtab_and_line)); + values.sals[0] = val; + values.nelts = 1; + if (need_canonical) + build_canonical_line_spec (values.sals, NULL, canonical); + return values; +}