+2013-11-13 Keith Seitz <keiths@redhat.com>
+
+ * p-exp.y (uptok): Make first parameter const.
+ (yylex): Make `tokstart' and `tokptr' const.
+ Don't copy the lexer input to a temporary buffer.
+ Make `p' const.
+ Remove const workaround for parse_escape.
+ Create a temporary buffer for a convenience variable instead
+ of doing in-place modification of the input.
+ If a match is found with a different case from the input,
+ do not change the input at all.
+ Use `tmp' to construct the resultant stoken instead of
+ `tokstart'.
+
2013-11-13 Doug Evans <xdje42@gmail.com>
* breakpoint.c (breakpoint_cond_eval): Fix and enhance comment.
void yyerror (char *);
-static char * uptok (char *, int);
+static char *uptok (const char *, int);
%}
/* Although the yacc "value" of an expression is not used,
/* Allocate uppercased var: */
/* make an uppercased copy of tokstart. */
static char *
-uptok (char *tokstart, int namelen)
+uptok (const char *tokstart, int namelen)
{
int i;
char *uptokstart = (char *)malloc(namelen+1);
int c;
int namelen;
unsigned int i;
- char *tokstart;
+ const char *tokstart;
char *uptokstart;
- char *tokptr;
+ const char *tokptr;
int explen, tempbufindex;
static char *tempbuf;
static int tempbufsize;
prev_lexptr = lexptr;
+ tokstart = lexptr;
explen = strlen (lexptr);
- tokstart = alloca (explen + 1);
- memcpy (tokstart, lexptr, explen + 1);
/* See if it is a special token of length 3. */
if (explen > 2)
{
/* It's a number. */
int got_dot = 0, got_e = 0, toktype;
- char *p = tokstart;
+ const char *p = tokstart;
int hex = input_radix > 10;
if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
/* Do nothing, loop will terminate. */
break;
case '\\':
- {
- const char *s, *o;
-
- o = s = ++tokptr;
- c = parse_escape (parse_gdbarch, &s);
- *tokptr += s - o;
- if (c == -1)
- {
- continue;
- }
- tempbuf[tempbufindex++] = c;
- }
+ ++tokptr;
+ c = parse_escape (parse_gdbarch, &tokptr);
+ if (c == -1)
+ {
+ continue;
+ }
+ tempbuf[tempbufindex++] = c;
break;
default:
tempbuf[tempbufindex++] = *tokptr++;
if (*tokstart == '$')
{
- char c;
+ char *tmp;
+
/* $ is the normal prefix for pascal hexadecimal values
but this conflicts with the GDB use for debugger variables
so in expression to enter hexadecimal values
we still need to use C syntax with 0xff */
write_dollar_variable (yylval.sval);
- c = tokstart[namelen];
- tokstart[namelen] = 0;
- intvar = lookup_only_internalvar (++tokstart);
- --tokstart;
- tokstart[namelen] = c;
+ tmp = alloca (namelen + 1);
+ memcpy (tmp, tokstart, namelen);
+ tmp[namelen] = '\0';
+ intvar = lookup_only_internalvar (tmp + 1);
free (uptokstart);
return VARIABLE;
}
else
sym = lookup_symbol (tmp, expression_context_block,
VAR_DOMAIN, &is_a_field_of_this);
- if (sym || is_a_field_of_this.type != NULL || is_a_field)
- for (i = 0; i <= namelen; i++)
- {
- if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
- tokstart[i] -= ('a'-'A');
- }
}
/* Third chance Capitalized (as GPC does). */
if (!sym && is_a_field_of_this.type == NULL && !is_a_field)
else
sym = lookup_symbol (tmp, expression_context_block,
VAR_DOMAIN, &is_a_field_of_this);
- if (sym || is_a_field_of_this.type != NULL || is_a_field)
- for (i = 0; i <= namelen; i++)
- {
- if (i == 0)
- {
- if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
- tokstart[i] -= ('a'-'A');
- }
- else
- if ((tokstart[i] >= 'A' && tokstart[i] <= 'Z'))
- tokstart[i] -= ('A'-'a');
- }
}
if (is_a_field)
{
tempbuf = (char *) realloc (tempbuf, namelen + 1);
- strncpy (tempbuf, tokstart, namelen); tempbuf [namelen] = 0;
+ strncpy (tempbuf, tmp, namelen);
+ tempbuf [namelen] = 0;
yylval.sval.ptr = tempbuf;
yylval.sval.length = namelen;
free (uptokstart);