char *tag_rhs_value(int tagnum); int cpop(void); void cpush(int op); int get_icode (FILE * f) { int c = fgetc (f); if (c != EOF) { if (debug_input) { if ('!' <= c && c <= '~') { fprintf (stdout, "%c: ", c); } else { fprintf (stdout, "%d: ", c); } } if (cstackp != cstack) { int tos; tos = cpop(); cpush(tos); if (debug_input) printf("%s\n", tag_rhs_value(tos)); } else { if (debug_input) printf("(stack empty)\n"); } } return (c); } static char *getname (void) { /* A Hack */ static char local[256]; int c; char *s = local; for (;;) { c = get_icode (icode_file); assert (c != EOF); if ((isalpha (c) && isupper (c)) || isdigit (c)) { } else break; *s++ = c; } *s = '\0'; ungetc (c, icode_file); return (local); } static char *getwordconst (int *w) { static char local[12]; int i, c; int word = 0; for (i = 0; i < 4; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } sprintf (local, "0x%08x", word); if (w != NULL) *w = word; return (local); } static char *getbyte (void) { static char local[4]; int c; c = get_icode (icode_file); assert (c != EOF); sprintf (local, "%02x", c & 255); return (local); } static char *getcond (int *ch) { int c; c = get_icode (icode_file); assert (c != EOF); c &= 255; if (ch != NULL) *ch = c; return (cond[c]); } static char *getrcond (void) { int c; c = get_icode (icode_file); assert (c != EOF); c &= 255; return (rcond[c]); } static char *getimpstring (char **starg) { static char local[256 * 2 + 3]; char *impstr; int i, c, len; char *s = local; char *p; impstr = malloc(257); p = impstr+1; len = get_icode (icode_file); assert (c != EOF); *s++ = '"'; for (i = 0; i < len; i++) { c = get_icode (icode_file); assert (c != EOF); *p++ = c; if (c == '"') { *s++ = '\\'; *s++ = c; } else if (c == '\n') { *s++ = '\\'; /* just for display purposes */ *s++ = 'n'; } else *s++ = c; } *s++ = '"'; *s++ = '\0'; *p = '\0'; *impstr = strlen(impstr+1); if (starg != NULL) *starg = impstr; return (local); } static char *getshort (short int *sh) { static char local[7]; int i, c; int word = 0; for (i = 0; i < 2; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } if (sh != NULL) *sh = word; sprintf (local, "0x%04x", word); return (local); } static char *getshortdecimal (short int *d) { static char local[7]; int i, c; int word = 0; for (i = 0; i < 2; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } if (d != NULL) *d = word; sprintf (local, "%0d", word); return (local); } static char *getlab (short int *d, int labtype) { static char local[7]; int i, c; int word = 0; for (i = 0; i < 2; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } if (!((word >= 0) && (word < MAX_LINENOS))) { fprintf(stdout, "\n*** word = %04x\n\n", word); exit(0); } if (lineno[word] == 0) { lineno[word] = get_next_lineno (); // linetype[word] = labtype; /* flag JUMPIF followed by LOCATE */ } if (d != NULL) *d = word; sprintf (local, "L_%04x", lineno[word]); return (local); } static char *getforwardlab (short int *d) { /* target for an if (..) goto skip; inst(); skip: */ static char local[7]; int i, c; int word = 0; for (i = 0; i < 2; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } assert((word >= 0) && (word < MAX_LINENOS)); /* there may be several jumps to this later label */ if (lineno[word] == 0) { i = get_next_lineno(); //printf("//*** setting lineno[0x%04x] to 0x%04x\n", word, i); lineno[word] = i; } if (d != NULL) *d = word; sprintf (local, "L_%04x", lineno[word]); return (local); } static char *getbackwardlab (short int *d) { /* start of for loop */ static char local[7]; int i, c; int word = 0; for (i = 0; i < 2; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } assert((word >= 0) && (word < MAX_LINENOS)); lineno[word] = get_next_lineno (); if (d != NULL) *d = word; // sprintf (local, "/*forloop*/L_%04x", lineno[word]); return (local); } static char *getuserlab (void) { static char local[7]; int i, c; int word = 0; for (i = 0; i < 2; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } sprintf (local, "U_%04x", word); return (local); } static char *nextlab (int d) { static char local[7]; // assert (lineno[d] == 0); lineno[d] = get_next_lineno (); // linetype[d] = labtype; /* flag JUMPIF followed by LOCATE */ sprintf (local, "L_%04x", lineno[d]); return (local); } static char *setbackwardlab (short int d, int *linenod) { static char local[64]; int word = d; /* If you have the LOCATE first, the REPEAT clears it. */ // assert(lineno[word] == 0); lineno[word] = get_next_lineno(); sprintf (local, "L_%04x", *linenod = lineno[word]); return(local); } static char *setforwardlab (short int d) { static char local[64]; int word = d; /* but if we have already had a JUMPIF then this LOCATE clears it */ /* This LOCATE comes before any type of jump */ /* Could either be start of a loop, or a user label */ assert(lineno[word] != 0); sprintf (local, "L_%04x", lineno[word]); //printf("//*** unsetting lineno[%04x] to 0\n", word); lineno[word] = 0; return (local); } static char *setrepeatlab (short int d, int *linenod) { static char local[64]; int word = d; /* If you have the LOCATE first, the REPEAT clears it. */ sprintf (local, "L_%04x", *linenod = lineno[word]); //printf("//*** unsetting lineno[%04x] to 0\n", word); lineno[word] = 0; return(local); } static char *setuserlab (short int d) { static char local[7]; int word = d; sprintf (local, "U_%04x", word); return (local); } static char *getvar (short int *d) { static char local[7]; int i, c; int word = 0; for (i = 0; i < 2; i++) { word = word << 8 | (c = get_icode (icode_file)); assert (c != EOF); } if (d != NULL) *d = word; sprintf (local, "V_%04x", word); return (local); } int memprintf(char *s, ...) { va_list ap; char *buff; FILE *nullfile; int string_length; va_start (ap, s); nullfile = fopen ("/dev/null", "w"); if (nullfile == NULL) { fprintf (stderr, "Major error - cannot open /dev/null\n"); exit (1); } string_length = vfprintf (nullfile, s, ap); fclose (nullfile); buff = malloc (string_length + 1); vsprintf (buff, s, ap); va_end (ap); string_length = fprintf(cur_impfile, "%s", buff); free (buff); return string_length; }