aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-03-21 15:55:26 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-21 15:55:26 -0700
commiteddecbb601c9ea3fab7e67d7892010fc9426d1e6 (patch)
tree4bfa4740ae554e5c5a8468e74b39531a6153ce9f /scripts
parent0bf8c869701039b12c3520cb1bb1689595ab108b (diff)
parentf2c23f65f63fe0dd83fc94efdfae0364c74458b8 (diff)
downloadkernel_samsung_smdk4412-eddecbb601c9ea3fab7e67d7892010fc9426d1e6.tar.gz
kernel_samsung_smdk4412-eddecbb601c9ea3fab7e67d7892010fc9426d1e6.tar.bz2
kernel_samsung_smdk4412-eddecbb601c9ea3fab7e67d7892010fc9426d1e6.zip
Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6
* 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: kbuild: Make DEBUG_SECTION_MISMATCH selectable, but not on by default genksyms: Regenerate lexer and parser genksyms: Track changes to enum constants genksyms: simplify usage of find_symbol() genksyms: Add helpers for building string lists genksyms: Simplify printing of symbol types genksyms: Simplify lexer genksyms: Do not paste the bison header file to lex.c modpost: fix trailing comma KBuild: silence "'scripts/unifdef' is up to date." kbuild: Add extra gcc checks kbuild: reenable section mismatch analysis unifdef: update to upstream version 2.5
Diffstat (limited to 'scripts')
-rw-r--r--scripts/Makefile5
-rw-r--r--scripts/Makefile.build35
-rw-r--r--scripts/genksyms/Makefile4
-rw-r--r--scripts/genksyms/genksyms.c192
-rw-r--r--scripts/genksyms/genksyms.h7
-rw-r--r--scripts/genksyms/lex.c_shipped427
-rw-r--r--scripts/genksyms/lex.l44
-rw-r--r--scripts/genksyms/parse.c_shipped1071
-rw-r--r--scripts/genksyms/parse.h_shipped72
-rw-r--r--scripts/genksyms/parse.y34
-rw-r--r--scripts/mod/modpost.c23
-rw-r--r--scripts/unifdef.c247
12 files changed, 1226 insertions, 935 deletions
diff --git a/scripts/Makefile b/scripts/Makefile
index 2e088109fbd..fcea26168bc 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -18,6 +18,11 @@ always := $(hostprogs-y) $(hostprogs-m)
# The following hostprogs-y programs are only build on demand
hostprogs-y += unifdef
+# This target is used internally to avoid "is up to date" messages
+PHONY += build_unifdef
+build_unifdef: scripts/unifdef FORCE
+ @:
+
subdir-$(CONFIG_MODVERSIONS) += genksyms
subdir-y += mod
subdir-$(CONFIG_SECURITY_SELINUX) += selinux
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 4eb99ab3405..d5f925abe4d 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -49,6 +49,40 @@ ifeq ($(KBUILD_NOPEDANTIC),)
$(error CFLAGS was changed in "$(kbuild-file)". Fix it to use EXTRA_CFLAGS)
endif
endif
+
+#
+# make W=1 settings
+#
+# $(call cc-option... ) handles gcc -W.. options which
+# are not supported by all versions of the compiler
+ifdef KBUILD_ENABLE_EXTRA_GCC_CHECKS
+KBUILD_EXTRA_WARNINGS := -Wextra
+KBUILD_EXTRA_WARNINGS += -Wunused -Wno-unused-parameter
+KBUILD_EXTRA_WARNINGS += -Waggregate-return
+KBUILD_EXTRA_WARNINGS += -Wbad-function-cast
+KBUILD_EXTRA_WARNINGS += -Wcast-qual
+KBUILD_EXTRA_WARNINGS += -Wcast-align
+KBUILD_EXTRA_WARNINGS += -Wconversion
+KBUILD_EXTRA_WARNINGS += -Wdisabled-optimization
+KBUILD_EXTRA_WARNINGS += -Wlogical-op
+KBUILD_EXTRA_WARNINGS += -Wmissing-declarations
+KBUILD_EXTRA_WARNINGS += -Wmissing-format-attribute
+KBUILD_EXTRA_WARNINGS += $(call cc-option, -Wmissing-include-dirs,)
+KBUILD_EXTRA_WARNINGS += -Wmissing-prototypes
+KBUILD_EXTRA_WARNINGS += -Wnested-externs
+KBUILD_EXTRA_WARNINGS += -Wold-style-definition
+KBUILD_EXTRA_WARNINGS += $(call cc-option, -Woverlength-strings,)
+KBUILD_EXTRA_WARNINGS += -Wpacked
+KBUILD_EXTRA_WARNINGS += -Wpacked-bitfield-compat
+KBUILD_EXTRA_WARNINGS += -Wpadded
+KBUILD_EXTRA_WARNINGS += -Wpointer-arith
+KBUILD_EXTRA_WARNINGS += -Wredundant-decls
+KBUILD_EXTRA_WARNINGS += -Wshadow
+KBUILD_EXTRA_WARNINGS += -Wswitch-default
+KBUILD_EXTRA_WARNINGS += $(call cc-option, -Wvla,)
+KBUILD_CFLAGS += $(KBUILD_EXTRA_WARNINGS)
+endif
+
include scripts/Makefile.lib
ifdef host-progs
@@ -403,7 +437,6 @@ ifneq ($(cmd_files),)
include $(cmd_files)
endif
-
# Declare the contents of the .PHONY variable as phony. We keep that
# information in a variable se we can use it in if_changed and friends.
diff --git a/scripts/genksyms/Makefile b/scripts/genksyms/Makefile
index e420fe44001..13d03cf05d9 100644
--- a/scripts/genksyms/Makefile
+++ b/scripts/genksyms/Makefile
@@ -28,9 +28,9 @@ $(obj)/keywords.c: $(obj)/keywords.gperf FORCE
# flex
quiet_cmd_lex.c = FLEX $@
- cmd_lex.c = flex -o$@ -d $< $(obj)/parse.h
+ cmd_lex.c = flex -o$@ -d $<
-$(obj)/lex.c: $(obj)/lex.l $(obj)/parse.h $(obj)/keywords.c FORCE
+$(obj)/lex.c: $(obj)/lex.l $(obj)/keywords.c FORCE
$(call if_changed,lex.c)
cp $@ $@_shipped
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c
index f99115ebe92..f9e75531ea0 100644
--- a/scripts/genksyms/genksyms.c
+++ b/scripts/genksyms/genksyms.c
@@ -53,12 +53,22 @@ static int nsyms;
static struct symbol *expansion_trail;
static struct symbol *visited_symbols;
-static const char *const symbol_type_name[] = {
- "normal", "typedef", "enum", "struct", "union"
+static const struct {
+ int n;
+ const char *name;
+} symbol_types[] = {
+ [SYM_NORMAL] = { 0, NULL},
+ [SYM_TYPEDEF] = {'t', "typedef"},
+ [SYM_ENUM] = {'e', "enum"},
+ [SYM_STRUCT] = {'s', "struct"},
+ [SYM_UNION] = {'u', "union"},
+ [SYM_ENUM_CONST] = {'E', "enum constant"},
};
static int equal_list(struct string_list *a, struct string_list *b);
static void print_list(FILE * f, struct string_list *list);
+static struct string_list *concat_list(struct string_list *start, ...);
+static struct string_list *mk_node(const char *string);
static void print_location(void);
static void print_type_name(enum symbol_type type, const char *name);
@@ -140,14 +150,20 @@ static unsigned long crc32(const char *s)
static enum symbol_type map_to_ns(enum symbol_type t)
{
- if (t == SYM_TYPEDEF)
- t = SYM_NORMAL;
- else if (t == SYM_UNION)
- t = SYM_STRUCT;
+ switch (t) {
+ case SYM_ENUM_CONST:
+ case SYM_NORMAL:
+ case SYM_TYPEDEF:
+ return SYM_NORMAL;
+ case SYM_ENUM:
+ case SYM_STRUCT:
+ case SYM_UNION:
+ return SYM_STRUCT;
+ }
return t;
}
-struct symbol *find_symbol(const char *name, enum symbol_type ns)
+struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact)
{
unsigned long h = crc32(name) % HASH_BUCKETS;
struct symbol *sym;
@@ -158,6 +174,8 @@ struct symbol *find_symbol(const char *name, enum symbol_type ns)
sym->is_declared)
break;
+ if (exact && sym && sym->type != ns)
+ return NULL;
return sym;
}
@@ -180,10 +198,47 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
struct string_list *defn, int is_extern,
int is_reference)
{
- unsigned long h = crc32(name) % HASH_BUCKETS;
+ unsigned long h;
struct symbol *sym;
enum symbol_status status = STATUS_UNCHANGED;
+ /* The parser adds symbols in the order their declaration completes,
+ * so it is safe to store the value of the previous enum constant in
+ * a static variable.
+ */
+ static int enum_counter;
+ static struct string_list *last_enum_expr;
+
+ if (type == SYM_ENUM_CONST) {
+ if (defn) {
+ free_list(last_enum_expr, NULL);
+ last_enum_expr = copy_list_range(defn, NULL);
+ enum_counter = 1;
+ } else {
+ struct string_list *expr;
+ char buf[20];
+
+ snprintf(buf, sizeof(buf), "%d", enum_counter++);
+ if (last_enum_expr) {
+ expr = copy_list_range(last_enum_expr, NULL);
+ defn = concat_list(mk_node("("),
+ expr,
+ mk_node(")"),
+ mk_node("+"),
+ mk_node(buf), NULL);
+ } else {
+ defn = mk_node(buf);
+ }
+ }
+ } else if (type == SYM_ENUM) {
+ free_list(last_enum_expr, NULL);
+ last_enum_expr = NULL;
+ enum_counter = 0;
+ if (!name)
+ /* Anonymous enum definition, nothing more to do */
+ return NULL;
+ }
+ h = crc32(name) % HASH_BUCKETS;
for (sym = symtab[h]; sym; sym = sym->hash_next) {
if (map_to_ns(sym->type) == map_to_ns(type) &&
strcmp(name, sym->name) == 0) {
@@ -247,8 +302,12 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
sym->is_override = 0;
if (flag_debug) {
- fprintf(debugfile, "Defn for %s %s == <",
- symbol_type_name[type], name);
+ if (symbol_types[type].name)
+ fprintf(debugfile, "Defn for %s %s == <",
+ symbol_types[type].name, name);
+ else
+ fprintf(debugfile, "Defn for type%d %s == <",
+ type, name);
if (is_extern)
fputs("extern ", debugfile);
print_list(debugfile, defn);
@@ -288,6 +347,35 @@ void free_list(struct string_list *s, struct string_list *e)
}
}
+static struct string_list *mk_node(const char *string)
+{
+ struct string_list *newnode;
+
+ newnode = xmalloc(sizeof(*newnode));
+ newnode->string = xstrdup(string);
+ newnode->tag = SYM_NORMAL;
+ newnode->next = NULL;
+
+ return newnode;
+}
+
+static struct string_list *concat_list(struct string_list *start, ...)
+{
+ va_list ap;
+ struct string_list *n, *n2;
+
+ if (!start)
+ return NULL;
+ for (va_start(ap, start); (n = va_arg(ap, struct string_list *));) {
+ for (n2 = n; n2->next; n2 = n2->next)
+ ;
+ n2->next = start;
+ start = n;
+ }
+ va_end(ap);
+ return start;
+}
+
struct string_list *copy_node(struct string_list *node)
{
struct string_list *newnode;
@@ -299,6 +387,22 @@ struct string_list *copy_node(struct string_list *node)
return newnode;
}
+struct string_list *copy_list_range(struct string_list *start,
+ struct string_list *end)
+{
+ struct string_list *res, *n;
+
+ if (start == end)
+ return NULL;
+ n = res = copy_node(start);
+ for (start = start->next; start != end; start = start->next) {
+ n->next = copy_node(start);
+ n = n->next;
+ }
+ n->next = NULL;
+ return res;
+}
+
static int equal_list(struct string_list *a, struct string_list *b)
{
while (a && b) {
@@ -346,8 +450,8 @@ static struct string_list *read_node(FILE *f)
if (node.string[1] == '#') {
int n;
- for (n = 0; n < ARRAY_SIZE(symbol_type_name); n++) {
- if (node.string[0] == symbol_type_name[n][0]) {
+ for (n = 0; n < ARRAY_SIZE(symbol_types); n++) {
+ if (node.string[0] == symbol_types[n].n) {
node.tag = n;
node.string += 2;
return copy_node(&node);
@@ -397,8 +501,8 @@ static void read_reference(FILE *f)
static void print_node(FILE * f, struct string_list *list)
{
- if (list->tag != SYM_NORMAL) {
- putc(symbol_type_name[list->tag][0], f);
+ if (symbol_types[list->tag].n) {
+ putc(symbol_types[list->tag].n, f);
putc('#', f);
}
fputs(list->string, f);
@@ -468,8 +572,9 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
crc = partial_crc32_one(' ', crc);
break;
+ case SYM_ENUM_CONST:
case SYM_TYPEDEF:
- subsym = find_symbol(cur->string, cur->tag);
+ subsym = find_symbol(cur->string, cur->tag, 0);
/* FIXME: Bad reference files can segfault here. */
if (subsym->expansion_trail) {
if (flag_dump_defs)
@@ -486,55 +591,30 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
case SYM_STRUCT:
case SYM_UNION:
case SYM_ENUM:
- subsym = find_symbol(cur->string, cur->tag);
+ subsym = find_symbol(cur->string, cur->tag, 0);
if (!subsym) {
- struct string_list *n, *t = NULL;
+ struct string_list *n;
error_with_pos("expand undefined %s %s",
- symbol_type_name[cur->tag],
+ symbol_types[cur->tag].name,
cur->string);
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup(symbol_type_name[cur->tag]);
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup(cur->string);
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup("{");
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup("UNKNOWN");
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup("}");
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
+ n = concat_list(mk_node
+ (symbol_types[cur->tag].name),
+ mk_node(cur->string),
+ mk_node("{"),
+ mk_node("UNKNOWN"),
+ mk_node("}"), NULL);
subsym =
add_symbol(cur->string, cur->tag, n, 0);
}
if (subsym->expansion_trail) {
if (flag_dump_defs) {
fprintf(debugfile, "%s %s ",
- symbol_type_name[cur->tag],
+ symbol_types[cur->tag].name,
cur->string);
}
- crc = partial_crc32(symbol_type_name[cur->tag],
+ crc = partial_crc32(symbol_types[cur->tag].name,
crc);
crc = partial_crc32_one(' ', crc);
crc = partial_crc32(cur->string, crc);
@@ -565,7 +645,7 @@ void export_symbol(const char *name)
{
struct symbol *sym;
- sym = find_symbol(name, SYM_NORMAL);
+ sym = find_symbol(name, SYM_NORMAL, 0);
if (!sym)
error_with_pos("export undefined symbol %s", name);
else {
@@ -624,8 +704,8 @@ static void print_location(void)
static void print_type_name(enum symbol_type type, const char *name)
{
- if (type != SYM_NORMAL)
- fprintf(stderr, "%s %s", symbol_type_name[type], name);
+ if (symbol_types[type].name)
+ fprintf(stderr, "%s %s", symbol_types[type].name, name);
else
fprintf(stderr, "%s", name);
}
@@ -771,8 +851,8 @@ int main(int argc, char **argv)
if (sym->is_override)
fputs("override ", dumpfile);
- if (sym->type != SYM_NORMAL) {
- putc(symbol_type_name[sym->type][0], dumpfile);
+ if (symbol_types[sym->type].n) {
+ putc(symbol_types[sym->type].n, dumpfile);
putc('#', dumpfile);
}
fputs(sym->name, dumpfile);
diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h
index 25c4d40cefc..7ec52ae3846 100644
--- a/scripts/genksyms/genksyms.h
+++ b/scripts/genksyms/genksyms.h
@@ -26,7 +26,8 @@
#include <stdio.h>
enum symbol_type {
- SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION
+ SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION,
+ SYM_ENUM_CONST
};
enum symbol_status {
@@ -58,7 +59,7 @@ typedef struct string_list **yystype;
extern int cur_line;
extern char *cur_filename;
-struct symbol *find_symbol(const char *name, enum symbol_type ns);
+struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact);
struct symbol *add_symbol(const char *name, enum symbol_type type,
struct string_list *defn, int is_extern);
void export_symbol(const char *);
@@ -66,6 +67,8 @@ void export_symbol(const char *);
void free_node(struct string_list *list);
void free_list(struct string_list *s, struct string_list *e);
struct string_list *copy_node(struct string_list *);
+struct string_list *copy_list_range(struct string_list *start,
+ struct string_list *end);
int yylex(void);
int yyparse(void);
diff --git a/scripts/genksyms/lex.c_shipped b/scripts/genksyms/lex.c_shipped
index 2ac23bcca5b..af4939041e4 100644
--- a/scripts/genksyms/lex.c_shipped
+++ b/scripts/genksyms/lex.c_shipped
@@ -79,6 +79,7 @@ typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
@@ -109,8 +110,6 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
-#endif /* ! C99 */
-
#endif /* ! FLEXINT_H */
/* %endif */
@@ -456,16 +455,16 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[76] =
+static yyconst flex_int16_t yy_accept[73] =
{ 0,
- 0, 0, 0, 0, 14, 12, 4, 3, 12, 7,
- 12, 12, 7, 12, 12, 12, 12, 12, 9, 9,
- 12, 12, 12, 4, 0, 5, 0, 7, 0, 6,
- 0, 0, 0, 0, 0, 0, 2, 8, 10, 10,
- 9, 0, 0, 9, 9, 0, 9, 0, 0, 11,
- 0, 0, 0, 10, 0, 10, 9, 9, 0, 0,
- 0, 0, 0, 0, 0, 10, 10, 0, 0, 0,
- 0, 0, 0, 1, 0
+ 0, 0, 14, 12, 4, 3, 12, 7, 12, 12,
+ 12, 12, 12, 9, 9, 12, 12, 7, 12, 12,
+ 4, 0, 5, 0, 7, 8, 0, 6, 0, 0,
+ 10, 10, 9, 0, 0, 9, 9, 0, 9, 0,
+ 0, 0, 0, 2, 0, 0, 11, 0, 10, 0,
+ 10, 9, 9, 0, 0, 0, 10, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0
} ;
static yyconst flex_int32_t yy_ec[256] =
@@ -507,108 +506,104 @@ static yyconst flex_int32_t yy_meta[29] =
8, 7, 3, 3, 3, 1, 3, 1
} ;
-static yyconst flex_int16_t yy_base[88] =
+static yyconst flex_int16_t yy_base[85] =
{ 0,
- 0, 147, 21, 140, 145, 284, 39, 284, 26, 0,
- 32, 126, 40, 44, 115, 35, 36, 46, 50, 53,
- 39, 61, 54, 79, 65, 284, 0, 0, 66, 284,
- 0, 119, 79, 75, 123, 104, 284, 284, 107, 0,
- 79, 73, 76, 76, 66, 0, 0, 85, 86, 284,
- 133, 83, 91, 284, 99, 147, 284, 114, 122, 70,
- 107, 141, 172, 151, 135, 181, 284, 137, 114, 157,
- 149, 48, 45, 284, 284, 208, 214, 222, 230, 238,
- 246, 250, 255, 256, 261, 267, 275
+ 0, 145, 150, 266, 27, 266, 25, 0, 131, 23,
+ 23, 16, 23, 39, 31, 25, 39, 60, 22, 65,
+ 57, 43, 266, 0, 0, 266, 61, 266, 0, 128,
+ 74, 0, 113, 59, 62, 113, 52, 0, 0, 72,
+ 66, 110, 100, 266, 73, 74, 266, 70, 266, 90,
+ 103, 266, 84, 129, 108, 113, 143, 266, 107, 66,
+ 118, 137, 168, 120, 80, 91, 145, 143, 83, 41,
+ 266, 266, 190, 196, 204, 212, 220, 228, 232, 237,
+ 238, 243, 249, 257
} ;
-static yyconst flex_int16_t yy_def[88] =
+static yyconst flex_int16_t yy_def[85] =
{ 0,
- 75, 1, 1, 3, 75, 75, 75, 75, 76, 77,
- 78, 75, 77, 79, 75, 75, 75, 75, 75, 19,
- 75, 75, 75, 75, 76, 75, 80, 77, 78, 75,
- 81, 75, 76, 78, 79, 79, 75, 75, 75, 39,
- 19, 82, 83, 75, 75, 84, 20, 76, 78, 75,
- 79, 51, 85, 75, 75, 75, 75, 84, 79, 51,
- 79, 79, 79, 51, 75, 75, 75, 86, 79, 63,
- 86, 87, 87, 75, 0, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75
+ 72, 1, 72, 72, 72, 72, 73, 74, 72, 72,
+ 75, 72, 72, 72, 14, 72, 72, 74, 72, 76,
+ 72, 73, 72, 77, 74, 72, 75, 72, 78, 72,
+ 72, 31, 14, 79, 80, 72, 72, 81, 15, 73,
+ 75, 76, 76, 72, 73, 75, 72, 82, 72, 72,
+ 72, 72, 81, 76, 54, 72, 72, 72, 76, 54,
+ 76, 76, 76, 54, 83, 76, 63, 83, 84, 84,
+ 72, 0, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72
} ;
-static yyconst flex_int16_t yy_nxt[313] =
+static yyconst flex_int16_t yy_nxt[295] =
{ 0,
- 6, 7, 8, 7, 9, 6, 10, 6, 6, 11,
- 6, 6, 12, 6, 6, 6, 6, 6, 6, 10,
- 10, 10, 13, 10, 10, 6, 10, 6, 15, 16,
- 26, 15, 17, 18, 19, 20, 20, 21, 15, 22,
- 24, 30, 24, 38, 33, 36, 37, 74, 23, 34,
- 74, 27, 38, 38, 38, 38, 38, 31, 32, 39,
- 39, 39, 40, 41, 41, 42, 47, 47, 47, 26,
- 43, 38, 44, 45, 46, 30, 44, 75, 38, 38,
- 24, 38, 24, 26, 30, 40, 55, 55, 57, 26,
- 27, 31, 57, 43, 35, 30, 64, 64, 64, 57,
-
- 31, 65, 65, 75, 27, 36, 37, 35, 59, 37,
- 27, 31, 56, 56, 56, 59, 37, 51, 52, 52,
- 39, 39, 39, 59, 37, 37, 68, 53, 54, 54,
- 69, 50, 38, 54, 59, 37, 44, 45, 32, 37,
- 44, 35, 59, 37, 75, 14, 60, 60, 66, 66,
- 66, 37, 14, 72, 75, 61, 62, 63, 59, 61,
- 56, 56, 56, 69, 64, 64, 64, 69, 67, 67,
- 75, 75, 75, 67, 37, 35, 75, 75, 75, 61,
- 62, 75, 75, 61, 75, 70, 70, 70, 75, 75,
- 75, 70, 70, 70, 66, 66, 66, 75, 75, 75,
-
- 75, 75, 54, 54, 75, 75, 75, 54, 25, 25,
- 25, 25, 25, 25, 25, 25, 28, 75, 75, 28,
- 28, 28, 29, 29, 29, 29, 29, 29, 29, 29,
- 35, 35, 35, 35, 35, 35, 35, 35, 48, 75,
- 48, 48, 48, 48, 48, 48, 49, 75, 49, 49,
- 49, 49, 49, 49, 42, 42, 75, 42, 56, 75,
- 56, 58, 58, 58, 66, 75, 66, 71, 71, 71,
- 71, 71, 71, 71, 71, 73, 73, 73, 73, 73,
- 73, 73, 73, 5, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
-
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75
+ 4, 5, 6, 5, 7, 4, 8, 9, 10, 11,
+ 9, 12, 13, 14, 15, 15, 16, 9, 17, 8,
+ 8, 8, 18, 8, 8, 4, 8, 19, 21, 23,
+ 21, 26, 28, 26, 26, 30, 31, 31, 31, 26,
+ 26, 26, 26, 71, 39, 39, 39, 23, 29, 26,
+ 24, 32, 33, 33, 34, 72, 26, 26, 21, 35,
+ 21, 36, 37, 38, 40, 36, 43, 44, 24, 41,
+ 28, 32, 50, 50, 52, 28, 23, 23, 52, 35,
+ 56, 56, 44, 28, 42, 71, 29, 31, 31, 31,
+ 42, 29, 59, 44, 48, 49, 49, 24, 24, 29,
+
+ 49, 43, 44, 51, 51, 51, 36, 37, 59, 44,
+ 36, 65, 44, 54, 55, 55, 51, 51, 51, 59,
+ 44, 64, 64, 64, 58, 58, 57, 57, 57, 58,
+ 59, 44, 42, 64, 64, 64, 52, 72, 59, 44,
+ 47, 66, 60, 60, 42, 44, 59, 69, 26, 72,
+ 20, 61, 62, 63, 72, 61, 57, 57, 57, 66,
+ 72, 72, 72, 66, 49, 49, 72, 61, 62, 49,
+ 44, 61, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 67, 67, 67, 72, 72, 72, 67, 67, 67,
+ 22, 22, 22, 22, 22, 22, 22, 22, 25, 72,
+
+ 72, 25, 25, 25, 27, 27, 27, 27, 27, 27,
+ 27, 27, 42, 42, 42, 42, 42, 42, 42, 42,
+ 45, 72, 45, 45, 45, 45, 45, 45, 46, 72,
+ 46, 46, 46, 46, 46, 46, 34, 34, 72, 34,
+ 51, 72, 51, 53, 53, 53, 57, 72, 57, 68,
+ 68, 68, 68, 68, 68, 68, 68, 70, 70, 70,
+ 70, 70, 70, 70, 70, 3, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72
+
} ;
-static yyconst flex_int16_t yy_chk[313] =
+static yyconst flex_int16_t yy_chk[295] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 3, 3,
- 9, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 7, 11, 7, 16, 13, 14, 14, 73, 3, 13,
- 72, 9, 16, 17, 17, 21, 21, 11, 18, 18,
- 18, 18, 19, 19, 19, 19, 20, 20, 20, 25,
- 19, 23, 19, 19, 19, 29, 19, 20, 22, 22,
- 24, 23, 24, 33, 34, 42, 43, 43, 45, 48,
- 25, 29, 45, 42, 60, 49, 52, 52, 52, 44,
-
- 34, 53, 53, 41, 33, 36, 36, 52, 61, 61,
- 48, 49, 55, 55, 55, 69, 69, 36, 36, 36,
- 39, 39, 39, 59, 59, 35, 59, 39, 39, 39,
- 61, 32, 15, 39, 51, 51, 58, 58, 12, 68,
- 58, 68, 62, 62, 5, 4, 51, 51, 65, 65,
- 65, 71, 2, 71, 0, 51, 51, 51, 70, 51,
- 56, 56, 56, 62, 64, 64, 64, 62, 56, 56,
- 0, 0, 0, 56, 63, 64, 0, 0, 0, 70,
- 70, 0, 0, 70, 0, 63, 63, 63, 0, 0,
- 0, 63, 63, 63, 66, 66, 66, 0, 0, 0,
-
- 0, 0, 66, 66, 0, 0, 0, 66, 76, 76,
- 76, 76, 76, 76, 76, 76, 77, 0, 0, 77,
- 77, 77, 78, 78, 78, 78, 78, 78, 78, 78,
- 79, 79, 79, 79, 79, 79, 79, 79, 80, 0,
- 80, 80, 80, 80, 80, 80, 81, 0, 81, 81,
- 81, 81, 81, 81, 82, 82, 0, 82, 83, 0,
- 83, 84, 84, 84, 85, 0, 85, 86, 86, 86,
- 86, 86, 86, 86, 86, 87, 87, 87, 87, 87,
- 87, 87, 87, 75, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
-
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75
+ 1, 1, 1, 1, 1, 1, 1, 1, 5, 7,
+ 5, 10, 11, 12, 12, 13, 13, 13, 13, 19,
+ 10, 16, 16, 70, 15, 15, 15, 22, 11, 19,
+ 7, 14, 14, 14, 14, 15, 17, 17, 21, 14,
+ 21, 14, 14, 14, 18, 14, 20, 20, 22, 18,
+ 27, 34, 35, 35, 37, 41, 40, 45, 37, 34,
+ 48, 48, 65, 46, 65, 69, 27, 31, 31, 31,
+ 60, 41, 66, 66, 31, 31, 31, 40, 45, 46,
+
+ 31, 43, 43, 50, 50, 50, 53, 53, 59, 59,
+ 53, 59, 42, 43, 43, 43, 51, 51, 51, 61,
+ 61, 55, 55, 55, 51, 51, 56, 56, 56, 51,
+ 54, 54, 55, 64, 64, 64, 36, 33, 62, 62,
+ 30, 61, 54, 54, 64, 68, 67, 68, 9, 3,
+ 2, 54, 54, 54, 0, 54, 57, 57, 57, 62,
+ 0, 0, 0, 62, 57, 57, 0, 67, 67, 57,
+ 63, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 63, 63, 63, 0, 0, 0, 63, 63, 63,
+ 73, 73, 73, 73, 73, 73, 73, 73, 74, 0,
+
+ 0, 74, 74, 74, 75, 75, 75, 75, 75, 75,
+ 75, 75, 76, 76, 76, 76, 76, 76, 76, 76,
+ 77, 0, 77, 77, 77, 77, 77, 77, 78, 0,
+ 78, 78, 78, 78, 78, 78, 79, 79, 0, 79,
+ 80, 0, 80, 81, 81, 81, 82, 0, 82, 83,
+ 83, 83, 83, 83, 83, 83, 83, 84, 84, 84,
+ 84, 84, 84, 84, 84, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72
+
} ;
static yy_state_type yy_last_accepting_state;
@@ -619,8 +614,8 @@ int yy_flex_debug = 1;
static yyconst flex_int16_t yy_rule_linenum[13] =
{ 0,
- 71, 72, 73, 76, 79, 80, 81, 87, 88, 89,
- 91, 94
+ 67, 68, 69, 72, 75, 76, 77, 83, 84, 85,
+ 87, 90
} ;
/* The intent behind this definition is that it'll catch
@@ -667,15 +662,11 @@ char *yytext;
and then we categorize those basic tokens in the second stage. */
#define YY_DECL static int yylex1(void)
-/* Version 2 checksumming does proper tokenization; version 1 wasn't
- quite so pedantic. */
-
/* We don't do multiple input files. */
#define YY_NO_INPUT 1
-#line 676 "scripts/genksyms/lex.c"
+#line 668 "scripts/genksyms/lex.c"
#define INITIAL 0
-#define V2_TOKENS 1
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -808,7 +799,7 @@ static int input (void );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- size_t n; \
+ int n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@@ -918,12 +909,12 @@ YY_DECL
register int yy_act;
/* %% [7.0] user's declarations go here */
-#line 67 "scripts/genksyms/lex.l"
+#line 63 "scripts/genksyms/lex.l"
/* Keep track of our location in the original source files. */
-#line 927 "scripts/genksyms/lex.c"
+#line 918 "scripts/genksyms/lex.c"
if ( !(yy_init) )
{
@@ -987,13 +978,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 76 )
+ if ( yy_current_state >= 73 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 284 );
+ while ( yy_base[yy_current_state] != 266 );
yy_find_action:
/* %% [10.0] code to find the action number goes here */
@@ -1041,42 +1032,42 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
-#line 71 "scripts/genksyms/lex.l"
+#line 67 "scripts/genksyms/lex.l"
return FILENAME;
YY_BREAK
case 2:
/* rule 2 can match eol */
YY_RULE_SETUP
-#line 72 "scripts/genksyms/lex.l"
+#line 68 "scripts/genksyms/lex.l"
cur_line++;
YY_BREAK
case 3:
/* rule 3 can match eol */
YY_RULE_SETUP
-#line 73 "scripts/genksyms/lex.l"
+#line 69 "scripts/genksyms/lex.l"
cur_line++;
YY_BREAK
/* Ignore all other whitespace. */
case 4:
YY_RULE_SETUP
-#line 76 "scripts/genksyms/lex.l"
+#line 72 "scripts/genksyms/lex.l"
;
YY_BREAK
case 5:
/* rule 5 can match eol */
YY_RULE_SETUP
-#line 79 "scripts/genksyms/lex.l"
+#line 75 "scripts/genksyms/lex.l"
return STRING;
YY_BREAK
case 6:
/* rule 6 can match eol */
YY_RULE_SETUP
-#line 80 "scripts/genksyms/lex.l"
+#line 76 "scripts/genksyms/lex.l"
return CHAR;
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 81 "scripts/genksyms/lex.l"
+#line 77 "scripts/genksyms/lex.l"
return IDENT;
YY_BREAK
/* The Pedant requires that the other C multi-character tokens be
@@ -1085,38 +1076,37 @@ return IDENT;
around them properly. */
case 8:
YY_RULE_SETUP
-#line 87 "scripts/genksyms/lex.l"
+#line 83 "scripts/genksyms/lex.l"
return OTHER;
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 88 "scripts/genksyms/lex.l"
+#line 84 "scripts/genksyms/lex.l"
return INT;
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 89 "scripts/genksyms/lex.l"
+#line 85 "scripts/genksyms/lex.l"
return REAL;
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 91 "scripts/genksyms/lex.l"
+#line 87 "scripts/genksyms/lex.l"
return DOTS;
YY_BREAK
/* All other tokens are single characters. */
case 12:
YY_RULE_SETUP
-#line 94 "scripts/genksyms/lex.l"
+#line 90 "scripts/genksyms/lex.l"
return yytext[0];
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 97 "scripts/genksyms/lex.l"
+#line 93 "scripts/genksyms/lex.l"
ECHO;
YY_BREAK
-#line 1118 "scripts/genksyms/lex.c"
+#line 1109 "scripts/genksyms/lex.c"
case YY_STATE_EOF(INITIAL):
-case YY_STATE_EOF(V2_TOKENS):
yyterminate();
case YY_END_OF_BUFFER:
@@ -1429,7 +1419,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 76 )
+ if ( yy_current_state >= 73 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1462,11 +1452,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 76 )
+ if ( yy_current_state >= 73 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 75);
+ yy_is_jam = (yy_current_state == 72);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -2252,7 +2242,7 @@ void yyfree (void * ptr )
/* %ok-for-header */
-#line 97 "scripts/genksyms/lex.l"
+#line 93 "scripts/genksyms/lex.l"
@@ -2263,12 +2253,23 @@ void yyfree (void * ptr )
/* Macros to append to our phrase collection list. */
+/*
+ * We mark any token, that that equals to a known enumerator, as
+ * SYM_ENUM_CONST. The parser will change this for struct and union tags later,
+ * the only problem is struct and union members:
+ * enum e { a, b }; struct s { int a, b; }
+ * but in this case, the only effect will be, that the ABI checksums become
+ * more volatile, which is acceptable. Also, such collisions are quite rare,
+ * so far it was only observed in include/linux/telephony.h.
+ */
#define _APP(T,L) do { \
cur_node = next_node; \
next_node = xmalloc(sizeof(*next_node)); \
next_node->next = cur_node; \
cur_node->string = memcpy(xmalloc(L+1), T, L+1); \
- cur_node->tag = SYM_NORMAL; \
+ cur_node->tag = \
+ find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\
+ SYM_ENUM_CONST : SYM_NORMAL ; \
} while (0)
#define APP _APP(yytext, yyleng)
@@ -2294,7 +2295,6 @@ yylex(void)
if (lexstate == ST_NOTSTARTED)
{
- BEGIN(V2_TOKENS);
next_node = xmalloc(sizeof(*next_node));
next_node->next = NULL;
lexstate = ST_NORMAL;
@@ -2347,8 +2347,8 @@ repeat:
case STRUCT_KEYW:
case UNION_KEYW:
- dont_want_brace_phrase = 3;
case ENUM_KEYW:
+ dont_want_brace_phrase = 3;
suppress_type_lookup = 2;
goto fini;
@@ -2358,8 +2358,7 @@ repeat:
}
if (!suppress_type_lookup)
{
- struct symbol *sym = find_symbol(yytext, SYM_TYPEDEF);
- if (sym && sym->type == SYM_TYPEDEF)
+ if (find_symbol(yytext, SYM_TYPEDEF, 1))
token = TYPE;
}
}
@@ -2478,7 +2477,20 @@ repeat:
++count;
APP;
goto repeat;
- case ')': case ']': case '}':
+ case '}':
+ /* is this the last line of an enum declaration? */
+ if (count == 0)
+ {
+ /* Put back the token we just read so's we can find it again
+ after registering the expression. */
+ unput(token);
+
+ lexstate = ST_NORMAL;
+ token = EXPRESSION_PHRASE;
+ break;
+ }
+ /* FALLTHRU */
+ case ')': case ']':
--count;
APP;
goto repeat;
@@ -2567,143 +2579,4 @@ fini:
return token;
}
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- ASM_KEYW = 258,
- ATTRIBUTE_KEYW = 259,
- AUTO_KEYW = 260,
- BOOL_KEYW = 261,
- CHAR_KEYW = 262,
- CONST_KEYW = 263,
- DOUBLE_KEYW = 264,
- ENUM_KEYW = 265,
- EXTERN_KEYW = 266,
- EXTENSION_KEYW = 267,
- FLOAT_KEYW = 268,
- INLINE_KEYW = 269,
- INT_KEYW = 270,
- LONG_KEYW = 271,
- REGISTER_KEYW = 272,
- RESTRICT_KEYW = 273,
- SHORT_KEYW = 274,
- SIGNED_KEYW = 275,
- STATIC_KEYW = 276,
- STRUCT_KEYW = 277,
- TYPEDEF_KEYW = 278,
- UNION_KEYW = 279,
- UNSIGNED_KEYW = 280,
- VOID_KEYW = 281,
- VOLATILE_KEYW = 282,
- TYPEOF_KEYW = 283,
- EXPORT_SYMBOL_KEYW = 284,
- ASM_PHRASE = 285,
- ATTRIBUTE_PHRASE = 286,
- BRACE_PHRASE = 287,
- BRACKET_PHRASE = 288,
- EXPRESSION_PHRASE = 289,
- CHAR = 290,
- DOTS = 291,
- IDENT = 292,
- INT = 293,
- REAL = 294,
- STRING = 295,
- TYPE = 296,
- OTHER = 297,
- FILENAME = 298
- };
-#endif
-/* Tokens. */
-#define ASM_KEYW 258
-#define ATTRIBUTE_KEYW 259
-#define AUTO_KEYW 260
-#define BOOL_KEYW 261
-#define CHAR_KEYW 262
-#define CONST_KEYW 263
-#define DOUBLE_KEYW 264
-#define ENUM_KEYW 265
-#define EXTERN_KEYW 266
-#define EXTENSION_KEYW 267
-#define FLOAT_KEYW 268
-#define INLINE_KEYW 269
-#define INT_KEYW 270
-#define LONG_KEYW 271
-#define REGISTER_KEYW 272
-#define RESTRICT_KEYW 273
-#define SHORT_KEYW 274
-#define SIGNED_KEYW 275
-#define STATIC_KEYW 276
-#define STRUCT_KEYW 277
-#define TYPEDEF_KEYW 278
-#define UNION_KEYW 279
-#define UNSIGNED_KEYW 280
-#define VOID_KEYW 281
-#define VOLATILE_KEYW 282
-#define TYPEOF_KEYW 283
-#define EXPORT_SYMBOL_KEYW 284
-#define ASM_PHRASE 285
-#define ATTRIBUTE_PHRASE 286
-#define BRACE_PHRASE 287
-#define BRACKET_PHRASE 288
-#define EXPRESSION_PHRASE 289
-#define CHAR 290
-#define DOTS 291
-#define IDENT 292
-#define INT 293
-#define REAL 294
-#define STRING 295
-#define TYPE 296
-#define OTHER 297
-#define FILENAME 298
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef int YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff --git a/scripts/genksyms/lex.l b/scripts/genksyms/lex.l
index fe50ff9dacd..e4ddd493fec 100644
--- a/scripts/genksyms/lex.l
+++ b/scripts/genksyms/lex.l
@@ -55,10 +55,6 @@ CHAR L?\'([^\\\']*\\.)*[^\\\']*\'
MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
-/* Version 2 checksumming does proper tokenization; version 1 wasn't
- quite so pedantic. */
-%s V2_TOKENS
-
/* We don't do multiple input files. */
%option noyywrap
@@ -84,9 +80,9 @@ MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
recognized as tokens. We don't actually use them since we don't
parse expressions, but we do want whitespace to be arranged
around them properly. */
-<V2_TOKENS>{MC_TOKEN} return OTHER;
-<V2_TOKENS>{INT} return INT;
-<V2_TOKENS>{REAL} return REAL;
+{MC_TOKEN} return OTHER;
+{INT} return INT;
+{REAL} return REAL;
"..." return DOTS;
@@ -103,12 +99,23 @@ MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
/* Macros to append to our phrase collection list. */
+/*
+ * We mark any token, that that equals to a known enumerator, as
+ * SYM_ENUM_CONST. The parser will change this for struct and union tags later,
+ * the only problem is struct and union members:
+ * enum e { a, b }; struct s { int a, b; }
+ * but in this case, the only effect will be, that the ABI checksums become
+ * more volatile, which is acceptable. Also, such collisions are quite rare,
+ * so far it was only observed in include/linux/telephony.h.
+ */
#define _APP(T,L) do { \
cur_node = next_node; \
next_node = xmalloc(sizeof(*next_node)); \
next_node->next = cur_node; \
cur_node->string = memcpy(xmalloc(L+1), T, L+1); \
- cur_node->tag = SYM_NORMAL; \
+ cur_node->tag = \
+ find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\
+ SYM_ENUM_CONST : SYM_NORMAL ; \
} while (0)
#define APP _APP(yytext, yyleng)
@@ -134,7 +141,6 @@ yylex(void)
if (lexstate == ST_NOTSTARTED)
{
- BEGIN(V2_TOKENS);
next_node = xmalloc(sizeof(*next_node));
next_node->next = NULL;
lexstate = ST_NORMAL;
@@ -187,8 +193,8 @@ repeat:
case STRUCT_KEYW:
case UNION_KEYW:
- dont_want_brace_phrase = 3;
case ENUM_KEYW:
+ dont_want_brace_phrase = 3;
suppress_type_lookup = 2;
goto fini;
@@ -198,8 +204,7 @@ repeat:
}
if (!suppress_type_lookup)
{
- struct symbol *sym = find_symbol(yytext, SYM_TYPEDEF);
- if (sym && sym->type == SYM_TYPEDEF)
+ if (find_symbol(yytext, SYM_TYPEDEF, 1))
token = TYPE;
}
}
@@ -318,7 +323,20 @@ repeat:
++count;
APP;
goto repeat;
- case ')': case ']': case '}':
+ case '}':
+ /* is this the last line of an enum declaration? */
+ if (count == 0)
+ {
+ /* Put back the token we just read so's we can find it again
+ after registering the expression. */
+ unput(token);
+
+ lexstate = ST_NORMAL;
+ token = EXPRESSION_PHRASE;
+ break;
+ }
+ /* FALLTHRU */
+ case ')': case ']':
--count;
APP;
goto repeat;
diff --git a/scripts/genksyms/parse.c_shipped b/scripts/genksyms/parse.c_shipped
index 809b949e495..1a0b8607fb0 100644
--- a/scripts/genksyms/parse.c_shipped
+++ b/scripts/genksyms/parse.c_shipped
@@ -1,24 +1,23 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-/* Skeleton implementation for Bison's Yacc-like parsers in C
+/* A Bison parser, made by GNU Bison 2.4.1. */
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
+
+ This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
@@ -29,7 +28,7 @@
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
@@ -47,7 +46,7 @@
#define YYBISON 1
/* Bison version. */
-#define YYBISON_VERSION "2.3"
+#define YYBISON_VERSION "2.4.1"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
@@ -55,11 +54,75 @@
/* Pure parsers. */
#define YYPURE 0
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
/* Using locations. */
#define YYLSP_NEEDED 0
+/* Copy the first part of user declarations. */
+
+/* Line 189 of yacc.c */
+#line 24 "scripts/genksyms/parse.y"
+
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include "genksyms.h"
+
+static int is_typedef;
+static int is_extern;
+static char *current_name;
+static struct string_list *decl_spec;
+
+static void yyerror(const char *);
+
+static inline void
+remove_node(struct string_list **p)
+{
+ struct string_list *node = *p;
+ *p = node->next;
+ free_node(node);
+}
+
+static inline void
+remove_list(struct string_list **pb, struct string_list **pe)
+{
+ struct string_list *b = *pb, *e = *pe;
+ *pb = e;
+ free_list(b, e);
+}
+
+
+
+/* Line 189 of yacc.c */
+#line 106 "scripts/genksyms/parse.c"
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 1
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
@@ -109,117 +172,22 @@
FILENAME = 298
};
#endif
-/* Tokens. */
-#define ASM_KEYW 258
-#define ATTRIBUTE_KEYW 259
-#define AUTO_KEYW 260
-#define BOOL_KEYW 261
-#define CHAR_KEYW 262
-#define CONST_KEYW 263
-#define DOUBLE_KEYW 264
-#define ENUM_KEYW 265
-#define EXTERN_KEYW 266
-#define EXTENSION_KEYW 267
-#define FLOAT_KEYW 268
-#define INLINE_KEYW 269
-#define INT_KEYW 270
-#define LONG_KEYW 271
-#define REGISTER_KEYW 272
-#define RESTRICT_KEYW 273
-#define SHORT_KEYW 274
-#define SIGNED_KEYW 275
-#define STATIC_KEYW 276
-#define STRUCT_KEYW 277
-#define TYPEDEF_KEYW 278
-#define UNION_KEYW 279
-#define UNSIGNED_KEYW 280
-#define VOID_KEYW 281
-#define VOLATILE_KEYW 282
-#define TYPEOF_KEYW 283
-#define EXPORT_SYMBOL_KEYW 284
-#define ASM_PHRASE 285
-#define ATTRIBUTE_PHRASE 286
-#define BRACE_PHRASE 287
-#define BRACKET_PHRASE 288
-#define EXPRESSION_PHRASE 289
-#define CHAR 290
-#define DOTS 291
-#define IDENT 292
-#define INT 293
-#define REAL 294
-#define STRING 295
-#define TYPE 296
-#define OTHER 297
-#define FILENAME 298
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 24 "scripts/genksyms/parse.y"
-
-
-#include <assert.h>
-#include <stdlib.h>
-#include "genksyms.h"
-
-static int is_typedef;
-static int is_extern;
-static char *current_name;
-static struct string_list *decl_spec;
-
-static void yyerror(const char *);
-
-static inline void
-remove_node(struct string_list **p)
-{
- struct string_list *node = *p;
- *p = node->next;
- free_node(node);
-}
-
-static inline void
-remove_list(struct string_list **pb, struct string_list **pe)
-{
- struct string_list *b = *pb, *e = *pe;
- *pb = e;
- free_list(b, e);
-}
-
-
-
-/* Enabling traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 1
-#endif
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-/* Enabling the token table. */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
#endif
-
/* Copy the second part of user declarations. */
-/* Line 216 of yacc.c. */
-#line 223 "scripts/genksyms/parse.c"
+/* Line 264 of yacc.c */
+#line 191 "scripts/genksyms/parse.c"
#ifdef short
# undef short
@@ -294,14 +262,14 @@ typedef short int yytype_int16;
#if (defined __STDC__ || defined __C99__FUNC__ \
|| defined __cplusplus || defined _MSC_VER)
static int
-YYID (int i)
+YYID (int yyi)
#else
static int
-YYID (i)
- int i;
+YYID (yyi)
+ int yyi;
#endif
{
- return i;
+ return yyi;
}
#endif
@@ -382,9 +350,9 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
/* A type that is properly aligned for any stack member. */
union yyalloc
{
- yytype_int16 yyss;
- YYSTYPE yyvs;
- };
+ yytype_int16 yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
/* The size of the maximum gap between one aligned stack and the next. */
# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
@@ -418,12 +386,12 @@ union yyalloc
elements in the stack, and YYPTR gives the new location of the
stack. Advance YYPTR to a properly aligned location for the next
stack. */
-# define YYSTACK_RELOCATE(Stack) \
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
do \
{ \
YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
yyptr += yynewbytes / sizeof (*yyptr); \
} \
@@ -434,16 +402,16 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 4
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 523
+#define YYLAST 532
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 53
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 46
+#define YYNNTS 49
/* YYNRULES -- Number of rules. */
-#define YYNRULES 126
+#define YYNRULES 132
/* YYNRULES -- Number of states. */
-#define YYNSTATES 178
+#define YYNSTATES 188
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
@@ -504,7 +472,8 @@ static const yytype_uint16 yyprhs[] =
239, 242, 245, 247, 248, 250, 252, 257, 262, 265,
269, 273, 277, 278, 280, 283, 287, 291, 292, 294,
296, 299, 303, 306, 307, 309, 311, 315, 318, 321,
- 323, 326, 327, 330, 333, 334, 336
+ 323, 326, 327, 330, 334, 339, 341, 345, 347, 351,
+ 354, 355, 357
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
@@ -512,16 +481,16 @@ static const yytype_int8 yyrhs[] =
{
54, 0, -1, 55, -1, 54, 55, -1, -1, 56,
57, -1, -1, 12, 23, 58, 60, -1, -1, 23,
- 59, 60, -1, 60, -1, 84, -1, 96, -1, 98,
+ 59, 60, -1, 60, -1, 84, -1, 99, -1, 101,
-1, 1, 44, -1, 1, 45, -1, 64, 61, 44,
-1, -1, 62, -1, 63, -1, 62, 46, 63, -1,
- 74, 97, 95, 85, -1, -1, 65, -1, 66, -1,
+ 74, 100, 95, 85, -1, -1, 65, -1, 66, -1,
65, 66, -1, 67, -1, 68, -1, 5, -1, 17,
-1, 21, -1, 11, -1, 14, -1, 69, -1, 73,
-1, 28, 47, 65, 48, 49, -1, 28, 47, 65,
49, -1, 22, 37, -1, 24, 37, -1, 10, 37,
-1, 22, 37, 87, -1, 24, 37, 87, -1, 10,
- 37, 32, -1, 10, 32, -1, 22, 87, -1, 24,
+ 37, 96, -1, 10, 96, -1, 22, 87, -1, 24,
87, -1, 7, -1, 19, -1, 15, -1, 16, -1,
20, -1, 25, -1, 13, -1, 9, -1, 26, -1,
6, -1, 41, -1, 48, 71, -1, -1, 72, -1,
@@ -543,26 +512,29 @@ static const yytype_int8 yyrhs[] =
91, 44, -1, 1, 44, -1, -1, 92, -1, 93,
-1, 92, 46, 93, -1, 76, 95, -1, 37, 94,
-1, 94, -1, 52, 34, -1, -1, 95, 31, -1,
- 30, 44, -1, -1, 30, -1, 29, 47, 37, 49,
- 44, -1
+ 51, 97, 45, -1, 51, 97, 46, 45, -1, 98,
+ -1, 97, 46, 98, -1, 37, -1, 37, 50, 34,
+ -1, 30, 44, -1, -1, 30, -1, 29, 47, 37,
+ 49, 44, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 103, 103, 104, 108, 108, 114, 114, 116, 116,
- 118, 119, 120, 121, 122, 123, 127, 141, 142, 146,
- 154, 167, 173, 174, 178, 179, 183, 189, 193, 194,
- 195, 196, 197, 201, 202, 203, 204, 208, 210, 212,
- 216, 223, 230, 239, 240, 241, 245, 246, 247, 248,
- 249, 250, 251, 252, 253, 254, 255, 259, 264, 265,
- 269, 270, 274, 274, 274, 275, 283, 284, 288, 297,
- 299, 301, 303, 305, 312, 313, 317, 318, 319, 321,
- 323, 325, 327, 332, 333, 334, 338, 339, 343, 344,
- 349, 354, 356, 360, 361, 369, 373, 375, 377, 379,
- 381, 386, 395, 396, 401, 406, 407, 411, 412, 416,
- 417, 421, 423, 428, 429, 433, 434, 438, 439, 440,
- 444, 448, 449, 453, 457, 458, 462
+ 0, 104, 104, 105, 109, 109, 115, 115, 117, 117,
+ 119, 120, 121, 122, 123, 124, 128, 142, 143, 147,
+ 155, 168, 174, 175, 179, 180, 184, 190, 194, 195,
+ 196, 197, 198, 202, 203, 204, 205, 209, 211, 213,
+ 217, 224, 231, 241, 244, 245, 249, 250, 251, 252,
+ 253, 254, 255, 256, 257, 258, 259, 263, 268, 269,
+ 273, 274, 278, 278, 278, 279, 287, 288, 292, 301,
+ 303, 305, 307, 309, 316, 317, 321, 322, 323, 325,
+ 327, 329, 331, 336, 337, 338, 342, 343, 347, 348,
+ 353, 358, 360, 364, 365, 373, 377, 379, 381, 383,
+ 385, 390, 399, 400, 405, 410, 411, 415, 416, 420,
+ 421, 425, 427, 432, 433, 437, 438, 442, 443, 444,
+ 448, 452, 453, 457, 458, 462, 463, 466, 471, 479,
+ 483, 484, 488
};
#endif
@@ -581,8 +553,8 @@ static const char *const yytname[] =
"ATTRIBUTE_PHRASE", "BRACE_PHRASE", "BRACKET_PHRASE",
"EXPRESSION_PHRASE", "CHAR", "DOTS", "IDENT", "INT", "REAL", "STRING",
"TYPE", "OTHER", "FILENAME", "';'", "'}'", "','", "'('", "'*'", "')'",
- "'='", "'{'", "':'", "$accept", "declaration_seq", "declaration", "@1",
- "declaration1", "@2", "@3", "simple_declaration",
+ "'='", "'{'", "':'", "$accept", "declaration_seq", "declaration", "$@1",
+ "declaration1", "$@2", "$@3", "simple_declaration",
"init_declarator_list_opt", "init_declarator_list", "init_declarator",
"decl_specifier_seq_opt", "decl_specifier_seq", "decl_specifier",
"storage_class_specifier", "type_specifier", "simple_type_specifier",
@@ -596,7 +568,8 @@ static const char *const yytname[] =
"member_specification", "member_declaration",
"member_declarator_list_opt", "member_declarator_list",
"member_declarator", "member_bitfield_declarator", "attribute_opt",
- "asm_definition", "asm_phrase_opt", "export_definition", 0
+ "enum_body", "enumerator_list", "enumerator", "asm_definition",
+ "asm_phrase_opt", "export_definition", 0
};
#endif
@@ -629,7 +602,8 @@ static const yytype_uint8 yyr1[] =
81, 82, 82, 83, 83, 83, 83, 83, 83, 83,
83, 84, 85, 85, 86, 87, 87, 88, 88, 89,
89, 90, 90, 91, 91, 92, 92, 93, 93, 93,
- 94, 95, 95, 96, 97, 97, 98
+ 94, 95, 95, 96, 96, 97, 97, 98, 98, 99,
+ 100, 100, 101
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@@ -647,7 +621,8 @@ static const yytype_uint8 yyr2[] =
2, 2, 1, 0, 1, 1, 4, 4, 2, 3,
3, 3, 0, 1, 2, 3, 3, 0, 1, 1,
2, 3, 2, 0, 1, 1, 3, 2, 2, 1,
- 2, 0, 2, 2, 0, 1, 5
+ 2, 0, 2, 3, 4, 1, 3, 1, 3, 2,
+ 0, 1, 5
};
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -659,17 +634,18 @@ static const yytype_uint8 yydefact[] =
62, 53, 0, 31, 0, 52, 32, 48, 49, 29,
65, 47, 50, 30, 0, 8, 0, 51, 54, 63,
0, 0, 0, 64, 56, 5, 10, 17, 23, 24,
- 26, 27, 33, 34, 11, 12, 13, 14, 15, 43,
- 39, 6, 37, 0, 44, 22, 38, 45, 0, 0,
- 123, 68, 0, 58, 0, 18, 19, 0, 124, 67,
- 25, 42, 22, 40, 0, 113, 0, 0, 109, 9,
- 17, 41, 0, 0, 0, 0, 57, 59, 60, 16,
- 0, 66, 125, 101, 121, 71, 0, 7, 112, 106,
- 76, 77, 0, 0, 0, 121, 75, 0, 114, 115,
- 119, 105, 0, 110, 124, 0, 36, 0, 73, 72,
- 61, 20, 102, 0, 93, 0, 84, 87, 88, 118,
+ 26, 27, 33, 34, 11, 12, 13, 14, 15, 39,
+ 0, 43, 6, 37, 0, 44, 22, 38, 45, 0,
+ 0, 129, 68, 0, 58, 0, 18, 19, 0, 130,
+ 67, 25, 42, 127, 0, 125, 22, 40, 0, 113,
+ 0, 0, 109, 9, 17, 41, 0, 0, 0, 0,
+ 57, 59, 60, 16, 0, 66, 131, 101, 121, 71,
+ 0, 0, 123, 0, 7, 112, 106, 76, 77, 0,
+ 0, 0, 121, 75, 0, 114, 115, 119, 105, 0,
+ 110, 130, 0, 36, 0, 73, 72, 61, 20, 102,
+ 0, 93, 0, 84, 87, 88, 128, 124, 126, 118,
0, 76, 0, 120, 74, 117, 80, 0, 111, 0,
- 35, 126, 122, 0, 21, 103, 70, 94, 56, 0,
+ 35, 132, 122, 0, 21, 103, 70, 94, 56, 0,
93, 90, 92, 69, 83, 0, 82, 81, 0, 0,
116, 104, 0, 95, 0, 91, 98, 0, 85, 89,
79, 78, 100, 99, 0, 0, 97, 96
@@ -678,46 +654,47 @@ static const yytype_uint8 yydefact[] =
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 2, 3, 35, 72, 55, 36, 64, 65,
- 66, 75, 38, 39, 40, 41, 42, 67, 86, 87,
- 43, 114, 69, 105, 106, 125, 126, 127, 128, 151,
- 152, 44, 144, 145, 54, 76, 77, 78, 107, 108,
- 109, 110, 122, 45, 94, 46
+ -1, 1, 2, 3, 35, 76, 56, 36, 65, 66,
+ 67, 79, 38, 39, 40, 41, 42, 68, 90, 91,
+ 43, 121, 70, 112, 113, 132, 133, 134, 135, 161,
+ 162, 44, 154, 155, 55, 80, 81, 82, 114, 115,
+ 116, 117, 129, 51, 74, 75, 45, 98, 46
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
-#define YYPACT_NINF -134
+#define YYPACT_NINF -135
static const yytype_int16 yypact[] =
{
- -134, 16, -134, 312, -134, -134, 20, -134, -134, -134,
- -134, -134, -18, -134, -3, -134, -134, -134, -134, -134,
- -134, -134, -134, -134, -26, -134, -25, -134, -134, -134,
- -7, 5, 27, -134, -134, -134, -134, 46, 482, -134,
- -134, -134, -134, -134, -134, -134, -134, -134, -134, -134,
- -8, -134, 30, 97, -134, 482, 30, -134, 482, 7,
- -134, -134, 12, 10, 42, 55, -134, 46, -15, 15,
- -134, -134, 482, -134, 25, 26, 47, 145, -134, -134,
- 46, -134, 356, 39, 71, 77, -134, 10, -134, -134,
- 46, -134, -134, -134, -134, -134, 193, -134, -134, -134,
- 75, -134, 6, 95, 43, -134, 28, 86, 85, -134,
- -134, -134, 88, -134, 103, 87, -134, 91, -134, -134,
- -134, -134, -23, 90, 401, 94, 101, 102, -134, -134,
- 98, -134, 108, -134, -134, 109, -134, 230, -134, 26,
- -134, -134, -134, 134, -134, -134, -134, -134, -134, 9,
- 48, -134, 35, -134, -134, 445, -134, -134, 125, 126,
- -134, -134, 128, -134, 129, -134, -134, 267, -134, -134,
- -134, -134, -134, -134, 130, 131, -134, -134
+ -135, 20, -135, 321, -135, -135, 30, -135, -135, -135,
+ -135, -135, -28, -135, 2, -135, -135, -135, -135, -135,
+ -135, -135, -135, -135, -6, -135, 9, -135, -135, -135,
+ -5, 15, -17, -135, -135, -135, -135, 18, 491, -135,
+ -135, -135, -135, -135, -135, -135, -135, -135, -135, -22,
+ 31, -135, -135, 19, 106, -135, 491, 19, -135, 491,
+ 50, -135, -135, 11, -3, 51, 57, -135, 18, -14,
+ 14, -135, -135, 48, 46, -135, 491, -135, 33, 32,
+ 59, 154, -135, -135, 18, -135, 365, 56, 60, 61,
+ -135, -3, -135, -135, 18, -135, -135, -135, -135, -135,
+ 202, 74, -135, -23, -135, -135, -135, 77, -135, 16,
+ 101, 49, -135, 34, 92, 93, -135, -135, -135, 94,
+ -135, 110, 95, -135, 97, -135, -135, -135, -135, -20,
+ 96, 410, 99, 113, 100, -135, -135, -135, -135, -135,
+ 103, -135, 107, -135, -135, 111, -135, 239, -135, 32,
+ -135, -135, -135, 123, -135, -135, -135, -135, -135, 3,
+ 52, -135, 38, -135, -135, 454, -135, -135, 117, 128,
+ -135, -135, 134, -135, 135, -135, -135, 276, -135, -135,
+ -135, -135, -135, -135, 137, 138, -135, -135
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -134, -134, 180, -134, -134, -134, -134, -33, -134, -134,
- 93, 0, -58, -37, -134, -134, -134, -73, -134, -134,
- -54, -32, -134, -81, -134, -133, -134, -134, 29, -50,
- -134, -134, -134, -134, -20, -134, -134, 110, -134, -134,
- 49, 96, 80, -134, -134, -134
+ -135, -135, 187, -135, -135, -135, -135, -50, -135, -135,
+ 98, 0, -59, -37, -135, -135, -135, -77, -135, -135,
+ -54, -30, -135, -90, -135, -134, -135, -135, 24, -58,
+ -135, -135, -135, -135, -18, -135, -135, 109, -135, -135,
+ 44, 87, 84, 148, -135, 102, -135, -135, -135
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
@@ -727,116 +704,118 @@ static const yytype_int16 yypgoto[] =
#define YYTABLE_NINF -109
static const yytype_int16 yytable[] =
{
- 82, 70, 104, 37, 159, 68, 57, 130, 142, 88,
- 162, 52, 56, 84, 49, 92, 4, 93, 10, 50,
- 51, 132, 79, 134, 71, 53, 53, 143, 20, 104,
- 85, 104, 73, 120, 175, 91, 81, 29, 124, 97,
- 58, 33, -93, 131, 83, 70, 147, 101, 95, 61,
- 163, 150, 59, 102, 63, 80, 149, 63, -93, 62,
- 63, 136, 96, 100, 47, 48, 104, 101, 166, 98,
- 99, 60, 80, 102, 63, 137, 150, 150, 103, 124,
- 131, 53, 167, 61, 101, 147, 89, 70, 117, 163,
- 102, 63, 111, 62, 63, 149, 63, 124, 74, 164,
- 165, 90, 7, 8, 9, 10, 11, 12, 13, 124,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 118, 26, 27, 28, 29, 30, 119, 103, 33, 133,
- 138, 139, 98, 92, -22, 141, 140, 154, 34, 146,
- 142, -22, -107, 153, -22, -22, 112, 156, 155, -22,
- 7, 8, 9, 10, 11, 12, 13, 157, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24, 161, 26,
- 27, 28, 29, 30, 170, 171, 33, 172, 173, 176,
- 177, 5, -22, 121, 169, 135, 34, 113, 160, -22,
- -108, 0, -22, -22, 123, 0, 129, -22, 7, 8,
- 9, 10, 11, 12, 13, 0, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 0, 26, 27, 28,
- 29, 30, 0, 0, 33, 0, 0, 0, 0, -86,
- 0, 158, 0, 0, 34, 7, 8, 9, 10, 11,
- 12, 13, -86, 15, 16, 17, 18, 19, 20, 21,
- 22, 23, 24, 0, 26, 27, 28, 29, 30, 0,
- 0, 33, 0, 0, 0, 0, -86, 0, 174, 0,
- 0, 34, 7, 8, 9, 10, 11, 12, 13, -86,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 0, 26, 27, 28, 29, 30, 0, 0, 33, 0,
- 0, 0, 0, -86, 0, 0, 0, 0, 34, 0,
- 0, 0, 0, 6, 0, 0, -86, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 0, 0, 0, 0, 0, -22,
- 0, 0, 0, 34, 0, 0, -22, 0, 0, -22,
- -22, 7, 8, 9, 10, 11, 12, 13, 0, 15,
+ 86, 71, 111, 37, 172, 10, 83, 69, 58, 49,
+ 92, 152, 88, 169, 73, 20, 96, 140, 97, 142,
+ 4, 144, 137, 50, 29, 52, 104, 61, 33, 50,
+ 153, 53, 111, 89, 111, 77, -93, 127, 95, 85,
+ 157, 131, 59, 185, 173, 54, 57, 99, 62, 71,
+ 159, 64, -93, 141, 160, 62, 84, 108, 63, 64,
+ 54, 100, 60, 109, 64, 63, 64, 146, 73, 107,
+ 54, 176, 111, 108, 47, 48, 84, 105, 106, 109,
+ 64, 147, 160, 160, 110, 177, 141, 87, 131, 157,
+ 108, 102, 103, 173, 71, 93, 109, 64, 101, 159,
+ 64, 174, 175, 94, 118, 124, 131, 78, 136, 125,
+ 126, 7, 8, 9, 10, 11, 12, 13, 131, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 110,
+ 26, 27, 28, 29, 30, 143, 148, 33, 105, 149,
+ 96, 151, 152, -22, 150, 156, 165, 34, 163, 164,
+ -22, -107, 166, -22, -22, 119, 167, 171, -22, 7,
+ 8, 9, 10, 11, 12, 13, 180, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 181, 26, 27,
+ 28, 29, 30, 182, 183, 33, 186, 187, 5, 179,
+ 120, -22, 128, 170, 139, 34, 145, 72, -22, -108,
+ 0, -22, -22, 130, 0, 138, -22, 7, 8, 9,
+ 10, 11, 12, 13, 0, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 0, 26, 27, 28, 29,
+ 30, 0, 0, 33, 0, 0, 0, 0, -86, 0,
+ 168, 0, 0, 34, 7, 8, 9, 10, 11, 12,
+ 13, -86, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 0, 26, 27, 28, 29, 30, 0, 0,
+ 33, 0, 0, 0, 0, -86, 0, 184, 0, 0,
+ 34, 7, 8, 9, 10, 11, 12, 13, -86, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 0,
26, 27, 28, 29, 30, 0, 0, 33, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 0, 0,
- 0, 0, 0, 0, 115, 116, 7, 8, 9, 10,
- 11, 12, 13, 0, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 0, 26, 27, 28, 29, 30,
- 0, 0, 33, 0, 0, 0, 0, 0, 147, 0,
- 0, 0, 148, 0, 0, 0, 0, 0, 149, 63,
+ 0, 0, -86, 0, 0, 0, 0, 34, 0, 0,
+ 0, 0, 6, 0, 0, -86, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 32, 33, 0, 0, 0, 0, 0, -22, 0,
+ 0, 0, 34, 0, 0, -22, 0, 0, -22, -22,
7, 8, 9, 10, 11, 12, 13, 0, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 0, 26,
27, 28, 29, 30, 0, 0, 33, 0, 0, 0,
- 0, 168, 0, 0, 0, 0, 34, 7, 8, 9,
- 10, 11, 12, 13, 0, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 0, 26, 27, 28, 29,
- 30, 0, 0, 33, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 34
+ 0, 0, 0, 0, 0, 0, 34, 0, 0, 0,
+ 0, 0, 0, 122, 123, 7, 8, 9, 10, 11,
+ 12, 13, 0, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 0, 26, 27, 28, 29, 30, 0,
+ 0, 33, 0, 0, 0, 0, 0, 157, 0, 0,
+ 0, 158, 0, 0, 0, 0, 0, 159, 64, 7,
+ 8, 9, 10, 11, 12, 13, 0, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 0, 26, 27,
+ 28, 29, 30, 0, 0, 33, 0, 0, 0, 0,
+ 178, 0, 0, 0, 0, 34, 7, 8, 9, 10,
+ 11, 12, 13, 0, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 0, 26, 27, 28, 29, 30,
+ 0, 0, 33, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 34
};
static const yytype_int16 yycheck[] =
{
- 58, 38, 75, 3, 137, 37, 26, 1, 31, 63,
- 1, 37, 37, 1, 32, 30, 0, 32, 8, 37,
- 23, 102, 55, 104, 32, 51, 51, 50, 18, 102,
- 62, 104, 52, 87, 167, 67, 56, 27, 96, 72,
- 47, 31, 33, 37, 37, 82, 37, 41, 33, 37,
- 41, 124, 47, 47, 48, 55, 47, 48, 49, 47,
- 48, 33, 47, 37, 44, 45, 139, 41, 33, 44,
- 45, 44, 72, 47, 48, 47, 149, 150, 52, 137,
- 37, 51, 47, 37, 41, 37, 44, 124, 49, 41,
- 47, 48, 45, 47, 48, 47, 48, 155, 1, 149,
- 150, 46, 5, 6, 7, 8, 9, 10, 11, 167,
- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 49, 24, 25, 26, 27, 28, 49, 52, 31, 34,
- 44, 46, 44, 30, 37, 44, 49, 36, 41, 49,
- 31, 44, 45, 49, 47, 48, 1, 49, 46, 52,
- 5, 6, 7, 8, 9, 10, 11, 49, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 34, 24,
- 25, 26, 27, 28, 49, 49, 31, 49, 49, 49,
- 49, 1, 37, 90, 155, 105, 41, 77, 139, 44,
- 45, -1, 47, 48, 1, -1, 100, 52, 5, 6,
- 7, 8, 9, 10, 11, -1, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, -1, 24, 25, 26,
- 27, 28, -1, -1, 31, -1, -1, -1, -1, 36,
- -1, 1, -1, -1, 41, 5, 6, 7, 8, 9,
- 10, 11, 49, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, -1, 24, 25, 26, 27, 28, -1,
- -1, 31, -1, -1, -1, -1, 36, -1, 1, -1,
- -1, 41, 5, 6, 7, 8, 9, 10, 11, 49,
- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- -1, 24, 25, 26, 27, 28, -1, -1, 31, -1,
- -1, -1, -1, 36, -1, -1, -1, -1, 41, -1,
- -1, -1, -1, 1, -1, -1, 49, 5, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
- 28, 29, 30, 31, -1, -1, -1, -1, -1, 37,
- -1, -1, -1, 41, -1, -1, 44, -1, -1, 47,
- 48, 5, 6, 7, 8, 9, 10, 11, -1, 13,
+ 59, 38, 79, 3, 1, 8, 56, 37, 26, 37,
+ 64, 31, 1, 147, 37, 18, 30, 1, 32, 109,
+ 0, 111, 45, 51, 27, 23, 76, 44, 31, 51,
+ 50, 37, 109, 63, 111, 53, 33, 91, 68, 57,
+ 37, 100, 47, 177, 41, 51, 37, 33, 37, 86,
+ 47, 48, 49, 37, 131, 37, 56, 41, 47, 48,
+ 51, 47, 47, 47, 48, 47, 48, 33, 37, 37,
+ 51, 33, 149, 41, 44, 45, 76, 44, 45, 47,
+ 48, 47, 159, 160, 52, 47, 37, 37, 147, 37,
+ 41, 45, 46, 41, 131, 44, 47, 48, 50, 47,
+ 48, 159, 160, 46, 45, 49, 165, 1, 34, 49,
+ 49, 5, 6, 7, 8, 9, 10, 11, 177, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 52,
+ 24, 25, 26, 27, 28, 34, 44, 31, 44, 46,
+ 30, 44, 31, 37, 49, 49, 46, 41, 49, 36,
+ 44, 45, 49, 47, 48, 1, 49, 34, 52, 5,
+ 6, 7, 8, 9, 10, 11, 49, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 49, 24, 25,
+ 26, 27, 28, 49, 49, 31, 49, 49, 1, 165,
+ 81, 37, 94, 149, 107, 41, 112, 49, 44, 45,
+ -1, 47, 48, 1, -1, 103, 52, 5, 6, 7,
+ 8, 9, 10, 11, -1, 13, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, -1, 24, 25, 26, 27,
+ 28, -1, -1, 31, -1, -1, -1, -1, 36, -1,
+ 1, -1, -1, 41, 5, 6, 7, 8, 9, 10,
+ 11, 49, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, -1, 24, 25, 26, 27, 28, -1, -1,
+ 31, -1, -1, -1, -1, 36, -1, 1, -1, -1,
+ 41, 5, 6, 7, 8, 9, 10, 11, 49, 13,
14, 15, 16, 17, 18, 19, 20, 21, 22, -1,
24, 25, 26, 27, 28, -1, -1, 31, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 41, -1, -1,
- -1, -1, -1, -1, 48, 49, 5, 6, 7, 8,
- 9, 10, 11, -1, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, -1, 24, 25, 26, 27, 28,
- -1, -1, 31, -1, -1, -1, -1, -1, 37, -1,
- -1, -1, 41, -1, -1, -1, -1, -1, 47, 48,
+ -1, -1, 36, -1, -1, -1, -1, 41, -1, -1,
+ -1, -1, 1, -1, -1, 49, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, -1, -1, -1, -1, -1, 37, -1,
+ -1, -1, 41, -1, -1, 44, -1, -1, 47, 48,
5, 6, 7, 8, 9, 10, 11, -1, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, -1, 24,
25, 26, 27, 28, -1, -1, 31, -1, -1, -1,
- -1, 36, -1, -1, -1, -1, 41, 5, 6, 7,
- 8, 9, 10, 11, -1, 13, 14, 15, 16, 17,
- 18, 19, 20, 21, 22, -1, 24, 25, 26, 27,
- 28, -1, -1, 31, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 41
+ -1, -1, -1, -1, -1, -1, 41, -1, -1, -1,
+ -1, -1, -1, 48, 49, 5, 6, 7, 8, 9,
+ 10, 11, -1, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, -1, 24, 25, 26, 27, 28, -1,
+ -1, 31, -1, -1, -1, -1, -1, 37, -1, -1,
+ -1, 41, -1, -1, -1, -1, -1, 47, 48, 5,
+ 6, 7, 8, 9, 10, 11, -1, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, -1, 24, 25,
+ 26, 27, 28, -1, -1, 31, -1, -1, -1, -1,
+ 36, -1, -1, -1, -1, 41, 5, 6, 7, 8,
+ 9, 10, 11, -1, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, -1, 24, 25, 26, 27, 28,
+ -1, -1, 31, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 41
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -847,15 +826,16 @@ static const yytype_uint8 yystos[] =
8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 41, 57, 60, 64, 65, 66,
- 67, 68, 69, 73, 84, 96, 98, 44, 45, 32,
- 37, 23, 37, 51, 87, 59, 37, 87, 47, 47,
- 44, 37, 47, 48, 61, 62, 63, 70, 74, 75,
- 66, 32, 58, 87, 1, 64, 88, 89, 90, 60,
- 64, 87, 65, 37, 1, 74, 71, 72, 73, 44,
- 46, 74, 30, 32, 97, 33, 47, 60, 44, 45,
- 37, 41, 47, 52, 70, 76, 77, 91, 92, 93,
- 94, 45, 1, 90, 74, 48, 49, 49, 49, 49,
- 73, 63, 95, 1, 65, 78, 79, 80, 81, 94,
+ 67, 68, 69, 73, 84, 99, 101, 44, 45, 37,
+ 51, 96, 23, 37, 51, 87, 59, 37, 87, 47,
+ 47, 44, 37, 47, 48, 61, 62, 63, 70, 74,
+ 75, 66, 96, 37, 97, 98, 58, 87, 1, 64,
+ 88, 89, 90, 60, 64, 87, 65, 37, 1, 74,
+ 71, 72, 73, 44, 46, 74, 30, 32, 100, 33,
+ 47, 50, 45, 46, 60, 44, 45, 37, 41, 47,
+ 52, 70, 76, 77, 91, 92, 93, 94, 45, 1,
+ 90, 74, 48, 49, 49, 49, 49, 73, 63, 95,
+ 1, 65, 78, 79, 80, 81, 34, 45, 98, 94,
1, 37, 76, 34, 76, 95, 33, 47, 44, 46,
49, 44, 31, 50, 85, 86, 49, 37, 41, 47,
70, 82, 83, 49, 36, 46, 49, 49, 1, 78,
@@ -1045,17 +1025,20 @@ yy_symbol_print (yyoutput, yytype, yyvaluep)
#if (defined __STDC__ || defined __C99__FUNC__ \
|| defined __cplusplus || defined _MSC_VER)
static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
#else
static void
-yy_stack_print (bottom, top)
- yytype_int16 *bottom;
- yytype_int16 *top;
+yy_stack_print (yybottom, yytop)
+ yytype_int16 *yybottom;
+ yytype_int16 *yytop;
#endif
{
YYFPRINTF (stderr, "Stack now");
- for (; bottom <= top; ++bottom)
- YYFPRINTF (stderr, " %d", *bottom);
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
YYFPRINTF (stderr, "\n");
}
@@ -1089,11 +1072,11 @@ yy_reduce_print (yyvsp, yyrule)
/* The symbols being reduced. */
for (yyi = 0; yyi < yynrhs; yyi++)
{
- fprintf (stderr, " $%d = ", yyi + 1);
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
&(yyvsp[(yyi + 1) - (yynrhs)])
);
- fprintf (stderr, "\n");
+ YYFPRINTF (stderr, "\n");
}
}
@@ -1373,10 +1356,8 @@ yydestruct (yymsg, yytype, yyvaluep)
break;
}
}
-
/* Prevent warnings from -Wmissing-prototypes. */
-
#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int yyparse (void *YYPARSE_PARAM);
@@ -1392,11 +1373,10 @@ int yyparse ();
#endif /* ! YYPARSE_PARAM */
-
-/* The look-ahead symbol. */
+/* The lookahead symbol. */
int yychar;
-/* The semantic value of the look-ahead symbol. */
+/* The semantic value of the lookahead symbol. */
YYSTYPE yylval;
/* Number of syntax errors so far. */
@@ -1404,9 +1384,9 @@ int yynerrs;
-/*----------.
-| yyparse. |
-`----------*/
+/*-------------------------.
+| yyparse or yypush_parse. |
+`-------------------------*/
#ifdef YYPARSE_PARAM
#if (defined __STDC__ || defined __C99__FUNC__ \
@@ -1430,66 +1410,68 @@ yyparse ()
#endif
#endif
{
-
- int yystate;
- int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Look-ahead token as an internal (translated) token number. */
- int yytoken = 0;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
+ int yystate;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss = yyssa;
- yytype_int16 *yyssp;
+ /* The stacks and their tools:
+ `yyss': related to states.
+ `yyvs': related to semantic values.
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- YYSTYPE *yyvsp;
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss;
+ yytype_int16 *yyssp;
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs;
+ YYSTYPE *yyvsp;
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- YYSIZE_T yystacksize = YYINITDEPTH;
+ YYSIZE_T yystacksize;
+ int yyn;
+ int yyresult;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken;
/* The variables used to return semantic value and location from the
action routines. */
YYSTYPE yyval;
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
/* The number of symbols on the RHS of the reduced rule.
Keep to zero when no symbol should be popped. */
int yylen = 0;
+ yytoken = 0;
+ yyss = yyssa;
+ yyvs = yyvsa;
+ yystacksize = YYINITDEPTH;
+
YYDPRINTF ((stderr, "Starting parse\n"));
yystate = 0;
yyerrstatus = 0;
yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
+ yychar = YYEMPTY; /* Cause a token to be read. */
/* Initialize stack pointers.
Waste one element of value and location stack
so that they stay on the same level as the state stack.
The wasted elements are never initialized. */
-
yyssp = yyss;
yyvsp = yyvs;
@@ -1519,7 +1501,6 @@ yyparse ()
YYSTYPE *yyvs1 = yyvs;
yytype_int16 *yyss1 = yyss;
-
/* Each stack pointer address is followed by the size of the
data in use in that stack, in bytes. This used to be a
conditional around just the two extra args, but that might
@@ -1527,7 +1508,6 @@ yyparse ()
yyoverflow (YY_("memory exhausted"),
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
-
&yystacksize);
yyss = yyss1;
@@ -1550,9 +1530,8 @@ yyparse ()
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
if (! yyptr)
goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
# undef YYSTACK_RELOCATE
if (yyss1 != yyssa)
YYSTACK_FREE (yyss1);
@@ -1563,7 +1542,6 @@ yyparse ()
yyssp = yyss + yysize - 1;
yyvsp = yyvs + yysize - 1;
-
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
(unsigned long int) yystacksize));
@@ -1573,6 +1551,9 @@ yyparse ()
YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
goto yybackup;
/*-----------.
@@ -1581,16 +1562,16 @@ yyparse ()
yybackup:
/* Do appropriate processing given the current state. Read a
- look-ahead token if we need one and don't already have one. */
+ lookahead token if we need one and don't already have one. */
- /* First try to decide what to do without reference to look-ahead token. */
+ /* First try to decide what to do without reference to lookahead token. */
yyn = yypact[yystate];
if (yyn == YYPACT_NINF)
goto yydefault;
- /* Not known => get a look-ahead token if don't already have one. */
+ /* Not known => get a lookahead token if don't already have one. */
- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
if (yychar == YYEMPTY)
{
YYDPRINTF ((stderr, "Reading a token: "));
@@ -1622,20 +1603,16 @@ yybackup:
goto yyreduce;
}
- if (yyn == YYFINAL)
- YYACCEPT;
-
/* Count tokens shifted since error; after three, turn off error
status. */
if (yyerrstatus)
yyerrstatus--;
- /* Shift the look-ahead token. */
+ /* Shift the lookahead token. */
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
- /* Discard the shifted token unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
yystate = yyn;
*++yyvsp = yylval;
@@ -1675,47 +1652,65 @@ yyreduce:
switch (yyn)
{
case 4:
-#line 108 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 109 "scripts/genksyms/parse.y"
{ is_typedef = 0; is_extern = 0; current_name = NULL; decl_spec = NULL; ;}
break;
case 5:
-#line 110 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 111 "scripts/genksyms/parse.y"
{ free_list(*(yyvsp[(2) - (2)]), NULL); *(yyvsp[(2) - (2)]) = NULL; ;}
break;
case 6:
-#line 114 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 115 "scripts/genksyms/parse.y"
{ is_typedef = 1; ;}
break;
case 7:
-#line 115 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 116 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]); ;}
break;
case 8:
-#line 116 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 117 "scripts/genksyms/parse.y"
{ is_typedef = 1; ;}
break;
case 9:
-#line 117 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 118 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 14:
-#line 122 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 123 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 15:
-#line 123 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 124 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 16:
-#line 128 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 129 "scripts/genksyms/parse.y"
{ if (current_name) {
struct string_list *decl = (*(yyvsp[(3) - (3)]))->next;
(*(yyvsp[(3) - (3)]))->next = NULL;
@@ -1729,12 +1724,16 @@ yyreduce:
break;
case 17:
-#line 141 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 142 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 19:
-#line 147 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 148 "scripts/genksyms/parse.y"
{ struct string_list *decl = *(yyvsp[(1) - (1)]);
*(yyvsp[(1) - (1)]) = NULL;
add_symbol(current_name,
@@ -1745,7 +1744,9 @@ yyreduce:
break;
case 20:
-#line 155 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 156 "scripts/genksyms/parse.y"
{ struct string_list *decl = *(yyvsp[(3) - (3)]);
*(yyvsp[(3) - (3)]) = NULL;
free_list(*(yyvsp[(2) - (3)]), NULL);
@@ -1758,27 +1759,37 @@ yyreduce:
break;
case 21:
-#line 168 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 169 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]) ? (yyvsp[(4) - (4)]) : (yyvsp[(3) - (4)]) ? (yyvsp[(3) - (4)]) : (yyvsp[(2) - (4)]) ? (yyvsp[(2) - (4)]) : (yyvsp[(1) - (4)]); ;}
break;
case 22:
-#line 173 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 174 "scripts/genksyms/parse.y"
{ decl_spec = NULL; ;}
break;
case 24:
-#line 178 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 179 "scripts/genksyms/parse.y"
{ decl_spec = *(yyvsp[(1) - (1)]); ;}
break;
case 25:
-#line 179 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 180 "scripts/genksyms/parse.y"
{ decl_spec = *(yyvsp[(2) - (2)]); ;}
break;
case 26:
-#line 184 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 185 "scripts/genksyms/parse.y"
{ /* Version 2 checksumming ignores storage class, as that
is really irrelevant to the linkage. */
remove_node((yyvsp[(1) - (1)]));
@@ -1787,32 +1798,44 @@ yyreduce:
break;
case 31:
-#line 196 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 197 "scripts/genksyms/parse.y"
{ is_extern = 1; (yyval) = (yyvsp[(1) - (1)]); ;}
break;
case 32:
-#line 197 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 198 "scripts/genksyms/parse.y"
{ is_extern = 0; (yyval) = (yyvsp[(1) - (1)]); ;}
break;
case 37:
-#line 209 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 210 "scripts/genksyms/parse.y"
{ remove_node((yyvsp[(1) - (2)])); (*(yyvsp[(2) - (2)]))->tag = SYM_STRUCT; (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 38:
-#line 211 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 212 "scripts/genksyms/parse.y"
{ remove_node((yyvsp[(1) - (2)])); (*(yyvsp[(2) - (2)]))->tag = SYM_UNION; (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 39:
-#line 213 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 214 "scripts/genksyms/parse.y"
{ remove_node((yyvsp[(1) - (2)])); (*(yyvsp[(2) - (2)]))->tag = SYM_ENUM; (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 40:
-#line 217 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 218 "scripts/genksyms/parse.y"
{ struct string_list *s = *(yyvsp[(3) - (3)]), *i = *(yyvsp[(2) - (3)]), *r;
r = copy_node(i); r->tag = SYM_STRUCT;
r->next = (*(yyvsp[(1) - (3)]))->next; *(yyvsp[(3) - (3)]) = r; (*(yyvsp[(1) - (3)]))->next = NULL;
@@ -1822,7 +1845,9 @@ yyreduce:
break;
case 41:
-#line 224 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 225 "scripts/genksyms/parse.y"
{ struct string_list *s = *(yyvsp[(3) - (3)]), *i = *(yyvsp[(2) - (3)]), *r;
r = copy_node(i); r->tag = SYM_UNION;
r->next = (*(yyvsp[(1) - (3)]))->next; *(yyvsp[(3) - (3)]) = r; (*(yyvsp[(1) - (3)]))->next = NULL;
@@ -1832,7 +1857,9 @@ yyreduce:
break;
case 42:
-#line 231 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 232 "scripts/genksyms/parse.y"
{ struct string_list *s = *(yyvsp[(3) - (3)]), *i = *(yyvsp[(2) - (3)]), *r;
r = copy_node(i); r->tag = SYM_ENUM;
r->next = (*(yyvsp[(1) - (3)]))->next; *(yyvsp[(3) - (3)]) = r; (*(yyvsp[(1) - (3)]))->next = NULL;
@@ -1842,42 +1869,58 @@ yyreduce:
break;
case 43:
-#line 239 "scripts/genksyms/parse.y"
- { (yyval) = (yyvsp[(2) - (2)]); ;}
+
+/* Line 1455 of yacc.c */
+#line 242 "scripts/genksyms/parse.y"
+ { add_symbol(NULL, SYM_ENUM, NULL, 0); (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 44:
-#line 240 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 244 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 45:
-#line 241 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 245 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 56:
-#line 255 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 259 "scripts/genksyms/parse.y"
{ (*(yyvsp[(1) - (1)]))->tag = SYM_TYPEDEF; (yyval) = (yyvsp[(1) - (1)]); ;}
break;
case 57:
-#line 260 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 264 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]) ? (yyvsp[(2) - (2)]) : (yyvsp[(1) - (2)]); ;}
break;
case 58:
-#line 264 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 268 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 61:
-#line 270 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 274 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 65:
-#line 276 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 280 "scripts/genksyms/parse.y"
{ /* restrict has no effect in prototypes so ignore it */
remove_node((yyvsp[(1) - (1)]));
(yyval) = (yyvsp[(1) - (1)]);
@@ -1885,12 +1928,16 @@ yyreduce:
break;
case 66:
-#line 283 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 287 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 68:
-#line 289 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 293 "scripts/genksyms/parse.y"
{ if (current_name != NULL) {
error_with_pos("unexpected second declaration name");
YYERROR;
@@ -1902,97 +1949,135 @@ yyreduce:
break;
case 69:
-#line 298 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 302 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]); ;}
break;
case 70:
-#line 300 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 304 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]); ;}
break;
case 71:
-#line 302 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 306 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 72:
-#line 304 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 308 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 73:
-#line 306 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 310 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 74:
-#line 312 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 316 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 78:
-#line 320 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 324 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]); ;}
break;
case 79:
-#line 322 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 326 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]); ;}
break;
case 80:
-#line 324 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 328 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 81:
-#line 326 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 330 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 82:
-#line 328 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 332 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 83:
-#line 332 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 336 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 85:
-#line 334 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 338 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 86:
-#line 338 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 342 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 89:
-#line 345 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 349 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 90:
-#line 350 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 354 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]) ? (yyvsp[(2) - (2)]) : (yyvsp[(1) - (2)]); ;}
break;
case 91:
-#line 355 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 359 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]) ? (yyvsp[(2) - (2)]) : (yyvsp[(1) - (2)]); ;}
break;
case 93:
-#line 360 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 364 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 94:
-#line 362 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 366 "scripts/genksyms/parse.y"
{ /* For version 2 checksums, we don't want to remember
private parameter names. */
remove_node((yyvsp[(1) - (1)]));
@@ -2001,39 +2086,53 @@ yyreduce:
break;
case 95:
-#line 370 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 374 "scripts/genksyms/parse.y"
{ remove_node((yyvsp[(1) - (1)]));
(yyval) = (yyvsp[(1) - (1)]);
;}
break;
case 96:
-#line 374 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 378 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]); ;}
break;
case 97:
-#line 376 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 380 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(4) - (4)]); ;}
break;
case 98:
-#line 378 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 382 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 99:
-#line 380 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 384 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 100:
-#line 382 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 386 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 101:
-#line 387 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 391 "scripts/genksyms/parse.y"
{ struct string_list *decl = *(yyvsp[(2) - (3)]);
*(yyvsp[(2) - (3)]) = NULL;
add_symbol(current_name, SYM_NORMAL, decl, is_extern);
@@ -2042,93 +2141,163 @@ yyreduce:
break;
case 102:
-#line 395 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 399 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 104:
-#line 402 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 406 "scripts/genksyms/parse.y"
{ remove_list((yyvsp[(2) - (2)]), &(*(yyvsp[(1) - (2)]))->next); (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 105:
-#line 406 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 410 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 106:
-#line 407 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 411 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 107:
-#line 411 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 415 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 110:
-#line 417 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 421 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 111:
-#line 422 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 426 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 112:
-#line 424 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 428 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 113:
-#line 428 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 432 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 116:
-#line 434 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 438 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 117:
-#line 438 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 442 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]) ? (yyvsp[(2) - (2)]) : (yyvsp[(1) - (2)]); ;}
break;
case 118:
-#line 439 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 443 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 120:
-#line 444 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 448 "scripts/genksyms/parse.y"
{ (yyval) = (yyvsp[(2) - (2)]); ;}
break;
case 121:
-#line 448 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 452 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
case 123:
-#line 453 "scripts/genksyms/parse.y"
- { (yyval) = (yyvsp[(2) - (2)]); ;}
+
+/* Line 1455 of yacc.c */
+#line 457 "scripts/genksyms/parse.y"
+ { (yyval) = (yyvsp[(3) - (3)]); ;}
break;
case 124:
-#line 457 "scripts/genksyms/parse.y"
+
+/* Line 1455 of yacc.c */
+#line 458 "scripts/genksyms/parse.y"
+ { (yyval) = (yyvsp[(4) - (4)]); ;}
+ break;
+
+ case 127:
+
+/* Line 1455 of yacc.c */
+#line 467 "scripts/genksyms/parse.y"
+ {
+ const char *name = strdup((*(yyvsp[(1) - (1)]))->string);
+ add_symbol(name, SYM_ENUM_CONST, NULL, 0);
+ ;}
+ break;
+
+ case 128:
+
+/* Line 1455 of yacc.c */
+#line 472 "scripts/genksyms/parse.y"
+ {
+ const char *name = strdup((*(yyvsp[(1) - (3)]))->string);
+ struct string_list *expr = copy_list_range(*(yyvsp[(3) - (3)]), *(yyvsp[(2) - (3)]));
+ add_symbol(name, SYM_ENUM_CONST, expr, 0);
+ ;}
+ break;
+
+ case 129:
+
+/* Line 1455 of yacc.c */
+#line 479 "scripts/genksyms/parse.y"
+ { (yyval) = (yyvsp[(2) - (2)]); ;}
+ break;
+
+ case 130:
+
+/* Line 1455 of yacc.c */
+#line 483 "scripts/genksyms/parse.y"
{ (yyval) = NULL; ;}
break;
- case 126:
-#line 463 "scripts/genksyms/parse.y"
+ case 132:
+
+/* Line 1455 of yacc.c */
+#line 489 "scripts/genksyms/parse.y"
{ export_symbol((*(yyvsp[(3) - (5)]))->string); (yyval) = (yyvsp[(5) - (5)]); ;}
break;
-/* Line 1267 of yacc.c. */
-#line 2132 "scripts/genksyms/parse.c"
+
+/* Line 1455 of yacc.c */
+#line 2301 "scripts/genksyms/parse.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2139,7 +2308,6 @@ yyreduce:
*++yyvsp = yyval;
-
/* Now `shift' the result of the reduction. Determine what state
that goes to, based on the state we popped back to and the rule
number reduced by. */
@@ -2204,7 +2372,7 @@ yyerrlab:
if (yyerrstatus == 3)
{
- /* If just tried and failed to reuse look-ahead token after an
+ /* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= YYEOF)
@@ -2221,7 +2389,7 @@ yyerrlab:
}
}
- /* Else will try to reuse look-ahead token after shifting the error
+ /* Else will try to reuse lookahead token after shifting the error
token. */
goto yyerrlab1;
@@ -2278,9 +2446,6 @@ yyerrlab1:
YY_STACK_PRINT (yyss, yyssp);
}
- if (yyn == YYFINAL)
- YYACCEPT;
-
*++yyvsp = yylval;
@@ -2305,7 +2470,7 @@ yyabortlab:
yyresult = 1;
goto yyreturn;
-#ifndef yyoverflow
+#if !defined(yyoverflow) || YYERROR_VERBOSE
/*-------------------------------------------------.
| yyexhaustedlab -- memory exhaustion comes here. |
`-------------------------------------------------*/
@@ -2316,7 +2481,7 @@ yyexhaustedlab:
#endif
yyreturn:
- if (yychar != YYEOF && yychar != YYEMPTY)
+ if (yychar != YYEMPTY)
yydestruct ("Cleanup: discarding lookahead",
yytoken, &yylval);
/* Do not reclaim the symbols of the rule which action triggered
@@ -2342,7 +2507,9 @@ yyreturn:
}
-#line 467 "scripts/genksyms/parse.y"
+
+/* Line 1675 of yacc.c */
+#line 493 "scripts/genksyms/parse.y"
static void
diff --git a/scripts/genksyms/parse.h_shipped b/scripts/genksyms/parse.h_shipped
index c4eeec652b7..51752366925 100644
--- a/scripts/genksyms/parse.h_shipped
+++ b/scripts/genksyms/parse.h_shipped
@@ -1,24 +1,23 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-/* Skeleton interface for Bison's Yacc-like parsers in C
+/* A Bison parser, made by GNU Bison 2.4.1. */
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
+
+ This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
@@ -29,10 +28,11 @@
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
+
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
@@ -82,58 +82,16 @@
FILENAME = 298
};
#endif
-/* Tokens. */
-#define ASM_KEYW 258
-#define ATTRIBUTE_KEYW 259
-#define AUTO_KEYW 260
-#define BOOL_KEYW 261
-#define CHAR_KEYW 262
-#define CONST_KEYW 263
-#define DOUBLE_KEYW 264
-#define ENUM_KEYW 265
-#define EXTERN_KEYW 266
-#define EXTENSION_KEYW 267
-#define FLOAT_KEYW 268
-#define INLINE_KEYW 269
-#define INT_KEYW 270
-#define LONG_KEYW 271
-#define REGISTER_KEYW 272
-#define RESTRICT_KEYW 273
-#define SHORT_KEYW 274
-#define SIGNED_KEYW 275
-#define STATIC_KEYW 276
-#define STRUCT_KEYW 277
-#define TYPEDEF_KEYW 278
-#define UNION_KEYW 279
-#define UNSIGNED_KEYW 280
-#define VOID_KEYW 281
-#define VOLATILE_KEYW 282
-#define TYPEOF_KEYW 283
-#define EXPORT_SYMBOL_KEYW 284
-#define ASM_PHRASE 285
-#define ATTRIBUTE_PHRASE 286
-#define BRACE_PHRASE 287
-#define BRACKET_PHRASE 288
-#define EXPRESSION_PHRASE 289
-#define CHAR 290
-#define DOTS 291
-#define IDENT 292
-#define INT 293
-#define REAL 294
-#define STRING 295
-#define TYPE 296
-#define OTHER 297
-#define FILENAME 298
-
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
#endif
extern YYSTYPE yylval;
+
diff --git a/scripts/genksyms/parse.y b/scripts/genksyms/parse.y
index 09a265cd719..ba5c242866c 100644
--- a/scripts/genksyms/parse.y
+++ b/scripts/genksyms/parse.y
@@ -25,6 +25,7 @@
#include <assert.h>
#include <stdlib.h>
+#include <string.h>
#include "genksyms.h"
static int is_typedef;
@@ -227,16 +228,19 @@ type_specifier:
add_symbol(i->string, SYM_UNION, s, is_extern);
$$ = $3;
}
- | ENUM_KEYW IDENT BRACE_PHRASE
+ | ENUM_KEYW IDENT enum_body
{ struct string_list *s = *$3, *i = *$2, *r;
r = copy_node(i); r->tag = SYM_ENUM;
r->next = (*$1)->next; *$3 = r; (*$1)->next = NULL;
add_symbol(i->string, SYM_ENUM, s, is_extern);
$$ = $3;
}
-
- /* Anonymous s/u/e definitions. Nothing needs doing. */
- | ENUM_KEYW BRACE_PHRASE { $$ = $2; }
+ /*
+ * Anonymous enum definition. Tell add_symbol() to restart its counter.
+ */
+ | ENUM_KEYW enum_body
+ { add_symbol(NULL, SYM_ENUM, NULL, 0); $$ = $2; }
+ /* Anonymous s/u definitions. Nothing needs doing. */
| STRUCT_KEYW class_body { $$ = $2; }
| UNION_KEYW class_body { $$ = $2; }
;
@@ -449,6 +453,28 @@ attribute_opt:
| attribute_opt ATTRIBUTE_PHRASE
;
+enum_body:
+ '{' enumerator_list '}' { $$ = $3; }
+ | '{' enumerator_list ',' '}' { $$ = $4; }
+ ;
+
+enumerator_list:
+ enumerator
+ | enumerator_list ',' enumerator
+
+enumerator:
+ IDENT
+ {
+ const char *name = strdup((*$1)->string);
+ add_symbol(name, SYM_ENUM_CONST, NULL, 0);
+ }
+ | IDENT '=' EXPRESSION_PHRASE
+ {
+ const char *name = strdup((*$1)->string);
+ struct string_list *expr = copy_list_range(*$3, *$2);
+ add_symbol(name, SYM_ENUM_CONST, expr, 0);
+ }
+
asm_definition:
ASM_PHRASE ';' { $$ = $2; }
;
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index e8fba959fff..cd104afcc5f 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1248,6 +1248,19 @@ static int is_function(Elf_Sym *sym)
return -1;
}
+static void print_section_list(const char * const list[20])
+{
+ const char *const *s = list;
+
+ while (*s) {
+ fprintf(stderr, "%s", *s);
+ s++;
+ if (*s)
+ fprintf(stderr, ", ");
+ }
+ fprintf(stderr, "\n");
+}
+
/*
* Print a warning about a section mismatch.
* Try to find symbols near it so user can find it.
@@ -1304,7 +1317,6 @@ static void report_sec_mismatch(const char *modname,
break;
case DATA_TO_ANY_INIT: {
prl_to = sec2annotation(tosec);
- const char *const *s = mismatch->symbol_white_list;
fprintf(stderr,
"The variable %s references\n"
"the %s %s%s%s\n"
@@ -1312,9 +1324,7 @@ static void report_sec_mismatch(const char *modname,
"variable with __init* or __refdata (see linux/init.h) "
"or name the variable:\n",
fromsym, to, prl_to, tosym, to_p);
- while (*s)
- fprintf(stderr, "%s, ", *s++);
- fprintf(stderr, "\n");
+ print_section_list(mismatch->symbol_white_list);
free(prl_to);
break;
}
@@ -1329,7 +1339,6 @@ static void report_sec_mismatch(const char *modname,
break;
case DATA_TO_ANY_EXIT: {
prl_to = sec2annotation(tosec);
- const char *const *s = mismatch->symbol_white_list;
fprintf(stderr,
"The variable %s references\n"
"the %s %s%s%s\n"
@@ -1337,9 +1346,7 @@ static void report_sec_mismatch(const char *modname,
"variable with __exit* (see linux/init.h) or "
"name the variable:\n",
fromsym, to, prl_to, tosym, to_p);
- while (*s)
- fprintf(stderr, "%s, ", *s++);
- fprintf(stderr, "\n");
+ print_section_list(mismatch->symbol_white_list);
free(prl_to);
break;
}
diff --git a/scripts/unifdef.c b/scripts/unifdef.c
index 44d39785e50..7493c0ee51c 100644
--- a/scripts/unifdef.c
+++ b/scripts/unifdef.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002 - 2009 Tony Finch <dot@dotat.at>
+ * Copyright (c) 2002 - 2011 Tony Finch <dot@dotat.at>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -24,23 +24,14 @@
*/
/*
+ * unifdef - remove ifdef'ed lines
+ *
* This code was derived from software contributed to Berkeley by Dave Yost.
* It was rewritten to support ANSI C by Tony Finch. The original version
* of unifdef carried the 4-clause BSD copyright licence. None of its code
* remains in this version (though some of the names remain) so it now
* carries a more liberal licence.
*
- * The latest version is available from http://dotat.at/prog/unifdef
- */
-
-static const char * const copyright[] = {
- "@(#) Copyright (c) 2002 - 2009 Tony Finch <dot@dotat.at>\n",
- "$dotat: unifdef/unifdef.c,v 1.190 2009/11/27 17:21:26 fanf2 Exp $",
-};
-
-/*
- * unifdef - remove ifdef'ed lines
- *
* Wishlist:
* provide an option which will append the name of the
* appropriate symbol after #else's and #endif's
@@ -48,12 +39,16 @@ static const char * const copyright[] = {
* #else's and #endif's to see that they match their
* corresponding #ifdef or #ifndef
*
- * The first two items above require better buffer handling, which would
- * also make it possible to handle all "dodgy" directives correctly.
+ * These require better buffer handling, which would also make
+ * it possible to handle all "dodgy" directives correctly.
*/
+#include <sys/types.h>
+#include <sys/stat.h>
+
#include <ctype.h>
#include <err.h>
+#include <errno.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
@@ -61,6 +56,12 @@ static const char * const copyright[] = {
#include <string.h>
#include <unistd.h>
+const char copyright[] =
+ "@(#) $Version: unifdef-2.5 $\n"
+ "@(#) $Author: Tony Finch (dot@dotat.at) $\n"
+ "@(#) $URL: http://dotat.at/prog/unifdef $\n"
+;
+
/* types of input lines: */
typedef enum {
LT_TRUEI, /* a true #if with ignore flag */
@@ -153,6 +154,11 @@ static char const * const linestate_name[] = {
#define EDITSLOP 10
/*
+ * For temporary filenames
+ */
+#define TEMPLATE "unifdef.XXXXXX"
+
+/*
* Globals.
*/
@@ -165,6 +171,7 @@ static bool strictlogic; /* -K: keep ambiguous #ifs */
static bool killconsts; /* -k: eval constant #ifs */
static bool lnnum; /* -n: add #line directives */
static bool symlist; /* -s: output symbol list */
+static bool symdepth; /* -S: output symbol depth */
static bool text; /* -t: this is a text file */
static const char *symname[MAXSYMS]; /* symbol name */
@@ -175,10 +182,18 @@ static int nsyms; /* number of symbols */
static FILE *input; /* input file pointer */
static const char *filename; /* input file name */
static int linenum; /* current line number */
+static FILE *output; /* output file pointer */
+static const char *ofilename; /* output file name */
+static bool overwriting; /* output overwrites input */
+static char tempname[FILENAME_MAX]; /* used when overwriting */
static char tline[MAXLINE+EDITSLOP];/* input buffer plus space */
static char *keyword; /* used for editing #elif's */
+static const char *newline; /* input file format */
+static const char newline_unix[] = "\n";
+static const char newline_crlf[] = "\r\n";
+
static Comment_state incomment; /* comment parser state */
static Line_state linestate; /* #if line parser state */
static Ifstate ifstate[MAXDEPTH]; /* #if processor state */
@@ -189,10 +204,13 @@ static int delcount; /* count of deleted lines */
static unsigned blankcount; /* count of blank lines */
static unsigned blankmax; /* maximum recent blankcount */
static bool constexpr; /* constant #if expression */
+static bool zerosyms = true; /* to format symdepth output */
+static bool firstsym; /* ditto */
static int exitstat; /* program exit status */
static void addsym(bool, bool, char *);
+static void closeout(void);
static void debug(const char *, ...);
static void done(void);
static void error(const char *);
@@ -212,6 +230,7 @@ static void state(Ifstate);
static int strlcmp(const char *, const char *, size_t);
static void unnest(void);
static void usage(void);
+static void version(void);
#define endsym(c) (!isalnum((unsigned char)c) && c != '_')
@@ -223,7 +242,7 @@ main(int argc, char *argv[])
{
int opt;
- while ((opt = getopt(argc, argv, "i:D:U:I:BbcdeKklnst")) != -1)
+ while ((opt = getopt(argc, argv, "i:D:U:I:o:bBcdeKklnsStV")) != -1)
switch (opt) {
case 'i': /* treat stuff controlled by these symbols as text */
/*
@@ -245,16 +264,15 @@ main(int argc, char *argv[])
case 'U': /* undef a symbol */
addsym(false, false, optarg);
break;
- case 'I':
- /* no-op for compatibility with cpp */
- break;
- case 'B': /* compress blank lines around removed section */
- compblank = true;
+ case 'I': /* no-op for compatibility with cpp */
break;
case 'b': /* blank deleted lines instead of omitting them */
case 'l': /* backwards compatibility */
lnblank = true;
break;
+ case 'B': /* compress blank lines around removed section */
+ compblank = true;
+ break;
case 'c': /* treat -D as -U and vice versa */
complement = true;
break;
@@ -273,12 +291,20 @@ main(int argc, char *argv[])
case 'n': /* add #line directive after deleted lines */
lnnum = true;
break;
+ case 'o': /* output to a file */
+ ofilename = optarg;
+ break;
case 's': /* only output list of symbols that control #ifs */
symlist = true;
break;
+ case 'S': /* list symbols with their nesting depth */
+ symlist = symdepth = true;
+ break;
case 't': /* don't parse C comments */
text = true;
break;
+ case 'V': /* print version */
+ version();
default:
usage();
}
@@ -290,21 +316,68 @@ main(int argc, char *argv[])
errx(2, "can only do one file");
} else if (argc == 1 && strcmp(*argv, "-") != 0) {
filename = *argv;
- input = fopen(filename, "r");
+ input = fopen(filename, "rb");
if (input == NULL)
err(2, "can't open %s", filename);
} else {
filename = "[stdin]";
input = stdin;
}
+ if (ofilename == NULL) {
+ ofilename = "[stdout]";
+ output = stdout;
+ } else {
+ struct stat ist, ost;
+ if (stat(ofilename, &ost) == 0 &&
+ fstat(fileno(input), &ist) == 0)
+ overwriting = (ist.st_dev == ost.st_dev
+ && ist.st_ino == ost.st_ino);
+ if (overwriting) {
+ const char *dirsep;
+ int ofd;
+
+ dirsep = strrchr(ofilename, '/');
+ if (dirsep != NULL)
+ snprintf(tempname, sizeof(tempname),
+ "%.*s/" TEMPLATE,
+ (int)(dirsep - ofilename), ofilename);
+ else
+ snprintf(tempname, sizeof(tempname),
+ TEMPLATE);
+ ofd = mkstemp(tempname);
+ if (ofd != -1)
+ output = fdopen(ofd, "wb+");
+ if (output == NULL)
+ err(2, "can't create temporary file");
+ fchmod(ofd, ist.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO));
+ } else {
+ output = fopen(ofilename, "wb");
+ if (output == NULL)
+ err(2, "can't open %s", ofilename);
+ }
+ }
process();
abort(); /* bug */
}
static void
+version(void)
+{
+ const char *c = copyright;
+ for (;;) {
+ while (*++c != '$')
+ if (*c == '\0')
+ exit(0);
+ while (*++c != '$')
+ putc(*c, stderr);
+ putc('\n', stderr);
+ }
+}
+
+static void
usage(void)
{
- fprintf(stderr, "usage: unifdef [-BbcdeKknst] [-Ipath]"
+ fprintf(stderr, "usage: unifdef [-bBcdeKknsStV] [-Ipath]"
" [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n");
exit(2);
}
@@ -322,7 +395,8 @@ usage(void)
* When we have processed a group that starts off with a known-false
* #if/#elif sequence (which has therefore been deleted) followed by a
* #elif that we don't understand and therefore must keep, we edit the
- * latter into a #if to keep the nesting correct.
+ * latter into a #if to keep the nesting correct. We use strncpy() to
+ * overwrite the 4 byte token "elif" with "if " without a '\0' byte.
*
* When we find a true #elif in a group, the following block will
* always be kept and the rest of the sequence after the next #elif or
@@ -375,11 +449,11 @@ static void Oelif (void) { if (!iocccok) Eioccc(); Pelif(); }
static void Idrop (void) { Fdrop(); ignoreon(); }
static void Itrue (void) { Ftrue(); ignoreon(); }
static void Ifalse(void) { Ffalse(); ignoreon(); }
-/* edit this line */
+/* modify this line */
static void Mpass (void) { strncpy(keyword, "if ", 4); Pelif(); }
-static void Mtrue (void) { keywordedit("else\n"); state(IS_TRUE_MIDDLE); }
-static void Melif (void) { keywordedit("endif\n"); state(IS_FALSE_TRAILER); }
-static void Melse (void) { keywordedit("endif\n"); state(IS_FALSE_ELSE); }
+static void Mtrue (void) { keywordedit("else"); state(IS_TRUE_MIDDLE); }
+static void Melif (void) { keywordedit("endif"); state(IS_FALSE_TRAILER); }
+static void Melse (void) { keywordedit("endif"); state(IS_FALSE_ELSE); }
static state_fn * const trans_table[IS_COUNT][LT_COUNT] = {
/* IS_OUTSIDE */
@@ -431,13 +505,6 @@ static state_fn * const trans_table[IS_COUNT][LT_COUNT] = {
* State machine utility functions
*/
static void
-done(void)
-{
- if (incomment)
- error("EOF in comment");
- exit(exitstat);
-}
-static void
ignoreoff(void)
{
if (depth == 0)
@@ -452,14 +519,8 @@ ignoreon(void)
static void
keywordedit(const char *replacement)
{
- size_t size = tline + sizeof(tline) - keyword;
- char *dst = keyword;
- const char *src = replacement;
- if (size != 0) {
- while ((--size != 0) && (*src != '\0'))
- *dst++ = *src++;
- *dst = '\0';
- }
+ snprintf(keyword, tline + sizeof(tline) - keyword,
+ "%s%s", replacement, newline);
print();
}
static void
@@ -494,24 +555,26 @@ flushline(bool keep)
if (symlist)
return;
if (keep ^ complement) {
- bool blankline = tline[strspn(tline, " \t\n")] == '\0';
+ bool blankline = tline[strspn(tline, " \t\r\n")] == '\0';
if (blankline && compblank && blankcount != blankmax) {
delcount += 1;
blankcount += 1;
} else {
if (lnnum && delcount > 0)
- printf("#line %d\n", linenum);
- fputs(tline, stdout);
+ printf("#line %d%s", linenum, newline);
+ fputs(tline, output);
delcount = 0;
blankmax = blankcount = blankline ? blankcount + 1 : 0;
}
} else {
if (lnblank)
- putc('\n', stdout);
+ fputs(newline, output);
exitstat = 1;
delcount += 1;
blankcount = 0;
}
+ if (debugging)
+ fflush(output);
}
/*
@@ -520,22 +583,55 @@ flushline(bool keep)
static void
process(void)
{
- Linetype lineval;
-
/* When compressing blank lines, act as if the file
is preceded by a large number of blank lines. */
blankmax = blankcount = 1000;
for (;;) {
- linenum++;
- lineval = parseline();
+ Linetype lineval = parseline();
trans_table[ifstate[depth]][lineval]();
- debug("process %s -> %s depth %d",
- linetype_name[lineval],
+ debug("process line %d %s -> %s depth %d",
+ linenum, linetype_name[lineval],
ifstate_name[ifstate[depth]], depth);
}
}
/*
+ * Flush the output and handle errors.
+ */
+static void
+closeout(void)
+{
+ if (symdepth && !zerosyms)
+ printf("\n");
+ if (fclose(output) == EOF) {
+ warn("couldn't write to %s", ofilename);
+ if (overwriting) {
+ unlink(tempname);
+ errx(2, "%s unchanged", filename);
+ } else {
+ exit(2);
+ }
+ }
+}
+
+/*
+ * Clean up and exit.
+ */
+static void
+done(void)
+{
+ if (incomment)
+ error("EOF in comment");
+ closeout();
+ if (overwriting && rename(tempname, ofilename) == -1) {
+ warn("couldn't rename temporary file");
+ unlink(tempname);
+ errx(2, "%s unchanged", ofilename);
+ }
+ exit(exitstat);
+}
+
+/*
* Parse a line and determine its type. We keep the preprocessor line
* parser state between calls in the global variable linestate, with
* help from skipcomment().
@@ -549,14 +645,22 @@ parseline(void)
Linetype retval;
Comment_state wascomment;
+ linenum++;
if (fgets(tline, MAXLINE, input) == NULL)
return (LT_EOF);
+ if (newline == NULL) {
+ if (strrchr(tline, '\n') == strrchr(tline, '\r') + 1)
+ newline = newline_crlf;
+ else
+ newline = newline_unix;
+ }
retval = LT_PLAIN;
wascomment = incomment;
cp = skipcomment(tline);
if (linestate == LS_START) {
if (*cp == '#') {
linestate = LS_HASH;
+ firstsym = true;
cp = skipcomment(cp + 1);
} else if (*cp != '\0')
linestate = LS_DIRTY;
@@ -566,7 +670,8 @@ parseline(void)
cp = skipsym(cp);
kwlen = cp - keyword;
/* no way can we deal with a continuation inside a keyword */
- if (strncmp(cp, "\\\n", 2) == 0)
+ if (strncmp(cp, "\\\r\n", 3) == 0 ||
+ strncmp(cp, "\\\n", 2) == 0)
Eioccc();
if (strlcmp("ifdef", keyword, kwlen) == 0 ||
strlcmp("ifndef", keyword, kwlen) == 0) {
@@ -617,9 +722,8 @@ parseline(void)
size_t len = cp - tline;
if (fgets(tline + len, MAXLINE - len, input) == NULL) {
/* append the missing newline */
- tline[len+0] = '\n';
- tline[len+1] = '\0';
- cp++;
+ strcpy(tline + len, newline);
+ cp += strlen(newline);
linestate = LS_START;
} else {
linestate = LS_DIRTY;
@@ -630,7 +734,7 @@ parseline(void)
while (*cp != '\0')
cp = skipcomment(cp + 1);
}
- debug("parser %s comment %s line",
+ debug("parser line %d state %s comment %s line", linenum,
comment_name[incomment], linestate_name[linestate]);
return (retval);
}
@@ -875,11 +979,16 @@ skipcomment(const char *cp)
}
while (*cp != '\0')
/* don't reset to LS_START after a line continuation */
- if (strncmp(cp, "\\\n", 2) == 0)
+ if (strncmp(cp, "\\\r\n", 3) == 0)
+ cp += 3;
+ else if (strncmp(cp, "\\\n", 2) == 0)
cp += 2;
else switch (incomment) {
case NO_COMMENT:
- if (strncmp(cp, "/\\\n", 3) == 0) {
+ if (strncmp(cp, "/\\\r\n", 4) == 0) {
+ incomment = STARTING_COMMENT;
+ cp += 4;
+ } else if (strncmp(cp, "/\\\n", 3) == 0) {
incomment = STARTING_COMMENT;
cp += 3;
} else if (strncmp(cp, "/*", 2) == 0) {
@@ -899,7 +1008,7 @@ skipcomment(const char *cp)
} else if (strncmp(cp, "\n", 1) == 0) {
linestate = LS_START;
cp += 1;
- } else if (strchr(" \t", *cp) != NULL) {
+ } else if (strchr(" \r\t", *cp) != NULL) {
cp += 1;
} else
return (cp);
@@ -931,7 +1040,10 @@ skipcomment(const char *cp)
cp += 1;
continue;
case C_COMMENT:
- if (strncmp(cp, "*\\\n", 3) == 0) {
+ if (strncmp(cp, "*\\\r\n", 4) == 0) {
+ incomment = FINISHING_COMMENT;
+ cp += 4;
+ } else if (strncmp(cp, "*\\\n", 3) == 0) {
incomment = FINISHING_COMMENT;
cp += 3;
} else if (strncmp(cp, "*/", 2) == 0) {
@@ -1015,7 +1127,13 @@ findsym(const char *str)
if (cp == str)
return (-1);
if (symlist) {
- printf("%.*s\n", (int)(cp-str), str);
+ if (symdepth && firstsym)
+ printf("%s%3d", zerosyms ? "" : "\n", depth);
+ firstsym = zerosyms = false;
+ printf("%s%.*s%s",
+ symdepth ? " " : "",
+ (int)(cp-str), str,
+ symdepth ? "" : "\n");
/* we don't care about the value of the symbol */
return (0);
}
@@ -1052,7 +1170,7 @@ addsym(bool ignorethis, bool definethis, char *sym)
value[symind] = val+1;
*val = '\0';
} else if (*val == '\0')
- value[symind] = "";
+ value[symind] = "1";
else
usage();
} else {
@@ -1060,6 +1178,8 @@ addsym(bool ignorethis, bool definethis, char *sym)
usage();
value[symind] = NULL;
}
+ debug("addsym %s=%s", symname[symind],
+ value[symind] ? value[symind] : "undef");
}
/*
@@ -1100,5 +1220,6 @@ error(const char *msg)
else
warnx("%s: %d: %s (#if line %d depth %d)",
filename, linenum, msg, stifline[depth], depth);
+ closeout();
errx(2, "output may be truncated");
}