From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24710 invoked by alias); 19 Dec 2002 15:42:09 -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 24701 invoked from network); 19 Dec 2002 15:42:08 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by 209.249.29.67 with SMTP; 19 Dec 2002 15:42:08 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id gBJFFcg01283 for ; Thu, 19 Dec 2002 10:15:38 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id gBJFft227941 for ; Thu, 19 Dec 2002 10:41:55 -0500 Received: from localhost.redhat.com (romulus-int.sfbay.redhat.com [172.16.27.46]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id gBJFfsL04977; Thu, 19 Dec 2002 10:41:54 -0500 Received: by localhost.redhat.com (Postfix, from userid 469) id 1151CFF79; Thu, 19 Dec 2002 10:46:22 -0500 (EST) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15873.59853.959643.486121@localhost.redhat.com> Date: Thu, 19 Dec 2002 08:46:00 -0000 To: David Carlton Cc: gdb-patches@sources.redhat.com, Elena Zannoni Subject: Re: [rfa] linespec.c, part 7 In-Reply-To: References: X-SW-Source: 2002-12/txt/msg00549.txt.bz2 David Carlton writes: > 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. > Ok. Elena > 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; > +} > > >