From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5999 invoked by alias); 24 Jul 2012 03:48:50 -0000 Received: (qmail 5991 invoked by uid 22791); 24 Jul 2012 03:48:50 -0000 X-SWARE-Spam-Status: No, hits=-4.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-gg0-f169.google.com (HELO mail-gg0-f169.google.com) (209.85.161.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 24 Jul 2012 03:48:37 +0000 Received: by ggm4 with SMTP id 4so7357155ggm.0 for ; Mon, 23 Jul 2012 20:48:36 -0700 (PDT) Received: by 10.42.165.68 with SMTP id j4mr608111icy.24.1343101716207; Mon, 23 Jul 2012 20:48:36 -0700 (PDT) MIME-Version: 1.0 Received: by 10.231.146.205 with HTTP; Mon, 23 Jul 2012 20:47:55 -0700 (PDT) In-Reply-To: <87k3xusgan.fsf@fleche.redhat.com> References: <500C0A1F.8040106@redhat.com> <87k3xusgan.fsf@fleche.redhat.com> From: Hui Zhu Date: Tue, 24 Jul 2012 03:48:00 -0000 Message-ID: Subject: Re: [PATCH Bug breakpoints/14381] Fix linespec to parse file name that begin with decimal numbers To: Tom Tromey Cc: Keith Seitz , gdb-patches ml Content-Type: text/plain; charset=ISO-8859-1 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-07/txt/msg00476.txt.bz2 On Mon, Jul 23, 2012 at 10:28 PM, Tom Tromey wrote: >>>>>> ">" == Hui Zhu writes: > >>> The string begin with a number is not a error, why handle it as a >>> error? I think that will really make this part obfuscates. >>> What I thought is change the function name to >>> linespec_lexer_lex_number_string to make it clear. > > How about changing linespec_lexer_lex_number to return a boolean > indicating whether it succeeded? This is basically the same idea, but > without introducing a new token. > > Tom Agree with you. Post a new patch according to your comments. Thanks, Hui 2012-07-24 Hui Zhu * linespec.c (linespec_lexer_lex_number): Update comments, change the return and add check to make sure the input is the decimal numbers. (linespec_lexer_lex_one): If linespec_lexer_lex_number return false, call linespec_lexer_lex_string. --- linespec.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) --- a/linespec.c +++ b/linespec.c @@ -366,31 +366,38 @@ static const char *const linespec_quote_ /* Lexer functions. */ /* Lex a number from the input in PARSER. This only supports - decimal numbers. */ + decimal numbers.\ + Return true if input is decimal numbers. Return false if not. */ -static linespec_token -linespec_lexer_lex_number (linespec_parser *parser) +static int +linespec_lexer_lex_number (linespec_parser *parser, linespec_token *tokenp) { linespec_token token; - token.type = LSTOKEN_NUMBER; - LS_TOKEN_STOKEN (token).length = 0; - LS_TOKEN_STOKEN (token).ptr = PARSER_STREAM (parser); + tokenp->type = LSTOKEN_NUMBER; + LS_TOKEN_STOKEN (*tokenp).length = 0; + LS_TOKEN_STOKEN (*tokenp).ptr = PARSER_STREAM (parser); /* Keep any sign at the start of the stream. */ if (*PARSER_STREAM (parser) == '+' || *PARSER_STREAM (parser) == '-') { - ++LS_TOKEN_STOKEN (token).length; + ++LS_TOKEN_STOKEN (*tokenp).length; ++(PARSER_STREAM (parser)); } while (isdigit (*PARSER_STREAM (parser))) { - ++LS_TOKEN_STOKEN (token).length; + ++LS_TOKEN_STOKEN (*tokenp).length; ++(PARSER_STREAM (parser)); } - return token; + if (*PARSER_STREAM (parser) != '\0' && !isspace(*PARSER_STREAM (parser))) + { + PARSER_STREAM (parser) = LS_TOKEN_STOKEN (*tokenp).ptr; + return 0; + } + + return 1; } /* Does P represent one of the keywords? If so, return @@ -724,7 +731,8 @@ linespec_lexer_lex_one (linespec_parser case '+': case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - parser->lexer.current = linespec_lexer_lex_number (parser); + if (!linespec_lexer_lex_number (parser, &(parser->lexer.current))) + parser->lexer.current = linespec_lexer_lex_string (parser); break; case ':':