|
|
1.1 root 1: # include <stdio.h>
2: # include "constants.h"
3: # include "globals.h"
4: # include <sccs.h>
5:
6: SCCSID(@(#)prtout.c 7.2 10/27/81)
7:
8:
9: /*
10: ** PRTOUT.C -- output routines
11: **
12: ** Output routines for non-specific data structures
13: ** (i.e. w_display is in [display.c])
14: */
15:
16:
17:
18: int Fillcnt = FILLCNT;
19: /*
20: ** W_CON -- write out a constant
21: ** Writes out a constant of type 'type'
22: ** pointed to by 'string'.
23: */
24:
25:
26: w_con(type, string)
27: int type;
28: char *string;
29: {
30: if (type == Tokens.sp_sconst)
31: w_string(string, 1);
32: else
33: w_key(string);
34: }
35: /*
36: ** W_OP -- Writes out a string which doesn't need a blank
37: ** to separate it from a keyword.
38: */
39:
40:
41: w_op(string)
42: char *string;
43: {
44: w_raw(string);
45: Lastc = OPCHAR;
46: }
47: /*
48: ** W_VAR -- writes out code to send the
49: ** value of a C variable down to
50: ** the Quel scanner.
51: **
52: ** Conserves the state of In_quote.
53: */
54:
55:
56: w_var(disp, type)
57: int type;
58: struct display *disp;
59: {
60: register struct disp_node *d;
61: register savestat;
62:
63: savestat = In_quote;
64:
65: /* if was In_quote, then will want a space before the
66: * string written down
67: */
68: if (savestat)
69: w_key("");
70: if (type != opIDSTRING)
71: {
72: w_new("IIcvar(");
73: if (type != opSTRING)
74: w_op("&");
75: }
76: else
77: w_new("IIwrite(");
78: w_display(disp);
79: switch (type)
80: {
81: case opSHORT:
82: w_op(",1,2);");
83:
84: case opFLOAT :
85: w_op(",2,4);");
86: break;
87:
88: case opSTRING :
89: w_op(",3,0);");
90: break;
91:
92: case opDOUBLE :
93: w_op(",4,8);");
94: break;
95:
96: case opCHAR :
97: w_op(",5,1);");
98: break;
99:
100: case opLONG : /* also ints, since this is a VAX */
101: w_op(",6,4);");
102: break;
103:
104: case opIDSTRING :
105: w_op(");");
106: break;
107:
108: default :
109: syserr("invalid type %d in w_var",
110: type);
111: }
112: if (savestat)
113: {
114: begin_quote();
115: /* if was In_quote, then will want a space
116: * before next keyword
117: */
118: w_key("");
119: }
120: }
121: /*
122: ** W_KEY -- write out a string needing a blank to
123: ** separate it from other keywords.
124: */
125:
126:
127: w_key(string)
128: char *string;
129: {
130: if (Lastc == KEYCHAR)
131: w_raw(" ");
132: w_raw(string);
133: Lastc = KEYCHAR;
134: }
135: /*
136: ** W_NEW -- write out a string after getting out of
137: ** any pending IIwrite's.
138: */
139:
140: w_new(string)
141: char *string;
142: {
143: end_quote();
144: w_op(string);
145: }
146: /*
147: ** BEGIN_QUOTE -- Issue an IIwrite("
148: */
149:
150:
151: begin_quote()
152: {
153: In_string = 1;
154: In_quote = 1;
155: Fillmode = 1;
156: w_op("IIwrite(\"");
157: }
158: /*
159: ** END_QUOTE -- End any pending IIwrite("
160: */
161:
162:
163: end_quote()
164: {
165: In_string = 0;
166: if (In_quote)
167: w_op("\");");
168: In_quote = 0;
169: }
170: /*
171: ** EQUATE_LINES -- Make subsequent lines be output on the
172: ** same line they were read (lines of C_CODE only).
173: **
174: ** Note: Because of the algorithm used, it is possible that
175: ** the correct line in the output has already been passed,
176: ** in which case equate_lines does nothing.
177: */
178:
179:
180: equate_lines()
181: {
182: Fillmode = 0;
183: while (Lineout < yyline)
184: w_raw("\n");
185: Lastc = OPCHAR;
186: }
187: /*
188: ** W_SYNC -- Put out an IIsync() call
189: */
190:
191:
192: w_sync()
193: {
194: w_new("IIsync(");
195: w_file();
196: w_op(");");
197: }
198: /*
199: ** W_FLUSH -- Put out an IIflush_tup() call
200: */
201:
202:
203: w_flush()
204: {
205: w_new("IIflushtup(");
206: w_file();
207: w_op(");");
208: }
209: /*
210: ** W_FILE -- Writes out the name and line number of the
211: ** input file if Rtdb is specified, else a 0.
212: */
213:
214:
215: w_file()
216: {
217: char itemp [6];
218:
219: if (Rtdb)
220: {
221: w_string(Input_file_name, 0);
222: itoa(yyline, itemp);
223: w_op(",");
224: w_key(itemp);
225: }
226: else
227: w_key("0");
228: }
229: /*
230: ** W_STRING -- Writes out a string
231: **
232: ** String is output as a string constant if type == 0
233: ** otherwise writes out string inside an IIwrite(
234: */
235:
236:
237: w_string(string, type)
238: char *string;
239: int type;
240: {
241: register char *t;
242: register char *s;
243:
244: if (type)
245: {
246: if (!In_quote)
247: begin_quote();
248: w_raw("\\\"");
249: }
250: else
251: w_raw("\"");
252:
253: s = t = string;
254: In_string += 1;
255: for ( ;*t ; )
256: {
257: if (*t == '\\')
258: {
259:
260: if (t [1] == '\n')
261: {
262: *t = '\0';
263: w_raw(s);
264: s = t = &t [2];
265: w_raw("\\\n");
266: }
267: else
268: {
269: *t++ = '\0';
270: w_raw(s);
271: s = t;
272: /* note that this call must be atomic,
273: * as w_raw would feel free to put newlines
274: * in if not.
275: */
276: if (type)
277: w_raw("\\\\");
278: else
279: w_raw("\\");
280: }
281: }
282: else if (*t == '"')
283: {
284: w_raw("\\\"");
285: s = ++t;
286: }
287: else
288: t++;
289: }
290: w_raw(s);
291: In_string -= 1;
292: if (type)
293: w_raw("\\\"");
294: else
295: w_raw("\"");
296: }
297: /*
298: ** W_RAW -- Lowest level output character routine
299: **
300: ** Outputs string depending on Fillcnt and In_quote
301: ** and In_string and Fillmode.
302: ** When not in Fillmode does straight output.
303: ** When on Fillmode, fills lines to Fillmode.
304: **
305: ** NOTE : w_raw will feel free to output a newline after
306: ** 'string' if the string causes more than Fillcnt
307: ** characters to be output.
308: ** Inside strings (In_string != 0) w_raw will put
309: ** a '\\' before the newline issued.
310: ** When In_quote != 0 when the fillcnt is exceeded,
311: ** the IIwrite( is ended an continued on the next line
312: ** so that the query string won't overflow the C
313: ** pre-processor's line buffer.
314: */
315:
316:
317: w_raw(string)
318: char *string;
319: {
320: register char *s;
321: register charcnt;
322:
323: charcnt = 0;
324: for (s = string; *s; s++)
325: {
326: if (*s != '\n')
327: {
328: putc(*s, Out_file);
329: charcnt++;
330: }
331: else
332: {
333: if (Fillmode == 0 ||
334: Charcnt + charcnt > Fillcnt ||
335: In_string)
336: {
337: putc(*s, Out_file);
338: Lineout++;
339: charcnt = 0;
340: Charcnt = 0;
341: }
342: else
343: {
344: putc(' ', Out_file);
345: charcnt++;
346: }
347: }
348: }
349: if ((Charcnt += charcnt) > Fillcnt && Fillmode == 1)
350: {
351: if (In_string)
352: {
353: if (In_quote)
354: {
355: puts("\");\nIIwrite(\"", Out_file);
356: Charcnt = 9;
357: }
358: else
359: {
360: puts("\\\n", Out_file);
361: Charcnt = 0;
362: }
363: }
364: else
365: {
366: putc('\n', Out_file);
367: Charcnt = 0;
368: }
369: Lineout++;
370: }
371: }
372: /*
373: ** PUTS -- put a string on an output file using putc()
374: */
375:
376: puts(s, file)
377: char *s;
378: FILE *file;
379: {
380: register char *sp;
381: register FILE *f;
382:
383: f = file;
384: for (sp = s; *sp; )
385: putc(*sp++, f);
386: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.