1: # 2: # include <stdio.h> 3: 4: # include "constants.h" 5: # include "globals.h" 6: 7: /* 8: ** STRING -- processes a string constant 9: ** Strings are kept internally exactly as their external 10: ** appearance, except for the outermost '"'. 11: ** A string may be at most MAXSTRING characters 12: ** long, and may have escaped newlines. 13: ** 14: ** Parameters: 15: ** op -- pointer to string quote operator 16: ** table entry. 17: ** 18: ** Returns: 19: ** SCONST 20: ** 21: ** Called By: 22: ** operator() -- [operator.c] 23: ** 24: ** History: 25: ** 6/1/78 -- (marc) written 26: ** 27: */ 28: 29: 30: string(op) 31: struct optab *op; 32: { 33: char buf [MAXSTRING + 1]; 34: register char c, *cp; 35: int error; 36: register int escape; 37: 38: error = escape = 0; 39: cp = buf; 40: for ( ; ; ) 41: { 42: c = getch(); 43: switch (c) 44: { 45: 46: case '\\' : 47: if (!escape) 48: escape = 2; 49: goto regchar; 50: 51: case '\n' : 52: if (escape) 53: goto regchar; 54: *cp = '\0'; 55: yysemerr("non-terminated string", 56: !error ? buf : 0); 57: break; 58: 59: case EOF_TOK : 60: backup(c); 61: *cp = '\0'; 62: yysemerr("EOF in string", 63: !error ? buf : 0); 64: break; 65: 66: default : 67: regchar : 68: if (c == *op->op_term && !escape) 69: { 70: /* end of string */ 71: *cp = '\0'; 72: break; 73: } 74: if (!error) 75: { 76: if (cp - buf < MAXSTRING) 77: { 78: if (Cmap [c] == CNTRL) 79: yysemerr("control character in string eliminated", 80: 0); 81: else 82: *cp++ = c; 83: } 84: else 85: { 86: yysemerr("string too long, rest discarded", 87: 0); 88: error = 1; 89: } 90: } 91: if (escape) 92: --escape; 93: continue; 94: } 95: break; 96: } 97: yylval = addsym(salloc(buf)); 98: return (Tokens.sp_sconst); 99: }