#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
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;
}
-void do_cfg_get_constant(zval *result, zval *name)
+void zend_ini_get_constant(zval *result, zval *name)
{
zval z_constant;
}
+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
#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'
;
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:
#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
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