Module Name:    src
Committed By:   christos
Date:           Thu Dec 29 23:54:29 UTC 2016

Modified Files:
        src/usr.bin/xlint/lint1: cgram.y scan.l

Log Message:
handle __ symbols differently (so we don't duplicate entries in the table)
and add non_null.


To generate a diff of this commit:
cvs rdiff -u -r1.87 -r1.88 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.72 -r1.73 src/usr.bin/xlint/lint1/scan.l

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.87 src/usr.bin/xlint/lint1/cgram.y:1.88
--- src/usr.bin/xlint/lint1/cgram.y:1.87	Thu Dec 29 14:40:21 2016
+++ src/usr.bin/xlint/lint1/cgram.y	Thu Dec 29 18:54:29 2016
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.87 2016/12/29 19:40:21 christos Exp $ */
+/* $NetBSD: cgram.y,v 1.88 2016/12/29 23:54:29 christos Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.87 2016/12/29 19:40:21 christos Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.88 2016/12/29 23:54:29 christos Exp $");
 #endif
 
 #include <stdlib.h>
@@ -214,6 +214,7 @@ anonymize(sym_t *s)
 %token <y_type>		T_AT_MAY_ALIAS
 %token <y_type>		T_AT_MODE
 %token <y_type>		T_AT_NORETURN
+%token <y_type>		T_AT_NON_NULL
 %token <y_type>		T_AT_NO_INSTRUMENT_FUNCTION
 %token <y_type>		T_AT_PACKED
 %token <y_type>		T_AT_PURE
@@ -513,6 +514,7 @@ type_attribute_spec:
 	| T_AT_ALIGNED T_LPARN constant T_RPARN
 	| T_AT_SENTINEL T_LPARN constant T_RPARN
 	| T_AT_FORMAT_ARG T_LPARN constant T_RPARN
+	| T_AT_NON_NULL T_LPARN constant T_RPARN
 	| T_AT_MODE T_LPARN T_NAME T_RPARN
 	| T_AT_ALIAS T_LPARN string T_RPARN
 	| T_AT_SECTION T_LPARN string T_RPARN

Index: src/usr.bin/xlint/lint1/scan.l
diff -u src/usr.bin/xlint/lint1/scan.l:1.72 src/usr.bin/xlint/lint1/scan.l:1.73
--- src/usr.bin/xlint/lint1/scan.l:1.72	Thu Dec 29 14:40:35 2016
+++ src/usr.bin/xlint/lint1/scan.l	Thu Dec 29 18:54:29 2016
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: scan.l,v 1.72 2016/12/29 19:40:35 christos Exp $ */
+/* $NetBSD: scan.l,v 1.73 2016/12/29 23:54:29 christos Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: scan.l,v 1.72 2016/12/29 19:40:35 christos Exp $");
+__RCSID("$NetBSD: scan.l,v 1.73 2016/12/29 23:54:29 christos Exp $");
 #endif
 
 #include <stdlib.h>
@@ -203,132 +203,84 @@ static	struct	kwtab {
 	u_int	kw_c99 : 1;	/* c99 keyword */
 	u_int	kw_gcc : 1;	/* GCC keyword */
 	u_int	kw_attr : 1;	/* GCC attribute, keyword */
+	u_int	kw_deco : 3;	/* name[1] __name[2] __name__[4] */
 } kwtab[] = {
-	{ "__alignof__", T_ALIGNOF,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "__attribute__",T_ATTRIBUTE,	0,	0,	0,	  0, 0, 1, 0 },
-	{ "__attribute",T_ATTRIBUTE,	0,	0,	0,	  0, 0, 1, 0 },
-	{ "__packed__",	T_AT_PACKED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "packed",	T_AT_PACKED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__alias__",	T_AT_ALIAS,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "alias",	T_AT_ALIAS,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__aligned__",T_AT_ALIGNED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "aligned",	T_AT_ALIGNED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__transparent_union__",T_AT_TUNION,0,0,	0,	  0, 0, 1, 1 },
-	{ "transparent_union",T_AT_TUNION,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__unused__",	T_AT_UNUSED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "unused",	T_AT_UNUSED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__used__",	T_AT_USED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "used",	T_AT_USED,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__always_inline__", T_AT_ALWAYS_INLINE,
-					0,	0,	0,	  0, 0, 1, 1 },
-	{ "always_inline", T_AT_ALWAYS_INLINE,
-					0,	0,	0,	  0, 0, 1, 1 },
-	{ "__gnu_inline__",T_AT_GNU_INLINE,0,	0,	0,	  0, 0, 1, 1 },
-	{ "gnu_inline",	T_AT_GNU_INLINE,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__constructor__",T_AT_CONSTRUCTOR,0,	0,	0,	  0, 0, 1, 1 },
-	{ "constructor",T_AT_CONSTRUCTOR,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__deprecated__",T_AT_DEPRECATED,0,	0,	0,	  0, 0, 1, 1 },
-	{ "deprecated",	T_AT_DEPRECATED,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__may_alias__",T_AT_MAY_ALIAS,0,	0,	0,	  0, 0, 1, 1 },
-	{ "may_alias",	T_AT_MAY_ALIAS,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "format",	T_AT_FORMAT,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__format__",	T_AT_FORMAT,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "printf",	T_AT_FORMAT_PRINTF,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__printf__",	T_AT_FORMAT_PRINTF,0,	0,	0,	  0, 0, 1, 1 },
-	{ "scanf",	T_AT_FORMAT_SCANF,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__scanf__",	T_AT_FORMAT_SCANF,0,	0,	0,	  0, 0, 1, 1 },
-	{ "strfmon",	T_AT_FORMAT_STRFMON,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__strfmon__",T_AT_FORMAT_STRFMON,0,	0,	0,	  0, 0, 1, 1 },
-	{ "strftime",	T_AT_FORMAT_STRFTIME,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__strftime__",T_AT_FORMAT_STRFTIME,0,0,	0,	  0, 0, 1, 1 },
-	{ "pure",	T_AT_PURE,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__pure__",	T_AT_PURE,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "noreturn",	T_AT_NORETURN,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__noreturn__",T_AT_NORETURN,	0,	0,	0,	  0, 0, 1, 1 },
+	{ "_Bool",	T_TYPE,		0,	BOOL,	0,	  0,1,0,0,1 },
+	{ "_Complex",	T_TYPE,		0,	COMPLEX,0,	  0,1,0,0,1 },
+	{ "_Generic",	T_GENERIC,	0,	0,	0,	  0,1,0,0,1 },
+	{ "alias",	T_AT_ALIAS,	0,	0,	0,	  0,0,1,1,5 },
+	{ "aligned",	T_AT_ALIGNED,	0,	0,	0,	  0,0,1,1,5 },
+	{ "alignof",	T_ALIGNOF,	0,	0,	0,	  0,0,0,0,4 },
+	{ "always_inline", T_AT_ALWAYS_INLINE, 0,0,	0,	  0,0,1,1,5 },
+	{ "asm",	T_ASM,		0,	0,	0,	  0,0,1,0,7 },
+	{ "attribute",	T_ATTRIBUTE,	0,	0,	0,	  0,0,1,0,6 },
+	{ "auto",	T_SCLASS,	AUTO,	0,	0,	  0,0,0,0,1 },
+	{ "break",	T_BREAK,	0,	0,	0,	  0,0,0,0,1 },
+	{ "case",	T_CASE,		0,	0,	0,	  0,0,0,0,1 },
+	{ "char",	T_TYPE,		0,	CHAR,	0,	  0,0,0,0,1 },
+	{ "cold",	T_AT_COLD,	0,	0,	0,	  0,0,1,1,5 },
+	{ "const",	T_QUAL,		0,	0,	CONST,	  1,0,0,0,7 },
+	{ "constructor",T_AT_CONSTRUCTOR,0,	0,	0,	  0,0,1,1,5 },
+	{ "continue",	T_CONTINUE,	0,	0,	0,	  0,0,0,0,1 },
+	{ "default",	T_DEFAULT,	0,	0,	0,	  0,0,0,0,1 },
+	{ "deprecated",	T_AT_DEPRECATED,0,	0,	0,	  0,0,1,1,5 },
+	{ "do",		T_DO,		0,	0,	0,	  0,0,0,0,1 },
+	{ "double",	T_TYPE,		0,	DOUBLE,	0,	  0,0,0,0,1 },
+	{ "else",	T_ELSE,		0,	0,	0,	  0,0,0,0,1 },
+	{ "enum",	T_ENUM,		0,	0,	0,	  0,0,0,0,1 },
+	{ "extension",  T_EXTENSION,	0,	0,	0,	  0,0,1,0,4 },
+	{ "extern",	T_SCLASS,	EXTERN,	0,	0,	  0,0,0,0,1 },
+	{ "float",	T_TYPE,		0,	FLOAT,	0,	  0,0,0,0,1 },
+	{ "for",	T_FOR,		0,	0,	0,	  0,0,0,0,1 },
+	{ "format",	T_AT_FORMAT,	0,	0,	0,	  0,0,1,1,5 },
+	{ "format_arg", T_AT_FORMAT_ARG,0,	0,	0,	  0,0,1,1,5 },
+	{ "gnu_inline",	T_AT_GNU_INLINE,0,	0,	0,	  0,0,1,1,5 },
+	{ "goto",	T_GOTO,		0,	0,	0,	  0,0,0,0,1 },
+	{ "if",		T_IF,		0,	0,	0,	  0,0,0,0,1 },
+	{ "imag",	T_IMAG,		0,	0,	0,	  0,1,0,0,4 },
+	{ "inline",	T_SCLASS,	INLINE,	0,	0,	  0,1,0,0,7 },
+	{ "int",	T_TYPE,		0,	INT,	0,	  0,0,0,0,1 },
+	{ "long",	T_TYPE,		0,	LONG,	0,	  0,0,0,0,1 },
+	{ "may_alias",	T_AT_MAY_ALIAS,	0,	0,	0,	  0,0,1,1,5 },
+	{ "mode",	T_AT_MODE,	0,	0,	0,	  0,0,1,1,5 },
 	{ "no_instrument_function", T_AT_NO_INSTRUMENT_FUNCTION,
-					0,	0,	0,	  0, 0, 1, 1 },
-	{ "__no_instrument_function", T_AT_NO_INSTRUMENT_FUNCTION,
-					0,	0,	0,	  0, 0, 1, 1 },
-	{ "__no_instrument_function__", T_AT_NO_INSTRUMENT_FUNCTION,
-					0,	0,	0,	  0, 0, 1, 1 },
-	{ "sentinel",	T_AT_SENTINEL,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__sentinel__",T_AT_SENTINEL,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "format_arg", T_AT_FORMAT_ARG,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__format_arg__", T_AT_FORMAT_ARG,0,	0,	0,	  0, 0, 1, 1 },
-	{ "returns_twice", T_AT_RETURNS_TWICE,0,0,	0,	  0, 0, 1, 1 },
-	{ "__returns_twice__", T_AT_RETURNS_TWICE,0,0,	0,	  0, 0, 1, 1 },
-	{ "cold",	T_AT_COLD,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__cold__",	T_AT_COLD,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "asm",	T_ASM,		0,	0,	0,	  0, 0, 1, 0 },
-	{ "__asm",	T_ASM,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "__asm__",	T_ASM,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "auto",	T_SCLASS,	AUTO,	0,	0,	  0, 0, 0, 0 },
-	{ "break",	T_BREAK,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "_Bool",	T_TYPE,		0,	BOOL,	0,	  0, 1, 0, 0 },
-	{ "case",	T_CASE,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "char",	T_TYPE,		0,	CHAR,	0,	  0, 0, 0, 0 },
-	{ "const",	T_QUAL,		0,	0,	CONST,	  1, 0, 0, 0 },
-	{ "_Complex",	T_TYPE,		0,	COMPLEX,0,	  0, 1, 0, 0 },
-	{ "__const__",	T_QUAL,		0,	0,	CONST,	  0, 0, 0, 0 },
-	{ "__const",	T_QUAL,		0,	0,	CONST,	  0, 0, 0, 0 },
-	{ "continue",	T_CONTINUE,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "default",	T_DEFAULT,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "do",		T_DO,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "double",	T_TYPE,		0,	DOUBLE,	0,	  0, 0, 0, 0 },
-	{ "else",	T_ELSE,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "enum",	T_ENUM,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "__extension__", T_EXTENSION,	0,	0,	0,	  0, 0, 1, 0 },
-	{ "extern",	T_SCLASS,	EXTERN,	0,	0,	  0, 0, 0, 0 },
-	{ "float",	T_TYPE,		0,	FLOAT,	0,	  0, 0, 0, 0 },
-	{ "for",	T_FOR,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "_Generic",	T_GENERIC,	0,	0,	0,	  0, 1, 0, 0 },
-	{ "goto",	T_GOTO,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "if",		T_IF,		0,	0,	0,	  0, 0, 0, 0 },
-	{ "__imag__",	T_IMAG,		0,	0,	0,	  0, 1, 0, 0 },
-	{ "inline",	T_SCLASS,	INLINE,	0,	0,	  0, 1, 0, 0 },
-	{ "__inline__",	T_SCLASS,	INLINE,	0,	0,	  0, 0, 0, 0 },
-	{ "__inline",	T_SCLASS,	INLINE,	0,	0,	  0, 0, 0, 0 },
-	{ "int",	T_TYPE,		0,	INT,	0,	  0, 0, 0, 0 },
-	{ "__symbolrename", T_SYMBOLRENAME, 0,	0,	0,	  0, 0, 0, 0 },
-	{ "long",	T_TYPE,		0,	LONG,	0,	  0, 0, 0, 0 },
-	{ "mode",	T_AT_MODE,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__mode",	T_AT_MODE,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__mode__",	T_AT_MODE,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__real__",	T_REAL,		0,	0,	0,	  0, 1, 0, 0 },
-	{ "register",	T_SCLASS,	REG,	0,	0,	  0, 0, 0, 0 },
-	{ "__restrict__",T_QUAL,	0,	0,	RESTRICT, 0, 1, 0, 0 },
-	{ "restrict",	T_QUAL,		0,	0,	RESTRICT, 0, 1, 0, 0 },
-	{ "return",	T_RETURN,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "__packed",	T_PACKED,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "section",	T_AT_SECTION,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__section",	T_AT_SECTION,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__section__",T_AT_SECTION,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "short",	T_TYPE,		0,	SHORT,	0,	  0, 0, 0, 0 },
-	{ "signed",	T_TYPE,		0,	SIGNED,	0,	  1, 0, 0, 0 },
-	{ "__signed__",	T_TYPE,		0,	SIGNED,	0,	  0, 0, 0, 0 },
-	{ "__signed",	T_TYPE,		0,	SIGNED,	0,	  0, 0, 0, 0 },
-	{ "sizeof",	T_SIZEOF,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "static",	T_SCLASS,	STATIC,	0,	0,	  0, 0, 0, 0 },
-	{ "struct",	T_SOU,		0,	STRUCT,	0,	  0, 0, 0, 0 },
-	{ "switch",	T_SWITCH,	0,	0,	0,	  0, 0, 0, 0 },
-	{ "typedef",	T_SCLASS,	TYPEDEF, 0,	0,	  0, 0, 0, 0 },
-	{ "typeof",	T_TYPEOF,	0,	0,	0,	  0, 0, 1, 0 },
-	{ "__typeof",	T_TYPEOF,	0,	0,	0,	  0, 0, 1, 0 },
-	{ "__typeof__",	T_TYPEOF,	0,	0,	0,	  0, 0, 1, 0 },
-	{ "union",	T_SOU,		0,	UNION,	0,	  0, 0, 0, 0 },
-	{ "unsigned",	T_TYPE,		0,	UNSIGN,	0,	  0, 0, 0, 0 },
-	{ "void",	T_TYPE,		0,	VOID,	0,	  0, 0, 0, 0 },
-	{ "volatile",	T_QUAL,		0,	0,	VOLATILE, 1, 0, 0, 0 },
-	{ "__volatile__", T_QUAL,	0,	0,	VOLATILE, 0, 0, 0, 0 },
-	{ "__volatile",	T_QUAL,		0,	0,	VOLATILE, 0, 0, 0, 0 },
-	{ "visibility", T_AT_VISIBILITY,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__visibility",T_AT_VISIBILITY,0,	0,	0,	  0, 0, 1, 1 },
-	{ "__visibility__",T_AT_VISIBILITY,0,	0,	0,	  0, 0, 1, 1 },
-	{ "weak",	T_AT_WEAK,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__weak",	T_AT_WEAK,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "__weak__",	T_AT_WEAK,	0,	0,	0,	  0, 0, 1, 1 },
-	{ "while",	T_WHILE,	0,	0,	0,	  0, 0, 0, 0 },
-	{ NULL,		0,		0,	0,	0,	  0, 0, 0, 0 }
+					0,	0,	0,	  0,0,1,1,5 },
+	{ "non_null",	T_AT_NON_NULL,	0,	0,	0,	  0,0,1,1,5 },
+	{ "noreturn",	T_AT_NORETURN,	0,	0,	0,	  0,0,1,1,5 },
+	{ "packed",	T_AT_PACKED,	0,	0,	0,	  0,0,1,1,5 },
+	{ "packed",	T_PACKED,	0,	0,	0,	  0,0,0,0,2 },
+	{ "printf",	T_AT_FORMAT_PRINTF,0,	0,	0,	  0,0,1,1,5 },
+	{ "pure",	T_AT_PURE,	0,	0,	0,	  0,0,1,1,5 },
+	{ "real",	T_REAL,		0,	0,	0,	  0,1,0,0,4 },
+	{ "register",	T_SCLASS,	REG,	0,	0,	  0,0,0,0,1 },
+	{ "restrict",	T_QUAL,		0,	0,	RESTRICT, 0,1,0,0,5 },
+	{ "return",	T_RETURN,	0,	0,	0,	  0,0,0,0,1 },
+	{ "returns_twice", T_AT_RETURNS_TWICE,0,0,	0,	  0,0,1,1,5 },
+	{ "scanf",	T_AT_FORMAT_SCANF,0,	0,	0,	  0,0,1,1,5 },
+	{ "section",	T_AT_SECTION,	0,	0,	0,	  0,0,1,1,7 },
+	{ "sentinel",	T_AT_SENTINEL,	0,	0,	0,	  0,0,1,1,5 },
+	{ "short",	T_TYPE,		0,	SHORT,	0,	  0,0,0,0,1 },
+	{ "signed",	T_TYPE,		0,	SIGNED,	0,	  1,0,0,0,3 },
+	{ "sizeof",	T_SIZEOF,	0,	0,	0,	  0,0,0,0,1 },
+	{ "static",	T_SCLASS,	STATIC,	0,	0,	  0,0,0,0,1 },
+	{ "strfmon",	T_AT_FORMAT_STRFMON,0,	0,	0,	  0,0,1,1,5 },
+	{ "strftime",	T_AT_FORMAT_STRFTIME,0,	0,	0,	  0,0,1,1,5 },
+	{ "struct",	T_SOU,		0,	STRUCT,	0,	  0,0,0,0,1 },
+	{ "switch",	T_SWITCH,	0,	0,	0,	  0,0,0,0,1 },
+	{ "symbolrename", T_SYMBOLRENAME, 0,	0,	0,	  0,0,0,0,2 },
+	{ "transparent_union",T_AT_TUNION,0,	0,	0,	  0,0,1,1,5 },
+	{ "typedef",	T_SCLASS,	TYPEDEF, 0,	0,	  0,0,0,0,1 },
+	{ "typeof",	T_TYPEOF,	0,	0,	0,	  0,0,1,0,5 },
+	{ "union",	T_SOU,		0,	UNION,	0,	  0,0,0,0,1 },
+	{ "unsigned",	T_TYPE,		0,	UNSIGN,	0,	  0,0,0,0,1 },
+	{ "unused",	T_AT_UNUSED,	0,	0,	0,	  0,0,1,1,5 },
+	{ "used",	T_AT_USED,	0,	0,	0,	  0,0,1,1,5 },
+	{ "visibility", T_AT_VISIBILITY,0,	0,	0,	  0,0,1,1,5 },
+	{ "void",	T_TYPE,		0,	VOID,	0,	  0,0,0,0,1 },
+	{ "volatile",	T_QUAL,		0,	0,	VOLATILE, 1,0,0,0,7 },
+	{ "weak",	T_AT_WEAK,	0,	0,	0,	  0,0,1,1,5 },
+	{ "while",	T_WHILE,	0,	0,	0,	  0,0,0,0,1 },
+	{ NULL,		0,		0,	0,	0,	  0,0,0,0,0 }
 };
 
 /* Symbol table */
@@ -350,6 +302,54 @@ static	sbuf_t	 *sbfrlst;
 symt_t	symtyp;
 
 
+static void
+addkw(struct kwtab *kw, int deco)
+{
+	sym_t *sym;
+	size_t h;
+	char buf[256];
+	const char *name;
+
+	if (!(kw->kw_deco & deco))
+		return;
+
+	switch (deco) {
+	case 1:
+		name = kw->kw_name;
+		break;
+	case 2:
+		snprintf(buf, sizeof(buf), "__%s", kw->kw_name);
+		name = strdup(buf);
+		break;
+	case 4:
+		snprintf(buf, sizeof(buf), "__%s__", kw->kw_name);
+		name = strdup(buf);
+		break;
+	default:
+		abort();
+	}
+
+	if (name == NULL)
+		err(1, "Can't init symbol table");
+		
+	sym = getblk(sizeof (sym_t));
+	sym->s_name = name;
+	sym->s_keyw = kw;
+	sym->s_value.v_quad = kw->kw_token;
+	if (kw->kw_token == T_TYPE || kw->kw_token == T_SOU) {
+		sym->s_tspec = kw->kw_tspec;
+	} else if (kw->kw_token == T_SCLASS) {
+		sym->s_scl = kw->kw_scl;
+	} else if (kw->kw_token == T_QUAL) {
+		sym->s_tqual = kw->kw_tqual;
+	}
+	h = hash(sym->s_name);
+	if ((sym->s_link = symtab[h]) != NULL)
+		symtab[h]->s_rlink = &sym->s_link;
+	sym->s_rlink = &symtab[h];
+	symtab[h] = sym;
+}
+
 /*
  * All keywords are written to the symbol table. This saves us looking
  * in a extra table for each name we found.
@@ -358,8 +358,7 @@ void
 initscan(void)
 {
 	struct	kwtab *kw;
-	sym_t	*sym;
-	size_t	h, i;
+	size_t	i;
 	uint64_t uq;
 
 	for (kw = kwtab; kw->kw_name != NULL; kw++) {
@@ -369,22 +368,9 @@ initscan(void)
 			continue;
 		if (kw->kw_gcc && !gflag)
 			continue;
-		sym = getblk(sizeof (sym_t));
-		sym->s_name = kw->kw_name;
-		sym->s_keyw = kw;
-		sym->s_value.v_quad = kw->kw_token;
-		if (kw->kw_token == T_TYPE || kw->kw_token == T_SOU) {
-			sym->s_tspec = kw->kw_tspec;
-		} else if (kw->kw_token == T_SCLASS) {
-			sym->s_scl = kw->kw_scl;
-		} else if (kw->kw_token == T_QUAL) {
-			sym->s_tqual = kw->kw_tqual;
-		}
-		h = hash(sym->s_name);
-		if ((sym->s_link = symtab[h]) != NULL)
-			symtab[h]->s_rlink = &sym->s_link;
-		sym->s_rlink = &symtab[h];
-		symtab[h] = sym;
+		addkw(kw, 1); 
+		addkw(kw, 2); 
+		addkw(kw, 4);
 	}
 
 	/* initialize bit-masks for quads */

Reply via email to