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