Home | History | Annotate | Line # | Download | only in dist
      1 /*	$NetBSD: defs.h,v 1.22 2026/05/03 15:29:19 christos Exp $	*/
      2 
      3 /* Id: defs.h,v 1.76 2026/01/24 13:46:31 tom Exp  */
      4 
      5 #if HAVE_NBTOOL_CONFIG_H
      6 #include "nbtool_config.h"
      7 #endif
      8 
      9 #ifdef HAVE_CONFIG_H
     10 #include <config.h>
     11 #endif
     12 
     13 #include <limits.h>
     14 #include <stdlib.h>
     15 #include <string.h>
     16 #include <errno.h>
     17 #include <assert.h>
     18 #include <ctype.h>
     19 #include <stdio.h>
     20 
     21 #if defined(__cplusplus)	/* __cplusplus, etc. */
     22 #define class myClass
     23 #endif
     24 
     25 #define YYMAJOR 2
     26 #define YYMINOR 0
     27 
     28 #define CONCAT(first,second)    first #second
     29 #define CONCAT1(string,number)  CONCAT(string, number)
     30 #define CONCAT2(first,second)   #first "." #second
     31 
     32 #ifdef YYPATCH
     33 #define VSTRING(a,b) CONCAT2(a,b) CONCAT1(" ",YYPATCH)
     34 #else
     35 #define VSTRING(a,b) CONCAT2(a,b)
     36 #endif
     37 
     38 #define VERSION VSTRING(YYMAJOR, YYMINOR)
     39 
     40 /*  machine-dependent definitions:			*/
     41 
     42 /*  MAXCHAR is the largest unsigned character value	*/
     43 /*  MAXTABLE is the maximum table size			*/
     44 /*  YYINT is the smallest C integer type that can be	*/
     45 /*	used to address a table of size MAXTABLE	*/
     46 /*  MAXYYINT is the largest value of a YYINT		*/
     47 /*  MINYYINT is the most negative value of a YYINT	*/
     48 /*  BITS_PER_WORD is the number of bits in a C unsigned	*/
     49 /*  WORDSIZE computes the number of words needed to	*/
     50 /*	store n bits					*/
     51 /*  BIT returns the value of the n-th bit starting	*/
     52 /*	from r (0-indexed)				*/
     53 /*  SETBIT sets the n-th bit starting from r		*/
     54 
     55 #define	MAXCHAR		UCHAR_MAX
     56 #ifndef MAXTABLE
     57 #define MAXTABLE	INT_MAX
     58 #endif
     59 #if MAXTABLE <= SHRT_MAX
     60 #define YYINT		short
     61 #define MAXYYINT	SHRT_MAX
     62 #define MINYYINT	SHRT_MIN
     63 #elif MAXTABLE <= INT_MAX
     64 #define YYINT		int
     65 #define MAXYYINT	INT_MAX
     66 #define MINYYINT	INT_MIN
     67 #elif MAXTABLE <= LONG_MAX
     68 #define YYINT		long
     69 #define MAXYYINT	LONG_MAX
     70 #define MINYYINT	LONG_MIN
     71 #else
     72 #error "MAXTABLE is too large for this machine architecture!"
     73 #endif
     74 
     75 #define BITS_PER_WORD	((int) sizeof (unsigned) * CHAR_BIT)
     76 #define WORDSIZE(n)	(((n)+(BITS_PER_WORD-1))/BITS_PER_WORD)
     77 #define BIT(r, n)	((((r)[(n)/BITS_PER_WORD])>>((n)&(BITS_PER_WORD-1)))&1)
     78 #define SETBIT(r, n)	((r)[(n)/BITS_PER_WORD]|=((unsigned)1<<((n)&(BITS_PER_WORD-1))))
     79 
     80 /*  character names  */
     81 
     82 #define	NUL		'\0'	/*  the null character  */
     83 #define	NEWLINE		'\n'	/*  line feed  */
     84 #define	SP		' '	/*  space  */
     85 #define	BS		'\b'	/*  backspace  */
     86 #define	HT		'\t'	/*  horizontal tab  */
     87 #define	VT		'\013'	/*  vertical tab  */
     88 #define	CR		'\r'	/*  carriage return  */
     89 #define	FF		'\f'	/*  form feed  */
     90 #define	QUOTE		'\''	/*  single quote  */
     91 #define	DOUBLE_QUOTE	'\"'	/*  double quote  */
     92 #define	BACKSLASH	'\\'	/*  backslash  */
     93 
     94 #define UCH(c)          (unsigned char)(c)
     95 
     96 /* defines for constructing filenames */
     97 
     98 #if defined(VMS)
     99 #define CODE_SUFFIX	"_code.c"
    100 #define	DEFINES_SUFFIX	"_tab.h"
    101 #define	EXTERNS_SUFFIX	"_tab.i"
    102 #define	OUTPUT_SUFFIX	"_tab.c"
    103 #else
    104 #define CODE_SUFFIX	".code.c"
    105 #define	DEFINES_SUFFIX	".tab.h"
    106 #define	EXTERNS_SUFFIX	".tab.i"
    107 #define	OUTPUT_SUFFIX	".tab.c"
    108 #endif
    109 #define	VERBOSE_SUFFIX	".output"
    110 #define GRAPH_SUFFIX    ".dot"
    111 
    112 /* keyword codes */
    113 
    114 typedef enum
    115 {
    116     TOKEN = 0
    117     ,LEFT
    118     ,RIGHT
    119     ,NONASSOC
    120     ,MARK
    121     ,TEXT
    122     ,TYPE
    123     ,START
    124     ,UNION
    125     ,IDENT
    126 
    127     /* trivial bison "extensions" which have POSIX equivalents */
    128     ,NONPOSIX_DEBUG
    129 
    130     /* other bison "extensions", some useful */
    131     ,HACK_DEFINE
    132     ,ERROR_VERBOSE
    133     ,EXPECT
    134     ,EXPECT_RR
    135     ,LEX_PARAM
    136     ,PARSE_PARAM
    137     ,POSIX_YACC
    138     ,PURE_PARSER
    139     ,TOKEN_TABLE
    140     ,XCODE
    141 
    142 #if defined(YYBTYACC)
    143     ,DESTRUCTOR
    144     ,INITIAL_ACTION
    145     ,LOCATIONS
    146 #endif
    147 }
    148 KEY_CASES;
    149 
    150 /*  symbol classes  */
    151 
    152 typedef enum
    153 {
    154     UNKNOWN = 0
    155     ,TERM
    156     ,NONTERM
    157     ,ACTION
    158     ,ARGUMENT
    159 }
    160 SYM_CASES;
    161 
    162 /*  the undefined value  */
    163 
    164 #define UNDEFINED (-1)
    165 
    166 /*  action codes  */
    167 
    168 #define SHIFT 1
    169 #define REDUCE 2
    170 
    171 /*  character macros  */
    172 
    173 #define IS_NAME1(c)	(isalpha(UCH(c)) || (c) == '_' || (c) == '$')
    174 #define IS_NAME2(c)	(isalnum(UCH(c)) || (c) == '_' || (c) == '$')
    175 #define IS_IDENT(c)	(isalnum(UCH(c)) || (c) == '_' || (c) == '.' || (c) == '$')
    176 #define	IS_OCTAL(c)	((c) >= '0' && (c) <= '7')
    177 
    178 /*  symbol macros  */
    179 
    180 #define ISTOKEN(s)	((s) < start_symbol)
    181 #define ISVAR(s)	((s) >= start_symbol)
    182 
    183 /*  storage allocation macros  */
    184 
    185 #define CALLOC(k,n)	(calloc((size_t)(k),(size_t)(n)))
    186 #define	FREE(x)		(free((char*)(x)))
    187 #define MALLOC(n)	(malloc((size_t)(n)))
    188 #define TCMALLOC(t,n)	((t*) calloc((size_t)(n), sizeof(t)))
    189 #define TMALLOC(t,n)	((t*) malloc((size_t)(n) * sizeof(t)))
    190 #define	NEW(t)		((t*)allocate(sizeof(t)))
    191 #define	NEW2(n,t)	((t*)allocate(((size_t)(n)*sizeof(t))))
    192 #define REALLOC(p,n)	(realloc((char*)(p),(size_t)(n)))
    193 #define TREALLOC(t,p,n)	((t*)realloc((char*)(p), (size_t)(n) * sizeof(t)))
    194 
    195 #define DO_FREE(x)	if (x) { FREE(x); x = NULL; }
    196 
    197 #define NO_SPACE(p)	do { if (p == NULL) on_error(); assert(p != NULL); } while (0)
    198 
    199 /* messages */
    200 #define PLURAL(n) ((n) > 1 ? "s" : "")
    201 
    202 /*
    203  * Features which depend indirectly on the btyacc configuration, but are not
    204  * essential.
    205  */
    206 #if defined(YYBTYACC)
    207 #define USE_HEADER_GUARDS 1
    208 #else
    209 #define USE_HEADER_GUARDS 0
    210 #endif
    211 
    212 typedef char Assoc_t;
    213 typedef char Class_t;
    214 typedef YYINT Index_t;
    215 typedef YYINT Value_t;
    216 
    217 /*  the structure of a symbol table entry  */
    218 
    219 typedef struct bucket bucket;
    220 struct bucket
    221 {
    222     struct bucket *link;
    223     struct bucket *next;
    224     char *name;
    225     char *tag;
    226 #if defined(YYBTYACC)
    227     char **argnames;
    228     char **argtags;
    229     int args;
    230     char *destructor;
    231 #endif
    232     Value_t value;
    233     Index_t index;
    234     Value_t prec;
    235     Class_t class;
    236     Assoc_t assoc;
    237 };
    238 
    239 /*  the structure of the LR(0) state machine  */
    240 
    241 typedef struct core core;
    242 struct core
    243 {
    244     struct core *next;
    245     struct core *link;
    246     Value_t number;
    247     Value_t accessing_symbol;
    248     Value_t nitems;
    249     Value_t items[1];
    250 };
    251 
    252 /*  the structure used to record shifts  */
    253 
    254 typedef struct shifts shifts;
    255 struct shifts
    256 {
    257     struct shifts *next;
    258     Value_t number;
    259     Value_t nshifts;
    260     Value_t shift[1];
    261 };
    262 
    263 /*  the structure used to store reductions  */
    264 
    265 typedef struct reductions reductions;
    266 struct reductions
    267 {
    268     struct reductions *next;
    269     Value_t number;
    270     Value_t nreds;
    271     Value_t rules[1];
    272 };
    273 
    274 /*  the structure used to represent parser actions  */
    275 
    276 typedef struct action action;
    277 struct action
    278 {
    279     struct action *next;
    280     Value_t symbol;
    281     Value_t number;
    282     Value_t prec;
    283     char action_code;
    284     Assoc_t assoc;
    285     char suppressed;
    286 };
    287 
    288 /*  the structure used to store parse/lex parameters  */
    289 typedef struct param param;
    290 struct param
    291 {
    292     struct param *next;
    293     char *name;		/* parameter name */
    294     char *type;		/* everything before parameter name */
    295     char *type2;	/* everything after parameter name */
    296 };
    297 
    298 /* global variables */
    299 
    300 extern char dflag2;
    301 extern char dflag;
    302 extern char gflag;
    303 extern char iflag;
    304 extern char lflag;
    305 extern char rflag;
    306 extern char sflag;
    307 extern char tflag;
    308 extern char vflag;
    309 extern const char *symbol_prefix;
    310 
    311 extern const char *myname;
    312 extern char *cptr;
    313 extern char *line;
    314 extern int lineno;
    315 extern int outline;
    316 extern int exit_code;
    317 extern int pure_parser;
    318 extern int token_table;
    319 extern int error_verbose;
    320 #if defined(YYBTYACC)
    321 extern int locations;
    322 extern int backtrack;
    323 extern int destructor;
    324 extern char *initial_action;
    325 #endif
    326 
    327 extern const char *const banner[];
    328 extern const char *const xdecls[];
    329 extern const char *const tables[];
    330 extern const char *const global_vars[];
    331 extern const char *const impure_vars[];
    332 extern const char *const hdr_defs[];
    333 extern const char *const hdr_vars[];
    334 extern const char *const body_1[];
    335 extern const char *const body_vars[];
    336 extern const char *const init_vars[];
    337 extern const char *const body_2[];
    338 extern const char *const body_3[];
    339 extern const char *const trailer[];
    340 
    341 extern char *code_file_name;
    342 extern char *input_file_name;
    343 extern size_t input_file_name_len;
    344 extern char *defines_file_name;
    345 extern char *externs_file_name;
    346 
    347 extern FILE *action_file;
    348 extern FILE *code_file;
    349 extern FILE *defines_file;
    350 extern FILE *externs_file;
    351 extern FILE *input_file;
    352 extern FILE *output_file;
    353 extern FILE *text_file;
    354 extern FILE *union_file;
    355 extern FILE *verbose_file;
    356 extern FILE *graph_file;
    357 
    358 extern Value_t nitems;
    359 extern Value_t nrules;
    360 extern Value_t nsyms;
    361 extern Value_t ntokens;
    362 extern Value_t nvars;
    363 extern int ntags;
    364 
    365 extern char unionized;
    366 extern char line_format[];
    367 
    368 #define fprintf_lineno(f, n, s) \
    369 	    if (!lflag) \
    370 		fprintf(f, line_format, (n), (s) ? (s) : "(null)")
    371 
    372 extern Value_t start_symbol;
    373 extern char **symbol_name;
    374 extern char **symbol_pname;
    375 extern Value_t *symbol_value;
    376 extern Value_t *symbol_prec;
    377 extern char *symbol_assoc;
    378 
    379 #if defined(YYBTYACC)
    380 extern Value_t *symbol_pval;
    381 extern char **symbol_destructor;
    382 extern char **symbol_type_tag;
    383 #endif
    384 
    385 extern Value_t *ritem;
    386 extern Value_t *rlhs;
    387 extern Value_t *rrhs;
    388 extern Value_t *rprec;
    389 extern Assoc_t *rassoc;
    390 
    391 extern Value_t **derives;
    392 extern char *nullable;
    393 
    394 extern bucket *first_symbol;
    395 extern bucket *last_symbol;
    396 
    397 extern Value_t nstates;
    398 extern core *first_state;
    399 extern shifts *first_shift;
    400 extern reductions *first_reduction;
    401 extern Value_t *accessing_symbol;
    402 extern core **state_table;
    403 extern shifts **shift_table;
    404 extern reductions **reduction_table;
    405 extern unsigned *LA;
    406 extern Value_t *LAruleno;
    407 extern Value_t *lookaheads;
    408 extern Value_t *goto_base;
    409 extern Value_t *goto_map;
    410 extern Value_t *from_state;
    411 extern Value_t *to_state;
    412 
    413 extern action **parser;
    414 extern int SRexpect;
    415 extern int RRexpect;
    416 extern int SRtotal;
    417 extern int RRtotal;
    418 extern Value_t *SRconflicts;
    419 extern Value_t *RRconflicts;
    420 extern Value_t *defred;
    421 extern Value_t *rules_used;
    422 extern Value_t nunused;
    423 extern Value_t final_state;
    424 
    425 extern Value_t *itemset;
    426 extern Value_t *itemsetend;
    427 extern unsigned *ruleset;
    428 
    429 extern param *lex_param;
    430 extern param *parse_param;
    431 
    432 /* global functions */
    433 
    434 #ifdef HAVE_STDNORETURN_H
    435 #undef GCC_NORETURN
    436 #include <stdnoreturn.h>
    437 #define GCC_NORETURN _Noreturn
    438 #endif
    439 
    440 #ifndef GCC_NORETURN
    441 #if defined(_MSC_VER)
    442 #define GCC_NORETURN		__declspec(noreturn)
    443 #else
    444 #define GCC_NORETURN		/* nothing */
    445 #endif
    446 #endif
    447 
    448 #if defined(NDEBUG) && defined(_MSC_VER)
    449 #define NODEFAULT   __assume(0);
    450 #else
    451 #define NODEFAULT
    452 #endif
    453 #define NOTREACHED	NODEFAULT
    454 
    455 #ifndef GCC_UNUSED
    456 #if defined(__unused)
    457 #define GCC_UNUSED		__unused
    458 #else
    459 #define GCC_UNUSED		/* nothing */
    460 #endif
    461 #endif
    462 
    463 #ifndef GCC_PRINTFLIKE
    464 #define GCC_PRINTFLIKE(fmt,var)	/*nothing */
    465 #endif
    466 
    467 /* closure.c */
    468 extern void closure(Value_t *nucleus, int n);
    469 extern void finalize_closure(void);
    470 extern void set_first_derives(void);
    471 
    472 /* error.c */
    473 struct ainfo
    474 {
    475     int a_lineno;
    476     char *a_line;
    477     char *a_cptr;
    478 };
    479 
    480 extern void arg_number_disagree_warning(int a_lineno, const char *a_name);
    481 extern void arg_type_disagree_warning(int a_lineno, int i, const char *a_name);
    482 extern GCC_NORETURN void at_error(int a_lineno, const char *a_line, const char *a_cptr);
    483 extern void at_warning(int a_lineno, int i);
    484 extern GCC_NORETURN void bad_formals(void);
    485 extern void default_action_warning(const char *s);
    486 extern void destructor_redeclared_warning(const struct ainfo *);
    487 extern void dislocations_warning(void);
    488 extern GCC_NORETURN void dollar_error(int a_lineno, const char *a_line, const char *a_cptr);
    489 extern void dollar_warning(int a_lineno, int i);
    490 extern GCC_NORETURN void fatal(const char *msg);
    491 extern GCC_NORETURN void illegal_character(const char *c_cptr);
    492 extern GCC_NORETURN void illegal_tag(int t_lineno, const char *t_line, const char *t_cptr);
    493 extern GCC_NORETURN void missing_brace(void);
    494 extern GCC_NORETURN void no_grammar(void);
    495 extern GCC_NORETURN void on_error(void);
    496 extern GCC_NORETURN void open_error(const char *filename);
    497 extern GCC_NORETURN void over_unionized(const char *u_cptr);
    498 extern void prec_redeclared(void);
    499 extern void reprec_warning(const char *s);
    500 extern void restarted_warning(void);
    501 extern void retyped_warning(const char *s);
    502 extern void revalued_warning(const char *s);
    503 extern void start_requires_args(const char *a_name);
    504 extern GCC_NORETURN void syntax_error(int st_lineno, const char *st_line, const char *st_cptr);
    505 extern GCC_NORETURN void terminal_lhs(int s_lineno);
    506 extern GCC_NORETURN void terminal_start(const char *s);
    507 extern GCC_NORETURN void tokenized_start(const char *s);
    508 extern GCC_NORETURN void undefined_goal(const char *s);
    509 extern void undefined_symbol_warning(const char *s);
    510 extern GCC_NORETURN void unexpected_EOF(void);
    511 extern void unknown_arg_warning(int d_lineno,
    512 				const char *dlr_opt,
    513 				const char *d_arg,
    514 				const char *d_line,
    515 				const char *d_cptr);
    516 extern GCC_NORETURN void unknown_rhs(int i);
    517 extern void unsupported_flag_warning(const char *flag, const char *details);
    518 extern GCC_NORETURN void unexpected_value(const struct ainfo *);
    519 extern GCC_NORETURN void unterminated_action(const struct ainfo *);
    520 extern GCC_NORETURN void unterminated_comment(const struct ainfo *);
    521 extern GCC_NORETURN void unterminated_string(const struct ainfo *);
    522 extern GCC_NORETURN void unterminated_text(const struct ainfo *);
    523 extern GCC_NORETURN void unterminated_union(const struct ainfo *);
    524 extern void untyped_arg_warning(int a_lineno, const char *dlr_opt, const char *a_name);
    525 extern GCC_NORETURN void untyped_lhs(void);
    526 extern GCC_NORETURN void untyped_rhs(int i, const char *s);
    527 extern GCC_NORETURN void used_reserved(const char *s);
    528 extern GCC_NORETURN void unterminated_arglist(const struct ainfo *);
    529 extern void wrong_number_args_warning(const char *which, const char *a_name);
    530 extern void wrong_type_for_arg_warning(int i, const char *a_name);
    531 
    532 /* graph.c */
    533 extern void graph(void);
    534 
    535 /* lalr.c */
    536 extern void lalr(void);
    537 
    538 /* lr0.c */
    539 extern void lr0(void);
    540 extern void show_cores(void);
    541 extern void show_ritems(void);
    542 extern void show_rrhs(void);
    543 extern void show_shifts(void);
    544 
    545 /* main.c */
    546 extern void *allocate(size_t n);
    547 extern GCC_NORETURN void done(int k);
    548 
    549 /* mkpar.c */
    550 extern void free_parser(void);
    551 extern void make_parser(void);
    552 
    553 /* mstring.c */
    554 struct mstring
    555 {
    556     char *base, *ptr, *end;
    557 };
    558 
    559 extern void msprintf(struct mstring *, const char *, ...) GCC_PRINTFLIKE(2,3);
    560 extern int mputchar(struct mstring *, int);
    561 extern struct mstring *msnew(void);
    562 extern struct mstring *msrenew(char *);
    563 extern char *msdone(struct mstring *);
    564 extern int strnscmp(const char *, const char *);
    565 extern unsigned int strnshash(const char *);
    566 
    567 #define mputc(m, ch)	(((m)->ptr == (m)->end) \
    568 			 ? mputchar(m,ch) \
    569 			 : (*(m)->ptr++ = (char) (ch)))
    570 
    571 /* output.c */
    572 extern void puts_trim(const char *, FILE *);
    573 extern void output(void);
    574 
    575 /* reader.c */
    576 extern void reader(void);
    577 
    578 typedef enum
    579 {
    580     CODE_HEADER = 0
    581     ,CODE_REQUIRES
    582     ,CODE_PROVIDES
    583     ,CODE_TOP
    584     ,CODE_IMPORTS
    585     ,CODE_MAX		/* this must be last */
    586 }
    587 CODE_CASES;
    588 extern struct code_lines
    589 {
    590     const char *name;
    591     char *lines;
    592     size_t num;
    593 }
    594 code_lines[CODE_MAX];
    595 
    596 /* skeleton.c (generated by skel2c) */
    597 extern void write_section(FILE * fp, const char *const section[]);
    598 
    599 /* symtab.c */
    600 extern bucket *make_bucket(const char *);
    601 extern bucket *lookup(const char *);
    602 extern void create_symbol_table(void);
    603 extern void free_symbol_table(void);
    604 extern void free_symbols(void);
    605 
    606 /* verbose.c */
    607 extern void verbose(void);
    608 
    609 /* warshall.c */
    610 extern void reflexive_transitive_closure(unsigned *R, int n);
    611 
    612 #ifdef DEBUG
    613     /* closure.c */
    614 extern void print_closure(int n);
    615 extern void print_EFF(void);
    616 extern void print_first_derives(void);
    617     /* lr0.c */
    618 extern void print_derives(void);
    619 #endif
    620 
    621 #ifdef NO_LEAKS
    622 extern void lr0_leaks(void);
    623 extern void lalr_leaks(void);
    624 extern void mkpar_leaks(void);
    625 extern void output_leaks(void);
    626 extern void mstring_leaks(void);
    627 extern void reader_leaks(void);
    628 #endif
    629