⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fparse.y

📁 Solaris操作系统下的过滤驱动程序, C源码程序.
💻 Y
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1997-2003 Erez Zadok * Copyright (c) 2001-2003 Stony Brook University * Copyright (c) 1997-2000 Columbia University * * For specific licensing information, see the COPYING file distributed with * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. * * This Copyright notice must be kept intact and distributed with all * fistgen sources INCLUDING sources generated by fistgen. */%{/* * fparse.y: parser for FiST language * Fistgen sources. * Copyright (c) 1997-2003 Erez Zadok * Copyright (c) 2001-2003 Stony Brook University * Copyright (c) 1997-2000 Columbia University */#ifdef HAVE_CONFIG_H# include <config.h>#endif /* HAVE_CONFIG_H */extern char *yytext;extern int fyylex(void);extern int yylineno;extern void free(void *);static int yyerror(const char *s);static void fyy_echo(const char *s);static void add_func_arg(const char *s);static char *dv, *dn, *da;static char buf[MAX_BUF_LEN], errmsg[MAX_BUF_LEN], fxnbuf[MAX_BUF_LEN];static bdt_t *tmp_bdt = NULL;ecl_t *tmp_ecl = NULL;int num_func_args, parsing_fist_fxn;static char *func_args[MAX_FUNCARGS];#define YYDEBUG 0#define PARSE_DEBUG 0#if PARSE_DEBUG# define dprintf(f,s) fprintf(stderr, (f), yylineno, (s))# define fist_return(v)#else /* not PARSE_DEBUG */# define dprintf(f,s)# define fist_return(v) return((v))#endif /* not PARSE_DEBUG */static int parsedebug;%}%union {char *strtype;int inttype;}%token NEWLINE SEMICOLON COLON%token LEFT_BRACE RIGHT_BRACE%token LEFT_BRACKET RIGHT_BRACKET%token LEFT_PAREN RIGHT_PAREN%token DOUBLE_PCT PCT_LEFT PCT_RIGHT%token <strtype> PCT_KEY DOLLAR_KEY%token <strtype> WORD PCT_ALPHA%token <inttype> NUMBER%token <strtype> CODELINE%token <strtype> MISC%token <strtype> DOLLAR_VNA%token <strtype> DOLLAR_VN DOLLAR_NA DOLLAR_VA%token <strtype> DOLLAR_V DOLLAR_N%token <strtype> FIST_FXN FIST_RULE_DEF FUNCARG%token <strtype> MSOURCE_LIST USOURCE_LIST MHEADER_LIST ADDMK_LIST%start file%%/****************************************************************************/file		: {		   yylineno = 1;#if YYDEBUG != 0		   yydebug = YYDEBUG;#endif /* YYDEBUG != 0 */		   parsedebug = PARSE_DEBUG;		  } sections		;sections	: opt_decls_sect fist_decls_sect fist_rules_sect opt_code_sect		;/****************************************************************************/opt_decls_sect	: PCT_LEFT opt_decls_lines PCT_RIGHT		| PCT_LEFT PCT_RIGHT		| /* can be empty */		;opt_decls_lines	: opt_decls_line		| opt_decls_line opt_decls_lines		;opt_decls_line	: CODELINE		{		  if (parsedebug)		    fprintf(stderr, "opt_decl1 = \"%s\"\n", $1 ? $1 : "null");		  fprintf(out_fp_h, "%s", $1);		}		;/****************************************************************************/fist_decls_sect	: fist_decls		| /* can be empty */		;fist_decls	: fist_decl		| fist_decl fist_decls		;fist_decl	: WORD WORD SEMICOLON		{		  if (parsedebug)		    fprintf(stderr, "WORD+WORD LINE! %s %s\n", $1, $2);		  if (STREQ($1, "accessmode")) {		    if (parsedebug)		      fprintf(stderr, "accessmode +%s\n", $2);		    if (!fist_validate_decl_accessmode($2)) {		      yyerror("unknown FiST accessmode");		      YYABORT;		    }		  } else if (STREQ($1, "debug")) {		    if (parsedebug)		      fprintf(stderr, "debug +%s\n", $2);		    if (!fist_validate_decl_debug($2)) {		      yyerror("unknown FiST debug flag");		      YYABORT;		    }		  } else if (STREQ($1, "dynamic_inode_numbers")) {		    if (parsedebug)		      fprintf(stderr, "dynamic_inode_numbers +%s\n", $2);		    if (!fist_validate_decl_dynamic_inode_numbers($2)) {		      yyerror("unknown FiST dynamic_inode_numbers flag");		      YYABORT;		    }		  } else if (STREQ($1, "encoding_type")) {		    if (parsedebug)		      fprintf(stderr, "encoding_type +%s\n", $2);		    if (!fist_validate_decl_encoding_type($2)) {		      yyerror("unknown FiST encoding_type flag");		      YYABORT;		    }		  } else if (STREQ($1, "errorcode")) {		    if (parsedebug)		      fprintf(stderr, "errorcode +%s\n", $2);		    if (!fist_validate_decl_errorcode($2, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		  } else if (STREQ($1, "filter")) {		    if (parsedebug)		      fprintf(stderr, "filter +%s\n", $2);		    if (!fist_validate_decl_filter($2)) {		      yyerror("unknown FiST filter type");		      YYABORT;		    }		  } else if (STREQ($1, "fsname")) {		    if (parsedebug)		      fprintf(stderr, "fsname +%s\n", $2);		    if (STREQ(fist_globals.fg_fsname, $2))		      strcpy(fist_globals.fg_fsname, $2);		    else {		      yyerror("not allowed to override fsname (taken from the fist file)");		      YYABORT;		    }		  } else if (STREQ($1, "mntflag")) {		    if (parsedebug)		      fprintf(stderr, "mntflag +%s\n", $2);		    if (!fist_validate_decl_mntflag($2, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		  } else if (STREQ($1, "mntstyle")) {		    if (parsedebug)		      fprintf(stderr, "mntstyle +%s\n", $2);		    if (!fist_validate_decl_mntstyle($2)) {		      yyerror("unknown FiST mntstyle flag");		      YYABORT;		    }		  } else {		    yyerror("unknown FiST declaration (word argument)");		    YYABORT;		  }		}		| WORD NUMBER SEMICOLON		{		  if (parsedebug)		    fprintf(stderr, "WORD+NUMBER LINE! %s %d\n", $1, $2);		  if (STREQ($1, "fanout")) {		    if (parsedebug)		      fprintf(stderr, "fanout +%d\n", $2);		    if (!fist_validate_decl_fanout($2)) {		      yyerror("bad FiST fanout value");		      YYABORT;		    }		  } else if (STREQ($1, "encoding_blocksize")) {		    if (parsedebug)		      fprintf(stderr, "encoding_blocksize +%d\n", $2);		    if (!fist_validate_decl_encoding_blocksize($2)) {		      yyerror("bad FiST encoding_blocksize value");		      YYABORT;		    }		  } else {		    yyerror("unknown FiST declaration (numeric argument)");		    YYABORT;		  }		}		| WORD LEFT_BRACE basic_data_types RIGHT_BRACE SEMICOLON		{		  if (parsedebug)		    fprintf(stderr, "WORD BDT line: %s\n", $1);		  if (STREQ($1, "mntdata")) {		    if (parsedebug)		      fprintf(stderr, "mntdata\n");		    if (fist_globals.fg_mntdata) {		      yyerror("already defined mntdata");		      YYABORT;		    }		    fist_globals.fg_mntdata = tmp_bdt;		    tmp_bdt = NULL; /* do not free it */		  } else if (STREQ($1, "pervfs")) {		    if (parsedebug)		      fprintf(stderr, "pervfs\n");		    if (fist_globals.fg_pervfs) {		      yyerror("already defined pervfs");		      YYABORT;		    }		    fist_globals.fg_pervfs = tmp_bdt;		    tmp_bdt = NULL; /* do not free it */		  } else if (STREQ($1, "pervnode")) {		    if (parsedebug)		      fprintf(stderr, "pervnode\n");		    if (fist_globals.fg_pervnode) {		      yyerror("already defined pervnode");		      YYABORT;		    }		    fist_globals.fg_pervnode = tmp_bdt;		    tmp_bdt = NULL; /* do not free it */		  } else {		    yyerror("unknown FiST declaration (word+bdt argument)");		    YYABORT;		  }		}		| WORD WORD LEFT_BRACE basic_data_types RIGHT_BRACE SEMICOLON		{		  if (parsedebug)		    fprintf(stderr, "WORD WORD BDT line: %s\n", $1);		  if (STREQ($1, "fileformat")) {		    if (parsedebug)		      fprintf(stderr, "fileformat +%s\n", $2);		    if (!fist_validate_decl_fileformat($2, tmp_bdt, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		    tmp_bdt = NULL; /* do not free it */		  } else if (STREQ($1, "ioctl")) {		    if (parsedebug)		      fprintf(stderr, "ioctl +%s\n", $2);		    if (!fist_validate_decl_ioctl($2, "both", tmp_bdt, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		    tmp_bdt = NULL; /* do not free it */		  } else {		    yyerror("unknown FiST declaration (word+word+bdt argument)");		    YYABORT;		  }		}		| WORD COLON WORD WORD LEFT_BRACE basic_data_types RIGHT_BRACE SEMICOLON		{		  if (parsedebug)		    fprintf(stderr, "WORD:WORD WORD BDT line: %s\n", $1);		  if (STREQ($1, "ioctl")) {		    if (parsedebug)		      fprintf(stderr, "ioctl:%s +%s\n", $3, $4);		    if (!fist_validate_decl_ioctl($4, $3, tmp_bdt, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		    tmp_bdt = NULL; /* do not free it */		  } else {		    yyerror("unknown FiST declaration (word:word+word+bdt argument)");		    YYABORT;		  }		}		| MSOURCE_LIST SEMICOLON		{		  char *cp;		  if (parsedebug)		    fprintf(stderr, "mod_src: %s\n", $1);		  cp = strtok($1, " \t");		  while (cp) {		    if (!fist_validate_decl_msources(cp, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		    cp = strtok(NULL, " \t");		  }		}		| MHEADER_LIST SEMICOLON		{		  char *cp;		  if (parsedebug)		    fprintf(stderr, "mod_hdr: %s\n", $1);		  cp = strtok($1, " \t");		  while (cp) {		    if (!fist_validate_decl_mheaders(cp, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		    cp = strtok(NULL, " \t");		  }		}		| USOURCE_LIST SEMICOLON		{		  char *cp;		  if (parsedebug)		    fprintf(stderr, "user_src: %s\n", $1);		  cp = strtok($1, " \t");		  while (cp) {		    if (!fist_validate_decl_usources(cp, errmsg)) {		      yyerror(errmsg);		      YYABORT;		    }		    cp = strtok(NULL, " \t");		  }		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -