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) |
{ |