| Index: gdb/ada-lex.l
|
| diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l
|
| index 714265ef385ef3d9cf130cf6c9facae91e704847..e9cda4ae27f59f8829d5ee16b3bef35d93b6f137 100644
|
| --- a/gdb/ada-lex.l
|
| +++ b/gdb/ada-lex.l
|
| @@ -1,6 +1,5 @@
|
| /* FLEX lexer for Ada expressions, for GDB.
|
| - Copyright (C) 1994, 1997-1998, 2000-2003, 2007-2012 Free Software
|
| - Foundation, Inc.
|
| + Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -54,6 +53,7 @@ static int processReal (const char *);
|
| static struct stoken processId (const char *, int);
|
| static int processAttribute (const char *);
|
| static int find_dot_all (const char *);
|
| +static void rewind_to_char (int);
|
|
|
| #undef YY_DECL
|
| #define YY_DECL static int yylex ( void )
|
| @@ -158,18 +158,19 @@ static int find_dot_all (const char *);
|
|
|
|
|
| if {
|
| - while (*lexptr != 'i' && *lexptr != 'I')
|
| - lexptr -= 1;
|
| - yyrestart(NULL);
|
| + rewind_to_char ('i');
|
| return 0;
|
| }
|
|
|
| -(task|thread) {
|
| +task {
|
| + rewind_to_char ('t');
|
| + return 0;
|
| + }
|
| +
|
| +thread{WHITE}+{DIG} {
|
| /* This keyword signals the end of the expression and
|
| will be processed separately. */
|
| - while (*lexptr != 't' && *lexptr != 'T')
|
| - lexptr--;
|
| - yyrestart(NULL);
|
| + rewind_to_char ('t');
|
| return 0;
|
| }
|
|
|
| @@ -219,8 +220,7 @@ false { return FALSEKEYWORD; }
|
|
|
| "," { if (paren_depth == 0 && comma_terminates)
|
| {
|
| - lexptr -= 1;
|
| - yyrestart(NULL);
|
| + rewind_to_char (',');
|
| return 0;
|
| }
|
| else
|
| @@ -230,8 +230,7 @@ false { return FALSEKEYWORD; }
|
| "(" { paren_depth += 1; return '('; }
|
| ")" { if (paren_depth == 0)
|
| {
|
| - lexptr -= 1;
|
| - yyrestart(NULL);
|
| + rewind_to_char (')');
|
| return 0;
|
| }
|
| else
|
| @@ -289,7 +288,7 @@ false { return FALSEKEYWORD; }
|
| %%
|
|
|
| #include <ctype.h>
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
|
|
| /* Initialize the lexer for processing new expression. */
|
|
|
| @@ -330,8 +329,7 @@ processInt (const char *base0, const char *num0, const char *exp0)
|
| ULONGEST result;
|
| long exp;
|
| int base;
|
| -
|
| - char *trailer;
|
| + const char *trailer;
|
|
|
| if (base0 == NULL)
|
| base = 10;
|
| @@ -348,7 +346,7 @@ processInt (const char *base0, const char *num0, const char *exp0)
|
| exp = strtol(exp0, (char **) NULL, 10);
|
|
|
| errno = 0;
|
| - result = strtoulst (num0, (const char **) &trailer, base);
|
| + result = strtoulst (num0, &trailer, base);
|
| if (errno == ERANGE)
|
| error (_("Integer literal out of range"));
|
| if (isxdigit(*trailer))
|
| @@ -499,7 +497,8 @@ processString (const char *text, int len)
|
| const char *lim = text + len;
|
| struct stoken result;
|
|
|
| - q = result.ptr = obstack_alloc (&temp_parse_space, len);
|
| + q = obstack_alloc (&temp_parse_space, len);
|
| + result.ptr = q;
|
| p = text;
|
| while (p < lim)
|
| {
|
| @@ -538,19 +537,20 @@ static int
|
| find_dot_all (const char *str)
|
| {
|
| int i;
|
| - for (i = 0; str[i] != '\000'; i += 1)
|
| - {
|
| - if (str[i] == '.')
|
| - {
|
| - int i0 = i;
|
| - do
|
| - i += 1;
|
| - while (isspace (str[i]));
|
| - if (strncmp (str+i, "all", 3) == 0
|
| - && ! isalnum (str[i+3]) && str[i+3] != '_')
|
| - return i0;
|
| - }
|
| - }
|
| +
|
| + for (i = 0; str[i] != '\000'; i++)
|
| + if (str[i] == '.')
|
| + {
|
| + int i0 = i;
|
| +
|
| + do
|
| + i += 1;
|
| + while (isspace (str[i]));
|
| +
|
| + if (strncasecmp (str + i, "all", 3) == 0
|
| + && !isalnum (str[i + 3]) && str[i + 3] != '_')
|
| + return i0;
|
| + }
|
| return -1;
|
| }
|
|
|
| @@ -617,6 +617,23 @@ processAttribute (const char *str)
|
| return attributes[k].code;
|
| }
|
|
|
| +/* Back up lexptr by yyleng and then to the rightmost occurrence of
|
| + character CH, case-folded (there must be one). WARNING: since
|
| + lexptr points to the next input character that Flex has not yet
|
| + transferred to its internal buffer, the use of this function
|
| + depends on the assumption that Flex calls YY_INPUT only when it is
|
| + logically necessary to do so (thus, there is no reading ahead
|
| + farther than needed to identify the next token.) */
|
| +
|
| +static void
|
| +rewind_to_char (int ch)
|
| +{
|
| + lexptr -= yyleng;
|
| + while (toupper (*lexptr) != toupper (ch))
|
| + lexptr -= 1;
|
| + yyrestart (NULL);
|
| +}
|
| +
|
| int
|
| yywrap(void)
|
| {
|
|
|