Annotation of 43BSD/ingres/source/equel/prtout.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.