This commit is contained in:
Oliver Lehmann 1989-10-31 17:57:56 +00:00
parent 61d1ec1ff6
commit aa15655252
2 changed files with 377 additions and 0 deletions

View File

@ -0,0 +1,166 @@
/*
** --- RC.H ------------ BASIC DECLARATIONS ---------------------------------
**
** Report Compiler Definitions
**
** contains the global structures and variable
** declarations needed by the lexical analyzer.
** This includes Manifest constants and certain
** variables for internal communication purposes.
** Therefore, extreme care should be exercised
** when modifying this file.
**
** Version: @(#)rc.h 4.0 02/05/89
**
*/
# include "r_code.h"
/* SYSTEM VARIABLES */
# define SYS_COL 1
# define SYS_LINE 2
# define SYS_ALL_LINE 3
# define SYS_PAGE 4
# define SYS_TUPL 5
/* CHARACTER TYPES */
# define ALPHA 1
# define NUMBR 2
# define OPATR 3
# define PUNCT 4
# define CNTRL 5
/* character type mapping */
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
/* INTEGER CONSTANT */
# define GOVAL -1
/* SYMBOL TABLE ENTRY */
struct s_entry
{
struct s_entry *nextsym;
char symbl[1];
};
/* KEYWORD AND OPERATOR TABLE */
struct optab
{
char *term;
int token;
int opcode;
};
typedef struct optab OPTAB;
/* in rc_tables.y */
extern struct optab Optab[]; /* operator table */
extern struct optab Keyword[]; /* keyword table */
extern int Keyent; /* # of entries in the Keyword table */
/* SPECIAL TOKENS FOR SCANNER */
struct special
{
int name;
int sconst;
int bgncmnt;
int endcmnt;
int iconst;
int lconst;
int rconst;
};
/* in rc_tables.y */
extern struct special Tokens; /* special tokens for scanner */
/* FORMAT STRUCTURE (formatted output) */
struct format
{
int data;
int length;
double scale;
int str_len;
char *str_adr;
int before;
int point;
int ignore;
int norm;
char *fr_to[2];
int batch_len;
int fr_to_v[2];
double fr_to_8[2];
};
/* PROCEDURE handling */
# define MAX_PROCS 128
extern char *Proc[];
/* CASE HANDLING */
# define MAX_CASES 50
extern int Case_no;
extern char *Case[];
/* MACRO HANDLING */
# define MAX_MACROS 500
struct macro
{
char *templt;
int subst;
};
extern int Macro_no;
extern struct macro Macro[];
/* DECLARATIONS */
extern struct desc_t Desc[MAX_DOM]; /* domain desriptions */
extern int Line; /* source line counter */
extern int Lcase; /* UPPER->lower conversion flag */
extern int Compile; /* FALSE for only compilation */
extern int Iflag; /* read from standard input */
extern int Oflag; /* write to file "r_code" */
extern int Sflag; /* be silent if FALSE */
extern int S_error; /* # of errors found */
extern char *S_name; /* name of R_CODE file */
extern char *S_desc; /* name of DESC file */

View File

@ -0,0 +1,211 @@
/*
** --- RC_MAIN.C ------- MAIN -----------------------------------------------
**
** Version: @(#)rc_main.c 4.0 02/05/89
**
*/
# include <stdio.h>
# include "rc.h"
# define FLAG '-'
# define COMPILE 'c'
# define INPUT 'i'
# undef LCASE
# define LCASE 'l'
# define OUTPUT 'o'
# define SILENT 's'
# define VERBOSE 'v'
# ifdef RC_TRACE
# define YYPARSE 'Y'
# define YYLEX 'L'
# define YYINPUT 'I'
# define YYOUTPUT 'O'
# define YYR_CODE 'R'
# endif
/* SETEXIT | RESET */
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
extern FILE *Input;
static int catch;
rc_catch()
{
signal(2, rc_catch);
signal(3, rc_catch);
catch++;
if (Sflag)
{
printf("\n----------------\n");
printf("COMPILING aborted\n");
}
if (Iflag)
Iflag = FALSE;
else
fclose(Input);
reset();
}
main(argc, argv)
int argc;
char *argv[];
{
register char *p;
register int i;
register int files;
# ifdef SETBUF
char out_buf[BUFSIZ];
# endif
# ifdef SETBUF
setbuf(stdout, out_buf);
# endif
PQR_system = "compiler";
signal(2, rc_catch);
signal(3, rc_catch);
files = 0;
setexit();
while (--argc > 0)
{
++argv;
if (**argv == FLAG)
{
p = *argv;
p++;
while (*p)
{
switch (*p)
{
# ifdef RC_TRACE
case YYPARSE:
setbit(01, rc_debug);
break;
case YYLEX:
setbit(02, rc_debug);
break;
case YYINPUT:
setbit(04, rc_debug);
break;
case YYOUTPUT:
setbit(010, rc_debug);
break;
case YYR_CODE:
setbit(020, rc_debug);
break;
# endif
case COMPILE:
case 'C':
Compile = FALSE;
break;
case INPUT:
Iflag = TRUE;
Input = stdin;
goto compile;
case LCASE:
Lcase = FALSE;
break;
case OUTPUT:
Oflag = TRUE;
break;
case SILENT:
case 'S':
Sflag = FALSE;
break;
case VERBOSE:
case 'V':
Sflag = TRUE;
break;
default:
printf("? Option: -%c\n", *p);
}
p++;
}
continue;
}
if (!(Input = fopen(*argv, "r")))
{
printf("Cannot open *** %s ***\n", *argv);
continue;
}
compile:
Doms = 0;
Line = 1;
S_error = 0;
R_cols = D_COLS;
R_lines = D_LINES;
R_all_lines = D_ALL_LINES;
R_for_all = D_FOR_ALL;
R_first_page = D_FIRST_PAGE;
R_last_page = D_LAST_PAGE;
R_from_tuple = D_FROM_TUPLE;
R_to_tuple = D_TO_TUPLE;
R_big = FALSE;
R_rc = &R_code[1];
Macro_no = 0;
for (i = 0; i < MAX_PROCS; i++)
Proc[i] = (char *) 0;
if (Sflag)
{
if (!files)
PQR();
printf("\nCompiling REPORT ");
}
printf("%s:\n", *argv);
if (Sflag)
{
printf("----------------\n");
printf("%4d: ", Line);
}
files++;
rc_parse();
rc_freesym();
if (Iflag)
Iflag = FALSE;
else
fclose(Input);
if (Sflag)
{
printf("\n----------------\n");
printf("ERRORS\treported\t%d\n", S_error);
printf("R_CODE\ton file\t\t\"%s\"\n", S_name);
if (Doms && S_desc)
printf("DESC\ton file\t\t\"%s\"\n", S_desc);
}
sync();
Oflag = FALSE;
}
if (Sflag && files > 1)
{
printf("\nTOTAL\tfiles\t\t%d\n", files);
printf("\tinterrupts\t%d\n", catch);
}
fflush(stdout);
exit (S_error);
}