The new INI parser is showing some signs of life
authorZeev Suraski <zeev@php.net>
Sun, 29 Oct 2000 22:40:01 +0000 (22:40 +0000)
committerZeev Suraski <zeev@php.net>
Sun, 29 Oct 2000 22:40:01 +0000 (22:40 +0000)
Zend/zend_alloc.h
Zend/zend_ini.h
Zend/zend_ini_parser.y
Zend/zend_ini_scanner.h
Zend/zend_ini_scanner.l

index cd9b742e83ade387ae69a918763ee2a3e6ddb357..ee2cf063f877e87ae96ad00a4385563c0b26502c 100644 (file)
@@ -64,10 +64,11 @@ typedef union _align_test {
 
 #define PLATFORM_PADDING (((PLATFORM_ALIGNMENT-sizeof(zend_mem_header))%PLATFORM_ALIGNMENT+PLATFORM_ALIGNMENT)%PLATFORM_ALIGNMENT)
 
-ZEND_API char *zend_strndup(const char *s, unsigned int length);
 
 BEGIN_EXTERN_C()
 
+ZEND_API char *zend_strndup(const char *s, unsigned int length);
+
 ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
index df9d48559b5640ed1af27f6518db8af4dfc755e1..44628a8277ba5f271e5d9e3959ecee676b433d76 100644 (file)
@@ -157,7 +157,8 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty);
 #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));
+typedef void (*zend_ini_parser_cb_t)(zval *arg1, zval *arg2, int callback_type, void *arg);
+int zend_parse_ini_file(zend_file_handle *fh, zend_ini_parser_cb_t ini_parser_cb, void *arg);
 #define ZEND_INI_PARSER_ENTRY  1
 #define ZEND_INI_PARSER_SECTION        2
 
index cc5511f72ccc87e84cf480378e9517a809e10d80..49de05d519e92f3c580eed20dd57f8a123f33b73 100644 (file)
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <winbase.h>
-//#include "win32/wfile.h"
 #endif
 
-int ini_lex(zval *ini_lval);
+
+typedef struct _zend_ini_parser_param {
+       zend_ini_parser_cb_t ini_parser_cb;
+       void *arg;
+} zend_ini_parser_param;
 
 #define YYSTYPE zval
+#define YYPARSE_PARAM ini_parser_param
 
-#define YYPARSE_PARAM zend_ini_parser_cb
+#define ZEND_INI_PARSER_CB     ((zend_ini_parser_param *) ini_parser_param)->ini_parser_cb
+#define ZEND_INI_PARSER_ARG    ((zend_ini_parser_param *) ini_parser_param)->arg
 
-#define ZEND_INI_PARSER_CB ((void (*)(zval *arg1, zval *arg2, int callback_type)) zend_ini_parser_cb)
+int ini_lex(zval *ini_lval);
+int ini_parse(void *ini_parser_param);
 
 #define PARSING_MODE_CFG               0
 #define PARSING_MODE_BROWSCAP  1
@@ -66,7 +72,7 @@ extern int ini_lineno;
 extern void init_cfg_scanner(void);
 #endif
 
-void do_cfg_op(char type, zval *result, zval *op1, zval *op2)
+void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
 {
        int i_result;
        int i_op1, i_op2;
@@ -107,7 +113,7 @@ void do_cfg_op(char type, zval *result, zval *op1, zval *op2)
 }
 
 
-void do_cfg_get_constant(zval *result, zval *name)
+void zend_ini_get_constant(zval *result, zval *name)
 {
        zval z_constant;
 
@@ -143,6 +149,24 @@ static void ini_error(char *str)
 }
 
 
+int zend_parse_ini_file(zend_file_handle *fh, zend_ini_parser_cb_t ini_parser_cb, void *arg)
+{
+       zend_ini_parser_param ini_parser_param;
+
+       ini_parser_param.ini_parser_cb = ini_parser_cb;
+       ini_parser_param.arg = arg;
+
+       if (zend_ini_open_file_for_scanning(fh)==FAILURE) {
+               return FAILURE;
+       }
+       if (ini_parse(&ini_parser_param)==0) {
+               return SUCCESS;
+       } else {
+               return FAILURE;
+       }
+}
+
+
 %}
 
 %pure_parser
@@ -166,10 +190,10 @@ statement:
 #if DEBUG_CFG_PARSER
                        printf("'%s' = '%s'\n",$1.value.str.val,$3.value.str.val);
 #endif
-                       ZEND_INI_PARSER_CB(&$1, &$3, ZEND_INI_PARSER_ENTRY);
+                       ZEND_INI_PARSER_CB(&$1, &$3, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG);
                }
-       |       TC_STRING { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_ENTRY); }
-       |       SECTION { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_SECTION); }
+       |       TC_STRING { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); }
+       |       SECTION { ZEND_INI_PARSER_CB(&$1, NULL, ZEND_INI_PARSER_SECTION, ZEND_INI_PARSER_ARG); }
        |       '\n'
 ;
 
@@ -185,15 +209,15 @@ string_or_value:
 
 expr:
                constant_string                 { $$ = $1; }
-       |       expr '|' expr                   { do_cfg_op('|', &$$, &$1, &$3); }
-       |       expr '&' expr                   { do_cfg_op('&', &$$, &$1, &$3); }
-       |       '~' expr                                { do_cfg_op('~', &$$, &$2, NULL); }
-       |       '!'     expr                            { do_cfg_op('!', &$$, &$2, NULL); }
+       |       expr '|' expr                   { zend_ini_do_op('|', &$$, &$1, &$3); }
+       |       expr '&' expr                   { zend_ini_do_op('&', &$$, &$1, &$3); }
+       |       '~' expr                                { zend_ini_do_op('~', &$$, &$2, NULL); }
+       |       '!'     expr                            { zend_ini_do_op('!', &$$, &$2, NULL); }
        |       '(' expr ')'                    { $$ = $2; }
 ;
 
 constant_string:
-               TC_STRING { do_cfg_get_constant(&$$, &$1); }
+               TC_STRING { zend_ini_get_constant(&$$, &$1); }
 ;
 /*
  * Local variables:
index 9a97f267f671a3876a4a6728f8efec844ee871a3..f83743f90f230bd931738c63063f8b2cedf69e68 100644 (file)
@@ -11,6 +11,10 @@ public:
 };
 #endif /* ZTS && __cplusplus */
 
+BEGIN_EXTERN_C()
 int zend_ini_scanner_get_lineno();
+int zend_ini_open_file_for_scanning(zend_file_handle *fh);
+int ini_lex(zval *ini_lval);
+END_EXTERN_C()
 
 #endif /* _ZEND_INI_SCANNER_H */
\ No newline at end of file
index 6f1880d9d9af9a478d9a27767e31c11aa994ed0d..48379e34851b6c7b4e15dfb0d5cb4a5ab26e5610 100644 (file)
 #include "zend_ini_parser.h"
 #include "zend_ini_scanner.h"
 
+#ifdef ZTS
+# ifdef HAVE_STDIOSTR_H
+#  include <stdiostr.h>
+# endif
+# ifdef HAVE_STDIOSTREAM_H
+#  include <stdiostream.h>
+# endif
+# ifdef ZEND_WIN32
+#  include <strstrea.h>
+# else
+#  include <strstream.h>
+# endif
+#endif
+
 #undef YYSTYPE
 #define YYSTYPE zval
 
@@ -59,9 +73,55 @@ int ini_lex(zval *ini_lval)
        return CG(ini_scanner)->lex_scan(ini_lval);
 }
 
+ZendIniFlexLexer::~ZendIniFlexLexer()
+{
+       if (yy_start_stack) {
+               yy_flex_free(yy_start_stack);
+       }
+}
+
+int yyFlexLexer::yylex()
+{
+       fprintf(stderr, "Error:  yyFlexLexer::yylex() called\n");
+       return -1;
+}
+
 #endif
 
 
+int zend_ini_open_file_for_scanning(zend_file_handle *fh)
+{
+       FILE *fp;
+       CLS_FETCH();
+
+       switch (fh->type) {
+               case ZEND_HANDLE_FP:
+                       fp = fh->handle.fp;
+                       break;
+               case ZEND_HANDLE_FILENAME:
+                       fp = zend_fopen(fh->filename, NULL);
+                       break;
+               default:
+                       return FAILURE;
+       }
+
+#ifdef ZTS
+       if (!fp) {
+               return FAILURE;
+       }
+       fh->handle.is = new istdiostream(fp);
+       fh->type = ZEND_HANDLE_STDIOSTREAM;
+
+       CG(ini_scanner) = new ZendIniFlexLexer;
+       CG(ini_scanner)->switch_streams(fh->handle.is, &cout);
+#else
+       init_cfg_scanner();
+       yyin = fp;
+       yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+#endif
+       return SUCCESS;
+}
+
 %}
 
 %option noyywrap