Annotation of coherent/g/usr/lib/ncurses/comp_scan.c, revision 1.1.1.1

1.1       root        1: /*********************************************************************
                      2: *                         COPYRIGHT NOTICE                           *
                      3: **********************************************************************
                      4: *        This software is copyright (C) 1982 by Pavel Curtis         *
                      5: *                                                                    *
                      6: *        Permission is granted to reproduce and distribute           *
                      7: *        this file by any means so long as no fee is charged         *
                      8: *        above a nominal handling fee and so long as this            *
                      9: *        notice is always included in the copies.                    *
                     10: *                                                                    *
                     11: *        Other rights are reserved except as explicitly granted      *
                     12: *        by written permission of the author.                        *
                     13: *                Pavel Curtis                                        *
                     14: *                Computer Science Dept.                              *
                     15: *                405 Upson Hall                                      *
                     16: *                Cornell University                                  *
                     17: *                Ithaca, NY 14853                                    *
                     18: *                                                                    *
                     19: *                Ph- (607) 256-4934                                  *
                     20: *                                                                    *
                     21: *                Pavel.Cornell@Udel-Relay   (ARPAnet)                *
                     22: *                decvax!cornell!pavel       (UUCPnet)                *
                     23: *********************************************************************/
                     24: 
                     25: /*
                     26:  *     comp_scan.c --- Lexical scanner for terminfo compiler.
                     27:  *
                     28:  *   $Log:     comp_scan.c,v $
                     29:  * Revision 1.8  93/04/12  14:13:10  bin
                     30:  * Udo: third color update
                     31:  * 
                     32:  * Revision 1.2  92/04/13  14:36:34  bin
                     33:  * update by vlad
                     34:  * 
                     35:  * Revision 2.1  82/10/25  14:45:55  pavel
                     36:  * Added Copyright Notice
                     37:  * 
                     38:  * Revision 2.0  82/10/24  15:17:12  pavel
                     39:  * Beta-one Test Release
                     40:  * 
                     41:  * Revision 1.3  82/08/23  22:30:03  pavel
                     42:  * The REAL Alpha-one Release Version
                     43:  * 
                     44:  * Revision 1.2  82/08/19  19:10:06  pavel
                     45:  * Alpha Test Release One
                     46:  * 
                     47:  * Revision 1.1  82/08/12  18:37:46  pavel
                     48:  * Initial revision
                     49:  * 
                     50:  *
                     51:  */
                     52: 
                     53: #ifdef RCSHDR
                     54: static char RCSid[] =
                     55:        "$Header: /src386/usr/lib/ncurses/RCS/comp_scan.c,v 1.8 93/04/12 14:13:10 bin Exp Locker: bin $";
                     56: #endif
                     57: 
                     58: #include <stdio.h>
                     59: #include <ctype.h>
                     60: #include "compiler.h"
                     61: 
                     62: #define iswhite(ch)    (ch == ' '  ||  ch == '\t')
                     63: 
                     64: static int     first_column;           /* See 'next_char()' below */
                     65: 
                     66: 
                     67: /*
                     68:  *     int
                     69:  *     get_token()
                     70:  *
                     71:  *     Scans the input for the next token, storing the specifics in the
                     72:  *     global structure 'curr_token' and returning one of the following:
                     73:  *
                     74:  *             NAMES           A line beginning in column 1.  'name'
                     75:  *                             will be set to point to everything up to
                     76:  *                             but not including the first comma on the line.
                     77:  *             BOOLEAN         An entry consisting of a name followed by
                     78:  *                             a comma.  'name' will be set to point to the
                     79:  *                             name of the capability.
                     80:  *             NUMBER          An entry of the form
                     81:  *                                     name#digits,
                     82:  *                             'name' will be set to point to the capability
                     83:  *                             name and 'valnumber' to the number given.
                     84:  *             STRING          An entry of the form
                     85:  *                                     name=characters,
                     86:  *                             'name' is set to the capability name and
                     87:  *                             'valstring' to the string of characters, with
                     88:  *                             input translations done.
                     89:  *             CANCEL          An entry of the form
                     90:  *                                     name@,
                     91:  *                             'name' is set to the capability name and
                     92:  *                             'valnumber' to -1.
                     93:  *             EOF             The end of the file has been reached.
                     94:  *
                     95:  */
                     96: 
                     97: int
                     98: get_token()
                     99: {
                    100:        long            number;
                    101:        int             type;
                    102:        register int    ch;
                    103:        static char     buffer[1024];
                    104:        register char   *ptr;
                    105:        int             dot_flag = FALSE;
                    106: 
                    107:        while ((ch = next_char()) == '\n'  ||  iswhite(ch))
                    108:            ;
                    109:        
                    110:        if (ch == EOF)
                    111:            type = EOF;
                    112:        else
                    113:        {
                    114:            if (ch == '.')
                    115:            {
                    116:                dot_flag = TRUE;
                    117: 
                    118:                while ((ch = next_char()) == ' '  ||  ch == '\t')
                    119:                    ;
                    120:            }
                    121: 
                    122:            if (! isalnum(ch))
                    123:            {
                    124:                 warning("Illegal character - '%c'", ch);
                    125:                 panic_mode(',');
                    126:            }
                    127: 
                    128:            ptr = buffer;
                    129:            *(ptr++) = ch;
                    130: 
                    131:            if (first_column)
                    132:            {
                    133:                while ((ch = next_char()) != ',' && ch != '\n' && ch != EOF)
                    134:                    *(ptr++) = ch;
                    135:                
                    136:                if (ch == EOF)
                    137:                    err_abort("Premature EOF");
                    138:                else if (ch == '\n') {
                    139:                    warning("Newline in middle of terminal name");
                    140:                    panic_mode(',');
                    141:                }
                    142:                
                    143:                *ptr = '\0';
                    144:                curr_token.tk_name = buffer;
                    145:                type = NAMES;
                    146:            }
                    147:            else
                    148:            {
                    149:                ch = next_char();
                    150:                while (isalnum(ch))
                    151:                {
                    152:                    *(ptr++) = ch;
                    153:                    ch = next_char();
                    154:                }
                    155: 
                    156:                *ptr++ = '\0';
                    157:                switch (ch)
                    158:                {
                    159:                    case ',':
                    160:                        curr_token.tk_name = buffer;
                    161:                        type = BOOLEAN;
                    162:                        break;
                    163: 
                    164:                    case '@':
                    165:                        if (next_char() != ',')
                    166:                            warning("Missing comma");
                    167:                        curr_token.tk_name = buffer;
                    168:                        type = CANCEL;
                    169:                        break;
                    170: 
                    171:                    case '#':
                    172:                        number = 0;
                    173:                        while (isdigit(ch = next_char()))
                    174:                            number = number * 10 + ch - '0';
                    175:                        if (ch != ',')
                    176:                            warning("Missing comma");
                    177:                        curr_token.tk_name = buffer;
                    178:                        curr_token.tk_valnumber = number;
                    179:                        type = NUMBER;
                    180:                        break;
                    181:                    
                    182:                    case '=':
                    183:                        ch = trans_string(ptr);
                    184:                        if (ch != ',')
                    185:                            warning("Missing comma");
                    186:                        curr_token.tk_name = buffer;
                    187:                        curr_token.tk_valstring = ptr;
                    188:                        type = STRING;
                    189:                        break;
                    190: 
                    191:                    default:
                    192:                        warning("Illegal character - '%c'", ch);
                    193:                }
                    194:            } /* end else (first_column == FALSE) */
                    195:        } /* end else (ch != EOF) */
                    196: 
                    197:        if (dot_flag == TRUE)
                    198:            DEBUG(8, "Commented out ", "");
                    199: 
                    200:        if (debug_level >= 8)
                    201:        {
                    202:            fprintf(stderr, "Token: ");
                    203:            switch (type)
                    204:            {
                    205:                case BOOLEAN:
                    206:                    fprintf(stderr, "Boolean;  name='%s'\n",
                    207:                                                           curr_token.tk_name);
                    208:                    break;
                    209:                
                    210:                case NUMBER:
                    211:                    fprintf(stderr, "Number; name='%s', value=%d\n",
                    212:                                curr_token.tk_name, curr_token.tk_valnumber);
                    213:                    break;
                    214:                
                    215:                case STRING:
                    216:                    fprintf(stderr, "String; name='%s', value='%s'\n",
                    217:                                curr_token.tk_name, curr_token.tk_valstring);
                    218:                    break;
                    219:                
                    220:                case CANCEL:
                    221:                    fprintf(stderr, "Cancel; name='%s'\n",
                    222:                                                           curr_token.tk_name);
                    223:                    break;
                    224:                
                    225:                case NAMES:
                    226: 
                    227:                    fprintf(stderr, "Names; value='%s'\n",
                    228:                                                           curr_token.tk_name);
                    229:                    break;
                    230: 
                    231:                case EOF:
                    232:                    fprintf(stderr, "End of file\n");
                    233:                    break;
                    234: 
                    235:                default:
                    236:                    warning("Bad token type");
                    237:            }
                    238:        }
                    239: 
                    240:        if (dot_flag == TRUE)           /* if commented out, use the next one */
                    241:            type = get_token();
                    242: 
                    243:        return(type);
                    244: }
                    245: 
                    246: 
                    247: /*
                    248:  *     next_char()
                    249:  *
                    250:  *     Returns the next character in the input stream.  Comments and leading
                    251:  *     white space are stripped.  The global state variable 'firstcolumn' is
                    252:  *     set TRUE if the character returned is from the first column of the input
                    253:  *     line.  The global variable curr_line is incremented for each new line.
                    254:  *     The global variable curr_file_pos is set to the file offset of the
                    255:  *     beginning of each line.
                    256:  *
                    257:  */
                    258: 
                    259: int    curr_column = -1;
                    260: char   line[1024];
                    261: 
                    262: next_char()
                    263: {
                    264:        char    *rtn_value;
                    265:        long    ftell();
                    266: 
                    267:        if (curr_column < 0  ||  curr_column > 1023  ||
                    268:                                                    line[curr_column] == '\0')
                    269:        {
                    270:            do
                    271:            {
                    272:                curr_file_pos = ftell(stdin);
                    273: 
                    274:                if ((rtn_value = fgets(line, 1024, stdin)) != NULL)
                    275:                    curr_line++;
                    276:            } while (rtn_value != NULL  &&  line[0] == '#');
                    277: 
                    278:            if (rtn_value == NULL)
                    279:                return (EOF);
                    280: 
                    281:            curr_column = 0;
                    282:            while (iswhite(line[curr_column]))
                    283:                curr_column++;
                    284:        }
                    285: 
                    286:        if (curr_column == 0  &&  line[0] != '\n')
                    287:            first_column = TRUE;
                    288:        else
                    289:            first_column = FALSE;
                    290:        
                    291:        return (line[curr_column++]);
                    292: }
                    293: 
                    294: 
                    295: backspace()
                    296: {
                    297:        curr_column--;
                    298: 
                    299:        if (curr_column < 0)
                    300:            syserr_abort("Backspaced off beginning of line");
                    301: }
                    302: 
                    303: 
                    304: /*
                    305:  *     reset_input()
                    306:  *
                    307:  *     Resets the input-reading routines.  Used after a seek has been done.
                    308:  *
                    309:  */
                    310: 
                    311: reset_input()
                    312: {
                    313:        curr_column = -1;
                    314: }
                    315: 
                    316: 
                    317: /*
                    318:  *     trans_string(ptr)
                    319:  *
                    320:  *     Reads characters using next_char() until encountering a comma, newline
                    321:  *     or end-of-file.  The returned value is the character which caused
                    322:  *     reading to stop.  The following translations are done on the input:
                    323:  *
                    324:  *             ^X  goes to  ctrl-X (i.e. X & 037)
                    325:  *             {\E,\n,\r,\b,\t,\f}  go to
                    326:  *                     {ESCAPE,newline,carriage-return,backspace,tab,formfeed}
                    327:  *             {\^,\\}  go to  {carat,backslash}
                    328:  *             \ddd (for ddd = up to three octal digits)  goes to
                    329:  *                                                     the character ddd
                    330:  *
                    331:  *             \e == \E
                    332:  *             \0 == \200
                    333:  *
                    334:  */
                    335: 
                    336: trans_string(ptr)
                    337: char   *ptr;
                    338: {
                    339:        register int    count = 0;
                    340:        int             number;
                    341:        int             i;
                    342:         int            ch;
                    343: 
                    344:        while ((ch = next_char()) != ','  &&  ch != EOF)
                    345:        {
                    346:            if (ch == '^')
                    347:            {
                    348:                ch = next_char();
                    349:                if (ch == EOF)
                    350:                    err_abort("Premature EOF");
                    351: 
                    352:                if (! isprint(ch))
                    353:                {
                    354:                    warning("Illegal ^ character - '%c'", ch);
                    355:                }
                    356: 
                    357:                *(ptr++) = ch & 037;
                    358:            }
                    359:            else if (ch == '\\')
                    360:            {
                    361:                ch = next_char();
                    362:                if (ch == EOF)
                    363:                    err_abort("Premature EOF");
                    364:                
                    365:                if (ch >= '0'  &&  ch <= '7')
                    366:                {
                    367:                    number = ch - '0';
                    368:                    for (i=0; i < 2; i++)
                    369:                    {
                    370:                        ch = next_char();
                    371:                        if (ch == EOF)
                    372:                            err_abort("Premature EOF");
                    373:                        
                    374:                        if (ch < '0'  ||  ch > '7')
                    375:                        {
                    376:                            backspace();
                    377:                            break;
                    378:                        }
                    379: 
                    380:                        number = number * 8 + ch - '0';
                    381:                    }
                    382: 
                    383:                    if (number == 0)
                    384:                        number = 0200;
                    385:                    *(ptr++) = (char) number;
                    386:                }
                    387:                else
                    388:                {
                    389:                    switch (ch)
                    390:                    {
                    391:                        case 'E':
                    392:                        case 'e':       *(ptr++) = '\033';      break;
                    393:                        
                    394:                        case 'l':
                    395:                        case 'n':       *(ptr++) = '\n';        break;
                    396:                        
                    397:                        case 'r':       *(ptr++) = '\r';        break;
                    398: 
                    399:                        case 'b':       *(ptr++) = '\b';        break;
                    400: 
                    401:                        case 's':       *(ptr++) = ' ';         break;
                    402:                        
                    403:                        case 'f':       *(ptr++) = '\014';      break;
                    404:                        
                    405:                        case 't':       *(ptr++) = '\t';        break;
                    406:                        
                    407:                        case '\\':      *(ptr++) = '\\';        break;
                    408:                        
                    409:                        case '^':       *(ptr++) = '^';         break;
                    410: 
                    411:                        case ',':       *(ptr++) = ',';         break;
                    412: 
                    413:                        case ':':       *(ptr++) = ':';         break;
                    414: 
                    415:                        default:
                    416:                            warning("Illegal character in \\ sequence");
                    417:                            *(ptr++) = ch;
                    418:                    } /* endswitch (ch) */
                    419:                } /* endelse (ch < '0' ||  ch > '7') */
                    420:            } /* end else if (ch == '\\') */
                    421:            else
                    422:            {
                    423:                *(ptr++) = ch;
                    424:            }
                    425:            
                    426:            count ++;
                    427: 
                    428:            if (count > 500)
                    429:                warning("Very long string found.  Missing comma?");
                    430:        } /* end while */
                    431: 
                    432:        *ptr = '\0';
                    433: 
                    434:        return(ch);
                    435: }
                    436: 
                    437: 
                    438: /*
                    439:  * Panic mode error recovery - skip everything until a "ch" is found.
                    440:  */
                    441: 
                    442: panic_mode(ch)
                    443: char ch;
                    444: {
                    445:        int c;
                    446: 
                    447:        for (;;) {
                    448:                c = next_char();
                    449:                if (c == ch)
                    450:                        return;
                    451:                if (c == EOF);
                    452:                        return;
                    453:        }
                    454: }

unix.superglobalmegacorp.com

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