]> granicus.if.org Git - php/commitdiff
Final touches on the INI parser
authorZeev Suraski <zeev@php.net>
Mon, 30 Oct 2000 23:19:48 +0000 (23:19 +0000)
committerZeev Suraski <zeev@php.net>
Mon, 30 Oct 2000 23:19:48 +0000 (23:19 +0000)
Zend/zend_globals.h
Zend/zend_ini.h
Zend/zend_ini_parser.y
Zend/zend_ini_scanner.h
Zend/zend_ini_scanner.l

index 283d026ba19b0b8f2426f795486fca16fb7d05a1..821a606a42c7caac91fff32651bcf3757597b2fe 100644 (file)
@@ -107,6 +107,8 @@ struct _zend_compiler_globals {
 
        zend_bool unclean_shutdown;
 
+       zend_bool ini_parser_unbuffered_errors;
+
        zend_llist open_files;
 #if defined(ZTS) && defined(__cplusplus)
        ZendFlexLexer *ZFL;
index 44628a8277ba5f271e5d9e3959ecee676b433d76..3411eef40e0c79bdfdaa86c570948c532f0b7ced 100644 (file)
@@ -158,7 +158,7 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty);
 
 /* INI parsing engine */
 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);
+int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg);
 #define ZEND_INI_PARSER_ENTRY  1
 #define ZEND_INI_PARSER_SECTION        2
 
index a8c4687be69c92b3442d7f57f160a6fe14bf0035..1d87a3d937ed3c6a74c987445ef1378eb3a3271e 100644 (file)
@@ -59,7 +59,6 @@ extern HashTable browser_hash;
 ZEND_API extern char *php_ini_path;
 static HashTable *active_hash_table;
 static zval *current_section;
-static char *currently_parsed_filename;
 
 static int parsing_mode;
 
@@ -135,24 +134,32 @@ static void ini_error(char *str)
 {
        char *error_buf;
        int error_buf_len;
+       char *currently_parsed_filename = zend_ini_scanner_get_filename();
+       CLS_FETCH();
 
        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());
+
+       if (CG(ini_parser_unbuffered_errors)) {
 #ifdef PHP_WIN32
-       MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L);
+               MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L);
 #else
-       fprintf(stderr, "PHP:  %s", error_buf);
+               fprintf(stderr, "PHP:  %s", error_buf);
 #endif
+       } else {
+               zend_error(E_CORE_WARNING, error_buf);
+       }
        efree(error_buf);
 }
 
 
-int zend_parse_ini_file(zend_file_handle *fh, zend_ini_parser_cb_t ini_parser_cb, void *arg)
+int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg)
 {
        zend_ini_parser_param ini_parser_param;
        int retval;
+       CLS_FETCH();
 
        ini_parser_param.ini_parser_cb = ini_parser_cb;
        ini_parser_param.arg = arg;
@@ -161,6 +168,7 @@ int zend_parse_ini_file(zend_file_handle *fh, zend_ini_parser_cb_t ini_parser_cb
                return FAILURE;
        }
 
+       CG(ini_parser_unbuffered_errors) = unbuffered_errors;
        retval = ini_parse(&ini_parser_param);
 
        zend_ini_close_file(fh);
index 9131216108aeb75e619763d87b2e587458842f20..81389cc11fb933fe566335ccf98a2a0eb2672e74 100644 (file)
@@ -8,11 +8,14 @@ public:
        virtual ~ZendIniFlexLexer();
        int lex_scan(zval *zendlval);
        void BeginState(int state);
+
+       char *filename;
 };
 #endif /* ZTS && __cplusplus */
 
 BEGIN_EXTERN_C()
 int zend_ini_scanner_get_lineno();
+char *zend_ini_scanner_get_filename();
 int zend_ini_open_file_for_scanning(zend_file_handle *fh);
 void zend_ini_close_file(zend_file_handle *fh);
 int ini_lex(zval *ini_lval);
index 1356005b2a8c0c778f9718c961216bc700bbc2ef..dcb0998f68ba7c09431f7311fc894816893196b6 100644 (file)
@@ -46,6 +46,8 @@
 #endif
 
 #ifndef ZTS
+static char *ini_filename;
+
 void init_ini_scanner()
 {
        ini_lineno=1;
@@ -57,6 +59,12 @@ int zend_ini_scanner_get_lineno()
        return ini_lineno;
 }
 
+
+char *zend_ini_scanner_get_filename()
+{
+       return ini_filename;
+}
+
 #else /* ZTS */
 
 int zend_ini_scanner_get_lineno()
@@ -66,6 +74,13 @@ int zend_ini_scanner_get_lineno()
        return CG(ini_scanner)->lineno();
 }
 
+char *zend_ini_scanner_get_filename()
+{
+       CLS_FETCH();
+
+       return CG(ini_scanner)->filename;
+}
+
 int ini_lex(zval *ini_lval)
 {
        CLS_FETCH();
@@ -115,10 +130,12 @@ int zend_ini_open_file_for_scanning(zend_file_handle *fh)
 
        CG(ini_scanner) = new ZendIniFlexLexer;
        CG(ini_scanner)->switch_streams(fh->handle.is, &cout);
+       CG(ini_scanner)->filename = fh->filename;
 #else
        init_ini_scanner();
        yyin = fp;
        yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+       ini_filename = fh->filename;
 #endif
        return SUCCESS;
 }
@@ -130,13 +147,13 @@ void zend_ini_close_file(zend_file_handle *fh)
                case ZEND_HANDLE_FP:
                        fclose(fh->handle.fp);
                        break;
+#ifdef ZTS
                case ZEND_HANDLE_STDIOSTREAM: {
                                CLS_FETCH();
-#ifdef ZTS
                                delete CG(ini_scanner);
-#endif
                        }
                        break;
+#endif
        }
 }