/* I N T E R M E D I A T E C O D E * * I C _ I O . C */ #include #include "../share/types.h" #include "../share/debug.h" #include "../../../h/em_pseu.h" #include "../../../h/em_spec.h" #include "../../../h/arch.h" #include "ic.h" #include "ic_lookup.h" #include "../share/alloc.h" #include "ic_io.h" STATIC short libstate; STATIC long bytecnt; STATIC FILE *infile; /* The current EM input file */ STATIC int readbyte() { if (libstate == ARCHIVE && bytecnt-- == 0L) { /* If we're reading from an archive file, we'll * have to count the number of characters read, * to know where the current module ends. */ return EOF; } return getc(infile); } short readshort() { register int l_byte, h_byte; l_byte = readbyte(); h_byte = readbyte(); if ( h_byte>=128 ) h_byte -= 256 ; return l_byte | (h_byte*256) ; } #ifdef LONGOFF offset readoffset() { register long l; register int h_byte; l = readbyte(); l |= ((unsigned) readbyte())*256 ; l |= readbyte()*256L*256L ; h_byte = readbyte() ; if ( h_byte>=128 ) h_byte -= 256 ; return l | (h_byte*256L*256*256L) ; } #endif short get_int() { switch(table2()) { default: error("int expected"); case CSTX1: return(tabval); } } char readchar() { return(readbyte()); } offset get_off() { switch (table2()) { default: error("offset expected"); case CSTX1: return((offset) tabval); #ifdef LONGOFF case CSTX2: return(tabval2); #endif } } STATIC make_string(n) int n; { register char *s; extern char *sprintf(); s=sprintf(string,".%u",n); assert(s == string); } STATIC inident() { register n; register char *p = string; register c; n = get_int(); while (n--) { c = readbyte(); if (p<&string[IDL]) *p++ = c; } *p++ = 0; } int table3(n) int n; { switch (n) { case sp_ilb1: tabval = readbyte(); return(ILBX); case sp_ilb2: tabval = readshort(); return(ILBX); case sp_dlb1: make_string(readbyte()); return(DLBX); case sp_dlb2: make_string(readshort()); return(DLBX); case sp_dnam: inident(); return(DLBX); case sp_pnam: inident(); return(n); case sp_cst2: tabval = readshort(); return(CSTX1); #ifdef LONGOFF case sp_cst4: tabval2 = readoffset(); return(CSTX2); #endif case sp_doff: if (table2()!=DLBX) error("symbol expected"); switch(table2()) { default: error("offset expected"); case CSTX1: return(VALX1); #ifdef LONGOFF case CSTX2: return(VALX2); #endif } default: return(n); } } int table1() { register n; n = readbyte(); if (n == EOF) return(ATEOF); if ((n <= sp_lmnem) && (n >= sp_fmnem)) { tabval = n; return(INST); } if ((n <= sp_lpseu) && (n >= sp_fpseu)) { tabval = n; return(PSEU); } if ((n < sp_filb0 + sp_nilb0) && (n >= sp_filb0)) { tabval = n - sp_filb0; return(ILBX); } return(table3(n)); } int table2() { register n; n = readbyte(); if ((n < sp_fcst0 + sp_ncst0) && (n >= sp_fcst0)) { tabval = n - sp_zcst0; return(CSTX1); } return(table3(n)); } file_init(f,state,length) FILE *f; short state; long length; { short n; infile = f; libstate = state; bytecnt = length; linecount = 0; n = readshort(); if (n != (short) sp_magic) { error("wrong magic number: %d", n); } } arch_init(arch) FILE *arch; { short n; infile = arch; n = readshort(); if (n != ARMAG) { error("wrong archive magic number: %d",n); } }