Annotation of embedaddon/ntp/ntpd/ntp_scanner.h, revision 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>