1: #
2: # include <stdio.h>
3:
4: # include "constants.h"
5: # include "globals.h"
6:
7: /*
8: ** GETCH.C -- I/O manipulation routines
9: **
10: ** Defines:
11: ** getch()
12: ** backup()
13: ** int Peekc[2] -- 2 char stack, if [0] != -1, the character to
14: ** be returned on the next call to getch().
15: ** char *Line_pos -- if != 0 *Line_pos is next
16: ** character that should be returned.
17: ** char Line_buf [MAXSTRING + 1] -- holds current
18: ** input line's text.
19: **
20: ** Files:
21: ** globals.h
22: **
23: ** Compilation Flags:
24: ** xDEBUG -- to test Chardebug for
25: ** returning activity of getch() and backup().
26: **
27: ** History:
28: ** 4/20/78 - written (marc)
29: ** 9/5/78 -- Peekc made Peekc [2] to allow correct
30: ** processing in eat_display() [display.c]
31: ** Also include processing put below this
32: ** abstraction level
33: **
34: */
35:
36: /*
37: ** GETCH -- Get a character from the input stream
38: **
39: ** Parameters:
40: ** none
41: **
42: ** Returns:
43: ** the next character on the input stream, or
44: ** the backed up character if there is one.
45: ** EOF_TOK is returned on EOF.
46: **
47: ** Side Effects:
48: ** If a backed up character exists, unloads it.
49: ** *Line_pos is returned if Line_pos != 0
50: ** and no backup character exists. Line_buf
51: ** contains the line from which characters are being
52: ** returned. A call with Line_pos == 0 forces
53: ** reading of the next input line. Yyline is
54: ** incremented when a newline is returned.
55: ** If an EOF is in the middle of a line,
56: ** then a newline will be appended.
57: **
58: ** Requires:
59: ** getc() - from utility library
60: ** tst_include() - [include.c]
61: **
62: ** Diagnostics:
63: ** "WARNING : line %d too long, broken in two\n" --
64: ** a input line may contain at most MAXSTRING
65: ** characters, including the terminating
66: ** newline.
67: **
68: ** Called By:
69: ** all lexical analisys routines
70: ** include() looks at Line_buf and manipulates
71: ** Line_pos to skip the "#include"d lines.
72: **
73: ** History:
74: ** 4/20/78 - written (marc)
75: ** 9/5/78 -- modified (marc)
76: */
77:
78:
79: /* initializes peek buffer to be empty */
80: int Peekc [2] = {-1, -1};
81:
82: getch()
83: {
84: register char *cp;
85: register char ch;
86: static eoflag;
87: extern int yyline;
88: extern FILE *In_file;
89:
90: if (Peekc [0] >= 0)
91: {
92: /* have a backed up character */
93: ch = Peekc [0];
94: if (ch == '\n')
95: yyline += 1;
96: Peekc [0] = Peekc [1];
97: Peekc [1] = -1;
98: }
99: else
100: {
101: for ( ; ; )
102: {
103: /* no lookahead character */
104: if (!Line_pos)
105: {
106: if (eoflag)
107: {
108: eoflag = 0;
109:
110: /* try to restore previous file */
111: if (!restoref())
112: return (0);
113: # ifdef xDEBUG
114: if (Chardebug || Lex_debug)
115: printf("include file - pop\n");
116: # endif
117: }
118: for (cp = Line_buf; (*cp = getc(In_file)) != '\n'
119: && *cp != EOF; cp++)
120: {
121: if (cp - Line_buf > sizeof Line_buf - 1)
122: {
123: printf("WARNING : line %d too long, broken in two\n",
124: yyline);
125: break;
126: }
127: }
128: if (*cp == EOF)
129: {
130: eoflag++;
131: if (cp == Line_buf)
132: /* EOF after '\n' */
133: continue;
134: /* EOF in middle of line */
135: *cp = '\n';
136: }
137: Line_pos = Line_buf;
138:
139: /* test for a "#include" line */
140: if (tst_include())
141: {
142: /* Force reloading Line_buf */
143: Line_pos = 0;
144: eoflag = 0;
145: # ifdef xDEBUG
146: if (Chardebug || Lex_debug)
147: printf("include file - push\n");
148: # endif
149: continue;
150: }
151: }
152: cp = Line_pos;
153: if (*cp == '\n')
154: {
155: Line_pos = 0;
156: yyline += 1;
157: }
158: else
159: Line_pos++;
160: ch = *cp;
161: break;
162: }
163: }
164: ch &= 0377;
165:
166: # ifdef xDEBUG
167: if (Chardebug)
168: printf("getch - returning '%c'.\n", ch);
169: # endif
170:
171: return (ch);
172: }
173:
174: /*
175: ** BACKUP -- Back up a character on the input stream.
176: ** Backs up a single character into Peekc.
177: **
178: ** Parameters:
179: ** ch - character to back up
180: **
181: ** Returns:
182: ** none
183: **
184: ** Side Effects:
185: ** pushes Peekc [0] to Peekc [1].
186: ** sets Peekc [0] to backed up character.
187: **
188: ** Requires:
189: ** Peekc [2] -- integers.
190: **
191: ** Called By:
192: ** most lexical analysis routines.
193: **
194: ** Syserrs:
195: ** "backup buffer overflow on line %d, \"%c%c\"." -
196: ** can only back up two character.
197: ** History:
198: ** 4/20/78 - written (marc)
199: ** 9/5/78 -- added on backup character (marc)
200: **
201: */
202:
203: backup(ch)
204: char ch;
205: {
206: extern int yyline;
207:
208:
209: # ifdef xDEBUG
210: if (Chardebug)
211: printf("backed up : '%c'\n", ch);
212: # endif
213:
214: if (Peekc [1] >= 0)
215: syserr("backup buffer overflow on line %d, \"%c%c%c\".",
216: yyline, Peekc [0], Peekc [1], ch);
217:
218: Peekc [1] = Peekc [0];
219: if ((Peekc [0] = ch & 0377) == '\n')
220: --yyline;
221: }
Defined functions
getch
defined in line
82; used 16 times
Defined variables
Peekc
defined in line
80; used 11 times