# /* ** GLOBALS.H -- Equel declarations ** ** Defines: ** Structures and variables ** used in Equel. ** ** Required By: ** most of the routines in the precompiler. ** ** Compilation Flags: ** xDEBUG -- for Chardebug, to provide compatability ** with older Equels' "-c" flag, and for ** Lex_debug for the "-v" flag. ** ** Files: ** constants.h -- for manifest constants ** ** History: ** 5/26/78 -- (marc) written ** 8/24/78 -- (marc) modified for including structures to equel. ** The variables F_locals, F_globals, and Field_indir ** were added, and the special sructure was extended. */ /* ** Structure declarations */ /* parser keyword and operator table node */ struct optab { char *op_term; /* pointer to terminal */ int op_token; /* lexical token */ int op_code; /* code to distinguish different op_terms * with the same .op_token */ }; /* C variable tree node */ struct cvar { char *c_id; /* identifier */ char c_type; /* type */ char c_indir; /* indirection level (- 1 for strings) */ struct cvar *c_left; /* < sub-tree */ struct cvar *c_right; /* > sub-tree */ }; /* Display structures (linked list of strings) */ struct disp_node { char *d_elm; /* display element */ struct disp_node *d_next; /* next node */ int d_line; /* for Symsp nodes, line * where lexeme was seen */ }; struct display { struct disp_node *disp_first; /* first node in display */ struct disp_node *disp_last; /* last node in display */ }; /* Retrieval list */ struct ret_var { char *r_elm; /* string invoking variable * e.g. "*intpa [2]" */ struct ret_var *r_next; /* next variable used in "tupret" */ char r_type; /* type of variable */ }; struct ret_list { struct ret_var *ret_first; /* first node in ret_var chain */ struct ret_var *ret_last; /* last node in chain */ }; /* "# include" file processing stack (list) */ struct inc_file { int inc_yyline; /* old file's yyline */ int inc_lineout; /* " " Lineout */ char *inc_fid; /* name */ FILE *inc_infile; /* In_file */ FILE *inc_outfile; /* Out_file */ struct inc_file *inc_next; }; /* ** Structure for yacc generated terminal codes ** This avoids having to include functions in ** [grammar.y] for the function to know the ** parser generated token numbers. */ struct special { int sp_name; /* NAME */ int sp_sconst; /* SCONST */ int sp_i2const; /* I2CONST */ int sp_i4const; /* I4CONST */ int sp_f8const; /* F8CONST */ int sp_quote; /* QUOTE */ int sp_bgncmnt; /* BGNCMNT */ int sp_endcmnt; /* ENDCMNT */ int sp_c_code; /* C_CODE */ int sp_struct_var; }; /* ** Global definitions */ int Opcode; /* operator code to distinguis tokens */ extern int yychar; /* yacc input token */ extern int yyline; /* yacc external line counter */ extern int yylval; /* yacc external stack variable */ extern int yydebug; /* set by "-y" command line arg, * has yacc parser give details * of parse */ int Newline; /* less than one token has been * read from the input line, and * yylex isn't sure yet whether it is * C_CODE or not */ int Lineout; /* output line count */ int In_quote; /* set if inside an IIwrite("... */ char *Input_file_name; /* input file name */ int Type_spec; /* used in parser, in C-declarations */ int C_code_flg; /* set to indicate C-code in scanner */ int Pre_proc_flg; /* set to indicate a * pre-processor line */ int Block_level; /* > 0 local, 0 global */ int Indir_level; /* holds indirection level * of a reference to a C-var */ int Field_indir; /* indirection on a field of * a structure variable */ int Opflag; /* mode in which to interpret syntax */ int In_string; /* set if output is in a string */ int Fillmode; /* set if output line is being filled */ int Fillcnt; /* count to fill a line to */ int Charcnt; /* # chars written onto output line */ int Lastc; /* type of last char read (OPCHAR or * KEYCHAR) */ int Arg_error; /* set in argproc() [main.c] on * error in prcessing command line * arguments. */ int Rtdb; /* set by "-d" command line arg, * supplies equel runtime support * with info to report file name * and line number in case of an * error */ int Kwrdnum; /* # of entries in Kwrdtab [tokens.y] */ char Line_buf [MAXSTRING + 1]; /* buffer for input line */ char *Line_pos; /* position in input line */ int Peekc [2]; /* holds backup character */ int Struct_flag; /* while processing a structure * variable declaration, is set */ struct cvar *Cvarp, *Fieldp; /* to process C variables */ struct optab Kwrdtab []; /* table of key words [tokens.y] */ struct optab Optab []; /* table of operators [tokens.y] */ struct special Tokens; /* holds yacc generated lex codes * [tokens.y] */ char Cmap []; /* a type for each character [cmap.c] */ struct cvar *C_globals; /* Global C-variable tree */ struct cvar *C_locals; /* Local C-variable tree */ struct cvar *F_locals; /* Local structure fields */ struct cvar *F_globals; /* Global structure fields */ struct display Displays [1]; /* Cv_display is set to point at this * so that Cv_display may be passed * as a parameter instead of &Cv_display */ struct display *Cv_display; /* display into which "cvarx"'s * get put */ struct display Symsp; /* storage for symbols read by * yylex() */ struct ret_list Ret_list; /* list of variables in a "ctlelm" */ struct inc_file *Inc_files; /* stack of files pushed by #includes */ /* ** I/O manipulation data structures */ FILE *In_file; /* input file */ FILE *Out_file; /* output file */ # ifdef xDEBUG char Lex_debug; /* debugging info for lexemes in yylex() * [yylex.c] */ char Chardebug; /* print debugging info for routine * in getch.c */ # endif