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>