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

1.1       root        1: # include      <stdio.h>
                      2: # include      "constants.h"
                      3: # include      "globals.h"
                      4: # include      <setjmp.h>
                      5: # include      <sccs.h>
                      6: 
                      7: SCCSID(@(#)display.c   8.1     12/31/84)
                      8: 
                      9: /*
                     10: **  DISPLAY.C -- display manipulation routines
                     11: **
                     12: **     a display is a list of strings, the symbol
                     13: **     space Symsp is impemented by means of displays.
                     14: **
                     15: **     Required By:
                     16: **             Lexical analysis routines to add to the symbol space
                     17: **             semantic productions to manipulate input
                     18: */
                     19: 
                     20: 
                     21: 
                     22: 
                     23:        /* this avoids having to specify &Cv_display in the semantic
                     24:         * routines, by making Cv_display a pointer to the pertinent
                     25:         * display structure.
                     26:         */
                     27: struct display *Cv_display     = &Displays [0];
                     28: 
                     29: /*
                     30: **  ENTER_DISPLAY -- enter a new string into a display
                     31: **
                     32: **     Parameters:
                     33: **             disp -- display to be added to
                     34: **             string -- string to add
                     35: **
                     36: **     Returns:
                     37: **             pointer to new disp_node structure.
                     38: **
                     39: **     Side Effects:
                     40: **             allocates a new disp_node structispl
                     41: **             Expects a dynamic "string", i.e. one that it can 
                     42: **             dispose of as it wishes, so it is the users responsability
                     43: **             to allocate space for this string.
                     44: **             If the string passed is 0, the string
                     45: **             "ERROR_TOKEN" is substituted, and a message is printed,
                     46: **             so a caller may call enter_display with the return of an
                     47: **             salloc() directly.
                     48: **             If no space is available for the allocation of the
                     49: **             new node, an error message is given, and a reset(III)
                     50: **             is performed (this should goto equel()[main.c])
                     51: **
                     52: **     Called By:
                     53: **             add_sym() -- to add a token to the Symsp
                     54: **             the semantic productions -- for manipulating usages
                     55: **                     of C variables.
                     56: */
                     57: 
                     58: 
                     59: struct disp_node *enter_display(disp, string)
                     60: struct display *disp;
                     61: char           *string;
                     62: {
                     63:        register struct display         *d;
                     64:        register struct disp_node       *node;
                     65:        extern  jmp_buf                 Jmpbuf;
                     66: 
                     67:        node = (struct disp_node *)nalloc(sizeof *node);
                     68:        if (node == 0)
                     69:        {
                     70:                yysemerr("symbol space overflow", string);
                     71:                longjmp(Jmpbuf,1);
                     72:        }
                     73:        d = disp;
                     74:        if (!d->disp_first)
                     75:                d->disp_first = d->disp_last = node;
                     76:        else
                     77:        {
                     78:                d->disp_last->d_next = node;
                     79:                d->disp_last = node;
                     80:        }
                     81:        node->d_next = 0;
                     82:        if (!(node->d_elm = string))
                     83:        {
                     84:                yysemerr("alloc error in display", 0);
                     85:                node->d_elm = "ERROR_TOKEN";
                     86:        }
                     87:        return (node);
                     88: }
                     89: 
                     90: /*
                     91: **  ADDSYM -- add a token to the symbol space
                     92: **
                     93: **     The node's .d_line field is set to the value of yyline,
                     94: **     which, if this routine is called from a lexical routine
                     95: **     taking lexemes that can't include newlines (and back them up),
                     96: **     is the line the lexeme was read from. This fact is used
                     97: **     be yyserror() [yyerror.c] to report accurate line numbers
                     98: **     for errors.
                     99: **
                    100: **     Parameters:
                    101: **             s -- string to add
                    102: **
                    103: **     Returns:
                    104: **             pointer to node added
                    105: */
                    106: 
                    107: 
                    108: 
                    109: struct disp_node *addsym(s)
                    110: char           *s;
                    111: {
                    112:        register struct disp_node       *d;
                    113: 
                    114:        d = enter_display(&Symsp, s);
                    115:        d->d_line = yyline;
                    116:        return (d);
                    117: }
                    118: 
                    119: /*
                    120: **  FREE_DISPLAY -- frees all elements of a display
                    121: **
                    122: **     Parameters:
                    123: **             disp -- the display to free
                    124: */
                    125: 
                    126: 
                    127: 
                    128: 
                    129: 
                    130: free_display(disp)
                    131: struct display *disp;
                    132: {
                    133:        register struct display         *d;
                    134:        register struct disp_node       *f, *n;
                    135: 
                    136:        d = disp;
                    137:        for (f = d->disp_first; f; f = n)
                    138:        {
                    139:                n = f->d_next;
                    140:                xfree(f->d_elm);
                    141:                xfree(f);
                    142:        }
                    143:        d->disp_first = d->disp_last = 0;
                    144: }
                    145: 
                    146: /*
                    147: **  SYSMSPFREE -- Frees symbol space
                    148: **     Symspfree frees all the symbol table, EXCEPT
                    149: **     for the last element in it, as this is the lookahead
                    150: **     element. That is to say, the element which forced reduction
                    151: **     to the non-terminal program, which called on symspfree()
                    152: **
                    153: **     Requires:
                    154: **             Symsp -- to free it
                    155: **
                    156: **     Called By:
                    157: **             argproc()
                    158: **             semantic routines (nonterminal "program")
                    159: */
                    160: 
                    161: 
                    162: 
                    163: symspfree()
                    164: {
                    165:        register struct display         *d;
                    166:        register struct disp_node       *f, *n;
                    167: 
                    168:        d = &Symsp;
                    169:        for (f = d->disp_first; f && f->d_next; f = n)
                    170:        {
                    171:                n = f->d_next;
                    172:                xfree(f->d_elm);
                    173:                xfree(f);
                    174:        }
                    175:        d->disp_first = d->disp_last;
                    176: }
                    177: 
                    178: /*
                    179: **  W_DISPLAY -- write out the contents of a display
                    180: **
                    181: **     Parameters:
                    182: **             disp -- display to take write out
                    183: **
                    184: **     Side Effects:
                    185: **             Writes onto Out_file
                    186: **             the contents of the display,
                    187: **             each string is comsidered a separate
                    188: **             word to be written out(so w_raw may
                    189: **             break a line between words).
                    190: **             Calls are made to w_op() and w_key() so as 
                    191: **             to have the minimum number of spaces in the text.
                    192: **
                    193: **     Requires:
                    194: **             w_op() -- to write out operator terminated
                    195: **                     strings
                    196: **             w_key() -- to write out KEYCHAR terminated 
                    197: **                     strings
                    198: **
                    199: **     Called By:
                    200: **             semantic productions dealing with usage of
                    201: **             C variables.
                    202: */
                    203: 
                    204: 
                    205: 
                    206: w_display(disp)
                    207: struct display         *disp;
                    208: {
                    209:        register struct disp_node       *n;
                    210: 
                    211:        for (n = disp->disp_first; n; n = n->d_next)
                    212:        {
                    213:                switch (Cmap [n->d_elm [length(n->d_elm) - 1]])
                    214:                {
                    215: 
                    216:                  case OPATR :
                    217:                  case PUNCT :
                    218:                        w_op(n->d_elm);
                    219:                        break;
                    220: 
                    221:                  default :
                    222:                        w_key(n->d_elm);
                    223:                        break;
                    224:                }
                    225:        }
                    226: }
                    227: /*
                    228: **  EAT_DISPLAY -- enter text from In_file into a display
                    229: **     Enters all text gotten through getch() [getch.c]
                    230: **     lying between one character delimiters, which may
                    231: **     be nested, into a display or w_op()'s it.
                    232: **     eat_display() assumes that when it is called a 
                    233: **     "left_ch" has just been seen. It will "eat" up to 
                    234: **     MAXSTRING characters.
                    235: **     Newline is played with because :
                    236: **             a) a newline may have been read by eat_display
                    237: **                instead of yylex(), therefore if eat_display
                    238: **                stops there, yylex() must know that a newline
                    239: **                has just been seen and it must test for C_CODE.
                    240: **             b) Newline may have to be set to 0 if an include()
                    241: **                was done which sets it to 1, and no yylex() was
                    242: **                done afterwards to reset it.
                    243: **
                    244: **             NOTE : This playing with Newline is needed because 
                    245: **             yylex() and not getch() maintains Newline. If getch()
                    246: **             maintained Newline then it would be automatically right.
                    247: **
                    248: **     Parameters:
                    249: **             disp -- display to add elements to if != 0 else
                    250: **                     characters are written out.
                    251: **             left_ch -- left delimiter character
                    252: **             right_ch -- right delimiter character
                    253: **
                    254: **     Side Effects:
                    255: **             advances input to after the close of the
                    256: **             left_ch, right_ch pair.
                    257: **             may back up 2 characters.
                    258: **
                    259: **     Called By:
                    260: **             semantic routines dealing with array subscription
                    261: **
                    262: **     Bugs:
                    263: **             #include's encountered, are treated wrongly
                    264: **             because the "#include ...c.h" is put out immediately,
                    265: **             while the display is put out only later.
                    266: */
                    267: 
                    268: 
                    269: eat_display(disp, left_ch, right_ch)
                    270: struct display *disp;
                    271: char           left_ch;
                    272: char           right_ch;
                    273: {
                    274:        char            buf [MAXSTRING + 1];
                    275:        register char   *cp;
                    276:        register        level;
                    277:        register        i;
                    278:        char            pk;
                    279:        char            r_c [2];
                    280: 
                    281:        cp = buf;
                    282:        level = i = 1;
                    283:        *cp = left_ch;
                    284:        do
                    285:        {
                    286:                i++;
                    287:                if (i >= sizeof buf)
                    288:                {
                    289:                        yysemerr("display too long", 0);
                    290:                        break;
                    291:                }
                    292:                if ((*++cp = getch()) == left_ch)
                    293:                        level++;
                    294:                else if (*cp == right_ch)
                    295:                        level -= 1;
                    296:                else if (*cp == EOF_TOK)
                    297:                {
                    298:                        backup(*cp);
                    299: missing :
                    300:                        r_c [1] = '\0';
                    301:                        r_c [0] = right_ch;
                    302:                        yysemerr("missing closing character", r_c);
                    303:                        *cp = right_ch;
                    304:                        /* make next line be read as possible
                    305:                         * C_CODE by yylex() [yylex.c]
                    306:                         */
                    307:                        Newline = 1;
                    308:                        break;
                    309:                }
                    310:                else if (*cp == '\n')
                    311:                {
                    312:                        /* test that next line is valid equel line,
                    313:                         * and strip "##"
                    314:                         */
                    315:                        if ((pk = getch()) != '#')
                    316:                        {
                    317:                                backup(pk);
                    318:                                goto missing;
                    319:                        }
                    320:                        if ((pk = getch()) != '#')
                    321:                        {
                    322:                                backup(pk);
                    323:                                backup('#');
                    324:                                goto missing;
                    325:                        }
                    326:                }
                    327:        }  while (*cp != right_ch || level > 0);
                    328:        if (level == 0)
                    329:                Newline = 0;
                    330:        *++cp = '\0';
                    331:        if (disp)
                    332:                enter_display(disp, salloc(buf));
                    333:        else
                    334:                w_op(buf);
                    335: }

unix.superglobalmegacorp.com

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