Annotation of coherent/b/STREAMS/conf/bin/src/lex.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Simple ad-hoc lexer.
                      3:  */
                      4: 
                      5: /*
                      6:  *-IMPORTS:
                      7:  *     <sys/compat.h>
                      8:  *             USE_PROTO
                      9:  *             ARGS ()
                     10:  *     <string.h>
                     11:  *             strchr ()
                     12:  */
                     13: 
                     14: #include <sys/compat.h>
                     15: #include <string.h>
                     16: 
                     17: #include "ehand.h"
                     18: 
                     19: #include "lex.h"
                     20: 
                     21: 
                     22: CONST char     LEX_WILD [1];           /* special wildcard value */
                     23: 
                     24: lex_t  WHITESPACE [] = {
                     25:        { NULL, STD_FLUSH, STD_SEP, LEX_WILD, NULL }
                     26: };
                     27: 
                     28: 
                     29: /*
                     30:  * Here the code that uses the "lex_t" structure to classify a character has
                     31:  * been factored out.
                     32:  */
                     33: 
                     34: #if    USE_PROTO
                     35: int (classify) (lex_t * lexp, int ch, int flush)
                     36: #else
                     37: int
                     38: classify ARGS ((lexp, ch, flush))
                     39: lex_t        * lexp;
                     40: int            ch;
                     41: int            flush;
                     42: #endif
                     43: {
                     44:        int             valid = 0;
                     45:        int             invalid = 0;
                     46:        CONST lex_t   * scan = lexp;
                     47: 
                     48:        if (ch < 0)
                     49:                throw_error ("Bad character passed to classify ()");
                     50: 
                     51:        do {
                     52:                /*
                     53:                 * Classify the new character.
                     54:                 */
                     55: 
                     56:                if (flush && scan->l_flush != NULL &&
                     57:                    strchr (scan->l_flush, ch) != 0)
                     58:                        return CLASS_FLUSH;
                     59: 
                     60:                if (scan->l_sep != NULL && strchr (scan->l_sep, ch) != 0)
                     61:                        return CLASS_SEP;
                     62: 
                     63:                if (scan->l_valid == LEX_WILD ||
                     64:                                (scan->l_valid != NULL &&
                     65:                                 strchr (scan->l_valid, ch) != NULL))
                     66:                        valid = 1;
                     67: 
                     68:                if (scan->l_error == LEX_WILD)
                     69:                        invalid = 1;
                     70:                else if (! valid && scan->l_error != NULL &&
                     71:                                 strchr (scan->l_error, ch) != NULL) {
                     72: 
                     73:                        invalid = 1;
                     74:                        break;
                     75:                }
                     76:        } while ((scan = scan->l_prev) != NULL);
                     77: 
                     78: 
                     79:        if (! valid) {
                     80: 
                     81:                if (invalid)
                     82:                        throw_error ("invalid character value 0x%x\n", ch);
                     83: 
                     84:                throw_error ("unexpected character value 0x%x\n", ch);
                     85:        }
                     86: 
                     87:        return CLASS_VALID;
                     88: }
                     89: 

unix.superglobalmegacorp.com

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