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