1272955Srodrigc/* $Id: defs.h,v 1.51 2014/10/02 22:38:13 tom Exp $ */ 2234949Sbapt 3234949Sbapt#ifdef HAVE_CONFIG_H 4234949Sbapt#include <config.h> 5234949Sbapt#endif 6234949Sbapt 7268899Sbapt#include <limits.h> 8234949Sbapt#include <stdlib.h> 9234949Sbapt#include <string.h> 10234949Sbapt#include <errno.h> 11234949Sbapt#include <assert.h> 12234949Sbapt#include <ctype.h> 13234949Sbapt#include <stdio.h> 14234949Sbapt 15240517Sbapt#if defined(__cplusplus) /* __cplusplus, etc. */ 16240517Sbapt#define class myClass 17240517Sbapt#endif 18240517Sbapt 19234949Sbapt#define YYMAJOR 1 20234949Sbapt#define YYMINOR 9 21234949Sbapt 22234949Sbapt#define CONCAT(first,second) first #second 23234949Sbapt#define CONCAT1(string,number) CONCAT(string, number) 24234949Sbapt#define CONCAT2(first,second) #first "." #second 25234949Sbapt 26234949Sbapt#ifdef YYPATCH 27234949Sbapt#define VSTRING(a,b) CONCAT2(a,b) CONCAT1(" ",YYPATCH) 28234949Sbapt#else 29234949Sbapt#define VSTRING(a,b) CONCAT2(a,b) 30234949Sbapt#endif 31234949Sbapt 32234949Sbapt#define VERSION VSTRING(YYMAJOR, YYMINOR) 33234949Sbapt 34268899Sbapt/* machine-dependent definitions: */ 35234949Sbapt 36234949Sbapt/* MAXCHAR is the largest unsigned character value */ 37234949Sbapt/* MAXTABLE is the maximum table size */ 38268899Sbapt/* YYINT is the smallest C integer type that can be */ 39268899Sbapt/* used to address a table of size MAXTABLE */ 40268899Sbapt/* MAXYYINT is the largest value of a YYINT */ 41268899Sbapt/* MINYYINT is the most negative value of a YYINT */ 42234949Sbapt/* BITS_PER_WORD is the number of bits in a C unsigned */ 43234949Sbapt/* WORDSIZE computes the number of words needed to */ 44234949Sbapt/* store n bits */ 45234949Sbapt/* BIT returns the value of the n-th bit starting */ 46234949Sbapt/* from r (0-indexed) */ 47234949Sbapt/* SETBIT sets the n-th bit starting from r */ 48234949Sbapt 49268899Sbapt#define MAXCHAR UCHAR_MAX 50268899Sbapt#ifndef MAXTABLE 51234949Sbapt#define MAXTABLE 32500 52268899Sbapt#endif 53268899Sbapt#if MAXTABLE <= SHRT_MAX 54268899Sbapt#define YYINT short 55268899Sbapt#define MAXYYINT SHRT_MAX 56268899Sbapt#define MINYYINT SHRT_MIN 57268899Sbapt#elif MAXTABLE <= INT_MAX 58268899Sbapt#define YYINT int 59268899Sbapt#define MAXYYINT INT_MAX 60268899Sbapt#define MINYYINT INT_MIN 61268899Sbapt#else 62268899Sbapt#error "MAXTABLE is too large for this machine architecture!" 63268899Sbapt#endif 64234949Sbapt 65268899Sbapt#define BITS_PER_WORD ((int) sizeof (unsigned) * CHAR_BIT) 66268899Sbapt#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) 67268899Sbapt#define BIT(r, n) ((((r)[(n)/BITS_PER_WORD])>>((n)&(BITS_PER_WORD-1)))&1) 68268899Sbapt#define SETBIT(r, n) ((r)[(n)/BITS_PER_WORD]|=((unsigned)1<<((n)&(BITS_PER_WORD-1)))) 69268899Sbapt 70234949Sbapt/* character names */ 71234949Sbapt 72234949Sbapt#define NUL '\0' /* the null character */ 73234949Sbapt#define NEWLINE '\n' /* line feed */ 74234949Sbapt#define SP ' ' /* space */ 75234949Sbapt#define BS '\b' /* backspace */ 76234949Sbapt#define HT '\t' /* horizontal tab */ 77234949Sbapt#define VT '\013' /* vertical tab */ 78234949Sbapt#define CR '\r' /* carriage return */ 79234949Sbapt#define FF '\f' /* form feed */ 80234949Sbapt#define QUOTE '\'' /* single quote */ 81234949Sbapt#define DOUBLE_QUOTE '\"' /* double quote */ 82234949Sbapt#define BACKSLASH '\\' /* backslash */ 83234949Sbapt 84234949Sbapt#define UCH(c) (unsigned char)(c) 85234949Sbapt 86234949Sbapt/* defines for constructing filenames */ 87234949Sbapt 88234949Sbapt#if defined(VMS) 89234949Sbapt#define CODE_SUFFIX "_code.c" 90234949Sbapt#define DEFINES_SUFFIX "_tab.h" 91234949Sbapt#define EXTERNS_SUFFIX "_tab.i" 92234949Sbapt#define OUTPUT_SUFFIX "_tab.c" 93234949Sbapt#else 94234949Sbapt#define CODE_SUFFIX ".code.c" 95234949Sbapt#define DEFINES_SUFFIX ".tab.h" 96234949Sbapt#define EXTERNS_SUFFIX ".tab.i" 97234949Sbapt#define OUTPUT_SUFFIX ".tab.c" 98234949Sbapt#endif 99234949Sbapt#define VERBOSE_SUFFIX ".output" 100234949Sbapt#define GRAPH_SUFFIX ".dot" 101234949Sbapt 102234949Sbapt/* keyword codes */ 103234949Sbapt 104234949Sbapt#define TOKEN 0 105234949Sbapt#define LEFT 1 106234949Sbapt#define RIGHT 2 107234949Sbapt#define NONASSOC 3 108234949Sbapt#define MARK 4 109234949Sbapt#define TEXT 5 110234949Sbapt#define TYPE 6 111234949Sbapt#define START 7 112234949Sbapt#define UNION 8 113234949Sbapt#define IDENT 9 114234949Sbapt#define EXPECT 10 115234949Sbapt#define EXPECT_RR 11 116234949Sbapt#define PURE_PARSER 12 117234949Sbapt#define PARSE_PARAM 13 118234949Sbapt#define LEX_PARAM 14 119234949Sbapt#define POSIX_YACC 15 120268899Sbapt#define TOKEN_TABLE 16 121234949Sbapt 122268899Sbapt#if defined(YYBTYACC) 123268899Sbapt#define LOCATIONS 17 124268899Sbapt#define DESTRUCTOR 18 125268899Sbapt#endif 126268899Sbapt 127234949Sbapt/* symbol classes */ 128234949Sbapt 129234949Sbapt#define UNKNOWN 0 130234949Sbapt#define TERM 1 131234949Sbapt#define NONTERM 2 132268899Sbapt#define ACTION 3 133268899Sbapt#define ARGUMENT 4 134234949Sbapt 135234949Sbapt/* the undefined value */ 136234949Sbapt 137234949Sbapt#define UNDEFINED (-1) 138234949Sbapt 139234949Sbapt/* action codes */ 140234949Sbapt 141234949Sbapt#define SHIFT 1 142234949Sbapt#define REDUCE 2 143234949Sbapt 144234949Sbapt/* character macros */ 145234949Sbapt 146234949Sbapt#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') 147234949Sbapt#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') 148234949Sbapt#define NUMERIC_VALUE(c) ((c) - '0') 149234949Sbapt 150234949Sbapt/* symbol macros */ 151234949Sbapt 152234949Sbapt#define ISTOKEN(s) ((s) < start_symbol) 153234949Sbapt#define ISVAR(s) ((s) >= start_symbol) 154234949Sbapt 155234949Sbapt/* storage allocation macros */ 156234949Sbapt 157234949Sbapt#define CALLOC(k,n) (calloc((size_t)(k),(size_t)(n))) 158234949Sbapt#define FREE(x) (free((char*)(x))) 159234949Sbapt#define MALLOC(n) (malloc((size_t)(n))) 160272954Srodrigc#define TCMALLOC(t,n) ((t*) calloc((size_t)(n), sizeof(t))) 161240517Sbapt#define TMALLOC(t,n) ((t*) malloc((size_t)(n) * sizeof(t))) 162234949Sbapt#define NEW(t) ((t*)allocate(sizeof(t))) 163234949Sbapt#define NEW2(n,t) ((t*)allocate(((size_t)(n)*sizeof(t)))) 164234949Sbapt#define REALLOC(p,n) (realloc((char*)(p),(size_t)(n))) 165240517Sbapt#define TREALLOC(t,p,n) ((t*)realloc((char*)(p), (size_t)(n) * sizeof(t))) 166234949Sbapt 167234949Sbapt#define DO_FREE(x) if (x) { FREE(x); x = 0; } 168234949Sbapt 169234949Sbapt#define NO_SPACE(p) if (p == 0) no_space(); assert(p != 0) 170234949Sbapt 171234949Sbapt/* messages */ 172234949Sbapt#define PLURAL(n) ((n) > 1 ? "s" : "") 173234949Sbapt 174268899Sbapt/* 175268899Sbapt * Features which depend indirectly on the btyacc configuration, but are not 176268899Sbapt * essential. 177268899Sbapt */ 178268899Sbapt#if defined(YYBTYACC) 179268899Sbapt#define USE_HEADER_GUARDS 1 180268899Sbapt#else 181268899Sbapt#define USE_HEADER_GUARDS 0 182268899Sbapt#endif 183268899Sbapt 184234949Sbapttypedef char Assoc_t; 185234949Sbapttypedef char Class_t; 186268899Sbapttypedef YYINT Index_t; 187268899Sbapttypedef YYINT Value_t; 188234949Sbapt 189234949Sbapt/* the structure of a symbol table entry */ 190234949Sbapt 191234949Sbapttypedef struct bucket bucket; 192234949Sbaptstruct bucket 193234949Sbapt{ 194234949Sbapt struct bucket *link; 195234949Sbapt struct bucket *next; 196234949Sbapt char *name; 197234949Sbapt char *tag; 198268899Sbapt#if defined(YYBTYACC) 199268899Sbapt char **argnames; 200268899Sbapt char **argtags; 201268899Sbapt int args; 202268899Sbapt char *destructor; 203268899Sbapt#endif 204234949Sbapt Value_t value; 205234949Sbapt Index_t index; 206234949Sbapt Value_t prec; 207234949Sbapt Class_t class; 208234949Sbapt Assoc_t assoc; 209234949Sbapt}; 210234949Sbapt 211234949Sbapt/* the structure of the LR(0) state machine */ 212234949Sbapt 213234949Sbapttypedef struct core core; 214234949Sbaptstruct core 215234949Sbapt{ 216234949Sbapt struct core *next; 217234949Sbapt struct core *link; 218234949Sbapt Value_t number; 219234949Sbapt Value_t accessing_symbol; 220234949Sbapt Value_t nitems; 221234949Sbapt Value_t items[1]; 222234949Sbapt}; 223234949Sbapt 224234949Sbapt/* the structure used to record shifts */ 225234949Sbapt 226234949Sbapttypedef struct shifts shifts; 227234949Sbaptstruct shifts 228234949Sbapt{ 229234949Sbapt struct shifts *next; 230234949Sbapt Value_t number; 231234949Sbapt Value_t nshifts; 232234949Sbapt Value_t shift[1]; 233234949Sbapt}; 234234949Sbapt 235234949Sbapt/* the structure used to store reductions */ 236234949Sbapt 237234949Sbapttypedef struct reductions reductions; 238234949Sbaptstruct reductions 239234949Sbapt{ 240234949Sbapt struct reductions *next; 241234949Sbapt Value_t number; 242234949Sbapt Value_t nreds; 243234949Sbapt Value_t rules[1]; 244234949Sbapt}; 245234949Sbapt 246234949Sbapt/* the structure used to represent parser actions */ 247234949Sbapt 248234949Sbapttypedef struct action action; 249234949Sbaptstruct action 250234949Sbapt{ 251234949Sbapt struct action *next; 252234949Sbapt Value_t symbol; 253234949Sbapt Value_t number; 254234949Sbapt Value_t prec; 255234949Sbapt char action_code; 256234949Sbapt Assoc_t assoc; 257234949Sbapt char suppressed; 258234949Sbapt}; 259234949Sbapt 260234949Sbapt/* the structure used to store parse/lex parameters */ 261234949Sbapttypedef struct param param; 262234949Sbaptstruct param 263234949Sbapt{ 264234949Sbapt struct param *next; 265234949Sbapt char *name; /* parameter name */ 266234949Sbapt char *type; /* everything before parameter name */ 267234949Sbapt char *type2; /* everything after parameter name */ 268234949Sbapt}; 269234949Sbapt 270234949Sbapt/* global variables */ 271234949Sbapt 272234949Sbaptextern char dflag; 273234949Sbaptextern char gflag; 274234949Sbaptextern char iflag; 275234949Sbaptextern char lflag; 276234949Sbaptextern char rflag; 277234949Sbaptextern char sflag; 278234949Sbaptextern char tflag; 279234949Sbaptextern char vflag; 280234949Sbaptextern const char *symbol_prefix; 281234949Sbapt 282234949Sbaptextern const char *myname; 283234949Sbaptextern char *cptr; 284234949Sbaptextern char *line; 285234949Sbaptextern int lineno; 286234949Sbaptextern int outline; 287234949Sbaptextern int exit_code; 288240517Sbaptextern int pure_parser; 289268899Sbaptextern int token_table; 290268899Sbapt#if defined(YYBTYACC) 291268899Sbaptextern int locations; 292268899Sbaptextern int backtrack; 293268899Sbaptextern int destructor; 294268899Sbapt#endif 295234949Sbapt 296234949Sbaptextern const char *const banner[]; 297234949Sbaptextern const char *const xdecls[]; 298234949Sbaptextern const char *const tables[]; 299234949Sbaptextern const char *const global_vars[]; 300234949Sbaptextern const char *const impure_vars[]; 301234949Sbaptextern const char *const hdr_defs[]; 302234949Sbaptextern const char *const hdr_vars[]; 303234949Sbaptextern const char *const body_1[]; 304234949Sbaptextern const char *const body_vars[]; 305234949Sbaptextern const char *const body_2[]; 306234949Sbaptextern const char *const trailer[]; 307234949Sbapt 308234949Sbaptextern char *code_file_name; 309234949Sbaptextern char *input_file_name; 310234949Sbaptextern char *defines_file_name; 311234949Sbaptextern char *externs_file_name; 312234949Sbapt 313234949Sbaptextern FILE *action_file; 314234949Sbaptextern FILE *code_file; 315234949Sbaptextern FILE *defines_file; 316234949Sbaptextern FILE *externs_file; 317234949Sbaptextern FILE *input_file; 318234949Sbaptextern FILE *output_file; 319234949Sbaptextern FILE *text_file; 320234949Sbaptextern FILE *union_file; 321234949Sbaptextern FILE *verbose_file; 322234949Sbaptextern FILE *graph_file; 323234949Sbapt 324268899Sbaptextern Value_t nitems; 325268899Sbaptextern Value_t nrules; 326268899Sbaptextern Value_t nsyms; 327268899Sbaptextern Value_t ntokens; 328268899Sbaptextern Value_t nvars; 329234949Sbaptextern int ntags; 330234949Sbapt 331234949Sbaptextern char unionized; 332234949Sbaptextern char line_format[]; 333234949Sbapt 334234949Sbaptextern Value_t start_symbol; 335234949Sbaptextern char **symbol_name; 336234949Sbaptextern char **symbol_pname; 337234949Sbaptextern Value_t *symbol_value; 338234949Sbaptextern Value_t *symbol_prec; 339234949Sbaptextern char *symbol_assoc; 340234949Sbapt 341268899Sbapt#if defined(YYBTYACC) 342268899Sbaptextern Value_t *symbol_pval; 343268899Sbaptextern char **symbol_destructor; 344268899Sbaptextern char **symbol_type_tag; 345268899Sbapt#endif 346268899Sbapt 347234949Sbaptextern Value_t *ritem; 348234949Sbaptextern Value_t *rlhs; 349234949Sbaptextern Value_t *rrhs; 350234949Sbaptextern Value_t *rprec; 351234949Sbaptextern Assoc_t *rassoc; 352234949Sbapt 353234949Sbaptextern Value_t **derives; 354234949Sbaptextern char *nullable; 355234949Sbapt 356234949Sbaptextern bucket *first_symbol; 357234949Sbaptextern bucket *last_symbol; 358234949Sbapt 359234949Sbaptextern int nstates; 360234949Sbaptextern core *first_state; 361234949Sbaptextern shifts *first_shift; 362234949Sbaptextern reductions *first_reduction; 363234949Sbaptextern Value_t *accessing_symbol; 364234949Sbaptextern core **state_table; 365234949Sbaptextern shifts **shift_table; 366234949Sbaptextern reductions **reduction_table; 367234949Sbaptextern unsigned *LA; 368234949Sbaptextern Value_t *LAruleno; 369234949Sbaptextern Value_t *lookaheads; 370272955Srodrigcextern Value_t *goto_base; 371234949Sbaptextern Value_t *goto_map; 372234949Sbaptextern Value_t *from_state; 373234949Sbaptextern Value_t *to_state; 374234949Sbapt 375234949Sbaptextern action **parser; 376234949Sbaptextern int SRexpect; 377234949Sbaptextern int RRexpect; 378234949Sbaptextern int SRtotal; 379234949Sbaptextern int RRtotal; 380234949Sbaptextern Value_t *SRconflicts; 381234949Sbaptextern Value_t *RRconflicts; 382234949Sbaptextern Value_t *defred; 383234949Sbaptextern Value_t *rules_used; 384234949Sbaptextern Value_t nunused; 385234949Sbaptextern Value_t final_state; 386234949Sbapt 387234949Sbaptextern Value_t *itemset; 388234949Sbaptextern Value_t *itemsetend; 389234949Sbaptextern unsigned *ruleset; 390234949Sbapt 391234949Sbaptextern param *lex_param; 392234949Sbaptextern param *parse_param; 393234949Sbapt 394234949Sbapt/* global functions */ 395234949Sbapt 396234949Sbapt#ifndef GCC_NORETURN 397240517Sbapt#if defined(__dead2) 398240517Sbapt#define GCC_NORETURN __dead2 399240517Sbapt#elif defined(__dead) 400240517Sbapt#define GCC_NORETURN __dead 401240517Sbapt#else 402234949Sbapt#define GCC_NORETURN /* nothing */ 403234949Sbapt#endif 404240517Sbapt#endif 405234949Sbapt 406234949Sbapt#ifndef GCC_UNUSED 407240517Sbapt#if defined(__unused) 408240517Sbapt#define GCC_UNUSED __unused 409240517Sbapt#else 410234949Sbapt#define GCC_UNUSED /* nothing */ 411234949Sbapt#endif 412240517Sbapt#endif 413234949Sbapt 414268899Sbapt#ifndef GCC_PRINTFLIKE 415268899Sbapt#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ 416268899Sbapt#endif 417268899Sbapt 418234949Sbapt/* closure.c */ 419234949Sbaptextern void closure(Value_t * nucleus, int n); 420234949Sbaptextern void finalize_closure(void); 421234949Sbaptextern void set_first_derives(void); 422234949Sbapt 423234949Sbapt/* error.c */ 424268899Sbaptextern void arg_number_disagree_warning(int a_lineno, char *a_name); 425268899Sbaptextern void arg_type_disagree_warning(int a_lineno, int i, char *a_name); 426268899Sbaptextern void at_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 427268899Sbaptextern void at_warning(int a_lineno, int i); 428268899Sbaptextern void bad_formals(void) GCC_NORETURN; 429234949Sbaptextern void default_action_warning(void); 430268899Sbaptextern void destructor_redeclared_warning(int a_lineno, char *a_line, char *a_cptr); 431234949Sbaptextern void dollar_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 432234949Sbaptextern void dollar_warning(int a_lineno, int i); 433234949Sbaptextern void fatal(const char *msg) GCC_NORETURN; 434234949Sbaptextern void illegal_character(char *c_cptr) GCC_NORETURN; 435234949Sbaptextern void illegal_tag(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; 436234949Sbaptextern void missing_brace(void) GCC_NORETURN; 437234949Sbaptextern void no_grammar(void) GCC_NORETURN; 438234949Sbaptextern void no_space(void) GCC_NORETURN; 439234949Sbaptextern void open_error(const char *filename) GCC_NORETURN; 440234949Sbaptextern void over_unionized(char *u_cptr) GCC_NORETURN; 441234949Sbaptextern void prec_redeclared(void); 442234949Sbaptextern void reprec_warning(char *s); 443234949Sbaptextern void restarted_warning(void); 444234949Sbaptextern void retyped_warning(char *s); 445234949Sbaptextern void revalued_warning(char *s); 446268899Sbaptextern void start_requires_args(char *a_name); 447234949Sbaptextern void syntax_error(int st_lineno, char *st_line, char *st_cptr) GCC_NORETURN; 448234949Sbaptextern void terminal_lhs(int s_lineno) GCC_NORETURN; 449234949Sbaptextern void terminal_start(char *s) GCC_NORETURN; 450234949Sbaptextern void tokenized_start(char *s) GCC_NORETURN; 451234949Sbaptextern void undefined_goal(char *s) GCC_NORETURN; 452234949Sbaptextern void undefined_symbol_warning(char *s); 453234949Sbaptextern void unexpected_EOF(void) GCC_NORETURN; 454268899Sbaptextern void unknown_arg_warning(int d_lineno, const char *dlr_opt, const char *d_arg, const char *d_line, const char *d_cptr); 455234949Sbaptextern void unknown_rhs(int i) GCC_NORETURN; 456268899Sbaptextern void unsupported_flag_warning(const char *flag, const char *details); 457234949Sbaptextern void unterminated_action(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 458234949Sbaptextern void unterminated_comment(int c_lineno, char *c_line, char *c_cptr) GCC_NORETURN; 459234949Sbaptextern void unterminated_string(int s_lineno, char *s_line, char *s_cptr) GCC_NORETURN; 460234949Sbaptextern void unterminated_text(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; 461234949Sbaptextern void unterminated_union(int u_lineno, char *u_line, char *u_cptr) GCC_NORETURN; 462268899Sbaptextern void untyped_arg_warning(int a_lineno, const char *dlr_opt, const char *a_name); 463234949Sbaptextern void untyped_lhs(void) GCC_NORETURN; 464234949Sbaptextern void untyped_rhs(int i, char *s) GCC_NORETURN; 465234949Sbaptextern void used_reserved(char *s) GCC_NORETURN; 466268899Sbaptextern void unterminated_arglist(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 467268899Sbaptextern void wrong_number_args_warning(const char *which, const char *a_name); 468268899Sbaptextern void wrong_type_for_arg_warning(int i, char *a_name); 469234949Sbapt 470234949Sbapt/* graph.c */ 471234949Sbaptextern void graph(void); 472234949Sbapt 473234949Sbapt/* lalr.c */ 474234949Sbaptextern void lalr(void); 475234949Sbapt 476234949Sbapt/* lr0.c */ 477234949Sbaptextern void lr0(void); 478234949Sbaptextern void show_cores(void); 479234949Sbaptextern void show_ritems(void); 480234949Sbaptextern void show_rrhs(void); 481234949Sbaptextern void show_shifts(void); 482234949Sbapt 483234949Sbapt/* main.c */ 484234949Sbaptextern void *allocate(size_t n); 485234949Sbaptextern void done(int k) GCC_NORETURN; 486234949Sbapt 487234949Sbapt/* mkpar.c */ 488234949Sbaptextern void free_parser(void); 489234949Sbaptextern void make_parser(void); 490234949Sbapt 491268899Sbapt/* mstring.c */ 492268899Sbaptstruct mstring 493268899Sbapt{ 494268899Sbapt char *base, *ptr, *end; 495268899Sbapt}; 496268899Sbapt 497268899Sbaptextern void msprintf(struct mstring *, const char *, ...) GCC_PRINTFLIKE(2,3); 498268899Sbaptextern int mputchar(struct mstring *, int); 499268899Sbaptextern struct mstring *msnew(void); 500268899Sbaptextern char *msdone(struct mstring *); 501268899Sbaptextern int strnscmp(const char *, const char *); 502268899Sbaptextern unsigned int strnshash(const char *); 503268899Sbapt 504268899Sbapt#define mputc(m, ch) (((m)->ptr == (m)->end) \ 505268899Sbapt ? mputchar(m,ch) \ 506268899Sbapt : (*(m)->ptr++ = (char) (ch))) 507268899Sbapt 508234949Sbapt/* output.c */ 509234949Sbaptextern void output(void); 510234949Sbapt 511234949Sbapt/* reader.c */ 512234949Sbaptextern void reader(void); 513234949Sbapt 514268899Sbapt/* skeleton.c (generated by skel2c) */ 515240517Sbaptextern void write_section(FILE * fp, const char *const section[]); 516234949Sbapt 517268899Sbapt/* symtab.c */ 518268899Sbaptextern bucket *make_bucket(const char *); 519268899Sbaptextern bucket *lookup(const char *); 520268899Sbaptextern void create_symbol_table(void); 521268899Sbaptextern void free_symbol_table(void); 522268899Sbaptextern void free_symbols(void); 523268899Sbapt 524234949Sbapt/* verbose.c */ 525234949Sbaptextern void verbose(void); 526234949Sbapt 527234949Sbapt/* warshall.c */ 528234949Sbaptextern void reflexive_transitive_closure(unsigned *R, int n); 529234949Sbapt 530268899Sbapt#ifdef DEBUG 531268899Sbapt /* closure.c */ 532268899Sbaptextern void print_closure(int n); 533268899Sbaptextern void print_EFF(void); 534268899Sbaptextern void print_first_derives(void); 535268899Sbapt /* lr0.c */ 536268899Sbaptextern void print_derives(void); 537268899Sbapt#endif 538268899Sbapt 539234949Sbapt#ifdef NO_LEAKS 540234949Sbaptextern void lr0_leaks(void); 541234949Sbaptextern void lalr_leaks(void); 542234949Sbaptextern void mkpar_leaks(void); 543234949Sbaptextern void output_leaks(void); 544268899Sbaptextern void mstring_leaks(void); 545234949Sbaptextern void reader_leaks(void); 546234949Sbapt#endif 547