|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include "scanner.h" ! 3: # include <sccs.h> ! 4: ! 5: SCCSID(@(#)s_string.c 7.2 5/4/83) ! 6: ! 7: /* ! 8: ** STRING ! 9: ** A string is defined as any sequence of MAXSTRING or fewer characters, ! 10: ** surrounded by string delimiters. New-line ;characters are purged ! 11: ** from strings unless preceeded by a '\'; QUOTE's must be similarly ! 12: ** prefixed in order to be correctly inserted within a string. Each ! 13: ** string is entered in the symbol table, indexed by 'yylval'. A ! 14: ** token or the error condition -1 is returned. ! 15: */ ! 16: string(op) ! 17: struct optab *op; ! 18: { ! 19: extern char Cmap[]; ! 20: extern char *yylval; ! 21: extern char *syment(); ! 22: register int esc; ! 23: register int save; ! 24: register char *ptr; ! 25: char buf[MAXSTRING + 1]; ! 26: ! 27: /* disable case conversion and fill in string */ ! 28: ptr = buf; ! 29: save = Lcase; ! 30: Lcase = 0; ! 31: do ! 32: { ! 33: /* get next character */ ! 34: if ((*ptr = get_scan(NORMAL)) <= 0) ! 35: { ! 36: Lcase = save; ! 37: /* non term string */ ! 38: par_error(STRTERM, FATAL, 0); ! 39: } ! 40: ! 41: /* handle escape characters */ ! 42: esc = (*ptr == '\\'); ! 43: if (*ptr == '\n') ! 44: { ! 45: if ((*ptr = get_scan(NORMAL)) <= 0) ! 46: { ! 47: Lcase = save; ! 48: *ptr = 0; ! 49: /* non term string */ ! 50: par_error(STRTERM, FATAL, 0); ! 51: } ! 52: } ! 53: if (esc == 1) ! 54: { ! 55: if ((*++ptr = get_scan(NORMAL)) <= 0) ! 56: { ! 57: Lcase = save; ! 58: *ptr = 0; ! 59: /* non term string */ ! 60: par_error(STRTERM, FATAL, 0); ! 61: } ! 62: if (*ptr == *(op->term)) ! 63: *--ptr = *(op->term); ! 64: } ! 65: ! 66: /* check length */ ! 67: if ((ptr - buf) > MAXSTRING - 1) ! 68: { ! 69: Lcase = save; ! 70: /* string too long */ ! 71: par_error(STRLONG, WARN, 0); ! 72: } ! 73: if (Cmap[*ptr] == CNTRL) ! 74: /* cntrl in string from equel */ ! 75: par_error(CNTRLCHR, WARN, 0); ! 76: } while (*ptr++ != *(op->term) || esc == 1); ! 77: ! 78: /* restore case conversion and return */ ! 79: *--ptr = '\0'; ! 80: Lcase = save; ! 81: # ifdef xSTR2 ! 82: tTfp(71, 8, "STRING: %s\n", buf); ! 83: # endif ! 84: yylval = syment(buf, (ptr - buf) + 1); ! 85: Lastok.tok = yylval; ! 86: Lastok.toktyp = Tokens.sconst; ! 87: return (Tokens.sconst); ! 88: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.