This commit is contained in:
Oliver Lehmann 1990-01-22 16:03:35 +00:00
parent 1392520bff
commit 13f616a358
1 changed files with 320 additions and 0 deletions

View File

@ -0,0 +1,320 @@
/*
** --- RC.C ------------ 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.c 4.0 02/05/89
**
*/
# include "rc.h"
/* PROCEDURE handling */
char *Proc[MAX_PROCS];
/* CASE HANDLING */
int Case_no;
char *Case[MAX_CASES];
/* MACRO HANDLING */
int Macro_no;
struct macro Macro[MAX_MACROS];
/* DECLARATIONS */
struct desc_t Desc[MAX_DOM]; /* domfrmt = 0 */
/* domfrml = 0 */
/* domoff = 0 */
int Line; /* source line counter */
int Lcase = TRUE; /* UPPER->lower conversion flag */
int Compile = TRUE; /* FALSE for only compilation */
int Iflag; /* read from standard input */
int Oflag; /* write to file "r_code" */
int Sflag = TRUE; /* be silent if FALSE */
int S_error; /* # of errors found */
char *S_name; /* name of R_CODE file */
char *S_desc; /* name of DESC file */
RC_BYTE(byte)
register int byte;
{
# ifdef RC_TRACE
if (TR_R_CODE)
# ifdef MSDOS
printf("RC_BYTE: %d (%Fp)\n", byte, R_rc);
# else
printf("RC_BYTE: %d (%08x)\n", byte, R_rc);
# endif
# endif
*R_rc++ = byte;
}
RC_WORD(word)
register unsigned int word;
{
register char *rc;
register unsigned short w;
rc = R_rc;
w = word;
# ifdef RC_TRACE
if (TR_R_CODE)
# ifdef MSDOS
printf("RC_WORD: %d (%Fp)\n", word, rc);
# else
printf("RC_WORD: %d (%08x)\n", word, rc);
# endif
# endif
*rc++ = w >> BYTE_LOG2;
*rc++ = w & BYTE_MASK;
R_rc = rc;
}
RC_JUMP(jump_to)
register char *jump_to;
{
register char *rc;
register unsigned short rel_addr;
rc = R_rc;
R_rc += sizeof (short);
rel_addr = jump_to - R_rc;
# ifdef RC_TRACE
if (TR_R_CODE)
# ifdef MSDOS
printf("RC_JUMP: to %Fp from %Fp - 2, rel_addr %d\n",
# else
printf("RC_JUMP: to %08x from %08x - 2, rel_addr %d\n",
# endif
jump_to, R_rc, rel_addr);
# endif
*rc++ = rel_addr >> BYTE_LOG2;
*rc = rel_addr & BYTE_MASK;
}
char *RC_INIT_JUMP(code)
register int code;
{
register char *ret;
RC_BYTE(code);
ret = R_rc;
RC_WORD(0);
# ifdef RC_TRACE
if (TR_R_CODE)
# ifdef MSDOS
printf("RC_INIT_JUMP: code %d on %Fp\n", code, ret);
# else
printf("RC_INIT_JUMP: code %d on %08x\n", code, ret);
# endif
# endif
return (ret);
}
RC_UPDATE(jump_from)
register char *jump_from;
{
register unsigned short rel_addr;
rel_addr = R_rc - (jump_from + sizeof (short));
# ifdef RC_TRACE
if (TR_R_CODE)
# ifdef MSDOS
printf("RC_UPDATE: jump from (%Fp - 2) to %Fp, rel_addr %d\n",
# else
printf("RC_UPDATE: jump from (%08x - 2) to %08x, rel_addr %d\n",
# endif
jump_from + sizeof (short), R_rc, rel_addr);
# endif
*jump_from++ = rel_addr >> BYTE_LOG2;
*jump_from = rel_addr & BYTE_MASK;
}
RC_SYS_VAR(var, print)
register int var;
register int print;
{
# ifdef RC_TRACE
if (TR_R_CODE)
# ifdef MSDOS
printf("RC_SYS_VAR: %d %d (%Fp)\n", var, print, R_rc);
# else
printf("RC_SYS_VAR: %d %d (%08x)\n", var, print, R_rc);
# endif
# endif
switch (var)
{
case SYS_COL:
RC_BYTE(print? prCOL: pushCOL);
break;
case SYS_LINE:
RC_BYTE(print? prLINE: pushLINE);
break;
case SYS_ALL_LINE:
RC_BYTE(print? prALLINES: pushALLINES);
break;
case SYS_PAGE:
RC_BYTE(print? prPAGE: pushPAGE);
break;
case SYS_TUPL:
RC_BYTE(print? prTUPLE: pushTUPLE);
break;
default:
RC_BYTE(print? prVAR: pushVAR);
RC_WORD(var);
}
}
RC_STR(str, len)
register char *str;
register int len;
{
register char *rc;
rc = R_rc;
# ifdef RC_TRACE
if (TR_R_CODE)
# ifdef MSDOS
printf("RC_STR: len=%d (%Fp)\n\t", len, rc);
# else
printf("RC_STR: len=%d (%08x)\n\t", len, rc);
# endif
# endif
while (--len >= 0)
{
# ifdef RC_TRACE
if (TR_R_CODE)
{
printf("%3o %c\t", *str, *str);
if (!len)
printf("\n");
else if (!(len % 8))
printf("\n\t");
}
# endif
*rc++ = *str++;
}
R_rc = rc;
}
RC_IDOM(dom, frmt, frml)
register int dom;
register int frmt;
register int frml;
{
if (Doms == dom - 1)
RC_DOM(frmt, frml);
else
{
rc_error(25, (char *) dom, ((char *) (Doms + 1)));
S_desc = (char *) 0;
}
}
RC_NDOM(dom, frmt, frml)
register char *dom;
register int frmt;
register int frml;
{
if (RC_MACRO(dom, Doms + 1))
RC_DOM(frmt, frml);
else
S_desc = (char *) 0;
}
RC_DOM(frmt, frml)
register int frmt;
register int frml;
{
register int dom;
if ((dom = Doms) >= MAX_DOM)
{
rc_error(26);
S_desc = (char *) 0;
return;
}
Desc[dom].domfrmt = frmt;
Desc[dom].domfrml = frml;
Desc[dom].domoff = Tup_len;
Tup_len += frml;
Doms++; /* new domain */
if (frml <= 0)
goto ill_len;
switch (frmt)
{
case INT:
switch (frml)
{
case sizeof (char):
case sizeof (short):
case sizeof (long):
break;
default:
goto ill_len;
}
break;
case FLOAT:
switch (frml)
{
# ifndef NO_F4
case sizeof (float):
# endif
case sizeof (double):
break;
default:
goto ill_len;
}
break;
case CHAR:
if (frml > MAX_FIELD)
{
ill_len:
rc_error(27);
S_desc = (char *) 0;
}
}
}
RC_MACRO(t, s)
register char *t;
register int s;
{
register int ovfl;
if (ovfl = (Macro_no < MAX_MACROS))
{
Macro[Macro_no].templt = t;
Macro[Macro_no].subst = s;
Macro_no++;
}
else
rc_error(24);
return (ovfl);
}