From 6b4c369164e638afcc916a3d6693547a1d5140a8 Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Sun, 29 Oct 2000 18:23:51 +0000 Subject: [PATCH] Generalization work --- Zend/Makefile.am | 6 +- Zend/ZendTS.dsp | 34 ++- Zend/zend_globals.h | 7 +- Zend/zend_ini.h | 5 + Zend/zend_ini_parser.y | 458 +++------------------------------------- Zend/zend_ini_scanner.l | 87 ++++---- 6 files changed, 111 insertions(+), 486 deletions(-) diff --git a/Zend/Makefile.am b/Zend/Makefile.am index ea35704a9f3..9d7af2faa41 100644 --- a/Zend/Makefile.am +++ b/Zend/Makefile.am @@ -42,13 +42,13 @@ zend_language_parser.c: $(srcdir)/zend_language_parser.y # INI parser/scanner rules zend_ini_parser.c: $(srcdir)/zend_ini_parser.y - $(YACC) -p ini -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c + $(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l - $(LEX) -Pini -o$@ -i $(srcdir)/zend_ini_scanner.l + $(LEX) -Pini_ -o$@ -i $(srcdir)/zend_ini_scanner.l zend_ini_scanner_cc.cc: $(srcdir)/zend_ini_scanner.l - $(LEX) -+ -B -i -S$(srcdir)/flex.skl -Pini -o$@ $(srcdir)/zend_ini_scanner.l + $(LEX) -+ -B -i -S$(srcdir)/flex.skl -Pini_ -o$@ $(srcdir)/zend_ini_scanner.l depend: diff --git a/Zend/ZendTS.dsp b/Zend/ZendTS.dsp index ef7c49704c4..6f280803c91 100644 --- a/Zend/ZendTS.dsp +++ b/Zend/ZendTS.dsp @@ -163,6 +163,14 @@ SOURCE=.\zend_ini.c # End Source File # Begin Source File +SOURCE=.\zend_ini_parser.c +# End Source File +# Begin Source File + +SOURCE=.\zend_ini_scanner.cpp +# End Source File +# Begin Source File + SOURCE=".\zend_language_parser.c" # End Source File # Begin Source File @@ -291,6 +299,14 @@ SOURCE=.\zend_ini.h # End Source File # Begin Source File +SOURCE=.\zend_ini_parser.h +# End Source File +# Begin Source File + +SOURCE=.\zend_ini_scanner.h +# End Source File +# Begin Source File + SOURCE=".\zend_language_parser.h" # End Source File # Begin Source File @@ -336,8 +352,8 @@ InputDir=. InputPath=.\zend_ini_parser.y BuildCmds= \ - if not "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "%CYGWIN%\share\bison.simple" -p zend_ini zend_ini_parser.y \ - if "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend_ini zend_ini_parser.y \ + if not "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "%CYGWIN%\share\bison.simple" -p ini_ zend_ini_parser.y \ + if "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p ini_ zend_ini_parser.y \ "$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -354,8 +370,8 @@ InputDir=. InputPath=.\zend_ini_parser.y BuildCmds= \ - if not "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "%CYGWIN%\share\bison.simple" -p zend_ini zend_ini_parser.y \ - if "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend_ini zend_ini_parser.y \ + if not "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "%CYGWIN%\share\bison.simple" -p ini_ zend_ini_parser.y \ + if "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p ini_ zend_ini_parser.y \ "$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -372,8 +388,8 @@ InputDir=. InputPath=.\zend_ini_parser.y BuildCmds= \ - if not "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "%CYGWIN%\share\bison.simple" -p zend_ini zend_ini_parser.y \ - if "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend_ini zend_ini_parser.y \ + if not "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "%CYGWIN%\share\bison.simple" -p ini_ zend_ini_parser.y \ + if "X%CYGWIN%"=="X" bison --output=zend_ini_parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p ini_ zend_ini_parser.y \ "$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -461,7 +477,7 @@ SOURCE=.\zend_ini_scanner.l InputPath=.\zend_ini_scanner.l "zend_ini_scanner.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -+ -B -i -Sflex.skl -Pzend_ini -ozend_ini_scanner.cpp zend_ini_scanner.l + flex -+ -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.cpp zend_ini_scanner.l # End Custom Build @@ -471,7 +487,7 @@ InputPath=.\zend_ini_scanner.l InputPath=.\zend_ini_scanner.l "zend_ini_scanner.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -+ -B -i -Sflex.skl -Pzend_ini -ozend_ini_scanner.cpp zend_ini_scanner.l + flex -+ -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.cpp zend_ini_scanner.l # End Custom Build @@ -481,7 +497,7 @@ InputPath=.\zend_ini_scanner.l InputPath=.\zend_ini_scanner.l "zend_ini_scanner.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -+ -B -i -Sflex.skl -Pzend_ini -ozend_ini_scanner.cpp zend_ini_scanner.l + flex -+ -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.cpp zend_ini_scanner.l # End Custom Build diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 7855ce6545f..283d026ba19 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -40,6 +40,7 @@ #ifdef __cplusplus class ZendFlexLexer; +class ZendIniFlexLexer; #endif BEGIN_EXTERN_C() @@ -107,12 +108,12 @@ struct _zend_compiler_globals { zend_bool unclean_shutdown; zend_llist open_files; -#ifdef ZTS -#ifdef __cplusplus +#if defined(ZTS) && defined(__cplusplus) ZendFlexLexer *ZFL; + ZendIniFlexLexer *ini_scanner; #else void *ZFL; -#endif + void *ini_parser; #endif }; diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h index 6127d7ec0ed..df9d48559b5 100644 --- a/Zend/zend_ini.h +++ b/Zend/zend_ini.h @@ -156,4 +156,9 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty); #define ZEND_INI_STAGE_DEACTIVATE (1<<3) #define ZEND_INI_STAGE_RUNTIME (1<<4) +/* INI parsing engine */ +int zend_parse_ini_file(zend_file_handle *fh, void (*zend_ini_parser_cb)(zval *arg1, zval *arg2, int callback_type)); +#define ZEND_INI_PARSER_ENTRY 1 +#define ZEND_INI_PARSER_SECTION 2 + #endif /* ZEND_INI_H */ diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y index 0e5393bc9d0..b0f8319ceaf 100644 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@ -25,11 +25,7 @@ #include "zend_API.h" #include "zend_ini.h" #include "zend_constants.h" -#if 0 -#include "ext/standard/dl.h" -#include "ext/standard/file.h" -#include "ext/standard/php_browscap.h" -#endif +#include "zend_ini_scanner.h" #include "zend_extensions.h" @@ -40,8 +36,14 @@ //#include "win32/wfile.h" #endif +int ini_lex(zval *ini_lval); + #define YYSTYPE zval +#define YYPARSE_PARAM zend_ini_parser_cb + +#define ZEND_INI_PARSER_CB ((void (*)(zval *arg1, zval *arg2, int callback_type)) zend_ini_parser_cb) + #define PARSING_MODE_CFG 0 #define PARSING_MODE_BROWSCAP 1 #define PARSING_MODE_STANDALONE 2 @@ -57,314 +59,12 @@ static int parsing_mode; zval yylval; -extern int cfglex(zval *cfglval); -extern FILE *cfgin; -extern int cfglineno; +#ifndef ZTS +extern int ini_lex(zval *ini_lval); */ +extern FILE *ini_in; +extern int ini_lineno; extern void init_cfg_scanner(void); - -zval *cfg_get_entry(char *name, uint name_length) -{ - zval *tmp; - - if (zend_hash_find(&configuration_hash, name, name_length, (void **) &tmp)==SUCCESS) { - return tmp; - } else { - return NULL; - } -} - - -ZEND_API int cfg_get_long(char *varname,long *result) -{ - zval *tmp,var; - - if (zend_hash_find(&configuration_hash,varname,strlen(varname)+1,(void **) &tmp)==FAILURE) { - *result=(long)NULL; - return FAILURE; - } - var = *tmp; - zval_copy_ctor(&var); - convert_to_long(&var); - *result = var.value.lval; - return SUCCESS; -} - - -ZEND_API int cfg_get_double(char *varname,double *result) -{ - zval *tmp,var; - - if (zend_hash_find(&configuration_hash,varname,strlen(varname)+1,(void **) &tmp)==FAILURE) { - *result=(double)0; - return FAILURE; - } - var = *tmp; - zval_copy_ctor(&var); - convert_to_double(&var); - *result = var.value.dval; - return SUCCESS; -} - - -ZEND_API int cfg_get_string(char *varname, char **result) -{ - zval *tmp; - - if (zend_hash_find(&configuration_hash,varname,strlen(varname)+1,(void **) &tmp)==FAILURE) { - *result=NULL; - return FAILURE; - } - *result = tmp->value.str.val; - return SUCCESS; -} - - -static void yyerror(char *str) -{ - char *error_buf; - int error_buf_len; - - error_buf_len = 128+strlen(currently_parsed_filename); /* should be more than enough */ - error_buf = (char *) emalloc(error_buf_len); - - sprintf(error_buf, "Error parsing %s on line %d\n", currently_parsed_filename, cfglineno); -#ifdef PHP_WIN32 - MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L); -#else - fprintf(stderr, "PHP: %s", error_buf); #endif - efree(error_buf); -} - - -static void pvalue_config_destructor(zval *pvalue) -{ - if (pvalue->type == IS_STRING && pvalue->value.str.val != empty_string) { - free(pvalue->value.str.val); - } -} - - -static void pvalue_browscap_destructor(zval *pvalue) -{ - if (pvalue->type == IS_OBJECT || pvalue->type == IS_ARRAY) { - zend_hash_destroy(pvalue->value.obj.properties); - free(pvalue->value.obj.properties); - } -} - - -#if 0 -int php_init_config(void) -{ - PLS_FETCH(); - - if (zend_hash_init(&configuration_hash, 0, NULL, (dtor_func_t) pvalue_config_destructor, 1)==FAILURE) { - return FAILURE; - } - -#if USE_CONFIG_FILE - { - char *env_location,*default_location,*php_ini_search_path; - int safe_mode_state = PG(safe_mode); - char *open_basedir = PG(open_basedir); - char *opened_path; - int free_default_location=0; - - env_location = getenv("PHPRC"); - if (!env_location) { - env_location=""; - } -#ifdef PHP_WIN32 - { - if (php_ini_path) { - default_location = php_ini_path; - } else { - default_location = (char *) malloc(512); - - if (!GetWindowsDirectory(default_location,255)) { - default_location[0]=0; - } - free_default_location=1; - } - } -#else - if (!php_ini_path) { - default_location = CONFIGURATION_FILE_PATH; - } else { - default_location = php_ini_path; - } -#endif - -/* build a path */ - php_ini_search_path = (char *) malloc(sizeof(".")+strlen(env_location)+strlen(default_location)+2+1); - - if (!php_ini_path) { -#ifdef PHP_WIN32 - sprintf(php_ini_search_path,".;%s;%s",env_location,default_location); -#else - sprintf(php_ini_search_path,".:%s:%s",env_location,default_location); -#endif - } else { - /* if path was set via -c flag, only look there */ - strcpy(php_ini_search_path,default_location); - } - PG(safe_mode) = 0; - PG(open_basedir) = NULL; - cfgin = php_fopen_with_path("php.ini","r",php_ini_search_path,&opened_path); - free(php_ini_search_path); - if (free_default_location) { - free(default_location); - } - PG(safe_mode) = safe_mode_state; - PG(open_basedir) = open_basedir; - - if (!cfgin) { - return SUCCESS; /* having no configuration file is ok */ - } - - if (opened_path) { - zval tmp; - - tmp.value.str.val = strdup(opened_path); - tmp.value.str.len = strlen(opened_path); - tmp.type = IS_STRING; - zend_hash_update(&configuration_hash,"cfg_file_path",sizeof("cfg_file_path"),(void *) &tmp,sizeof(zval),NULL); -#if DEBUG_CFG_PARSER - php_printf("INI file opened at '%s'\n",opened_path); -#endif - efree(opened_path); - } - - init_cfg_scanner(); - active_hash_table = &configuration_hash; - parsing_mode = PARSING_MODE_CFG; - currently_parsed_filename = "php.ini"; - yyparse(); - fclose(cfgin); - } - -#endif - - return SUCCESS; -} - - -PHP_MINIT_FUNCTION(browscap) -{ - char *browscap = INI_STR("browscap"); - - if (browscap) { - if (zend_hash_init(&browser_hash, 0, NULL, (dtor_func_t) pvalue_browscap_destructor, 1)==FAILURE) { - return FAILURE; - } - - cfgin = V_FOPEN(browscap, "r"); - if (!cfgin) { - php_error(E_WARNING,"Cannot open '%s' for reading", browscap); - return FAILURE; - } - init_cfg_scanner(); - active_hash_table = &browser_hash; - parsing_mode = PARSING_MODE_BROWSCAP; - currently_parsed_filename = browscap; - yyparse(); - fclose(cfgin); - } - - return SUCCESS; -} - -/* {{{ proto void parse_ini_file(string filename) - Parse configuration file */ -ZEND_FUNCTION(parse_ini_file) -{ -#ifdef ZTS - php_error(E_WARNING, "parse_ini_file() is not supported in multithreaded PHP"); - RETURN_FALSE; -#else - zval **filename; - - if (ARG_COUNT(ht)!=1 || zend_get_parameters_ex(1, &filename)==FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(filename); - cfgin = V_FOPEN((*filename)->value.str.val, "r"); - if (!cfgin) { - php_error(E_WARNING,"Cannot open '%s' for reading", (*filename)->value.str.val); - return; - } - array_init(return_value); - init_cfg_scanner(); - active_hash_table = return_value->value.ht; - parsing_mode = PARSING_MODE_STANDALONE; - currently_parsed_filename = (*filename)->value.str.val; - yyparse(); - fclose(cfgin); -#endif -} -/* }}} */ - - -int php_shutdown_config(void) -{ - zend_hash_destroy(&configuration_hash); - return SUCCESS; -} - - -PHP_MSHUTDOWN_FUNCTION(browscap) -{ - if (INI_STR("browscap")) { - zend_hash_destroy(&browser_hash); - } - return SUCCESS; -} - -#endif - - -static void convert_browscap_pattern(zval *pattern) -{ - register int i,j; - char *t; - - for (i=0; ivalue.str.len; i++) { - if (pattern->value.str.val[i]=='*' || pattern->value.str.val[i]=='?' || pattern->value.str.val[i]=='.') { - break; - } - } - - if (i==pattern->value.str.len) { /* no wildcards */ - pattern->value.str.val = zend_strndup(pattern->value.str.val, pattern->value.str.len); - return; - } - - t = (char *) malloc(pattern->value.str.len*2); - - for (i=0,j=0; ivalue.str.len; i++,j++) { - switch (pattern->value.str.val[i]) { - case '?': - t[j] = '.'; - break; - case '*': - t[j++] = '.'; - t[j] = '*'; - break; - case '.': - t[j++] = '\\'; - t[j] = '.'; - break; - default: - t[j] = pattern->value.str.val[i]; - break; - } - } - t[j]=0; - pattern->value.str.val = t; - pattern->value.str.len = j; -} - void do_cfg_op(char type, zval *result, zval *op1, zval *op2) { @@ -425,6 +125,24 @@ void do_cfg_get_constant(zval *result, zval *name) } +static void ini_error(char *str) +{ + char *error_buf; + int error_buf_len; + + error_buf_len = 128+strlen(currently_parsed_filename); /* should be more than enough */ + error_buf = (char *) emalloc(error_buf_len); + + sprintf(error_buf, "Error parsing %s on line %d\n", currently_parsed_filename, zend_ini_scanner_get_lineno()); +#ifdef PHP_WIN32 + MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L); +#else + fprintf(stderr, "PHP: %s", error_buf); +#endif + efree(error_buf); +} + + %} %pure_parser @@ -433,11 +151,6 @@ void do_cfg_get_constant(zval *result, zval *name) %token SECTION %token CFG_TRUE %token CFG_FALSE -%token EXTENSION -%token T_ZEND_EXTENSION -%token T_ZEND_EXTENSION_TS -%token T_ZEND_EXTENSION_DEBUG -%token T_ZEND_EXTENSION_DEBUG_TS %left '|' '&' %right '~' '!' @@ -453,121 +166,14 @@ statement: #if DEBUG_CFG_PARSER printf("'%s' = '%s'\n",$1.value.str.val,$3.value.str.val); #endif - $3.type = IS_STRING; - switch (parsing_mode) { - case PARSING_MODE_CFG: - zend_hash_update(active_hash_table, $1.value.str.val, $1.value.str.len+1, &$3, sizeof(zval), NULL); - if (active_hash_table == &configuration_hash) { - zend_alter_ini_entry($1.value.str.val, $1.value.str.len+1, $3.value.str.val, $3.value.str.len+1, ZEND_INI_SYSTEM, ZEND_INI_STAGE_STARTUP); - } - break; - case PARSING_MODE_BROWSCAP: - if (current_section) { - zval *new_property; - char *new_key; - - new_property = (zval *) malloc(sizeof(zval)); - INIT_PZVAL(new_property); - new_property->value.str.val = $3.value.str.val; - new_property->value.str.len = $3.value.str.len; - new_property->type = IS_STRING; - - new_key = zend_strndup($1.value.str.val, $1.value.str.len); - zend_str_tolower(new_key,$1.value.str.len); - zend_hash_update(current_section->value.obj.properties, new_key, $1.value.str.len+1, &new_property, sizeof(zval *), NULL); - free(new_key); - } - break; - case PARSING_MODE_STANDALONE: { - zval *entry; - - MAKE_STD_ZVAL(entry); - entry->value.str.val = estrndup($3.value.str.val, $3.value.str.len); - entry->value.str.len = $3.value.str.len; - entry->type = IS_STRING; - zend_hash_update(active_hash_table, $1.value.str.val, $1.value.str.len+1, &entry, sizeof(zval *), NULL); - pvalue_config_destructor(&$3); - } - break; - } - free($1.value.str.val); - } - | TC_STRING { free($1.value.str.val); } - | EXTENSION '=' cfg_string { - if (parsing_mode==PARSING_MODE_CFG) { - zval dummy; - -#if DEBUG_CFG_PARSER - printf("Loading '%s'\n",$3.value.str.val); -#endif - php_dl(&$3,MODULE_PERSISTENT,&dummy); - } - } - | T_ZEND_EXTENSION '=' cfg_string { - if (parsing_mode==PARSING_MODE_CFG) { -#if !defined(ZTS) && !ZEND_DEBUG - zend_load_extension($3.value.str.val); -#endif - free($3.value.str.val); - } - } - | T_ZEND_EXTENSION_TS '=' cfg_string { - if (parsing_mode==PARSING_MODE_CFG) { -#if defined(ZTS) && !ZEND_DEBUG - zend_load_extension($3.value.str.val); -#endif - free($3.value.str.val); - } - } - | T_ZEND_EXTENSION_DEBUG '=' cfg_string { - if (parsing_mode==PARSING_MODE_CFG) { -#if !defined(ZTS) && ZEND_DEBUG - zend_load_extension($3.value.str.val); -#endif - free($3.value.str.val); - } - } - | T_ZEND_EXTENSION_DEBUG_TS '=' cfg_string { - if (parsing_mode==PARSING_MODE_CFG) { -#if defined(ZTS) && ZEND_DEBUG - zend_load_extension($3.value.str.val); -#endif - free($3.value.str.val); - } - } - | SECTION { - if (parsing_mode==PARSING_MODE_BROWSCAP) { - zval *processed; - - /*printf("'%s' (%d)\n",$1.value.str.val,$1.value.str.len+1);*/ - current_section = (zval *) malloc(sizeof(zval)); - INIT_PZVAL(current_section); - processed = (zval *) malloc(sizeof(zval)); - INIT_PZVAL(processed); - - current_section->value.obj.ce = &zend_standard_class_def; - current_section->value.obj.properties = (HashTable *) malloc(sizeof(HashTable)); - current_section->type = IS_OBJECT; - zend_hash_init(current_section->value.obj.properties, 0, NULL, (dtor_func_t) pvalue_config_destructor, 1); - zend_hash_update(active_hash_table, $1.value.str.val, $1.value.str.len+1, (void *) ¤t_section, sizeof(zval *), NULL); - - processed->value.str.val = $1.value.str.val; - processed->value.str.len = $1.value.str.len; - processed->type = IS_STRING; - convert_browscap_pattern(processed); - zend_hash_update(current_section->value.obj.properties, "browser_name_pattern", sizeof("browser_name_pattern"), (void *) &processed, sizeof(zval *), NULL); - } - free($1.value.str.val); + ZEND_INI_PARSER_CB(&$1, &$3, ZEND_INI_PARSER_ENTRY); } + | TC_STRING { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_ENTRY); } + | SECTION { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_SECTION); } | '\n' ; -cfg_string: - TC_STRING { $$ = $1; } - | TC_ENCAPSULATED_STRING { $$ = $1; } -; - string_or_value: expr { $$ = $1; } | TC_ENCAPSULATED_STRING { $$ = $1; } diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l index 7a942109e10..6f1880d9d9a 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -18,6 +18,7 @@ */ #include "zend.h" +#include "zend_globals.h" #include "zend_ini_parser.h" #include "zend_ini_scanner.h" @@ -25,16 +26,39 @@ #define YYSTYPE zval #ifdef ZTS -#define YY_DECL int ZendIniFlexLexer::lex_scan(zval *inilval CLS_DC) +#define YY_DECL int ZendIniFlexLexer::lex_scan(zval *ini_lval) #else -#define YY_DECL int ini_lex_scan(zval *inilval CLS_DC) +#define YY_DECL int ini_lex(zval *ini_lval) #endif #ifndef ZTS void init_cfg_scanner() { - inilineno=1; + ini_lineno=1; } + + +int zend_ini_scanner_get_lineno() +{ + return ini_lineno; +} + +#else /* ZTS */ + +int zend_ini_scanner_get_lineno() +{ + CLS_FETCH(); + + return CG(ini_scanner)->lineno(); +} + +int ini_lex(zval *ini_lval) +{ + CLS_FETCH(); + + return CG(ini_scanner)->lex_scan(ini_lval); +} + #endif @@ -45,46 +69,19 @@ void init_cfg_scanner() %% -"extension" { -#if 0 - printf("found extension\n"); -#endif - return EXTENSION; -} - - -"zend_extension" { - return T_ZEND_EXTENSION; -} - - -"zend_extension_ts" { - return T_ZEND_EXTENSION_TS; -} - - -"zend_extension_debug" { - return T_ZEND_EXTENSION_DEBUG; -} - - -"zend_extension_debug_ts" { - return T_ZEND_EXTENSION_DEBUG_TS; -} - [ ]*("true"|"on"|"yes")[ ]* { - inilval->value.str.val = zend_strndup("1",1); - inilval->value.str.len = 1; - inilval->type = IS_STRING; + ini_lval->value.str.val = zend_strndup("1",1); + ini_lval->value.str.len = 1; + ini_lval->type = IS_STRING; return CFG_TRUE; } [ ]*("false"|"off"|"no"|"none")[ ]* { - inilval->value.str.val = zend_strndup("",0); - inilval->value.str.len = 0; - inilval->type = IS_STRING; + ini_lval->value.str.val = zend_strndup("",0); + ini_lval->value.str.len = 0; + ini_lval->type = IS_STRING; return CFG_FALSE; } @@ -101,9 +98,9 @@ void init_cfg_scanner() yytext++; yyleng--; - inilval->value.str.val = zend_strndup(yytext,yyleng); - inilval->value.str.len = yyleng; - inilval->type = IS_STRING; + ini_lval->value.str.val = zend_strndup(yytext,yyleng); + ini_lval->value.str.len = yyleng; + ini_lval->type = IS_STRING; return SECTION; } @@ -117,9 +114,9 @@ void init_cfg_scanner() /* eat leading " */ yytext++; - inilval->value.str.val = zend_strndup(yytext, yyleng - 2); - inilval->value.str.len = yyleng - 2; - inilval->type = IS_STRING; + ini_lval->value.str.val = zend_strndup(yytext, yyleng - 2); + ini_lval->value.str.len = yyleng - 2; + ini_lval->type = IS_STRING; return TC_ENCAPSULATED_STRING; } @@ -151,9 +148,9 @@ void init_cfg_scanner() } } if (yyleng!=0) { - inilval->value.str.val = zend_strndup(yytext,yyleng); - inilval->value.str.len = yyleng; - inilval->type = IS_STRING; + ini_lval->value.str.val = zend_strndup(yytext,yyleng); + ini_lval->value.str.len = yyleng; + ini_lval->type = IS_STRING; return TC_STRING; } else { /* whitespace */