Module Name: src Committed By: christos Date: Sun Jan 4 01:34:20 UTC 2015
Modified Files: src/external/bsd/byacc/dist: btyaccpar.c defs.h error.c main.c mstring.c output.c reader.c yaccpar.c src/external/bsd/byacc/include: config.h Log Message: Implement some more bison features (incomplete!!!) This handles the mesa/gallium parser but the %error-verbose part needs a little more work. To generate a diff of this commit: cvs rdiff -u -r1.1.1.1 -r1.2 src/external/bsd/byacc/dist/btyaccpar.c \ src/external/bsd/byacc/dist/yaccpar.c cvs rdiff -u -r1.8 -r1.9 src/external/bsd/byacc/dist/defs.h cvs rdiff -u -r1.9 -r1.10 src/external/bsd/byacc/dist/error.c cvs rdiff -u -r1.10 -r1.11 src/external/bsd/byacc/dist/main.c \ src/external/bsd/byacc/dist/reader.c cvs rdiff -u -r1.2 -r1.3 src/external/bsd/byacc/dist/mstring.c cvs rdiff -u -r1.11 -r1.12 src/external/bsd/byacc/dist/output.c cvs rdiff -u -r1.3 -r1.4 src/external/bsd/byacc/include/config.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/byacc/dist/btyaccpar.c diff -u src/external/bsd/byacc/dist/btyaccpar.c:1.1.1.1 src/external/bsd/byacc/dist/btyaccpar.c:1.2 --- src/external/bsd/byacc/dist/btyaccpar.c:1.1.1.1 Sat Jan 3 17:58:23 2015 +++ src/external/bsd/byacc/dist/btyaccpar.c Sat Jan 3 20:34:20 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: btyaccpar.c,v 1.1.1.1 2015/01/03 22:58:23 christos Exp $ */ +/* $NetBSD: btyaccpar.c,v 1.2 2015/01/04 01:34:20 christos Exp $ */ /* This file generated automatically using * @Id: skel2c,v 1.3 2014/04/06 19:48:04 tom Exp @ @@ -451,6 +451,10 @@ const char *const body_2[] = " fprintf(stderr, \"%sdebug[<# of symbols on state stack>]\\n\", YYPREFIX);", "#endif", "", + 0 +}; + +const char *const body_3[] = { #if defined(YYBTYACC) "#if YYBTYACC", " yyps = yyNewState(0); if (yyps == 0) goto yyenomem;", Index: src/external/bsd/byacc/dist/yaccpar.c diff -u src/external/bsd/byacc/dist/yaccpar.c:1.1.1.1 src/external/bsd/byacc/dist/yaccpar.c:1.2 --- src/external/bsd/byacc/dist/yaccpar.c:1.1.1.1 Sat Jan 3 17:58:23 2015 +++ src/external/bsd/byacc/dist/yaccpar.c Sat Jan 3 20:34:20 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: yaccpar.c,v 1.1.1.1 2015/01/03 22:58:23 christos Exp $ */ +/* $NetBSD: yaccpar.c,v 1.2 2015/01/04 01:34:20 christos Exp $ */ /* This file generated automatically using * @Id: skel2c,v 1.3 2014/04/06 19:48:04 tom Exp @ @@ -211,6 +211,11 @@ const char *const body_2[] = " }", "#endif", "", + 0, +}; + +const char *const body_3[] = +{ " yynerrs = 0;", " yyerrflag = 0;", " yychar = YYEMPTY;", Index: src/external/bsd/byacc/dist/defs.h diff -u src/external/bsd/byacc/dist/defs.h:1.8 src/external/bsd/byacc/dist/defs.h:1.9 --- src/external/bsd/byacc/dist/defs.h:1.8 Sat Jan 3 18:22:52 2015 +++ src/external/bsd/byacc/dist/defs.h Sat Jan 3 20:34:20 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: defs.h,v 1.8 2015/01/03 23:22:52 christos Exp $ */ +/* $NetBSD: defs.h,v 1.9 2015/01/04 01:34:20 christos Exp $ */ #if HAVE_NBTOOL_CONFIG_H #include "nbtool_config.h" @@ -123,10 +123,13 @@ #define LEX_PARAM 14 #define POSIX_YACC 15 #define TOKEN_TABLE 16 +#define ERROR_VERBOSE 17 +#define XXXDEBUG 18 #if defined(YYBTYACC) -#define LOCATIONS 17 -#define DESTRUCTOR 18 +#define LOCATIONS 19 +#define DESTRUCTOR 20 +#define INITIAL_ACTION 21 #endif /* symbol classes */ @@ -292,10 +295,12 @@ extern int outline; extern int exit_code; extern int pure_parser; extern int token_table; +extern int error_verbose; #if defined(YYBTYACC) extern int locations; extern int backtrack; extern int destructor; +extern char *initial_action; #endif extern const char *const banner[]; @@ -308,6 +313,7 @@ extern const char *const hdr_vars[]; extern const char *const body_1[]; extern const char *const body_vars[]; extern const char *const body_2[]; +extern const char *const body_3[]; extern const char *const trailer[]; extern char *code_file_name; @@ -432,7 +438,12 @@ extern void at_error(int a_lineno, char extern void at_warning(int a_lineno, int i); extern void bad_formals(void) GCC_NORETURN; extern void default_action_warning(void); -extern void destructor_redeclared_warning(int a_lineno, char *a_line, char *a_cptr); +struct ainfo { + int a_lineno; + char *a_line; + char *a_cptr; +}; +extern void destructor_redeclared_warning(const struct ainfo *); extern void dollar_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; extern void dollar_warning(int a_lineno, int i); extern void fatal(const char *msg) GCC_NORETURN; @@ -459,16 +470,16 @@ extern void unexpected_EOF(void) GCC_NOR extern void unknown_arg_warning(int d_lineno, const char *dlr_opt, const char *d_arg, const char *d_line, const char *d_cptr); extern void unknown_rhs(int i) GCC_NORETURN; extern void unsupported_flag_warning(const char *flag, const char *details); -extern void unterminated_action(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; -extern void unterminated_comment(int c_lineno, char *c_line, char *c_cptr) GCC_NORETURN; -extern void unterminated_string(int s_lineno, char *s_line, char *s_cptr) GCC_NORETURN; -extern void unterminated_text(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; -extern void unterminated_union(int u_lineno, char *u_line, char *u_cptr) GCC_NORETURN; +extern void unterminated_action(const struct ainfo *); +extern void unterminated_comment(const struct ainfo *) GCC_NORETURN; +extern void unterminated_string(const struct ainfo *) GCC_NORETURN; +extern void unterminated_text(const struct ainfo *) GCC_NORETURN; +extern void unterminated_union(const struct ainfo *) GCC_NORETURN; extern void untyped_arg_warning(int a_lineno, const char *dlr_opt, const char *a_name); extern void untyped_lhs(void) GCC_NORETURN; extern void untyped_rhs(int i, char *s) GCC_NORETURN; extern void used_reserved(char *s) GCC_NORETURN; -extern void unterminated_arglist(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; +extern void unterminated_arglist(const struct ainfo *) GCC_NORETURN; extern void wrong_number_args_warning(const char *which, const char *a_name); extern void wrong_type_for_arg_warning(int i, char *a_name); Index: src/external/bsd/byacc/dist/error.c diff -u src/external/bsd/byacc/dist/error.c:1.9 src/external/bsd/byacc/dist/error.c:1.10 --- src/external/bsd/byacc/dist/error.c:1.9 Sat Jan 3 18:22:52 2015 +++ src/external/bsd/byacc/dist/error.c Sat Jan 3 20:34:20 2015 @@ -1,9 +1,9 @@ -/* $NetBSD: error.c,v 1.9 2015/01/03 23:22:52 christos Exp $ */ +/* $NetBSD: error.c,v 1.10 2015/01/04 01:34:20 christos Exp $ */ #include "defs.h" #include <sys/cdefs.h> -__RCSID("$NetBSD: error.c,v 1.9 2015/01/03 23:22:52 christos Exp $"); +__RCSID("$NetBSD: error.c,v 1.10 2015/01/04 01:34:20 christos Exp $"); /* Id: error.c,v 1.11 2014/04/07 22:22:49 tom Exp */ /* routines for printing error messages */ @@ -81,38 +81,38 @@ syntax_error(int st_lineno, char *st_lin } __dead void -unterminated_comment(int c_lineno, char *c_line, char *c_cptr) +unterminated_comment(const struct ainfo *a) { fprintf(stderr, "%s: e - line %d of \"%s\", unmatched /*\n", - myname, c_lineno, input_file_name); - print_pos(c_line, c_cptr); + myname, a->a_lineno, input_file_name); + print_pos(a->a_line, a->a_cptr); done(1); } __dead void -unterminated_string(int s_lineno, char *s_line, char *s_cptr) +unterminated_string(const struct ainfo *a) { fprintf(stderr, "%s: e - line %d of \"%s\", unterminated string\n", - myname, s_lineno, input_file_name); - print_pos(s_line, s_cptr); + myname, a->a_lineno, input_file_name); + print_pos(a->a_line, a->a_cptr); done(1); } __dead void -unterminated_text(int t_lineno, char *t_line, char *t_cptr) +unterminated_text(const struct ainfo *a) { fprintf(stderr, "%s: e - line %d of \"%s\", unmatched %%{\n", - myname, t_lineno, input_file_name); - print_pos(t_line, t_cptr); + myname, a->a_lineno, input_file_name); + print_pos(a->a_line, a->a_cptr); done(1); } __dead void -unterminated_union(int u_lineno, char *u_line, char *u_cptr) +unterminated_union(const struct ainfo *a) { fprintf(stderr, "%s: e - line %d of \"%s\", unterminated %%union \ -declaration\n", myname, u_lineno, input_file_name); - print_pos(u_line, u_cptr); +declaration\n", myname, a->a_lineno, input_file_name); + print_pos(a->a_line, a->a_cptr); done(1); } @@ -222,11 +222,11 @@ specifiers\n", myname, lineno, input_fil } void -unterminated_action(int a_lineno, char *a_line, char *a_cptr) +unterminated_action(const struct ainfo *a) { fprintf(stderr, "%s: e - line %d of \"%s\", unterminated action\n", - myname, a_lineno, input_file_name); - print_pos(a_line, a_cptr); + myname, a->a_lineno, input_file_name); + print_pos(a->a_line, a->a_cptr); done(1); } @@ -319,12 +319,12 @@ at_error(int a_lineno, char *a_line, cha } void -unterminated_arglist(int a_lineno, char *a_line, char *a_cptr) +unterminated_arglist(const struct ainfo *a) { fprintf(stderr, "%s: e - line %d of \"%s\", unterminated argument list\n", - myname, a_lineno, input_file_name); - print_pos(a_line, a_cptr); + myname, a->a_lineno, input_file_name); + print_pos(a->a_line, a->a_cptr); done(1); } @@ -397,10 +397,10 @@ start_requires_args(char *a_name) } void -destructor_redeclared_warning(int a_lineno, char *a_line, char *a_cptr) +destructor_redeclared_warning(const struct ainfo *a) { fprintf(stderr, "%s: w - line %d of \"%s\", destructor redeclared\n", - myname, a_lineno, input_file_name); - print_pos(a_line, a_cptr); + myname, a->a_lineno, input_file_name); + print_pos(a->a_line, a->a_cptr); } #endif Index: src/external/bsd/byacc/dist/main.c diff -u src/external/bsd/byacc/dist/main.c:1.10 src/external/bsd/byacc/dist/main.c:1.11 --- src/external/bsd/byacc/dist/main.c:1.10 Sat Jan 3 18:22:52 2015 +++ src/external/bsd/byacc/dist/main.c Sat Jan 3 20:34:20 2015 @@ -1,9 +1,9 @@ -/* $NetBSD: main.c,v 1.10 2015/01/03 23:22:52 christos Exp $ */ +/* $NetBSD: main.c,v 1.11 2015/01/04 01:34:20 christos Exp $ */ #include "defs.h" #include <sys/cdefs.h> -__RCSID("$NetBSD: main.c,v 1.10 2015/01/03 23:22:52 christos Exp $"); +__RCSID("$NetBSD: main.c,v 1.11 2015/01/04 01:34:20 christos Exp $"); /* Id: main.c,v 1.54 2014/10/06 22:40:07 tom Exp */ #include <signal.h> @@ -98,6 +98,7 @@ char *symbol_assoc; int pure_parser; int token_table; +int error_verbose; #if defined(YYBTYACC) Value_t *symbol_pval; @@ -105,6 +106,7 @@ char **symbol_destructor; char **symbol_type_tag; int locations = 0; /* default to no position processing */ int backtrack = 0; /* default is no backtracking */ +char *initial_action = NULL; #endif int exit_code; Index: src/external/bsd/byacc/dist/reader.c diff -u src/external/bsd/byacc/dist/reader.c:1.10 src/external/bsd/byacc/dist/reader.c:1.11 --- src/external/bsd/byacc/dist/reader.c:1.10 Sat Jan 3 18:22:52 2015 +++ src/external/bsd/byacc/dist/reader.c Sat Jan 3 20:34:20 2015 @@ -1,11 +1,11 @@ -/* $NetBSD: reader.c,v 1.10 2015/01/03 23:22:52 christos Exp $ */ +/* $NetBSD: reader.c,v 1.11 2015/01/04 01:34:20 christos Exp $ */ /* Id: reader.c,v 1.58 2014/10/06 22:15:08 tom Exp */ #include "defs.h" #include <sys/cdefs.h> -__RCSID("$NetBSD: reader.c,v 1.10 2015/01/03 23:22:52 christos Exp $"); +__RCSID("$NetBSD: reader.c,v 1.11 2015/01/04 01:34:20 christos Exp $"); /* The line size must be a positive integer. One hundred was chosen */ /* because few lines in Yacc input grammars exceed 100 characters. */ @@ -27,6 +27,7 @@ __RCSID("$NetBSD: reader.c,v 1.10 2015/0 static void start_rule(bucket *bp, int s_lineno); #if defined(YYBTYACC) +static void copy_initial_action(void); static void copy_destructor(void); static char *process_destructor_XX(char *code, char *tag); #endif @@ -186,10 +187,10 @@ static void skip_comment(void) { char *s; - - int st_lineno = lineno; - char *st_line = dup_line(); - char *st_cptr = st_line + (cptr - line); + struct ainfo a; + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line); s = cptr + 2; for (;;) @@ -197,14 +198,14 @@ skip_comment(void) if (*s == '*' && s[1] == '/') { cptr = s + 2; - FREE(st_line); + FREE(a.a_line); return; } if (*s == '\n') { get_line(); if (line == 0) - unterminated_comment(st_lineno, st_line, st_cptr); + unterminated_comment(&a); s = cptr; } else @@ -291,17 +292,22 @@ nextc(void) /* *INDENT-OFF* */ static struct keyword { - char name[13]; + char name[14]; int token; } keywords[] = { { "binary", NONASSOC }, + { "debug", XXXDEBUG }, #if defined(YYBTYACC) { "destructor", DESTRUCTOR }, #endif + { "error-verbose",ERROR_VERBOSE }, { "expect", EXPECT }, { "expect-rr", EXPECT_RR }, { "ident", IDENT }, +#if defined(YYBTYACC) + { "initial-action", INITIAL_ACTION }, +#endif { "left", LEFT }, { "lex-param", LEX_PARAM }, #if defined(YYBTYACC) @@ -429,9 +435,10 @@ copy_string(int quote) { struct mstring *temp = msnew(); int c; - int s_lineno = lineno; - char *s_line = dup_line(); - char *s_cptr = s_line + (cptr - line - 1); + struct ainfo a; + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line - 1); for (;;) { @@ -439,11 +446,11 @@ copy_string(int quote) mputc(temp, c); if (c == quote) { - FREE(s_line); + FREE(a.a_line); return msdone(temp); } if (c == '\n') - unterminated_string(s_lineno, s_line, s_cptr); + unterminated_string(&a); if (c == '\\') { c = *cptr++; @@ -452,7 +459,7 @@ copy_string(int quote) { get_line(); if (line == 0) - unterminated_string(s_lineno, s_line, s_cptr); + unterminated_string(&a); } } } @@ -479,9 +486,10 @@ copy_comment(void) } else if (c == '*') { - int c_lineno = lineno; - char *c_line = dup_line(); - char *c_cptr = c_line + (cptr - line - 1); + struct ainfo a; + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line - 1); mputc(temp, c); ++cptr; @@ -493,14 +501,14 @@ copy_comment(void) { mputc(temp, '/'); ++cptr; - FREE(c_line); + FREE(a.a_line); return msdone(temp); } if (c == '\n') { get_line(); if (line == 0) - unterminated_comment(c_lineno, c_line, c_cptr); + unterminated_comment(&a); } } } @@ -513,15 +521,16 @@ copy_text(void) int c; FILE *f = text_file; int need_newline = 0; - int t_lineno = lineno; - char *t_line = dup_line(); - char *t_cptr = t_line + (cptr - line - 2); + struct ainfo a; + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line - 2); if (*cptr == '\n') { get_line(); if (line == 0) - unterminated_text(t_lineno, t_line, t_cptr); + unterminated_text(&a); } if (!lflag) fprintf(f, line_format, lineno, input_file_name); @@ -536,7 +545,7 @@ copy_text(void) get_line(); if (line) goto loop; - unterminated_text(t_lineno, t_line, t_cptr); + unterminated_text(&a); case '\'': case '"': @@ -566,7 +575,7 @@ copy_text(void) if (need_newline) putc('\n', f); ++cptr; - FREE(t_line); + FREE(a.a_line); return; } /* FALLTHRU */ @@ -599,9 +608,10 @@ copy_union(void) { int c; int depth; - int u_lineno = lineno; - char *u_line = dup_line(); - char *u_cptr = u_line + (cptr - line - 6); + struct ainfo a; + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line - 6); if (unionized) over_unionized(cptr - 6); @@ -627,7 +637,7 @@ copy_union(void) case '\n': get_line(); if (line == 0) - unterminated_union(u_lineno, u_line, u_cptr); + unterminated_union(&a); goto loop; case L_CURL: @@ -639,7 +649,7 @@ copy_union(void) { puts_both(" YYSTYPE;\n"); puts_both("#endif /* !YYSTYPE_IS_DECLARED */\n"); - FREE(u_line); + FREE(a.a_line); return; } goto loop; @@ -975,9 +985,10 @@ get_literal(void) int n; char *s; bucket *bp; - int s_lineno = lineno; - char *s_line = dup_line(); - char *s_cptr = s_line + (cptr - line); + struct ainfo a; + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line); quote = *cptr++; cinc = 0; @@ -987,7 +998,7 @@ get_literal(void) if (c == quote) break; if (c == '\n') - unterminated_string(s_lineno, s_line, s_cptr); + unterminated_string(&a); if (c == '\\') { char *c_cptr = cptr - 1; @@ -998,7 +1009,7 @@ get_literal(void) case '\n': get_line(); if (line == 0) - unterminated_string(s_lineno, s_line, s_cptr); + unterminated_string(&a); continue; case '0': @@ -1070,7 +1081,7 @@ get_literal(void) } cachec(c); } - FREE(s_line); + FREE(a.a_line); n = cinc; s = TMALLOC(char, n); @@ -1270,7 +1281,7 @@ scan_id(void) { char *b = cptr; - while (isalnum(*cptr) || *cptr == '_' || *cptr == '$') + while (isalnum((unsigned char)*cptr) || *cptr == '_' || *cptr == '$') cptr++; return cache_tag(b, (size_t) (cptr - b)); } @@ -1562,6 +1573,10 @@ read_declarations(void) token_table = 1; break; + case ERROR_VERBOSE: + error_verbose = 1; + break; + #if defined(YYBTYACC) case LOCATIONS: locations = 1; @@ -1571,8 +1586,15 @@ read_declarations(void) destructor = 1; copy_destructor(); break; + case INITIAL_ACTION: + copy_initial_action(); + break; #endif + case XXXDEBUG: + /* XXX: FIXME */ + break; + case POSIX_YACC: /* noop for bison compatibility. byacc is already designed to be posix * yacc compatible. */ @@ -1654,9 +1676,11 @@ copy_args(int *alen) struct mstring *s = msnew(); int depth = 0, len = 1; char c, quote = 0; - int a_lineno = lineno; - char *a_line = dup_line(); - char *a_cptr = a_line + (cptr - line - 1); + struct ainfo a; + + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line - 1); while ((c = *cptr++) != R_PAREN || depth || quote) { @@ -1673,9 +1697,9 @@ copy_args(int *alen) if (!line) { if (quote) - unterminated_string(a_lineno, a_line, a_cptr); + unterminated_string(&a); else - unterminated_arglist(a_lineno, a_line, a_cptr); + unterminated_arglist(&a); } } else if (quote) @@ -1700,7 +1724,7 @@ copy_args(int *alen) } if (alen) *alen = len; - FREE(a_line); + FREE(a.a_line); return msdone(s); } @@ -1709,13 +1733,13 @@ parse_id(char *p, char **save) { char *b; - while (isspace(*p)) + while (isspace((unsigned char)*p)) if (*p++ == '\n') rescan_lineno++; - if (!isalpha(*p) && *p != '_') + if (!isalpha((unsigned char)*p) && *p != '_') return NULL; b = p; - while (isalnum(*p) || *p == '_' || *p == '$') + while (isalnum((unsigned char)*p) || *p == '_' || *p == '$') p++; if (save) { @@ -1729,7 +1753,7 @@ parse_int(char *p, int *save) { int neg = 0, val = 0; - while (isspace(*p)) + while (isspace((unsigned char)*p)) if (*p++ == '\n') rescan_lineno++; if (*p == '-') @@ -1737,9 +1761,9 @@ parse_int(char *p, int *save) neg = 1; p++; } - if (!isdigit(*p)) + if (!isdigit((unsigned char)*p)) return NULL; - while (isdigit(*p)) + while (isdigit((unsigned char)*p)) val = val * 10 + *p++ - '0'; if (neg) val = -val; @@ -1773,12 +1797,12 @@ parse_arginfo(bucket *a, char *args, int return; for (i = 0; i < argslen; i++) { - while (isspace(*p)) + while (isspace((unsigned char)*p)) if (*p++ == '\n') rescan_lineno++; if (*p++ != '$') bad_formals(); - while (isspace(*p)) + while (isspace((unsigned char)*p)) if (*p++ == '\n') rescan_lineno++; if (*p == '<') @@ -1786,7 +1810,7 @@ parse_arginfo(bucket *a, char *args, int havetags = 1; if (!(p = parse_id(p + 1, &tmp))) bad_formals(); - while (isspace(*p)) + while (isspace((unsigned char)*p)) if (*p++ == '\n') rescan_lineno++; if (*p++ != '>') @@ -1803,7 +1827,7 @@ parse_arginfo(bucket *a, char *args, int a->argtags[i] = NULL; if (!(p = parse_id(p, &a->argnames[i]))) bad_formals(); - while (isspace(*p)) + while (isspace((unsigned char)*p)) if (*p++ == '\n') rescan_lineno++; if (*p++) @@ -1852,7 +1876,7 @@ compile_arg(char **theptr, char *yyvalta if (*++p == '<') if (!(p = parse_id(++p, &tag)) || *p++ != '>') illegal_tag(rescan_lineno, NULL, NULL); - if (isdigit(*p) || *p == '-') + if (isdigit((unsigned char)*p) || *p == '-') { int val; if (!(p = parse_int(p, &val))) @@ -1876,7 +1900,7 @@ compile_arg(char **theptr, char *yyvalta else if (havetags) unknown_rhs(val); } - else if (isalpha(*p) || *p == '_') + else if (isalpha((unsigned char)*p) || *p == '_') { char *arg; if (!(p = parse_id(p, &arg))) @@ -2232,12 +2256,14 @@ copy_action(void) #endif char *tag; FILE *f = action_file; - int a_lineno = lineno; - char *a_line = dup_line(); - char *a_cptr = a_line + (cptr - line); + struct ainfo a; Value_t *offsets = NULL, maxoffset; bucket **rhs; + a.a_lineno = lineno; + a.a_line = dup_line(); + a.a_cptr = a.a_line + (cptr - line); + if (last_was_action) insert_empty_rule(); last_was_action = 1; @@ -2403,7 +2429,7 @@ copy_action(void) goto loop; } #if defined(YYBTYACC) - else if (isalpha(cptr[1]) || cptr[1] == '_') + else if (isalpha((unsigned char)cptr[1]) || cptr[1] == '_') { char *arg; ++cptr; @@ -2494,7 +2520,7 @@ copy_action(void) goto loop; } fprintf(f, "\nbreak;\n"); - FREE(a_line); + FREE(a.a_line); if (maxoffset > 0) FREE(offsets); return; @@ -2508,13 +2534,13 @@ copy_action(void) get_line(); if (line) goto loop; - unterminated_action(a_lineno, a_line, a_cptr); + unterminated_action(&a); case ';': if (depth > 0) goto loop; fprintf(f, "\nbreak;\n"); - free(a_line); + free(a.a_line); if (maxoffset > 0) FREE(offsets); return; @@ -2557,7 +2583,7 @@ copy_action(void) } #endif fprintf(f, "\nbreak;\n"); - free(a_line); + free(a.a_line); if (maxoffset > 0) FREE(offsets); return; @@ -2585,32 +2611,27 @@ copy_action(void) } #if defined(YYBTYACC) -static void -copy_destructor(void) +static char * +get_code(struct ainfo *a, const char *loc) { int c; int depth; char *tag; - bucket *bp; - struct mstring *destructor_text = msnew(); - char *code_text; - int a_lineno; - char *a_line; - char *a_cptr; + struct mstring *code_mstr = msnew(); if (!lflag) - msprintf(destructor_text, line_format, lineno, input_file_name); + msprintf(code_mstr, line_format, lineno, input_file_name); cptr = after_blanks(cptr); if (*cptr == L_CURL) /* avoid putting curly-braces in first column, to ease editing */ - mputc(destructor_text, '\t'); + mputc(code_mstr, '\t'); else syntax_error(lineno, line, cptr); - a_lineno = lineno; - a_line = dup_line(); - a_cptr = a_line + (cptr - line); + a->a_lineno = lineno; + a->a_line = dup_line(); + a->a_cptr = a->a_line + (cptr - line); depth = 0; loop: @@ -2628,7 +2649,7 @@ copy_destructor(void) c = *cptr; if (c == '$') { - msprintf(destructor_text, "(*val).%s", tag); + msprintf(code_mstr, "(*val).%s", tag); ++cptr; FREE(d_line); goto loop; @@ -2639,7 +2660,7 @@ copy_destructor(void) else if (cptr[1] == '$') { /* process '$$' later; replacement is context dependent */ - msprintf(destructor_text, "$$"); + msprintf(code_mstr, "$$"); cptr += 2; goto loop; } @@ -2653,7 +2674,7 @@ copy_destructor(void) char *l_cptr = l_line + (cptr - line); syntax_error(l_lineno, l_line, l_cptr); } - msprintf(destructor_text, "(*loc)"); + msprintf(code_mstr, loc); cptr += 2; goto loop; } @@ -2661,21 +2682,21 @@ copy_destructor(void) { do { - mputc(destructor_text, c); + mputc(code_mstr, c); c = *++cptr; } while (isalnum(c) || c == '_' || c == '$'); goto loop; } ++cptr; - mputc(destructor_text, c); + mputc(code_mstr, c); switch (c) { case '\n': get_line(); if (line) goto loop; - unterminated_action(a_lineno, a_line, a_cptr); + unterminated_action(a); case L_CURL: ++depth; @@ -2684,13 +2705,13 @@ copy_destructor(void) case R_CURL: if (--depth > 0) goto loop; - goto process_symbols; + goto out; case '\'': case '"': { char *s = copy_string(c); - msprintf(destructor_text, "%s", s); + msprintf(code_mstr, "%s", s); free(s); } goto loop; @@ -2698,7 +2719,7 @@ copy_destructor(void) case '/': { char *s = copy_comment(); - msprintf(destructor_text, "%s", s); + msprintf(code_mstr, "%s", s); free(s); } goto loop; @@ -2706,8 +2727,29 @@ copy_destructor(void) default: goto loop; } - process_symbols: - code_text = msdone(destructor_text); + out: + return msdone(code_mstr); +} + +static void +copy_initial_action(void) +{ + struct ainfo a; + + initial_action = get_code(&a, "yyloc"); + free(a.a_line); +} + +static void +copy_destructor(void) +{ + char *code_text; + int c; + struct ainfo a; + bucket *bp; + + code_text = get_code(&a, "(*loc)"); + for (;;) { c = nextc(); @@ -2726,7 +2768,7 @@ copy_destructor(void) default_destructor[UNTYPED_DEFAULT] = bp; } if (bp->destructor != NULL) - destructor_redeclared_warning(a_lineno, a_line, a_cptr); + destructor_redeclared_warning(&a); else /* replace "$$" with "(*val)" in destructor code */ bp->destructor = process_destructor_XX(code_text, NULL); @@ -2742,7 +2784,7 @@ copy_destructor(void) default_destructor[TYPED_DEFAULT] = bp; } if (bp->destructor != NULL) - destructor_redeclared_warning(a_lineno, a_line, a_cptr); + destructor_redeclared_warning(&a); else { /* postpone re-processing destructor $$s until end of grammar spec */ @@ -2753,10 +2795,10 @@ copy_destructor(void) } else { /* "semantic type" default destructor */ - tag = get_tag(); + char *tag = get_tag(); bp = lookup_type_destructor(tag); if (bp->destructor != NULL) - destructor_redeclared_warning(a_lineno, a_line, a_cptr); + destructor_redeclared_warning(&a); else /* replace "$$" with "(*val).tag" in destructor code */ bp->destructor = process_destructor_XX(code_text, tag); @@ -2766,7 +2808,7 @@ copy_destructor(void) { /* "symbol" destructor */ bp = get_name(); if (bp->destructor != NULL) - destructor_redeclared_warning(a_lineno, a_line, a_cptr); + destructor_redeclared_warning(&a); else { /* postpone re-processing destructor $$s until end of grammar spec */ @@ -2778,7 +2820,7 @@ copy_destructor(void) else break; } - free(a_line); + free(a.a_line); free(code_text); } Index: src/external/bsd/byacc/dist/mstring.c diff -u src/external/bsd/byacc/dist/mstring.c:1.2 src/external/bsd/byacc/dist/mstring.c:1.3 --- src/external/bsd/byacc/dist/mstring.c:1.2 Sat Jan 3 18:22:52 2015 +++ src/external/bsd/byacc/dist/mstring.c Sat Jan 3 20:34:20 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: mstring.c,v 1.2 2015/01/03 23:22:52 christos Exp $ */ +/* $NetBSD: mstring.c,v 1.3 2015/01/04 01:34:20 christos Exp $ */ /* Id: mstring.c,v 1.6 2014/04/22 23:36:31 tom Exp */ #if HAVE_NBTOOL_CONFIG_H @@ -6,7 +6,7 @@ #endif #include <sys/cdefs.h> -__RCSID("$NetBSD: mstring.c,v 1.2 2015/01/03 23:22:52 christos Exp $"); +__RCSID("$NetBSD: mstring.c,v 1.3 2015/01/04 01:34:20 christos Exp $"); #include <stdlib.h> #include <stdio.h> @@ -165,20 +165,20 @@ strnscmp(const char *a, const char *b) { while (1) { - while (isspace(*a)) + while (isspace((unsigned char)*a)) a++; - while (isspace(*b)) + while (isspace((unsigned char)*b)) b++; while (*a && *a == *b) a++, b++; - if (isspace(*a)) + if (isspace((unsigned char)*a)) { - if (isalnum(a[-1]) && isalnum(*b)) + if (isalnum((unsigned char)a[-1]) && isalnum((unsigned char)*b)) break; } - else if (isspace(*b)) + else if (isspace((unsigned char)*b)) { - if (isalnum(b[-1]) && isalnum(*a)) + if (isalnum((unsigned char)b[-1]) && isalnum((unsigned char)*a)) break; } else @@ -194,7 +194,7 @@ strnshash(const char *s) while (*s) { - if (!isspace(*s)) + if (!isspace((unsigned char)*s)) h = (h << 5) - h + (unsigned char)*s; s++; } Index: src/external/bsd/byacc/dist/output.c diff -u src/external/bsd/byacc/dist/output.c:1.11 src/external/bsd/byacc/dist/output.c:1.12 --- src/external/bsd/byacc/dist/output.c:1.11 Sat Jan 3 18:22:52 2015 +++ src/external/bsd/byacc/dist/output.c Sat Jan 3 20:34:20 2015 @@ -1,11 +1,11 @@ -/* $NetBSD: output.c,v 1.11 2015/01/03 23:22:52 christos Exp $ */ +/* $NetBSD: output.c,v 1.12 2015/01/04 01:34:20 christos Exp $ */ /* Id: output.c,v 1.74 2014/10/05 23:21:09 tom Exp */ #include "defs.h" #include <sys/cdefs.h> -__RCSID("$NetBSD: output.c,v 1.11 2015/01/03 23:22:52 christos Exp $"); +__RCSID("$NetBSD: output.c,v 1.12 2015/01/04 01:34:20 christos Exp $"); #define StaticOrR (rflag ? "" : "static ") #define CountLine(fp) (!rflag || ((fp) == code_file)) @@ -1560,6 +1560,7 @@ output_ltype(FILE * fp) putl_code(fp, " int first_column;\n"); putl_code(fp, " int last_line;\n"); putl_code(fp, " int last_column;\n"); + putl_code(fp, " char *source;\n"); putl_code(fp, "} YYLTYPE;\n"); putl_code(fp, "#define YYLTYPE_IS_DECLARED 1\n"); putl_code(fp, "#endif\n"); @@ -1838,6 +1839,13 @@ output_yydestruct_decl(FILE * fp) } static void +output_initial_action(void) +{ + if (initial_action) + fprintf(code_file, "%s\n", initial_action); +} + +static void output_yydestruct_impl(void) { int i; @@ -2043,6 +2051,11 @@ output(void) write_section(code_file, body_vars); } write_section(code_file, body_2); +#if defined(YYBTYACC) + if (initial_action) + output_initial_action(); +#endif + write_section(code_file, body_3); output_semantic_actions(); write_section(code_file, trailer); } Index: src/external/bsd/byacc/include/config.h diff -u src/external/bsd/byacc/include/config.h:1.3 src/external/bsd/byacc/include/config.h:1.4 --- src/external/bsd/byacc/include/config.h:1.3 Sat Apr 6 10:52:25 2013 +++ src/external/bsd/byacc/include/config.h Sat Jan 3 20:34:20 2015 @@ -31,6 +31,12 @@ /* Define to 1 if mkstemp() is available and working. */ #define HAVE_MKSTEMP 1 +/* Define to 1 if vsnprintf() is available and working. */ +#define HAVE_VSNPRINTF 1 + +/* Define to maximum table size (default: 32500) */ +/* #undef MAXTABLE */ + /* Define to 1 if filesystem supports mixed-case filenames. */ #define MIXEDCASE_FILENAMES 1 @@ -38,7 +44,7 @@ /* #undef NO_LEAKS */ /* Define to the system name. */ -#define SYSTEM_NAME "netbsd" +#define SYSTEM_NAME "NetBSD" /* "Define to 1 if you want to use dbmalloc for testing." */ /* #undef USE_DBMALLOC */ @@ -49,5 +55,8 @@ /* "Define to 1 if you want to use valgrind for testing." */ /* #undef USE_VALGRIND */ +/* Define to 1 to enable backtracking extension */ +#define YYBTYACC 1 + /* Define to 1 if you want to perform memory-leak testing. */ /* #undef YY_NO_LEAKS */