aboutsummaryrefslogtreecommitdiff
path: root/reader.c
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2023-02-07 17:25:11 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2023-02-07 17:25:11 +0000
commitcba5e8978cf659b3216c47d38f9917403b4df1c4 (patch)
tree9de050055829d5d21a3f79f635455864677e3902 /reader.c
parent5dd99b746d26517ef72ee914e30ece2761079321 (diff)
downloadsrc-cba5e8978cf659b3216c47d38f9917403b4df1c4.tar.gz
src-cba5e8978cf659b3216c47d38f9917403b4df1c4.zip
Diffstat (limited to 'reader.c')
-rw-r--r--reader.c213
1 files changed, 126 insertions, 87 deletions
diff --git a/reader.c b/reader.c
index 3bbf9a79c187..5e8ca67bc648 100644
--- a/reader.c
+++ b/reader.c
@@ -1,4 +1,4 @@
-/* $Id: reader.c,v 1.79 2020/03/30 23:54:13 tom Exp $ */
+/* $Id: reader.c,v 1.91 2022/01/09 18:04:58 tom Exp $ */
#include "defs.h"
@@ -20,6 +20,13 @@
/* this is a hard limit, but seems more than adequate */
#define MAXARGS 20
+#define begin_case(f,n) fprintf(f, "case %d:\n", (int)(n))
+
+#define end_case(f) \
+ fprintf(f, "\n"); \
+ fprintf_lineno(f, 1, ""); \
+ fprintf(f, "break;\n")
+
static void start_rule(bucket *bp, int s_lineno);
#if defined(YYBTYACC)
static void copy_initial_action(void);
@@ -185,7 +192,7 @@ line_directive(void)
else
UNLESS(!isdigit(UCH(ch)));
line_1st = n;
- ld = ldNUM;
+ ld = ldNUM; /* this is needed, but cppcheck says no... */
/* FALLTHRU */
case ldNUM:
if (isdigit(UCH(ch)))
@@ -223,7 +230,7 @@ line_directive(void)
if (ld == ldOK)
{
- size_t need = (size_t) (name_end - name_1st);
+ size_t need = (size_t)(name_end - name_1st);
if ((long)need > (long)input_file_name_len)
{
input_file_name_len = ((need + 1) * 3) / 2;
@@ -261,11 +268,12 @@ static void
get_line(void)
{
FILE *f = input_file;
- int c;
- int i;
do
{
+ int c;
+ int i;
+
if (saw_eof || (c = getc(f)) == EOF)
{
if (line)
@@ -450,7 +458,7 @@ static struct keyword
keywords[] = {
{ "binary", NONASSOC },
{ "code", XCODE },
- { "debug", XXXDEBUG },
+ { "debug", NONPOSIX_DEBUG },
#if defined(YYBTYACC)
{ "destructor", DESTRUCTOR },
#endif
@@ -493,11 +501,12 @@ keyword(void)
{
int c;
char *t_cptr = cptr;
- struct keyword *key;
c = *++cptr;
if (isalpha(UCH(c)))
{
+ struct keyword *key;
+
cinc = 0;
for (;;)
{
@@ -587,7 +596,6 @@ static char *
copy_string(int quote)
{
struct mstring *temp = msnew();
- int c;
struct ainfo a;
a.a_lineno = lineno;
a.a_line = dup_line();
@@ -595,7 +603,8 @@ copy_string(int quote)
for (;;)
{
- c = *cptr++;
+ int c = *cptr++;
+
mputc(temp, c);
if (c == quote)
{
@@ -726,7 +735,7 @@ copy_code(void)
if (pos == -1 || !check_key(pos))
{
syntax_error(lineno, line, cptr);
- return;
+ /*NOTREACHED */
}
}
}
@@ -747,7 +756,8 @@ copy_code(void)
code_mstr = msnew();
}
cline++;
- msprintf(code_mstr, line_format, lineno, input_file_name);
+ if (!lflag)
+ msprintf(code_mstr, line_format, lineno, input_file_name);
for (;;)
{
c = *cptr++;
@@ -758,7 +768,7 @@ copy_code(void)
if (line == NULL)
{
unexpected_EOF();
- return;
+ /*NOTREACHED */
}
continue;
case '\n':
@@ -777,7 +787,7 @@ copy_code(void)
cline++;
}
code_lines[pos].lines = msdone(code_mstr);
- code_lines[pos].num = (size_t) cline;
+ code_lines[pos].num = (size_t)cline;
return;
}
break;
@@ -806,8 +816,7 @@ copy_text(void)
if (line == NULL)
unterminated_text(&a);
}
- if (!lflag)
- fprintf(f, line_format, lineno, input_file_name);
+ fprintf_lineno(f, lineno, input_file_name);
loop:
c = *cptr++;
@@ -898,9 +907,8 @@ copy_union(void)
puts_both("#ifndef YYSTYPE_IS_DECLARED\n");
puts_both("#define YYSTYPE_IS_DECLARED 1\n");
- if (!lflag)
- fprintf(text_file, line_format, lineno, input_file_name);
- puts_both("typedef union");
+ fprintf_lineno(text_file, lineno, input_file_name);
+ puts_both("typedef union YYSTYPE");
depth = 0;
loop:
@@ -1140,19 +1148,23 @@ copy_param(int k)
}
if (buf == 0)
{
- buf_size = (size_t) linesize;
+ buf_size = (size_t)linesize;
buf = TMALLOC(char, buf_size);
+ NO_SPACE(buf);
}
else if (c == '\n')
{
+ char *tmp;
+
get_line();
if (line == NULL)
unexpected_EOF();
--cptr;
- buf_size += (size_t) linesize;
- buf = TREALLOC(char, buf, buf_size);
+ buf_size += (size_t)linesize;
+ tmp = TREALLOC(char, buf, buf_size);
+ NO_SPACE(tmp);
+ buf = tmp;
}
- NO_SPACE(buf);
if (curly)
{
if ((state == 2) && (c == L_CURL))
@@ -1203,13 +1215,21 @@ copy_param(int k)
if (parms[i] == ']')
{
int level = 1;
- while (i >= 0 && level > 0 && parms[i] != '[')
+ while (i >= 0)
{
- if (parms[i] == ']')
+ char ch = parms[i--];
+ if (ch == ']')
+ {
++level;
- else if (parms[i] == '[')
- --level;
- i--;
+ }
+ else if (ch == '[')
+ {
+ if (--level <= 1)
+ {
+ ++i;
+ break;
+ }
+ }
}
if (i <= 0)
unexpected_EOF();
@@ -1433,8 +1453,6 @@ get_literal(void)
static int
is_reserved(char *name)
{
- char *s;
-
if (strcmp(name, ".") == 0 ||
strcmp(name, "$accept") == 0 ||
strcmp(name, "$end") == 0)
@@ -1442,7 +1460,8 @@ is_reserved(char *name)
if (name[0] == '$' && name[1] == '$' && isdigit(UCH(name[2])))
{
- s = name + 3;
+ char *s = name + 3;
+
while (isdigit(UCH(*s)))
++s;
if (*s == NUL)
@@ -1554,7 +1573,7 @@ get_tag(void)
FREE(t_line);
havetags = 1;
- return cache_tag(cache, (size_t) cinc);
+ return cache_tag(cache, (size_t)cinc);
}
#if defined(YYBTYACC)
@@ -1565,7 +1584,7 @@ scan_id(void)
while (IS_NAME2(UCH(*cptr)))
cptr++;
- return cache_tag(b, (size_t) (cptr - b));
+ return cache_tag(b, (size_t)(cptr - b));
}
#endif
@@ -1690,14 +1709,14 @@ static void
declare_argtypes(bucket *bp)
{
char *tags[MAXARGS];
- int args = 0, c;
+ int args = 0;
if (bp->args >= 0)
retyped_warning(bp->name);
cptr++; /* skip open paren */
for (;;)
{
- c = nextc();
+ int c = nextc();
if (c == EOF)
unexpected_EOF();
if (c != '<')
@@ -1792,15 +1811,15 @@ declare_start(void)
static void
read_declarations(void)
{
- int c, k;
-
cache_size = CACHE_SIZE;
cache = TMALLOC(char, cache_size);
NO_SPACE(cache);
for (;;)
{
- c = nextc();
+ int k;
+ int c = nextc();
+
if (c == EOF)
unexpected_EOF();
if (c != '%')
@@ -1877,8 +1896,8 @@ read_declarations(void)
break;
#endif
- case XXXDEBUG:
- /* XXX: FIXME */
+ case NONPOSIX_DEBUG:
+ tflag = 1;
break;
case POSIX_YACC:
@@ -2029,7 +2048,7 @@ parse_id(char *p, char **save)
p++;
if (save)
{
- *save = cache_tag(b, (size_t) (p - b));
+ *save = cache_tag(b, (size_t)(p - b));
}
return p;
}
@@ -2127,7 +2146,7 @@ compile_arg(char **theptr, char *yyvaltag)
{
char *p = *theptr;
struct mstring *c = msnew();
- int i, j, n;
+ int i, n;
Value_t *offsets = NULL, maxoffset;
bucket **rhs;
@@ -2141,7 +2160,9 @@ compile_arg(char **theptr, char *yyvaltag)
}
if (maxoffset > 0)
{
- offsets = TMALLOC(Value_t, maxoffset + 1);
+ int j;
+
+ offsets = TCMALLOC(Value_t, maxoffset + 1);
NO_SPACE(offsets);
for (j = 0, i++; i < nitems; i++)
@@ -2230,7 +2251,7 @@ can_elide_arg(char **theptr, char *yyvaltag)
{
char *p = *theptr;
int rv = 0;
- int i, j, n = 0;
+ int i, n = 0;
Value_t *offsets = NULL, maxoffset = 0;
bucket **rhs;
char *tag = 0;
@@ -2250,7 +2271,9 @@ can_elide_arg(char **theptr, char *yyvaltag)
}
if (maxoffset > 0)
{
- offsets = TMALLOC(Value_t, maxoffset + 1);
+ int j;
+
+ offsets = TCMALLOC(Value_t, maxoffset + 1);
NO_SPACE(offsets);
for (j = 0, i++; i < nitems; i++)
@@ -2370,7 +2393,6 @@ advance_to_start(void)
{
int c;
bucket *bp;
- char *s_cptr;
int s_lineno;
#if defined(YYBTYACC)
char *args = NULL;
@@ -2379,6 +2401,8 @@ advance_to_start(void)
for (;;)
{
+ char *s_cptr;
+
c = nextc();
if (c != '%')
break;
@@ -2457,12 +2481,12 @@ start_rule(bucket *bp, int s_lineno)
static void
end_rule(void)
{
- int i;
-
if (!last_was_action && plhs[nrules]->tag)
{
if (pitem[nitems - 1])
{
+ int i;
+
for (i = nitems - 1; (i > 0) && pitem[i]; --i)
continue;
if (pitem[i + 1] == 0 || pitem[i + 1]->tag != plhs[nrules]->tag)
@@ -2529,11 +2553,10 @@ insert_arg_rule(char *arg, char *tag)
rule = nrules;
insert_arg_cache(code, rule);
trialaction = 1; /* arg rules always run in trial mode */
- fprintf(f, "case %d:\n", rule - 2);
- if (!lflag)
- fprintf(f, line_format, line_number, input_file_name);
- fprintf(f, "%s;\n", code);
- fprintf(f, "break;\n");
+ begin_case(f, rule - 2);
+ fprintf_lineno(f, line_number, input_file_name);
+ fprintf(f, "%s;", code);
+ end_case(f);
insert_empty_rule();
plhs[rule]->tag = cache_tag(tag, strlen(tag));
plhs[rule]->class = ARGUMENT;
@@ -2669,7 +2692,7 @@ copy_action(void)
trialaction = (*cptr == L_BRAC);
#endif
- fprintf(f, "case %d:\n", nrules - 2);
+ begin_case(f, nrules - 2);
#if defined(YYBTYACC)
if (backtrack)
{
@@ -2677,8 +2700,7 @@ copy_action(void)
fprintf(f, " if (!yytrial)\n");
}
#endif
- if (!lflag)
- fprintf(f, line_format, lineno, input_file_name);
+ fprintf_lineno(f, lineno, input_file_name);
if (*cptr == '=')
++cptr;
@@ -2741,10 +2763,12 @@ copy_action(void)
else if (i > maxoffset)
{
dollar_warning(d_lineno, i);
- fprintf(f, "yystack.l_mark[%d].%s", i - maxoffset, tag);
+ fprintf(f, "yystack.l_mark[%ld].%s",
+ (long)(i - maxoffset), tag);
}
else if (offsets)
- fprintf(f, "yystack.l_mark[%d].%s", offsets[i], tag);
+ fprintf(f, "yystack.l_mark[%ld].%s",
+ (long)offsets[i], tag);
FREE(d_line);
goto loop;
}
@@ -2802,7 +2826,7 @@ copy_action(void)
tag = rhs[offsets[i]]->tag;
if (tag == 0)
untyped_rhs(i, rhs[offsets[i]]->name);
- fprintf(f, "yystack.l_mark[%d].%s", offsets[i], tag);
+ fprintf(f, "yystack.l_mark[%ld].%s", (long)offsets[i], tag);
}
else
{
@@ -2811,10 +2835,10 @@ copy_action(void)
else if (i > maxoffset)
{
dollar_warning(lineno, i);
- fprintf(f, "yystack.l_mark[%d]", i - maxoffset);
+ fprintf(f, "yystack.l_mark[%ld]", (long)(i - maxoffset));
}
else if (offsets)
- fprintf(f, "yystack.l_mark[%d]", offsets[i]);
+ fprintf(f, "yystack.l_mark[%ld]", (long)offsets[i]);
}
goto loop;
}
@@ -2920,12 +2944,11 @@ copy_action(void)
if (c == L_CURL && !haveyyval)
{
fprintf(f, " if (!yytrial)\n");
- if (!lflag)
- fprintf(f, line_format, lineno, input_file_name);
+ fprintf_lineno(f, lineno, input_file_name);
trialaction = 0;
goto loop;
}
- fprintf(f, "\nbreak;\n");
+ end_case(f);
FREE(a.a_line);
if (maxoffset > 0)
FREE(offsets);
@@ -2945,7 +2968,7 @@ copy_action(void)
case ';':
if (depth > 0)
goto loop;
- fprintf(f, "\nbreak;\n");
+ end_case(f);
free(a.a_line);
if (maxoffset > 0)
FREE(offsets);
@@ -2982,13 +3005,12 @@ copy_action(void)
if (c == L_CURL && !haveyyval)
{
fprintf(f, " if (!yytrial)\n");
- if (!lflag)
- fprintf(f, line_format, lineno, input_file_name);
+ fprintf_lineno(f, lineno, input_file_name);
goto loop;
}
}
#endif
- fprintf(f, "\nbreak;\n");
+ end_case(f);
free(a.a_line);
if (maxoffset > 0)
FREE(offsets);
@@ -3150,7 +3172,6 @@ static void
copy_destructor(void)
{
char *code_text;
- int c;
struct ainfo a;
bucket *bp;
@@ -3158,7 +3179,7 @@ copy_destructor(void)
for (;;)
{
- c = nextc();
+ int c = nextc();
if (c == EOF)
unexpected_EOF();
if (c == '<')
@@ -3337,6 +3358,16 @@ mark_symbol(void)
((c = cptr[4]) == 'c' || c == 'C') &&
((c = cptr[5], !IS_IDENT(c))))
cptr += 5;
+ else if ((c == 'e' || c == 'E') &&
+ ((c = cptr[2]) == 'm' || c == 'M') &&
+ ((c = cptr[3]) == 'p' || c == 'P') &&
+ ((c = cptr[4]) == 't' || c == 'T') &&
+ ((c = cptr[5]) == 'y' || c == 'Y') &&
+ ((c = cptr[6], !IS_IDENT(c))))
+ {
+ cptr += 6;
+ return (1);
+ }
else
syntax_error(lineno, line, cptr);
@@ -3362,14 +3393,13 @@ mark_symbol(void)
static void
read_grammar(void)
{
- int c;
-
initialize_grammar();
advance_to_start();
for (;;)
{
- c = nextc();
+ int c = nextc();
+
if (c == EOF)
break;
if (isalpha(UCH(c))
@@ -3378,13 +3408,17 @@ read_grammar(void)
|| c == '$'
|| c == '\''
|| c == '"')
+ {
add_symbol();
+ }
+ else if (c == L_CURL || c == '='
#if defined(YYBTYACC)
- else if (c == L_CURL || c == '=' || (backtrack && c == L_BRAC))
-#else
- else if (c == L_CURL || c == '=')
+ || (backtrack && c == L_BRAC)
#endif
+ )
+ {
copy_action();
+ }
else if (c == '|')
{
end_rule();
@@ -3426,7 +3460,8 @@ static void
pack_names(void)
{
bucket *bp;
- char *p, *s, *t;
+ char *p;
+ char *t;
name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */
for (bp = first_symbol; bp; bp = bp->next)
@@ -3440,8 +3475,9 @@ pack_names(void)
t = name_pool + 13;
for (bp = first_symbol; bp; bp = bp->next)
{
+ char *s = bp->name;
+
p = t;
- s = bp->name;
while ((*t++ = *s++) != 0)
continue;
FREE(bp->name);
@@ -3470,14 +3506,14 @@ check_symbols(void)
static void
protect_string(char *src, char **des)
{
- unsigned len;
- char *s;
- char *d;
-
*des = src;
if (src)
{
- len = 1;
+ char *s;
+ char *d;
+
+ unsigned len = 1;
+
s = src;
while (*s)
{
@@ -3688,8 +3724,6 @@ pack_grammar(void)
{
int i;
Value_t j;
- Assoc_t assoc;
- Value_t prec2;
ritem = TMALLOC(Value_t, nitems);
NO_SPACE(ritem);
@@ -3720,6 +3754,9 @@ pack_grammar(void)
j = 4;
for (i = 3; i < nrules; ++i)
{
+ Assoc_t assoc;
+ Value_t prec2;
+
#if defined(YYBTYACC)
if (plhs[i]->args > 0)
{
@@ -3811,11 +3848,11 @@ finalize_destructors(void)
{
int i;
bucket *bp;
- char *tag;
for (i = 2; i < nsyms; ++i)
{
- tag = symbol_type_tag[i];
+ char *tag = symbol_type_tag[i];
+
if (symbol_destructor[i] == NULL)
{
if (tag == NULL)
@@ -3849,8 +3886,10 @@ finalize_destructors(void)
}
else
{ /* replace "$$" with "(*val)[.tag]" in destructor code */
+ char *destructor_source = symbol_destructor[i];
symbol_destructor[i]
- = process_destructor_XX(symbol_destructor[i], tag);
+ = process_destructor_XX(destructor_source, tag);
+ FREE(destructor_source);
}
}
/* 'symbol_type_tag[]' elements are freed by 'free_tags()' */