php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #3384 Problems with the XML module
Submitted: 2000-02-02 06:38 UTC Modified: 2001-02-10 15:35 UTC
From: drew at elysium dot ltd dot uk Assigned: zeev (profile)
Status: Closed Package: Reproducible Crash
PHP Version: 3.0.14 OS: RH 6.1
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: drew at elysium dot ltd dot uk
New email:
PHP Version: OS:

 

 [2000-02-02 06:38 UTC] drew at elysium dot ltd dot uk
I have been getting Segmentation faults in Apache children using the XML module.  I have modified the source for the XML module to try and make it more stable.  I have included the diff for my changes.  On the same note, I dont use the DAV module but it looks very similar to the XML module, so the changes I have made to the XML module might well apply to it.

The diff is VERY long, so if you need it E-Mailed to someone please let me know.

Rgds Drew

diff -c php-3.0.14.orig/functions/xml.c php-3.0.14/functions/xml.c
*** php-3.0.14.orig/functions/xml.c     Sat Jan  1 04:31:17 2000
--- php-3.0.14/functions/xml.c  Wed Feb  2 12:22:23 2000
***************
*** 89,100 ****
  inline static char xml_decode_us_ascii(unsigned short);
  static XML_Char *xml_utf8_encode(const char *, int, int *, const XML_Char *);
  static char *xml_utf8_decode(const XML_Char *, int, int *, const XML_Char *);
! static pval *xml_call_handler(xml_parser *, char *, int, pval **);
  static pval *php3i_xmlcharpval(const XML_Char *, int, const XML_Char *);
  static int php3i_xmlcharlen(const XML_Char *);
  static void php3i_add_to_info(xml_parser *parser,char *name);
  
- 
  void php3i_xml_startElementHandler(void *, const char *, const char **);
  void php3i_xml_endElementHandler(void *, const char *);
  void php3i_xml_characterDataHandler(void *, const XML_Char *, int);
--- 89,99 ----
  inline static char xml_decode_us_ascii(unsigned short);
  static XML_Char *xml_utf8_encode(const char *, int, int *, const XML_Char *);
  static char *xml_utf8_decode(const XML_Char *, int, int *, const XML_Char *);
! static int xml_call_handler(xml_parser *, char *, int, pval **);
  static pval *php3i_xmlcharpval(const XML_Char *, int, const XML_Char *);
  static int php3i_xmlcharlen(const XML_Char *);
  static void php3i_add_to_info(xml_parser *parser,char *name);
  
  void php3i_xml_startElementHandler(void *, const char *, const char **);
  void php3i_xml_endElementHandler(void *, const char *);
  void php3i_xml_characterDataHandler(void *, const XML_Char *, int);
***************
*** 108,145 ****
  /* {{{ extension definition structures */
  
  function_entry xml_functions[] = {
!     PHP_FE(xml_parser_create, NULL)
!     PHP_FE(xml_set_element_handler, NULL)
        PHP_FE(xml_set_character_data_handler, NULL)
        PHP_FE(xml_set_processing_instruction_handler, NULL)
        PHP_FE(xml_set_default_handler, NULL)
        PHP_FE(xml_set_unparsed_entity_decl_handler, NULL)
        PHP_FE(xml_set_notation_decl_handler, NULL)
        PHP_FE(xml_set_external_entity_ref_handler, NULL)
!     PHP_FE(xml_parse, NULL)
!     PHP_FE(xml_parse_into_struct, NULL)
!     PHP_FE(xml_get_error_code, NULL)
!     PHP_FE(xml_error_string, NULL)
!     PHP_FE(xml_get_current_line_number, NULL)
!     PHP_FE(xml_get_current_column_number, NULL)
!     PHP_FE(xml_get_current_byte_index, NULL)
!     PHP_FE(xml_parser_free, NULL)
        PHP_FE(xml_parser_set_option, NULL)
        PHP_FE(xml_parser_get_option, NULL)
        PHP_FE(utf8_encode, NULL)
        PHP_FE(utf8_decode, NULL)
!     {NULL, NULL, NULL}
  };
  
  php3_module_entry xml_module_entry = {
!     "XML",                /* extension name */
!     xml_functions,        /* extension function list */
!     php3_minit_xml,       /* extension-wide startup function */
!     php3_mshutdown_xml,   /* extension-wide shutdown function */
!     php3_rinit_xml,       /* per-request startup function */
!     php3_rshutdown_xml,   /* per-request shutdown function */
!     php3_info_xml,        /* information function */
!     STANDARD_MODULE_PROPERTIES
  };
  
  /* All the encoding functions are set to NULL right now, since all
--- 107,144 ----
  /* {{{ extension definition structures */
  
  function_entry xml_functions[] = {
!       PHP_FE(xml_parser_create, NULL)
!       PHP_FE(xml_set_element_handler, NULL)
        PHP_FE(xml_set_character_data_handler, NULL)
        PHP_FE(xml_set_processing_instruction_handler, NULL)
        PHP_FE(xml_set_default_handler, NULL)
        PHP_FE(xml_set_unparsed_entity_decl_handler, NULL)
        PHP_FE(xml_set_notation_decl_handler, NULL)
        PHP_FE(xml_set_external_entity_ref_handler, NULL)
!       PHP_FE(xml_parse, NULL)
!       PHP_FE(xml_parse_into_struct, NULL)
!       PHP_FE(xml_get_error_code, NULL)
!       PHP_FE(xml_error_string, NULL)
!       PHP_FE(xml_get_current_line_number, NULL)
!       PHP_FE(xml_get_current_column_number, NULL)
!       PHP_FE(xml_get_current_byte_index, NULL)
!       PHP_FE(xml_parser_free, NULL)
        PHP_FE(xml_parser_set_option, NULL)
        PHP_FE(xml_parser_get_option, NULL)
        PHP_FE(utf8_encode, NULL)
        PHP_FE(utf8_decode, NULL)
!       {NULL, NULL, NULL}
  };
  
  php3_module_entry xml_module_entry = {
!       "XML",                /* extension name */
!       xml_functions,        /* extension function list */
!       php3_minit_xml,       /* extension-wide startup function */
!       php3_mshutdown_xml,   /* extension-wide shutdown function */
!       php3_rinit_xml,       /* per-request startup function */
!       php3_rshutdown_xml,   /* per-request shutdown function */
!       php3_info_xml,        /* information function */
!       STANDARD_MODULE_PROPERTIES
  };
  
  /* All the encoding functions are set to NULL right now, since all
***************
*** 149,155 ****
        { "ISO-8859-1", xml_decode_iso_8859_1, xml_encode_iso_8859_1 },
        { "US-ASCII",   xml_decode_us_ascii,   xml_encode_us_ascii   },
        { "UTF-8",      NULL,                  NULL                  },
!     { NULL,         NULL,                  NULL                  }
  };
  
  /* }}} */
--- 148,154 ----
        { "ISO-8859-1", xml_decode_iso_8859_1, xml_encode_iso_8859_1 },
        { "US-ASCII",   xml_decode_us_ascii,   xml_encode_us_ascii   },
        { "UTF-8",      NULL,                  NULL                  },
!       { NULL,         NULL,                  NULL                  }
  };
  
  /* }}} */
***************
*** 159,167 ****
  
  int php3_minit_xml(INIT_FUNC_ARGS)
  {
!       XML_GLOBAL(php3_xml_module).le_xml_parser =
!               register_list_destructors(xml_destroy_parser, NULL);
! 
        XML_GLOBAL(php3_xml_module).default_encoding = "ISO-8859-1";
  
        REGISTER_LONG_CONSTANT("XML_ERROR_NONE", XML_ERROR_NONE, CONST_CS|CONST_PERSISTENT);
--- 158,164 ----
  
  int php3_minit_xml(INIT_FUNC_ARGS)
  {
!       XML_GLOBAL(php3_xml_module).le_xml_parser = register_list_destructors(xml_destroy_parser, NULL);
        XML_GLOBAL(php3_xml_module).default_encoding = "ISO-8859-1";
  
        REGISTER_LONG_CONSTANT("XML_ERROR_NONE", XML_ERROR_NONE, CONST_CS|CONST_PERSISTENT);
***************
*** 192,204 ****
        REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_TAGSTART", PHP3_XML_OPTION_SKIP_TAGSTART, CONST_CS|CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_WHITE", PHP3_XML_OPTION_SKIP_WHITE, CONST_CS|CONST_PERSISTENT);
        
- 
        return SUCCESS;
  }
  
  /* }}} */
      /* {{{ php3_rinit_xml */
- 
  int php3_rinit_xml(INIT_FUNC_ARGS)
  {
      return SUCCESS;
--- 189,199 ----
***************
*** 206,243 ****
  
  /* }}} */
      /* {{{ php3_mshutdown_xml() */
- 
  int php3_mshutdown_xml()
  {
-       XML_TLS_VARS;
        return SUCCESS;
  }
  
  /* }}} */
      /* {{{ php3_rshutdown_xml() */
- 
  int php3_rshutdown_xml()
  {
!     return SUCCESS;
  }
  
  /* }}} */
      /* {{{ php3_info_xml() */
- 
  void php3_info_xml()
  {
!               PUTS("XML support active");
  }
  
  /* }}} */
  
  /* }}} */
  /* {{{ extension-internal functions */
- 
      /* {{{ xml_get_parser() */
! 
! static xml_parser *
! xml_get_parser(int parser_ind, const char *func, HashTable *list)
  {
        int type;
        xml_parser *parser;
--- 201,231 ----
  
  /* }}} */
      /* {{{ php3_mshutdown_xml() */
  int php3_mshutdown_xml()
  {
        return SUCCESS;
  }
  
  /* }}} */
      /* {{{ php3_rshutdown_xml() */
  int php3_rshutdown_xml()
  {
!       return SUCCESS;
  }
  
  /* }}} */
      /* {{{ php3_info_xml() */
  void php3_info_xml()
  {
!       PUTS("XML support active");
  }
  
  /* }}} */
  
  /* }}} */
  /* {{{ extension-internal functions */
      /* {{{ xml_get_parser() */
! static xml_parser *xml_get_parser(int parser_ind, const char *func, HashTable *list)
  {
        int type;
        xml_parser *parser;
***************
*** 248,261 ****
                php3_error(E_WARNING, "%s: invalid XML parser %d", func, parser_ind);
                return (xml_parser *)NULL;
        }
        return parser;
  }
  
  /* }}} */
      /* {{{ xml_destroy_parser() */
! 
! static void
! xml_destroy_parser(xml_parser *parser)
  {
        XML_TLS_VARS;
    
--- 236,248 ----
                php3_error(E_WARNING, "%s: invalid XML parser %d", func, parser_ind);
                return (xml_parser *)NULL;
        }
+ 
        return parser;
  }
  
  /* }}} */
      /* {{{ xml_destroy_parser() */
! static void xml_destroy_parser(xml_parser *parser)
  {
        XML_TLS_VARS;
    
***************
*** 301,309 ****
  
  /* }}} */
      /* {{{ xml_set_handler() */
! 
! static void
! xml_set_handler(char **nameBufp, pval *data)
  {
        if (data->value.str.len > 0) {
                if (*nameBufp != NULL) {
--- 288,294 ----
  
  /* }}} */
      /* {{{ xml_set_handler() */
! static void xml_set_handler(char **nameBufp, pval *data)
  {
        if (data->value.str.len > 0) {
                if (*nameBufp != NULL) {
***************
*** 320,397 ****
  
  /* }}} */
      /* {{{ xml_call_handler() */
! 
! static pval *
! xml_call_handler(xml_parser *parser, char *funcName, int argc, pval **argv)
  {
        if (parser && funcName) {
-               pval *retval, *func;
                int i;
!               HashTable *function_table;
  
-               func = php3i_string_pval(funcName);
-               retval = emalloc(sizeof(pval));
                /* We cannot call internal variables from a function module as
                   it breaks any chance of compiling it as a module on windows.
                   Instead, we create a callback function. */
!               function_table=php3i_get_function_table();
!               if (call_user_function(function_table, NULL, func, retval, argc, argv) == FAILURE) {
!                       php3tls_pval_destructor(retval);
!                       efree(retval);
!                       return NULL;
                }
!               php3tls_pval_destructor(func);
!               efree(func);
                for (i = 0; i < argc; i++) {
                        php3tls_pval_destructor(argv[i]);
                        efree(argv[i]);
                }
!               return retval;
        }
!       return NULL;
  }
  
  /* }}} */
      /* {{{ xml_encode_iso_8859_1() */
! 
! inline static unsigned short
! xml_encode_iso_8859_1(unsigned char c)
  {
        return (unsigned short)c;
  }
  
  /* }}} */
      /* {{{ xml_decode_iso_8859_1() */
! 
! inline static char
! xml_decode_iso_8859_1(unsigned short c)
  {
        return (char)(c > 0xff ? '?' : c);
  }
  
  /* }}} */
      /* {{{ xml_encode_us_ascii() */
! 
! inline static unsigned short
! xml_encode_us_ascii(unsigned char c)
  {
        return (unsigned short)c;
  }
  
  /* }}} */
      /* {{{ xml_decode_us_ascii() */
! 
! inline static char
! xml_decode_us_ascii(unsigned short c)
  {
        return (char)(c > 0x7f ? '?' : c);
  }
  
  /* }}} */
      /* {{{ xml_get_encoding() */
! 
! static xml_encoding *
! xml_get_encoding(const XML_Char *name)
  {
        xml_encoding *enc = &xml_encodings[0];
  
--- 305,372 ----
  
  /* }}} */
      /* {{{ xml_call_handler() */
! static int xml_call_handler(xml_parser *parser, char *funcName, int argc, pval **argv)
  {
        if (parser && funcName) {
                int i;
!               pval retval;
!               pval *function_name = php3i_string_pval(funcName);
  
                /* We cannot call internal variables from a function module as
                   it breaks any chance of compiling it as a module on windows.
                   Instead, we create a callback function. */
! 
!               if (call_user_function(&GLOBAL(function_table), NULL, function_name, &retval, argc, argv) == FAILURE) {
!                       php3tls_pval_destructor(function_name);
!                       efree(function_name);
! 
!                       return 0;
                }
! 
!               php3tls_pval_destructor(function_name);
!               efree(function_name);
! 
                for (i = 0; i < argc; i++) {
                        php3tls_pval_destructor(argv[i]);
                        efree(argv[i]);
                }
!               convert_to_long(&retval);
!               return retval.value.lval;
        }
!       return 0;
  }
  
  /* }}} */
      /* {{{ xml_encode_iso_8859_1() */
! inline static unsigned short xml_encode_iso_8859_1(unsigned char c)
  {
        return (unsigned short)c;
  }
  
  /* }}} */
      /* {{{ xml_decode_iso_8859_1() */
! inline static char xml_decode_iso_8859_1(unsigned short c)
  {
        return (char)(c > 0xff ? '?' : c);
  }
  
  /* }}} */
      /* {{{ xml_encode_us_ascii() */
! inline static unsigned short xml_encode_us_ascii(unsigned char c)
  {
        return (unsigned short)c;
  }
  
  /* }}} */
      /* {{{ xml_decode_us_ascii() */
! inline static char xml_decode_us_ascii(unsigned short c)
  {
        return (char)(c > 0x7f ? '?' : c);
  }
  
  /* }}} */
      /* {{{ xml_get_encoding() */
! static xml_encoding *xml_get_encoding(const XML_Char *name)
  {
        xml_encoding *enc = &xml_encodings[0];
  
***************
*** 401,413 ****
                }
                enc++;
        }
        return NULL;
  }
  
  /* }}} */
      /* {{{ xml_utf8_encode */
! static XML_Char *
! xml_utf8_encode(const char *s, int len, int *newlen, const XML_Char *encoding)
  {
        int pos = len;
        char *newbuf;
--- 376,388 ----
                }
                enc++;
        }
+ 
        return NULL;
  }
  
  /* }}} */
      /* {{{ xml_utf8_encode */
! static XML_Char *xml_utf8_encode(const char *s, int len, int *newlen, const XML_Char *encoding)
  {
        int pos = len;
        char *newbuf;
***************
*** 416,435 ****
        xml_encoding *enc = xml_get_encoding(encoding);
  
        *newlen = 0;
!       if (enc) {
!               encoder = enc->encoding_function;
!       } else {
                /* If the target encoding was unknown, fail */
                return NULL;
        }
        if (encoder == NULL) {
!               /* If no encoder function was specified, return the data as-is.
!                */
                newbuf = emalloc(len);
                memcpy(newbuf, s, len);
                *newlen = len;
                return newbuf;
        }
        /* This is the theoretical max (will never get beyond len * 2 as long
         * as we are converting from single-byte characters, though) */
        newbuf = emalloc(len * 4);
--- 391,410 ----
        xml_encoding *enc = xml_get_encoding(encoding);
  
        *newlen = 0;
!       if (!enc) {
                /* If the target encoding was unknown, fail */
                return NULL;
        }
+ 
+       encoder = enc->encoding_function;
        if (encoder == NULL) {
!               /* If no encoder function was specified, return the data as-is. */
                newbuf = emalloc(len);
                memcpy(newbuf, s, len);
                *newlen = len;
                return newbuf;
        }
+ 
        /* This is the theoretical max (will never get beyond len * 2 as long
         * as we are converting from single-byte characters, though) */
        newbuf = emalloc(len * 4);
***************
*** 452,467 ****
                }
                pos--;
                s++;
-     }
-       if (*newlen < len * 4) {
-               newbuf = erealloc(newbuf, *newlen);
        }
        return newbuf;
  }
  /* }}} */
      /* {{{ xml_utf8_decode */
! static char *
! xml_utf8_decode(const XML_Char *s, int len, int *newlen, const XML_Char *encoding)
  {
        int pos = len;
        char *newbuf = emalloc(len + 1);
--- 427,444 ----
                }
                pos--;
                s++;
        }
+ 
+       if (*newlen < len * 4)
+               newbuf = erealloc(newbuf, *newlen + 1);
+       newbuf[*newlen] = '\0';
+ 
        return newbuf;
  }
+ 
  /* }}} */
      /* {{{ xml_utf8_decode */
! static char *xml_utf8_decode(const XML_Char *s, int len, int *newlen, const XML_Char *encoding)
  {
        int pos = len;
        char *newbuf = emalloc(len + 1);
***************
*** 473,487 ****
        if (enc) {
                decoder = enc->decoding_function;
        }
        if (decoder == NULL) {
                /* If the target encoding was unknown, or no decoder function
!                * was specified, return the UTF-8-encoded data as-is.
!                */
                memcpy(newbuf, s, len);
                *newlen = len;
                newbuf[*newlen] = '\0';
                return newbuf;
        }
        while (pos > 0) {
                c = (unsigned char)(*s);
                if (c >= 0xf0) { /* four bytes encoded, 21 bits */
--- 450,465 ----
        if (enc) {
                decoder = enc->decoding_function;
        }
+ 
        if (decoder == NULL) {
                /* If the target encoding was unknown, or no decoder function
!                * was specified, return the UTF-8-encoded data as-is. */
                memcpy(newbuf, s, len);
                *newlen = len;
                newbuf[*newlen] = '\0';
                return newbuf;
        }
+ 
        while (pos > 0) {
                c = (unsigned char)(*s);
                if (c >= 0xf0) { /* four bytes encoded, 21 bits */
***************
*** 502,517 ****
                }
                newbuf[*newlen] = decoder ? decoder(c) : c;
                ++*newlen;
!     }
        if (*newlen < len) {
                newbuf = erealloc(newbuf, *newlen + 1);
        }
        newbuf[*newlen] = '\0';
        return newbuf;
  }
  /* }}} */
      /* {{{ php3i_xmlcharpval() */
- 
  static pval *php3i_xmlcharpval(const XML_Char *s, int len, const XML_Char *encoding)
  {
        pval *ret = emalloc(sizeof(pval));
--- 480,497 ----
                }
                newbuf[*newlen] = decoder ? decoder(c) : c;
                ++*newlen;
!       }
! 
        if (*newlen < len) {
                newbuf = erealloc(newbuf, *newlen + 1);
        }
        newbuf[*newlen] = '\0';
+ 
        return newbuf;
  }
+ 
  /* }}} */
      /* {{{ php3i_xmlcharpval() */
  static pval *php3i_xmlcharpval(const XML_Char *s, int len, const XML_Char *encoding)
  {
        pval *ret = emalloc(sizeof(pval));
***************
*** 523,536 ****
        if (len == 0) {
                len = php3i_xmlcharlen(s);
        }
        ret->type = IS_STRING;
        ret->value.str.val = xml_utf8_decode(s, len, &ret->value.str.len, encoding);
        return ret;
  }
  
  /* }}} */
      /* {{{ php3i_xmlcharlen() */
- 
  static int php3i_xmlcharlen(const XML_Char *s)
  {
        int len = 0;
--- 503,517 ----
        if (len == 0) {
                len = php3i_xmlcharlen(s);
        }
+ 
        ret->type = IS_STRING;
        ret->value.str.val = xml_utf8_decode(s, len, &ret->value.str.len, encoding);
+ 
        return ret;
  }
  
  /* }}} */
      /* {{{ php3i_xmlcharlen() */
  static int php3i_xmlcharlen(const XML_Char *s)
  {
        int len = 0;
***************
*** 539,544 ****
--- 520,526 ----
                len++;
                s++;
        }
+ 
        return len;
  }
  
***************
*** 548,584 ****
  {
        pval *element, values;
  
!       if (! parser->info) {
                return;
        }
  
!       if (_php3_hash_find(parser->info->value.ht,name,strlen(name) + 1,(void **) &element) == FAILURE) {
                if (array_init(&values) == FAILURE) {
                        php3_error(E_ERROR, "Unable to initialize array");
                        return;
                }
!               
!               _php3_hash_update(parser->info->value.ht, name, strlen(name)+1, (void *) &values, sizeof(pval), (void **) &element);
        } 
-                       
        add_next_index_long(element,parser->curtag);
- 
        
        parser->curtag++;
  }
  
  /* }}} */
! /* {{{ php3i_xml_startElementHandler() */
! 
! void php3i_xml_startElementHandler(void *userData, const char *name,
!                                                                  const char **attributes)
  {
        xml_parser *parser = (xml_parser *)userData;
        const char **attrs = attributes;
        XML_TLS_VARS;
  
        if (parser) {
!               pval *retval, *args[3];
  
                parser->level++;
  
--- 530,561 ----
  {
        pval *element, values;
  
!       if (!parser->info) {
                return;
        }
  
!       if (_php3_hash_find(parser->info->value.ht, name, strlen(name) + 1, (void **)&element) == FAILURE) {
                if (array_init(&values) == FAILURE) {
                        php3_error(E_ERROR, "Unable to initialize array");
                        return;
                }
!               _php3_hash_update(parser->info->value.ht, name, strlen(name) + 1, (void *)&values, sizeof(pval), (void **)&element);
        } 
        add_next_index_long(element,parser->curtag);
        
        parser->curtag++;
  }
  
  /* }}} */
!     /* {{{ php3i_xml_startElementHandler() */
! void php3i_xml_startElementHandler(void *userData, const char *name, const char **attributes)
  {
        xml_parser *parser = (xml_parser *)userData;
        const char **attrs = attributes;
        XML_TLS_VARS;
  
        if (parser) {
!               pval *args[3];
  
                parser->level++;
  
***************
*** 591,652 ****
                        args[1] = php3i_string_pval(name);
                        args[2] = emalloc(sizeof(pval));
                        array_init(args[2]);
                        while (attributes && *attributes) {
                                char *key = (char *)attributes[0];
                                char *value = (char *)attributes[1];
                                char *decoded_value;
!                               int decoded_len;
                                if (parser->case_folding) {
                                        key = _php3_strtoupper(estrdup(key));
                                }
!                               decoded_value = xml_utf8_decode(value, strlen(value),
!                                                                                               &decoded_len,
!                                                                                               parser->target_encoding);
                                
                                add_assoc_stringl(args[2], key, decoded_value, decoded_len, 0);
                                if (parser->case_folding) {
                                        efree(key);
                                }
                                attributes += 2;
                        }
!                       
!                       if ((retval = xml_call_handler(parser, parser->startElementHandler, 3, args))) {
!                               php3tls_pval_destructor(retval);
!                               efree(retval);
!                       }
                } 
  
                if (parser->data) {
-                       pval tag, atr;
                        int atcnt = 0;
  
                        array_init(&tag);
                        array_init(&atr);
  
!                       php3i_add_to_info(parser,((char *) name) + parser->toffset);
  
!                       add_assoc_string(&tag,"tag",((char *) name) + parser->toffset,1); /* cast to avoid gcc-warning */
!                       add_assoc_string(&tag,"type","open",1);
!                       add_assoc_long(&tag,"level",parser->level);
  
!                       parser->ltags[parser->level-1] = estrdup(name);
                        parser->lastwasopen = 1;
  
                        attributes = attrs;
                        while (attributes && *attributes) {
                                char *key = (char *)attributes[0];
                                char *value = (char *)attributes[1];
                                char *decoded_value;
!                               int decoded_len;
                                if (parser->case_folding) {
                                        key = _php3_strtoupper(estrdup(key));
                                }
!                               decoded_value = xml_utf8_decode(value, strlen(value),
!                                                                                               &decoded_len,
!                                                                                               parser->target_encoding);
                                
!                               add_assoc_stringl(&atr,key,decoded_value,decoded_len,0);
                                atcnt++;
                                if (parser->case_folding) {
                                        efree(key);
                                }
--- 568,626 ----
                        args[1] = php3i_string_pval(name);
                        args[2] = emalloc(sizeof(pval));
                        array_init(args[2]);
+ 
                        while (attributes && *attributes) {
+                               int decoded_len;
                                char *key = (char *)attributes[0];
                                char *value = (char *)attributes[1];
                                char *decoded_value;
! 
                                if (parser->case_folding) {
                                        key = _php3_strtoupper(estrdup(key));
                                }
!                               decoded_value = xml_utf8_decode(value, strlen(value), &decoded_len, parser->target_encoding);
                                
                                add_assoc_stringl(args[2], key, decoded_value, decoded_len, 0);
+ 
                                if (parser->case_folding) {
                                        efree(key);
                                }
                                attributes += 2;
                        }
!                       xml_call_handler(parser, parser->startElementHandler, 3, args);
                } 
  
                if (parser->data) {
                        int atcnt = 0;
+                       pval tag, atr;
  
                        array_init(&tag);
                        array_init(&atr);
  
!                       php3i_add_to_info(parser, ((char *)name) + parser->toffset);
  
!                       add_assoc_string(&tag, "tag", ((char *) name) + parser->toffset, 1); /* cast to avoid gcc-warning */
!                       add_assoc_string(&tag, "type", "open", 1);
!                       add_assoc_long(&tag, "level", parser->level);
  
!                       parser->ltags[parser->level - 1] = estrdup(name);
                        parser->lastwasopen = 1;
  
                        attributes = attrs;
                        while (attributes && *attributes) {
+                               int decoded_len;
                                char *key = (char *)attributes[0];
                                char *value = (char *)attributes[1];
                                char *decoded_value;
! 
                                if (parser->case_folding) {
                                        key = _php3_strtoupper(estrdup(key));
                                }
!                               decoded_value = xml_utf8_decode(value, strlen(value), &decoded_len, parser->target_encoding);
                                
!                               add_assoc_stringl(&atr, key, decoded_value, decoded_len, 0);
                                atcnt++;
+ 
                                if (parser->case_folding) {
                                        efree(key);
                                }
***************
*** 654,665 ****
                        }
  
                        if (atcnt) {
!                               _php3_hash_add(tag.value.ht,"attributes",sizeof("attributes"),&atr,sizeof(pval),NULL);
                        } else {
                                php3tls_pval_destructor(&atr);
                        }
! 
!                       _php3_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(pval),(void *) &parser->ctag);
                }
  
                if (parser->case_folding) {
--- 628,638 ----
                        }
  
                        if (atcnt) {
!                               _php3_hash_add(tag.value.ht, "attributes", sizeof("attributes"), &atr, sizeof(pval), NULL);
                        } else {
                                php3tls_pval_destructor(&atr);
                        }
!                       _php3_hash_next_index_insert(parser->data->value.ht, &tag, sizeof(pval), (void *)&parser->ctag);
                }
  
                if (parser->case_folding) {
***************
*** 670,683 ****
  
  /* }}} */
      /* {{{ php3i_xml_endElementHandler() */
- 
  void php3i_xml_endElementHandler(void *userData, const char *name)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser) {
!               pval *retval, *args[2];
  
                if (parser->case_folding) {
                        name = _php3_strtoupper(estrdup(name));
--- 643,655 ----
  
  /* }}} */
      /* {{{ php3i_xml_endElementHandler() */
  void php3i_xml_endElementHandler(void *userData, const char *name)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser) {
!               pval *args[2];
  
                if (parser->case_folding) {
                        name = _php3_strtoupper(estrdup(name));
***************
*** 687,703 ****
                        args[0] = php3i_long_pval(parser->index);
                        args[1] = php3i_string_pval(name);
  
!                       if ((retval = xml_call_handler(parser, parser->endElementHandler, 2, args))) {
!                               php3tls_pval_destructor(retval);
!                               efree(retval);
!                       }
                } 
  
                if (parser->data) {
                        pval tag;
  
                        if (parser->lastwasopen) {
!                               add_assoc_string(parser->ctag,"type","complete",1);
                        } else {
                                array_init(&tag);
                                  
--- 659,672 ----
                        args[0] = php3i_long_pval(parser->index);
                        args[1] = php3i_string_pval(name);
  
!                       xml_call_handler(parser, parser->endElementHandler, 2, args);
                } 
  
                if (parser->data) {
                        pval tag;
  
                        if (parser->lastwasopen) {
!                               add_assoc_string(parser->ctag, "type", "complete", 1);
                        } else {
                                array_init(&tag);
                                  
***************
*** 709,715 ****
                                  
                                _php3_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(pval),NULL);
                        }
- 
                        parser->lastwasopen = 0;
                }
  
--- 678,683 ----
***************
*** 717,723 ****
                        efree((char *)name);
                }
                if (parser->ltags) {
!                       efree(parser->ltags[parser->level-1]);
                }
                parser->level--;
        }
--- 685,691 ----
                        efree((char *)name);
                }
                if (parser->ltags) {
!                       efree(parser->ltags[parser->level - 1]);
                }
                parser->level--;
        }
***************
*** 725,765 ****
  
  /* }}} */
      /* {{{ php3i_xml_characterDataHandler() */
- 
  void php3i_xml_characterDataHandler(void *userData, const XML_Char *s, int len)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser) {
!               pval *retval, *args[2];
  
                if (parser->characterDataHandler) {
                        args[0] = php3i_long_pval(parser->index);
                        args[1] = php3i_xmlcharpval(s, len, parser->target_encoding);
!                       if ((retval = xml_call_handler(parser, parser->characterDataHandler, 2, args))) {
!                               php3tls_pval_destructor(retval);
!                               efree(retval);
!                       }
                } 
  
                if (parser->data) {
                        int i;
                        int doprint = 0;
- 
-                       char *decoded_value;
                        int decoded_len;
                        
!                       decoded_value = xml_utf8_decode(s,len,&decoded_len,parser->target_encoding);
                        for (i = 0; i < decoded_len; i++) {
                                switch (decoded_value[i]) {
!                               case ' ':
!                               case '\t':
!                               case '\n':
!                                       continue;
!                               default:
!                                       doprint = 1;
!                                       break;
                                }
                                if (doprint) {
                                        break;
--- 693,729 ----
  
  /* }}} */
      /* {{{ php3i_xml_characterDataHandler() */
  void php3i_xml_characterDataHandler(void *userData, const XML_Char *s, int len)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser) {
!               pval *args[2];
  
                if (parser->characterDataHandler) {
                        args[0] = php3i_long_pval(parser->index);
                        args[1] = php3i_xmlcharpval(s, len, parser->target_encoding);
! 
!                       xml_call_handler(parser, parser->characterDataHandler, 2, args);
                } 
  
                if (parser->data) {
                        int i;
                        int doprint = 0;
                        int decoded_len;
+                       char *decoded_value;
                        
!                       decoded_value = xml_utf8_decode(s, len, &decoded_len, parser->target_encoding);
                        for (i = 0; i < decoded_len; i++) {
                                switch (decoded_value[i]) {
!                                       case ' ':
!                                       case '\t':
!                                       case '\n':
!                                               continue;
!                                       default:
!                                               doprint = 1;
!                                               break;
                                }
                                if (doprint) {
                                        break;
***************
*** 770,777 ****
                                        pval *myval;
                                        
                                        /* check if the current tag already has a value - if yes append to that! */
!                                       if (_php3_hash_find(parser->ctag->value.ht,"value",sizeof("value"),(void *) &myval) == SUCCESS) {
                                                int newlen = myval->value.str.len + decoded_len;
                                                myval->value.str.val = erealloc(myval->value.str.val,newlen+1);
                                                strcpy(myval->value.str.val + myval->value.str.len,decoded_value);
                                                myval->value.str.len += decoded_len;
--- 734,742 ----
                                        pval *myval;
                                        
                                        /* check if the current tag already has a value - if yes append to that! */
!                                       if (_php3_hash_find(parser->ctag->value.ht, "value", sizeof("value"), (void *) &myval) == SUCCESS) {
                                                int newlen = myval->value.str.len + decoded_len;
+ 
                                                myval->value.str.val = erealloc(myval->value.str.val,newlen+1);
                                                strcpy(myval->value.str.val + myval->value.str.len,decoded_value);
                                                myval->value.str.len += decoded_len;
***************
*** 784,797 ****
                                        
                                        array_init(&tag);
                                        
!                                       php3i_add_to_info(parser,parser->ltags[parser->level-1] + parser->toffset);
  
!                                       add_assoc_string(&tag,"tag",parser->ltags[parser->level-1] + parser->toffset,1);
!                                       add_assoc_string(&tag,"value",decoded_value,0);
!                                       add_assoc_string(&tag,"type","cdata",1);
!                                       add_assoc_long(&tag,"level",parser->level);
                                        
!                                       _php3_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(pval),NULL);
                                }
                        } else {
                                efree(decoded_value);
--- 749,762 ----
                                        
                                        array_init(&tag);
                                        
!                                       php3i_add_to_info(parser, parser->ltags[parser->level-1] + parser->toffset);
  
!                                       add_assoc_string(&tag, "tag", parser->ltags[parser->level-1] + parser->toffset, 1);
!                                       add_assoc_string(&tag, "value", decoded_value, 0);
!                                       add_assoc_string(&tag, "type", "cdata", 1);
!                                       add_assoc_long(&tag, "level", parser->level);
                                        
!                                       _php3_hash_next_index_insert(parser->data->value.ht, &tag, sizeof(pval), NULL);
                                }
                        } else {
                                efree(decoded_value);
***************
*** 802,831 ****
  
  /* }}} */
      /* {{{ php3i_xml_processingInstructionHandler() */
! 
! void php3i_xml_processingInstructionHandler(void *userData,
!                                                                                       const XML_Char *target,
!                                                                                       const XML_Char *data)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser && parser->processingInstructionHandler) {
!               pval *retval, *args[3];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(target, 0, parser->target_encoding);
                args[2] = php3i_xmlcharpval(data, 0, parser->target_encoding);
!               if ((retval = xml_call_handler(parser, parser->processingInstructionHandler, 3, args))) {
!                       php3tls_pval_destructor(retval);
!                       efree(retval);
!               }
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_defaultHandler() */
- 
  void php3i_xml_defaultHandler(void *userData, const XML_Char *s, int len)
  {
        xml_parser *parser = (xml_parser *)userData;
--- 767,790 ----
  
  /* }}} */
      /* {{{ php3i_xml_processingInstructionHandler() */
! void php3i_xml_processingInstructionHandler(void *userData, const XML_Char *target, const XML_Char *data)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser && parser->processingInstructionHandler) {
!               pval *args[3];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(target, 0, parser->target_encoding);
                args[2] = php3i_xmlcharpval(data, 0, parser->target_encoding);
! 
!               xml_call_handler(parser, parser->processingInstructionHandler, 3, args);
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_defaultHandler() */
  void php3i_xml_defaultHandler(void *userData, const XML_Char *s, int len)
  {
        xml_parser *parser = (xml_parser *)userData;
***************
*** 836,863 ****
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(s, len, parser->target_encoding);
!               if ((retval = xml_call_handler(parser, parser->defaultHandler, 2, args))) {
!                       php3tls_pval_destructor(retval);
!                       efree(retval);
!               }
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_unparsedEntityDeclHandler() */
! 
! void php3i_xml_unparsedEntityDeclHandler(void *userData,
!                                                                                const XML_Char *entityName,
!                                                                                const XML_Char *base,
!                                                                                const XML_Char *systemId,
!                                                                                const XML_Char *publicId,
!                                                                                const XML_Char *notationName)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser && parser->unparsedEntityDeclHandler) {
!               pval *retval, *args[5];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(entityName, 0, parser->target_encoding);
--- 795,814 ----
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(s, len, parser->target_encoding);
! 
!               xml_call_handler(parser, parser->defaultHandler, 2, args);
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_unparsedEntityDeclHandler() */
! void php3i_xml_unparsedEntityDeclHandler(void *userData, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser && parser->unparsedEntityDeclHandler) {
!               pval *args[6];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(entityName, 0, parser->target_encoding);
***************
*** 865,935 ****
                args[3] = php3i_xmlcharpval(systemId, 0, parser->target_encoding);
                args[4] = php3i_xmlcharpval(publicId, 0, parser->target_encoding);
                args[5] = php3i_xmlcharpval(notationName, 0, parser->target_encoding);
!               if ((retval = xml_call_handler(parser, parser->unparsedEntityDeclHandler, 6, args))) {
!                       php3tls_pval_destructor(retval);
!                       efree(retval);
!               }
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_notationDeclHandler() */
! 
! void
! php3i_xml_notationDeclHandler(void *userData,
!                                                         const XML_Char *notationName,
!                                                         const XML_Char *base,
!                                                         const XML_Char *systemId,
!                                                         const XML_Char *publicId)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser && parser->notationDeclHandler) {
!               pval *retval, *args[5];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(notationName, 0, parser->target_encoding);
                args[2] = php3i_xmlcharpval(base, 0, parser->target_encoding);
                args[3] = php3i_xmlcharpval(systemId, 0, parser->target_encoding);
                args[4] = php3i_xmlcharpval(publicId, 0, parser->target_encoding);
!               if ((retval = xml_call_handler(parser, parser->notationDeclHandler, 5, args))) {
!                       php3tls_pval_destructor(retval);
!                       efree(retval);
!               }
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_externalEntityRefHandler() */
! 
! int
! php3i_xml_externalEntityRefHandler(XML_Parser parserPtr,
!                                                                  const XML_Char *openEntityNames,
!                                                                  const XML_Char *base,
!                                                                  const XML_Char *systemId,
!                                                                  const XML_Char *publicId)
  {
        xml_parser *parser = XML_GetUserData(parserPtr);
        int ret = 0; /* abort if no handler is set (should be configurable?) */
        XML_TLS_VARS;
  
        if (parser && parser->externalEntityRefHandler) {
!               pval *retval, *args[5];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(openEntityNames, 0, parser->target_encoding);
                args[2] = php3i_xmlcharpval(base, 0, parser->target_encoding);
                args[3] = php3i_xmlcharpval(systemId, 0, parser->target_encoding);
                args[4] = php3i_xmlcharpval(publicId, 0, parser->target_encoding);
!               if ((retval = xml_call_handler(parser, parser->externalEntityRefHandler, 5, args))) {
!                       convert_to_long(retval);
!                       ret = retval->value.lval;
!                       efree(retval);
!               } else {
!                       ret = 0;
!               }
        }
        return ret;
  }
  
--- 816,866 ----
                args[3] = php3i_xmlcharpval(systemId, 0, parser->target_encoding);
                args[4] = php3i_xmlcharpval(publicId, 0, parser->target_encoding);
                args[5] = php3i_xmlcharpval(notationName, 0, parser->target_encoding);
! 
!               xml_call_handler(parser, parser->unparsedEntityDeclHandler, 6, args);
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_notationDeclHandler() */
! void php3i_xml_notationDeclHandler(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId)
  {
        xml_parser *parser = (xml_parser *)userData;
        XML_TLS_VARS;
  
        if (parser && parser->notationDeclHandler) {
!               pval *args[5];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(notationName, 0, parser->target_encoding);
                args[2] = php3i_xmlcharpval(base, 0, parser->target_encoding);
                args[3] = php3i_xmlcharpval(systemId, 0, parser->target_encoding);
                args[4] = php3i_xmlcharpval(publicId, 0, parser->target_encoding);
! 
!               xml_call_handler(parser, parser->notationDeclHandler, 5, args);
        }
  }
  
  /* }}} */
      /* {{{ php3i_xml_externalEntityRefHandler() */
! int php3i_xml_externalEntityRefHandler(XML_Parser parserPtr, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId)
  {
        xml_parser *parser = XML_GetUserData(parserPtr);
        int ret = 0; /* abort if no handler is set (should be configurable?) */
        XML_TLS_VARS;
  
        if (parser && parser->externalEntityRefHandler) {
!               pval *args[5];
  
                args[0] = php3i_long_pval(parser->index);
                args[1] = php3i_xmlcharpval(openEntityNames, 0, parser->target_encoding);
                args[2] = php3i_xmlcharpval(base, 0, parser->target_encoding);
                args[3] = php3i_xmlcharpval(systemId, 0, parser->target_encoding);
                args[4] = php3i_xmlcharpval(publicId, 0, parser->target_encoding);
! 
!               ret = xml_call_handler(parser, parser->externalEntityRefHandler, 5, args);
        }
+ 
        return ret;
  }
  
***************
*** 943,957 ****
     Create an XML parser */
  PHP_FUNCTION(xml_parser_create)
  {
-       xml_parser *parser;
        int id, argc;
        pval *encodingArg = NULL;
        XML_Char *encoding;
-       char thisfunc[] = "xml_parser_create";
        XML_TLS_VARS;
  
        argc = ARG_COUNT(ht);
- 
        if (argc > 1 || getParameters(ht, argc, &encodingArg) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
--- 874,886 ----
     Create an XML parser */
  PHP_FUNCTION(xml_parser_create)
  {
        int id, argc;
+       xml_parser *parser;
        pval *encodingArg = NULL;
        XML_Char *encoding;
        XML_TLS_VARS;
  
        argc = ARG_COUNT(ht);
        if (argc > 1 || getParameters(ht, argc, &encodingArg) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
***************
*** 961,978 ****
                /* The supported encoding types are hardcoded here because
                 * we are limited to the encodings supported by expat/xmltok.
                 */
!               if (strncasecmp(encodingArg->value.str.val, "ISO-8859-1",
!                                               encodingArg->value.str.len) == 0) {
                        encoding = "ISO-8859-1";
!               } else if (strncasecmp(encodingArg->value.str.val, "UTF-8",
!                                               encodingArg->value.str.len) == 0) {
                        encoding = "UTF-8";
!               } else if (strncasecmp(encodingArg->value.str.val, "US-ASCII",
!                                               encodingArg->value.str.len) == 0) {
                        encoding = "US-ASCII";
                } else { /* UTF-16 not supported */
!                       php3_error(E_WARNING, "%s: unsupported source encoding \"%s\"",
!                                          thisfunc, encodingArg->value.str.val);
                        RETURN_FALSE;
                }
        } else {
--- 890,903 ----
                /* The supported encoding types are hardcoded here because
                 * we are limited to the encodings supported by expat/xmltok.
                 */
!               if (strncasecmp(encodingArg->value.str.val, "ISO-8859-1", encodingArg->value.str.len) == 0) {
                        encoding = "ISO-8859-1";
!               } else if (strncasecmp(encodingArg->value.str.val, "UTF-8", encodingArg->value.str.len) == 0) {
                        encoding = "UTF-8";
!               } else if (strncasecmp(encodingArg->value.str.val, "US-ASCII", encodingArg->value.str.len) == 0) {
                        encoding = "US-ASCII";
                } else { /* UTF-16 not supported */
!                       php3_error(E_WARNING, "xml_parser_create: unsupported source encoding \"%s\"", encodingArg->value.str.val);
                        RETURN_FALSE;
                }
        } else {
***************
*** 984,990 ****
        parser->target_encoding = encoding;
        XML_SetUserData(parser->parser, parser);
        id = php3_list_insert(parser, XML_GLOBAL(php3_xml_module).le_xml_parser);
!       parser = xml_get_parser(id, thisfunc, list);
        parser->index = id;
        parser->case_folding = 1;
  
--- 909,916 ----
        parser->target_encoding = encoding;
        XML_SetUserData(parser->parser, parser);
        id = php3_list_insert(parser, XML_GLOBAL(php3_xml_module).le_xml_parser);
! 
!       parser = xml_get_parser(id, "xml_parser_create", list);
        parser->index = id;
        parser->case_folding = 1;
  
***************
*** 1000,1019 ****
        pval *pind, *shdl, *ehdl;
        XML_TLS_VARS;
  
!       if (ARG_COUNT(ht) != 3 ||
!               getParameters(ht, 3, &pind, &shdl, &ehdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(pind);
        convert_to_string(shdl);
        convert_to_string(ehdl);
        parser = xml_get_parser(pind->value.lval, "xml_set_element_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
        xml_set_handler(&parser->startElementHandler, shdl);
        xml_set_handler(&parser->endElementHandler, ehdl);
        XML_SetElementHandler(parser->parser, php3i_xml_startElementHandler, php3i_xml_endElementHandler);
        RETVAL_TRUE;
  }
  /* }}} */
--- 926,948 ----
        pval *pind, *shdl, *ehdl;
        XML_TLS_VARS;
  
!       if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &pind, &shdl, &ehdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(shdl);
        convert_to_string(ehdl);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_set_element_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        xml_set_handler(&parser->startElementHandler, shdl);
        xml_set_handler(&parser->endElementHandler, ehdl);
        XML_SetElementHandler(parser->parser, php3i_xml_startElementHandler, php3i_xml_endElementHandler);
+ 
        RETVAL_TRUE;
  }
  /* }}} */
***************
*** 1029,1042 ****
--- 958,975 ----
        if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(hdl);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_set_character_data_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        xml_set_handler(&parser->characterDataHandler, hdl);
        XML_SetCharacterDataHandler(parser->parser, php3i_xml_characterDataHandler);
+ 
        RETVAL_TRUE;
  }
  /* }}} */
***************
*** 1052,1065 ****
--- 985,1002 ----
        if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(hdl);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_set_processing_instruction_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        xml_set_handler(&parser->processingInstructionHandler, hdl);
        XML_SetProcessingInstructionHandler(parser->parser, php3i_xml_processingInstructionHandler);
+ 
        RETVAL_TRUE;
  }
  /* }}} */
***************
*** 1075,1088 ****
--- 1012,1029 ----
        if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(hdl);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_set_default_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        xml_set_handler(&parser->defaultHandler, hdl);
        XML_SetDefaultHandler(parser->parser, php3i_xml_defaultHandler);
+ 
        RETVAL_TRUE;
  }
  /* }}} */
***************
*** 1098,1117 ****
--- 1039,1063 ----
        if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(hdl);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_set_unparsed_entity_decl_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        xml_set_handler(&parser->unparsedEntityDeclHandler, hdl);
        XML_SetUnparsedEntityDeclHandler(parser->parser, php3i_xml_unparsedEntityDeclHandler);
+ 
        RETVAL_TRUE;
  }
  /* }}} */
  
  /* {{{ proto int xml_set_notation_decl_handler(int pind, string hdl) 
     Set up notation declaration handler */
+ 
  PHP_FUNCTION(xml_set_notation_decl_handler)
  {
        xml_parser *parser;
***************
*** 1121,1134 ****
--- 1067,1084 ----
        if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(hdl);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_set_notation_decl_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        xml_set_handler(&parser->notationDeclHandler, hdl);
        XML_SetNotationDeclHandler(parser->parser, php3i_xml_notationDeclHandler);
+ 
        RETVAL_TRUE;
  }
  /* }}} */
***************
*** 1144,1157 ****
--- 1094,1111 ----
        if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(hdl);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_set_external_entity_ref_handler", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        xml_set_handler(&parser->externalEntityRefHandler, hdl);
        XML_SetExternalEntityRefHandler(parser->parser, php3i_xml_externalEntityRefHandler);
+ 
        RETVAL_TRUE;
  }
  /* }}} */
***************
*** 1160,1207 ****
     Start parsing an XML document */
  PHP_FUNCTION(xml_parse)
  {
        xml_parser *parser;
        pval *pind, *data, *final;
-       int argc, isFinal, ret;
        XML_TLS_VARS;
  
        argc = ARG_COUNT(ht);
        if (argc < 2 || argc > 3 || getParameters(ht, argc, &pind, &data, &final) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(pind);
        convert_to_string(data);
        if (argc == 3) {
                convert_to_long(final);
                isFinal = final->value.lval;
-       } else {
-               isFinal = 0;
        }
        parser = xml_get_parser(pind->value.lval, "XML_Parse", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
        /* fflush(stdout); uups, that can't be serious?!?!?*/
        ret = XML_Parse(parser->parser, data->value.str.val, data->value.str.len, isFinal);
        RETVAL_LONG(ret);
  }
  
  /* }}} */
  /* {{{ proto int xml_parse_into_struct(int pind, string data, array &struct, array &index) 
     Parsing a XML document */
- 
  PHP_FUNCTION(xml_parse_into_struct)
  {
-       xml_parser *parser;
-       pval *pind, *data, *xdata,*info = 0;
        int argc, ret;
        XML_TLS_VARS;
  
        argc = ARG_COUNT(ht);
        if (getParameters(ht, 4, &pind, &data, &xdata,&info) == SUCCESS) {
                if (!ParameterPassedByReference(ht, 4)) {
                        php3_error(E_WARNING, "Array to be filled with values must be passed by reference.");
!             RETURN_FALSE;
                }
                array_init(info);
        } else if (getParameters(ht, 3, &pind, &data, &xdata) == FAILURE) {
--- 1114,1163 ----
     Start parsing an XML document */
  PHP_FUNCTION(xml_parse)
  {
+       int argc, isFinal = 0, ret;
        xml_parser *parser;
        pval *pind, *data, *final;
        XML_TLS_VARS;
  
        argc = ARG_COUNT(ht);
        if (argc < 2 || argc > 3 || getParameters(ht, argc, &pind, &data, &final) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        convert_to_string(data);
        if (argc == 3) {
                convert_to_long(final);
                isFinal = final->value.lval;
        }
+ 
        parser = xml_get_parser(pind->value.lval, "XML_Parse", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        /* fflush(stdout); uups, that can't be serious?!?!?*/
+ 
        ret = XML_Parse(parser->parser, data->value.str.val, data->value.str.len, isFinal);
+ 
        RETVAL_LONG(ret);
  }
  
  /* }}} */
  /* {{{ proto int xml_parse_into_struct(int pind, string data, array &struct, array &index) 
     Parsing a XML document */
  PHP_FUNCTION(xml_parse_into_struct)
  {
        int argc, ret;
+       xml_parser *parser;
+       pval *pind, *data, *xdata, *info = 0;
        XML_TLS_VARS;
  
        argc = ARG_COUNT(ht);
        if (getParameters(ht, 4, &pind, &data, &xdata,&info) == SUCCESS) {
                if (!ParameterPassedByReference(ht, 4)) {
                        php3_error(E_WARNING, "Array to be filled with values must be passed by reference.");
!                       RETURN_FALSE;
                }
                array_init(info);
        } else if (getParameters(ht, 3, &pind, &data, &xdata) == FAILURE) {
***************
*** 1217,1223 ****
        convert_to_string(data);
        array_init(xdata);
  
!       parser = xml_get_parser(pind->value.lval, "XML_Parse_Into_Struct", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
--- 1173,1179 ----
        convert_to_string(data);
        array_init(xdata);
  
!       parser = xml_get_parser(pind->value.lval, "xml_parse_into_struct", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
***************
*** 1248,1258 ****
--- 1204,1216 ----
        if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
        parser = xml_get_parser(pind->value.lval, "xml_get_error_code", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        RETVAL_LONG((long)XML_GetErrorCode(parser->parser));
  }
  /* }}} */
***************
*** 1261,1278 ****
     Get XML parser error string */
  PHP_FUNCTION(xml_error_string)
  {
-       pval *code;
        char *str;
        XML_TLS_VARS;
  
        if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &code) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(code);
        str = (char *)XML_ErrorString((int)code->value.lval);
!       if (str) {
                RETVAL_STRING(str, 1);
-       }
  }
  /* }}} */
  
--- 1219,1237 ----
     Get XML parser error string */
  PHP_FUNCTION(xml_error_string)
  {
        char *str;
+       pval *code;
        XML_TLS_VARS;
  
        if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &code) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(code);
+ 
        str = (char *)XML_ErrorString((int)code->value.lval);
!       if (str)
                RETVAL_STRING(str, 1);
  }
  /* }}} */
  
***************
*** 1287,1297 ****
--- 1246,1259 ----
        if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_get_current_line_number", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        RETVAL_LONG(XML_GetCurrentLineNumber(parser->parser));
  }
  /* }}} */
***************
*** 1307,1317 ****
--- 1269,1282 ----
        if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+ 
        convert_to_long(pind);
+ 
        parser = xml_get_parser(pind->value.lval, "xml_get_current_column_number", list);
        if (parser == NULL) {
                RETURN_FALSE;
        }
+ 
        RETVAL_LONG(XML_GetCurrentColumnNumber(parser->parser));
  }
  /* }}} */
***************
*** 1327,1343 ****
--- 1292,1312 ----
        if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) {
              

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-02-07 09:51 UTC] thies at cvs dot php dot net
this has nothing to do with the xml-module as far as i can see (did some poking with gdb & purify). 

this can only be fixed by one of the parser-guys

(i sent some description directly to zeev & andi)


 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Wed May 07 15:01:31 2025 UTC