ING_DB
This commit is contained in:
parent
fcc2546ac7
commit
eefa54f77f
|
|
@ -0,0 +1,94 @@
|
|||
/* CONSTANTS.H -- manifest constants, operand and operator codes */
|
||||
/* */
|
||||
/* Defines: */
|
||||
/* op_codes for operands */
|
||||
/* Opflag's domain set */
|
||||
/* Type_spec's domain set */
|
||||
|
||||
/* Manifest constants used throughout EQL */
|
||||
|
||||
# define CONTINUE 1 /* "loop" flag for yylex */
|
||||
# ifdef MAXNAME
|
||||
# undef MAXNAME
|
||||
# endif
|
||||
# define MAXNAME 13 /* maximum length for EQL */
|
||||
/* identifiers (or keywords) */
|
||||
# define MAXSTRING 255 /* maximum length for EQL strings */
|
||||
# define FILLCNT 110 /* length to fill lines */
|
||||
/* when in Fillmode */
|
||||
|
||||
|
||||
/* debugging info conditional compilation flag */
|
||||
# define xDEBUG /* on for "-c" and "-v" flags */
|
||||
|
||||
|
||||
/* Character types [cmap.c] */
|
||||
|
||||
# define EOF_TOK 0 /* end of parse input too */
|
||||
# define ALPHA 1 /* alphabetic or '_' */
|
||||
# define NUMBR 2 /* numeric */
|
||||
# define OPATR 3 /* other non control characters */
|
||||
# define PUNCT 4 /* white space */
|
||||
# define CNTRL 5 /* control-characters */
|
||||
|
||||
|
||||
/* Modes used in parser actions to distinguish contexts in which */
|
||||
/* the same syntax applies. Opflag is set to these modes. */
|
||||
/* */
|
||||
/* (There are some modes that are never referenced, but are useful */
|
||||
/* for extension). */
|
||||
|
||||
/* QL statements */
|
||||
|
||||
# define mdAPPEND 1
|
||||
# define mdCOPY 2
|
||||
# define mdCREATE 3
|
||||
# define mdDEFINE 4
|
||||
# define mdDELETE 5
|
||||
# define mdDESTROY 6
|
||||
# define mdHELP 7
|
||||
# define mdINDEX 8
|
||||
# define mdINTEGRITY 9
|
||||
# define mdMODIFY 10
|
||||
# define mdPRINT 11
|
||||
# define mdRANGE 12
|
||||
# define mdREPLACE 13
|
||||
# define mdRETRIEVE 14
|
||||
# define mdSAVE 15
|
||||
# define mdVIEW 16
|
||||
# define mdPROT 17
|
||||
|
||||
/* statements particular to EQL */
|
||||
|
||||
# define mdDECL 16 /* C - declaration */
|
||||
# define mdCTLELM 17 /* left hand side of target list */
|
||||
/* element in "retrieve" to C-vars */
|
||||
# define mdEXIT 18 /* ## exit */
|
||||
# define mdDBS 19 /* ## dbs */
|
||||
# define mdTUPRET 20 /* "retrieve" w/o an "into" */
|
||||
# define mdFILENAME 21 /* used in "copy" statement */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* define typTYPE xx */ /* c types "Type_spec" */
|
||||
# define opINT 1
|
||||
# ifndef NO_F4
|
||||
# define opFLT 2
|
||||
# endif
|
||||
# define opSTRING 3
|
||||
# define opDOUBLE 4
|
||||
# define opCHAR 5
|
||||
# define opLONG 6
|
||||
# define opIDSTRING 7
|
||||
# define opSTRUCT 8
|
||||
|
||||
|
||||
/* define typALLOC xx */ /* c var allocation types */
|
||||
# define opAUTO 0
|
||||
# define opSTATIC 1
|
||||
# define opEXTERN 2
|
||||
# define opREGISTER 3
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
/* GLOBALS.H -- EQL declarations */
|
||||
/* */
|
||||
/* Defines: */
|
||||
/* Structures and variables */
|
||||
/* used in EQL. */
|
||||
|
||||
/* 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;
|
||||
# ifdef SETBUF
|
||||
char *inc_ibuf; /* Ibuf */
|
||||
# endif
|
||||
};
|
||||
|
||||
/* 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 */
|
||||
extern int Opcode; /* op code to distinguis tokens */
|
||||
extern int yychar; /* yacc input token */
|
||||
extern int yyline; /* yacc external line counter */
|
||||
extern char *yylval; /* yacc external stack variable */
|
||||
extern int yydebug; /* set by "-y" command line arg, */
|
||||
/* has yacc parser give details */
|
||||
/* of parse */
|
||||
extern 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 */
|
||||
extern int Lineout; /* output line count */
|
||||
extern int In_quote; /* set if inside an IIwrite("... */
|
||||
extern char *Input_file_name; /* input file name */
|
||||
extern int C_code_flag; /* set to indicate C-code in parser */
|
||||
extern int Pre_proc_flag; /* set to indicate a */
|
||||
/* pre-processor line */
|
||||
extern int Block_level; /* > 0 local, 0 global */
|
||||
extern int Indir_level; /* holds indirection level */
|
||||
/* of a reference to a C-var */
|
||||
extern int In_string; /* set if output is in a string */
|
||||
extern int Fillmode; /* set if output line being filled */
|
||||
extern short Fillcnt; /* count to fill a line to */
|
||||
extern int Charcnt; /* # chars written onto output line */
|
||||
extern int Rtdb; /* set by "-d" command line arg, */
|
||||
/* supplies EQL runtime support */
|
||||
/* with info to report file name */
|
||||
/* and line number in case of an */
|
||||
/* error */
|
||||
extern int Kwrdnum; /* # of entries in Kwrdtab tokens.y */
|
||||
extern char Line_buf[]; /* buffer for input line */
|
||||
extern char *Line_pos; /* position in input line */
|
||||
|
||||
extern struct optab Kwrdtab[]; /* table of key words [tokens.y] */
|
||||
extern struct optab Optab[]; /* table of operators [tokens.y] */
|
||||
extern struct special Tokens; /* holds yacc generated lex codes */
|
||||
/* [tokens.y] */
|
||||
extern struct cvar *C_globals; /* Global C-variable tree */
|
||||
extern struct cvar *C_locals; /* Local C-variable tree */
|
||||
extern struct cvar *F_globals; /* Global structure fields */
|
||||
extern struct cvar *F_locals; /* Local structure fields */
|
||||
extern struct display *Cv_display; /* display into which "cvarx"'s */
|
||||
/* get put */
|
||||
extern struct inc_file *Inc_file; /* file stack pushed by #includes */
|
||||
|
||||
/* I/O manipulation data structures */
|
||||
extern FILE *In_file; /* input file */
|
||||
extern FILE *Out_file; /* output file */
|
||||
# ifdef SETBUF
|
||||
extern char *Ibuf; /* input buffer */
|
||||
extern char Out_buf[]; /* buffer for Out_file */
|
||||
# endif
|
||||
|
||||
/* character type mapping */
|
||||
# define ASCII_MASK 0177
|
||||
# define BYTE_MASK 0377
|
||||
extern char Cmap[];
|
||||
# ifdef EBCDIC
|
||||
# ifdef ESER_PSU
|
||||
extern char _etoa_[];
|
||||
# define ETOA(c) _etoa_[(c) & BYTE_MASK]
|
||||
# endif
|
||||
# define CMAP(c) Cmap[(ETOA(c)) & ASCII_MASK]
|
||||
# else
|
||||
# define CMAP(c) Cmap[(c) & ASCII_MASK]
|
||||
# endif
|
||||
|
||||
# ifdef xDEBUG
|
||||
extern char Lex_debug; /* debugging info for lexemes in */
|
||||
/* yylex() [yylex.c] */
|
||||
extern char Chardebug; /* print debugging info for routine */
|
||||
/* in getch.c */
|
||||
# endif
|
||||
|
|
@ -0,0 +1,312 @@
|
|||
# include <stdio.h>
|
||||
# include "gen.h"
|
||||
# include "../h/bs.h"
|
||||
# include "constants.h"
|
||||
# include "globals.h"
|
||||
# include "cmap.c"
|
||||
|
||||
# ifdef P8000
|
||||
ret_buf AAjmp_buf;
|
||||
# else
|
||||
jmp_buf AAjmp_buf;
|
||||
# endif
|
||||
|
||||
int Opcode; /* op code to distinguis tokens */
|
||||
int Newline; /* less than one token has been */
|
||||
int Lineout; /* output line count */
|
||||
int In_quote; /* set if inside an IIwrite("... */
|
||||
char *Input_file_name; /* input file name */
|
||||
int C_code_flag; /* set to indicate C-code in parser */
|
||||
int Pre_proc_flag; /* 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 In_string; /* set if output is in a string */
|
||||
int Fillmode; /* set if output line being filled */
|
||||
int Charcnt; /* # chars written onto output line */
|
||||
int Rtdb; /* set by "-d" command line arg, */
|
||||
/* supplies EQL runtime support */
|
||||
/* with info to report file name */
|
||||
/* and line number in case of an */
|
||||
/* error */
|
||||
FILE *In_file; /* input file */
|
||||
FILE *Out_file; /* output file */
|
||||
# ifdef SETBUF
|
||||
char *Ibuf; /* input buffer */
|
||||
char Out_buf[BUFSIZ]; /* buffer for Out_file */
|
||||
# endif
|
||||
struct cvar *C_globals; /* Global C-variable tree */
|
||||
struct cvar *C_locals; /* Local C-variable tree */
|
||||
struct cvar *F_globals; /* Global structure fields */
|
||||
struct cvar *F_locals; /* Local structure fields */
|
||||
|
||||
# ifdef xDEBUG
|
||||
char Lex_debug; /* debugging info for lexemes in */
|
||||
/* yylex() [yylex.c] */
|
||||
char Chardebug; /* print debugging info for routine */
|
||||
/* in getch.c */
|
||||
# endif
|
||||
|
||||
static int Arg_error; /* set in argproc() [main.c] on */
|
||||
/* error in prcessing command line */
|
||||
/* arguments. */
|
||||
|
||||
/*
|
||||
** MAIN.C -- Start up routines
|
||||
**
|
||||
** Usage:
|
||||
** eql {-d | -v | -c | -y | -f | -f<integer> | <name>.q}
|
||||
**
|
||||
** Files:
|
||||
** standard output -- for diagnostics
|
||||
** <name>.q -- read
|
||||
** <name>.c -- created and written
|
||||
** any file appearing in a "#include" with a name
|
||||
** <name>.q.h -- read
|
||||
** <name>.c.h -- created and written
|
||||
**
|
||||
** Flags:
|
||||
** possible arguments are:
|
||||
** -d -- enables run-time errors to have the file name
|
||||
** and line number where they occurred reported
|
||||
** Defaults to off.
|
||||
** -f -- specify the number of characters to fill
|
||||
** an output line on QL commands
|
||||
** as being very high (to get C code on the
|
||||
** right line invariably).
|
||||
** -f<integer> -- fill output lines to integer chars
|
||||
** (0 is like -f alone)
|
||||
** Defaults to FILLCNT.
|
||||
** -y -- have the parser print debugging info
|
||||
** Defaults to off.
|
||||
** -v -- (verbose) have the lexical analizer
|
||||
** print the kind of token it sees.
|
||||
** (only available if xDEBUG is defined)
|
||||
** Defaults to off.
|
||||
** -c -- have every character read or backed up
|
||||
** echoed (only if xDEBUG is defined)
|
||||
** Defaults to off.
|
||||
** -r -- reset all previous flags to default
|
||||
** <name>.q -- name of a file to be EQL'ed
|
||||
**
|
||||
** Defines:
|
||||
** main()
|
||||
** argproc()
|
||||
** eql()
|
||||
*/
|
||||
|
||||
char *AApath;
|
||||
|
||||
/*
|
||||
** MAIN -- invokes the pre-compiler on all the argument files
|
||||
**
|
||||
** Parameters:
|
||||
** argc
|
||||
** argv
|
||||
**
|
||||
*/
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
extern char **argproc();
|
||||
|
||||
argv[argc] = 0;
|
||||
|
||||
for (argv++; *argv; )
|
||||
{
|
||||
argv = argproc(argv);
|
||||
if (!Arg_error)
|
||||
{
|
||||
printf("%s :\n", Input_file_name);
|
||||
eql(Input_file_name);
|
||||
sync();
|
||||
}
|
||||
}
|
||||
fflush(stdout);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** ARGPROC -- process arguments on the command line
|
||||
** Arguments have effect on all the files following them
|
||||
** until a "-r" or an argument cancelling the first
|
||||
**
|
||||
** Also performs global initializations.
|
||||
**
|
||||
** Parameters:
|
||||
** argv -- a 0 terminated string vector with the
|
||||
** command lines components.
|
||||
**
|
||||
** Returns:
|
||||
** a new argv with all the leading arguments taken out
|
||||
**
|
||||
** Side Effects:
|
||||
** sets certain variables for certain flags
|
||||
** -d -- Rtdb
|
||||
** -c -- Chardebug
|
||||
** -v -- Lex_debug
|
||||
** -y -- yydebug
|
||||
** -f -- Fillcnt
|
||||
** -r -- resets all variables to default values
|
||||
** Sets Arg_error on an argument error that should abort
|
||||
** the pre-processing of the file read.
|
||||
*/
|
||||
char **argproc(argv)
|
||||
register char **argv;
|
||||
{
|
||||
/* initializations for a new file */
|
||||
C_code_flag = Pre_proc_flag = 0;
|
||||
yyline = Newline = Lineout = 1;
|
||||
Block_level = Indir_level = In_string = Fillmode = 0;
|
||||
Charcnt = In_quote = 0;
|
||||
Arg_error = 0;
|
||||
|
||||
/* free C variable trees, and symbol space */
|
||||
freecvar(&C_locals);
|
||||
freecvar(&F_locals);
|
||||
freecvar(&C_globals);
|
||||
freecvar(&F_globals);
|
||||
|
||||
symspfree();
|
||||
|
||||
for ( ; *argv && **argv == '-'; argv++)
|
||||
{
|
||||
switch (*++*argv)
|
||||
{
|
||||
# ifdef xDEBUG
|
||||
case 'V':
|
||||
case 'v':
|
||||
Lex_debug = 'v';
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
case 'c':
|
||||
Chardebug = 'c';
|
||||
break;
|
||||
# endif
|
||||
|
||||
case 'Y':
|
||||
case 'y':
|
||||
yydebug = 1;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
case 'd':
|
||||
Rtdb = 1;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
case 'f': /* line fill */
|
||||
if (AA_atoi(++*argv, &Fillcnt))
|
||||
printf("bad fill count \"%s\"\n",
|
||||
*argv);
|
||||
if (!Fillcnt)
|
||||
/* make SURE that C_CODE is put
|
||||
* on line that it was typed in on
|
||||
*/
|
||||
Fillcnt = 30000;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
case 'r': /* reset all flags to
|
||||
* their default values.
|
||||
*/
|
||||
yydebug = Rtdb = 0;
|
||||
Fillcnt = FILLCNT;
|
||||
# ifdef xDEBUG
|
||||
Lex_debug = Chardebug = 0;
|
||||
# endif
|
||||
break;
|
||||
|
||||
default :
|
||||
printf("invalid option : '-%c'\n", **argv);
|
||||
}
|
||||
}
|
||||
if (*argv)
|
||||
Input_file_name = *argv++;
|
||||
else
|
||||
{
|
||||
printf("missing file name after arguments\n");
|
||||
Arg_error++;
|
||||
}
|
||||
return (argv);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** EQL -- invokes the precompiler for a non-included file
|
||||
**
|
||||
** Parameters:
|
||||
** filename -- the name of the file to pre-compile
|
||||
**
|
||||
** Side Effects:
|
||||
** performs the preprocessing on <filename>
|
||||
*/
|
||||
eql(filename)
|
||||
register char *filename;
|
||||
{
|
||||
register int l;
|
||||
# ifdef SETBUF
|
||||
char in_buf[BUFSIZ];
|
||||
# endif
|
||||
char o_file[100];
|
||||
|
||||
l = AAlength(filename);
|
||||
if (l > sizeof o_file - 1)
|
||||
{
|
||||
printf("filename \"%s\" too long\n",
|
||||
filename);
|
||||
return;
|
||||
}
|
||||
if (!AAsequal(".q", &filename[l - 2]))
|
||||
{
|
||||
printf("invalid input file name \"%s\"\n",
|
||||
filename);
|
||||
return;
|
||||
}
|
||||
AAbmove(".c", AAbmove(filename, o_file, l - 2), 3);
|
||||
Input_file_name = filename;
|
||||
In_file = Out_file = (FILE *) 0;
|
||||
# ifdef SETBUF
|
||||
Ibuf = in_buf;
|
||||
# endif
|
||||
|
||||
|
||||
if (!(In_file = fopen(filename, "r")))
|
||||
printf("can't read file \"%s\"\n", filename);
|
||||
else if (!(Out_file = fopen(o_file, "w")))
|
||||
printf("can't write file \"%s\"\n", o_file);
|
||||
else
|
||||
{
|
||||
# ifdef SETBUF
|
||||
setbuf(In_file, in_buf);
|
||||
setbuf(Out_file, Out_buf);
|
||||
# endif
|
||||
setexit();
|
||||
yyparse();
|
||||
}
|
||||
|
||||
/* if a reset(3) is done while processing
|
||||
* an included file, then this closes all
|
||||
* files skipped.
|
||||
*/
|
||||
while (restoref())
|
||||
continue;
|
||||
|
||||
if (Out_file)
|
||||
fclose(Out_file);
|
||||
if (In_file)
|
||||
fclose(In_file);
|
||||
In_file = Out_file = (FILE *) 0;
|
||||
Input_file_name = 0;
|
||||
if (Block_level)
|
||||
printf("unclosed block\n");
|
||||
}
|
||||
|
||||
|
||||
AAunlall()
|
||||
{
|
||||
}
|
||||
Loading…
Reference in New Issue