Annotation of embedaddon/ntp/ntpd/ntp_scanner.h, revision 1.1.1.1

1.1       misho       1: /* ntp_scanner.h
                      2:  *
                      3:  * The header file for a simple lexical analyzer. 
                      4:  *
                      5:  * Written By: Sachin Kamboj
                      6:  *             University of Delaware
                      7:  *             Newark, DE 19711
                      8:  * Copyright (c) 2006
                      9:  */
                     10: 
                     11: #ifndef NTP_SCANNER_H
                     12: #define NTP_SCANNER_H
                     13: 
                     14: /*
                     15:  * ntp.conf syntax is slightly irregular in that some tokens such as
                     16:  * hostnames do not require quoting even if they might otherwise be
                     17:  * recognized as T_ terminal tokens.  This hand-crafted lexical scanner
                     18:  * uses a "followed by" value associated with each keyword to indicate
                     19:  * normal scanning of the next token, forced scanning of the next token
                     20:  * alone as a T_String, or forced scanning of all tokens to the end of
                     21:  * the command as T_String.
                     22:  * In the past the identifiers for this functionality ended in _ARG:
                     23:  *
                     24:  * NO_ARG      ->      FOLLBY_TOKEN
                     25:  * SINGLE_ARG  ->      FOLLBY_STRING
                     26:  * MULTIPLE_ARG        ->      FOLLBY_STRINGS_TO_EOC
                     27:  *
                     28:  * Note that some tokens use FOLLBY_TOKEN even though they sometimes
                     29:  * are followed by strings.  FOLLBY_STRING is used only when needed to
                     30:  * avoid the keyword scanner matching a token where a string is needed.
                     31:  *
                     32:  * FOLLBY_NON_ACCEPT is an overloading of this field to distinguish
                     33:  * non-accepting states (where the state number does not match a T_
                     34:  * value).
                     35:  */
                     36: typedef enum {
                     37:        FOLLBY_TOKEN = 0,
                     38:        FOLLBY_STRING,
                     39:        FOLLBY_STRINGS_TO_EOC,
                     40:        FOLLBY_NON_ACCEPTING
                     41: } follby;
                     42: 
                     43: #define MAXLINE                1024    /* maximum length of line */
                     44: #define MAXINCLUDELEVEL        5       /* maximum include file levels */
                     45: 
                     46: /* STRUCTURES
                     47:  * ----------
                     48:  */
                     49: 
                     50: /* 
                     51:  * Define a structure to hold the FSA for the keywords.
                     52:  * The structure is actually a trie.
                     53:  *
                     54:  * To save space, a single u_int32 encodes four fields, and a fifth
                     55:  * (the token completed for terminal states) is implied by the index of
                     56:  * the rule within the scan state array, taking advantage of the fact
                     57:  * there are more scan states than the highest T_ token number.
                     58:  *
                     59:  * The lowest 8 bits hold the character the state matches on.
                     60:  * Bits 8 and 9 hold the followedby value (0 - 3).  For non-accepting
                     61:  *   states (which do not match a completed token) the followedby
                     62:  *   value 3 (FOLLBY_NONACCEPTING) denotes that fact.  For accepting
                     63:  *   states, values 0 - 2 control whether the scanner forces the
                     64:  *   following token(s) to strings.
                     65:  * Bits 10 through 20 hold the next state to check not matching
                     66:  * this state's character.
                     67:  * Bits 21 through 31 hold the next state to check matching the char.
                     68:  */
                     69: 
                     70: #define S_ST(ch, fb, match_n, other_n) (                       \
                     71:        (u_char)((ch) & 0xff) |                                 \
                     72:        ((u_int32)(fb) << 8) |                                  \
                     73:        ((u_int32)(match_n) << 10) |                            \
                     74:        ((u_int32)(other_n) << 21)                              \
                     75: )
                     76: 
                     77: #define SS_CH(ss)      ((char)(u_char)((ss) & 0xff))
                     78: #define SS_FB(ss)      (((u_int)(ss) >>  8) & 0x3)
                     79: #define SS_MATCH_N(ss) (((u_int)(ss) >> 10) & 0x7ff)
                     80: #define SS_OTHER_N(ss) (((u_int)(ss) >> 21) & 0x7ff)
                     81: 
                     82: typedef u_int32 scan_state;
                     83: 
                     84: 
                     85: /* Structure to hold a filename, file pointer and positional info */
                     86: struct FILE_INFO {
                     87:        const char *    fname;                  /* Path to the file */
                     88:        FILE *          fd;                     /* File Descriptor */
                     89:        int             line_no;                /* Line Number */
                     90:        int             col_no;                 /* Column Number */
                     91:        int             prev_line_col_no;       /* Col No on the 
                     92:                                                   previous line when a
                     93:                                                   '\n' was seen */
                     94:        int             prev_token_line_no;     /* Line at start of
                     95:                                                   token */
                     96:        int             prev_token_col_no;      /* Col No at start of
                     97:                                                   token */
                     98:        int             err_line_no;
                     99:        int             err_col_no;
                    100: };
                    101: 
                    102: 
                    103: /* SCANNER GLOBAL VARIABLES 
                    104:  * ------------------------
                    105:  */
                    106: extern struct config_tree cfgt;          /* Parser output stored here */
                    107: extern int curr_include_level;    /* The current include level */
                    108: 
                    109: extern struct FILE_INFO *ip_file; /* Pointer to the configuration file stream */
                    110: 
                    111: /* VARIOUS EXTERNAL DECLARATIONS
                    112:  * -----------------------------
                    113:  */
                    114: extern int old_config_style;
                    115: extern int input_from_file;
                    116: extern struct FILE_INFO *fp[];
                    117: 
                    118: /* VARIOUS SUBROUTINE DECLARATIONS
                    119:  * -------------------------------
                    120:  */
                    121: extern const char *keyword(int token);
                    122: extern char *quote_if_needed(char *str);
                    123: int yylex(void);
                    124: 
                    125: struct FILE_INFO *F_OPEN(const char *path, const char *mode);
                    126: int FGETC(struct FILE_INFO *stream);
                    127: int UNGETC(int ch, struct FILE_INFO *stream);
                    128: int FCLOSE(struct FILE_INFO *stream);
                    129: 
                    130: void push_back_char(int ch);
                    131: 
                    132: #endif /* NTP_SCANNER_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>