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

📄 lex_config.l

📁 pcmcia source code
💻 L
字号:
/* Special state for handling include files */%x src%{/* * lex_config.l 1.42 2002/07/02 07:55:27 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License * at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and * limitations under the License.  * * The initial developer of the original code is David A. Hinds * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved. * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License version 2 (the "GPL"), in * which case the provisions of the GPL are applicable instead of the * above.  If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by * deleting the provisions above and replace them with the notice and * other provisions required by the GPL.  If you do not delete the * provisions above, a recipient may use your version of this file * under either the MPL or the GPL. */#undef src#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <syslog.h>#ifdef __GLIBC__#include <wordexp.h>#else#include <glob.h>#endif#define src 1#include <pcmcia/cs_types.h>#include <pcmcia/cs.h>#include "yacc_config.h"/* For assembling nice error messages */char *current_file;int current_lineno;static int lex_number(char *s);static int lex_string(char *s);static void do_source(char *fn);static int do_eof(void);%}int	[0-9]+hex	0x[0-9a-fA-F]+str	\"([^"]|\\.)*\"%%source		BEGIN(src); return SOURCE;<src>[ \t]*	/* skip */ ;<src>[^\n]+	do_source(yytext); BEGIN(INITIAL);<<EOF>>		if (do_eof()) yyterminate();\n		current_lineno++;[ \t]*		/* skip */ ;[ ]*[#;].*	/* skip */ ;anonymous	return ANONYMOUS;bind		return BIND;cis		return CIS;card		return CARD;class		return CLASS;default		return DEFAULT;device		return DEVICE;dtype		return DTYPE;exclude		return EXCLUDE;function	return FUNCTION;include		return INCLUDE;irq		return IRQ_NO;jedec		return JEDEC;manfid		return MANFID;memory		return MEMORY;module		return MODULE;mtd		return MTD;needs_mtd	return NEEDS_MTD;opts		return OPTS;pci		return PCI;port		return PORT;region		return REGION;reserve		return RESERVE;to		return TO;tuple		return TUPLE;version		return VERSION;memory_card	return lex_number("1");serial_port	return lex_number("2");parallel_port	return lex_number("3");fixed_disk	return lex_number("4");video_adapter	return lex_number("5");network_adapter	return lex_number("6");aims_card	return lex_number("7");scsi_adapter	return lex_number("8");{int}		return lex_number(yytext);{hex}		return lex_number(yytext);{str}		return lex_string(yytext);.		return yytext[0];%%#ifndef yywrapint yywrap() { return 1; }#endif/*======================================================================    Stuff to parse basic data types======================================================================*/static int lex_number(char *s){    yylval.num = strtoul(s, NULL, 0);    return NUMBER;}static int lex_string(char *s){    int n = strlen(s);    yylval.str = malloc(n-1);    strncpy(yylval.str, s+1, n-2);    yylval.str[n-2] = '\0';    return STRING;}/*======================================================================    Code to support nesting of configuration files======================================================================*/#define MAX_SOURCE_DEPTH 4struct source_stack {    YY_BUFFER_STATE	buffer;    char		*filename;    int			lineno, fileno;    FILE		*file;#ifdef __GLIBC__    wordexp_t		word;#else    glob_t		glob;#endif} source_stack[MAX_SOURCE_DEPTH];static int source_stack_ptr = 0;static int parse_env = 0;static int get_glob(void){    struct source_stack *s = &source_stack[source_stack_ptr];#ifdef __GLIBC__    while (s->fileno < s->word.we_wordc) {	char *fn = s->word.we_wordv[s->fileno];#else    while (s->fileno < s->glob.gl_pathc) {	char *fn = s->glob.gl_pathv[s->fileno];#endif	s->file = fopen(fn, "r");	if (s->file == NULL) {	    if (strpbrk(fn, "?*[") == NULL)		syslog(LOG_INFO, "could not open '%s': %m", fn);	    s->fileno++;	} else {	    current_lineno = 1;	    current_file = strdup(fn);	    yy_switch_to_buffer(yy_create_buffer(s->file, YY_BUF_SIZE));	    source_stack_ptr++;	    s->fileno++;	    return 0;	}    }    return -1;}static void do_source(char *fn){    struct source_stack *s = &source_stack[source_stack_ptr];    if (source_stack_ptr >= MAX_SOURCE_DEPTH) {	syslog(LOG_INFO, "source depth limit exceeded");	return;    }#ifdef __GLIBC__    wordexp(fn, &s->word, 0);#else    glob(fn, GLOB_NOCHECK, NULL, &s->glob);#endif    s->fileno = 0;    s->buffer = YY_CURRENT_BUFFER;    s->lineno = current_lineno;    s->filename = current_file;    get_glob();}static int do_eof(void){    struct source_stack *s = &source_stack[--source_stack_ptr];    if (source_stack_ptr < 0) {	if (parse_env == 0) {	    char *t = getenv("PCMCIA_OPTS");	    if (t == NULL) return -1;	    parse_env = 1;	    source_stack_ptr = 0;	    current_file = "PCMCIA_OPTS";	    current_lineno = 1;	    yy_scan_string(t);	    return 0;	} else	    return -1;    }    fclose(s->file);    free(current_file);    yy_delete_buffer(YY_CURRENT_BUFFER);    if (get_glob() != 0) {	yy_switch_to_buffer(s->buffer);	current_lineno = s->lineno;	current_file = s->filename;    }    return 0;}/*======================================================================    The main entry point... returns -1 if the file can't be accessed.======================================================================*/int parse_configfile(char *fn){    FILE *f;        f = fopen(fn, "r");    if (!f) {	syslog(LOG_INFO, "could not open '%s': %m", fn);	return -1;    }    current_lineno = 1;    current_file = fn;    source_stack_ptr = 0;    yyrestart(f);    yyparse();    fclose(f);    return 0;}

⌨️ 快捷键说明

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