File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / ntpd / ntp_scanner.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    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>