cvs: php4 /ext/xml xml.c /ext/xml/tests 007.phpt

From: Date: Sun, 12 Aug 2001 18:44:42 +0000
Subject: cvs: php4 /ext/xml xml.c /ext/xml/tests 007.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-6756@lists.php.net to get a copy of this message
thies Sun Aug 12 14:44:42 2001 EDT Added files: /php4/ext/xml/tests 007.phpt Modified files: /php4/ext/xml xml.c Log: tags need to be UTF8-decoded as well. guys, case_folding can only work when the parser target encoding equal (or compatible) with the locale setting of the system as we use toupper to "do it" Index: php4/ext/xml/xml.c diff -u php4/ext/xml/xml.c:1.90 php4/ext/xml/xml.c:1.91 --- php4/ext/xml/xml.c:1.90 Tue Jul 31 01:44:09 2001 +++ php4/ext/xml/xml.c Sun Aug 12 14:44:42 2001 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xml.c,v 1.90 2001/07/31 05:44:09 zeev Exp $ */ +/* $Id: xml.c,v 1.91 2001/08/12 18:44:42 thies Exp $ */ #define IS_EXT_MODULE #ifdef HAVE_CONFIG_H @@ -85,7 +85,7 @@ static zval *_xml_xmlchar_zval(const XML_Char *, int, const XML_Char *); static int _xml_xmlcharlen(const XML_Char *); static void _xml_add_to_info(xml_parser *parser,char *name); - +inline static char *_xml_decode_tag(xml_parser *parser, const char *tag); void _xml_startElementHandler(void *, const char *, const char **); void _xml_endElementHandler(void *, const char *); @@ -621,47 +621,55 @@ parser->curtag++; } +/* }}} */ +/* {{{ _xml_decode_tag() */ + +static char *_xml_decode_tag(xml_parser *parser, const char *tag) +{ + char *newstr; + int out_len; + + newstr = xml_utf8_decode(tag, strlen(tag), &out_len, parser->target_encoding); + + if (parser->case_folding) { + php_strtoupper(newstr, out_len); + } + + return newstr; +} /* }}} */ - /* {{{ _xml_startElementHandler() */ +/* {{{ _xml_startElementHandler() */ -void _xml_startElementHandler(void *userData, const char *name, - const char **attributes) +void _xml_startElementHandler(void *userData, const char *name, const char **attributes) { xml_parser *parser = (xml_parser *)userData; const char **attrs = attributes; + char *tag_name; + char *att, *val; + int att_len, val_len; + zval *retval, *args[3]; if (parser) { - zval *retval, *args[3]; - parser->level++; - if (parser->case_folding) { - name = php_strtoupper(estrdup(name), strlen(name)); - } + tag_name = _xml_decode_tag(parser, name); if (parser->startElementHandler) { args[0] = _xml_resource_zval(parser->index); - args[1] = _xml_string_zval(name); + args[1] = _xml_string_zval(tag_name); MAKE_STD_ZVAL(args[2]); 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 = php_strtoupper(estrdup(key), strlen(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); - } + att = _xml_decode_tag(parser, attributes[0]); + val = xml_utf8_decode(attributes[1], strlen(attributes[1]), &val_len, parser->target_encoding); + + add_assoc_stringl(args[2], att, val, val_len, 0); + attributes += 2; + + efree(att); } if ((retval = xml_call_handler(parser, parser->startElementHandler, 3, args))) { @@ -680,34 +688,27 @@ array_init(tag); array_init(atr); - _xml_add_to_info(parser,((char *) name) + parser->toffset); + _xml_add_to_info(parser,((char *) tag_name) + parser->toffset); - add_assoc_string(tag,"tag",((char *) name) + parser->toffset,1); /* cast to avoid gcc-warning */ + add_assoc_string(tag,"tag",((char *) tag_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->ltags[parser->level-1] = estrdup(tag_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 = php_strtoupper(estrdup(key), strlen(key)); - } - decoded_value = xml_utf8_decode(value, strlen(value), - &decoded_len, - parser->target_encoding); + att = _xml_decode_tag(parser, attributes[0]); + val = xml_utf8_decode(attributes[1], strlen(attributes[1]), &val_len, parser->target_encoding); - add_assoc_stringl(atr,key,decoded_value,decoded_len,0); + add_assoc_stringl(atr,att,val,val_len,0); + atcnt++; - if (parser->case_folding) { - efree(key); - } attributes += 2; + + efree(att); } if (atcnt) { @@ -720,9 +721,7 @@ zend_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(zval*),(void *) &parser->ctag); } - if (parser->case_folding) { - efree((char *)name); - } + efree(tag_name); } } @@ -732,17 +731,16 @@ void _xml_endElementHandler(void *userData, const char *name) { xml_parser *parser = (xml_parser *)userData; + char *tag_name; if (parser) { zval *retval, *args[2]; - if (parser->case_folding) { - name = php_strtoupper(estrdup(name), strlen(name)); - } + tag_name = _xml_decode_tag(parser, name); if (parser->endElementHandler) { args[0] = _xml_resource_zval(parser->index); - args[1] = _xml_string_zval(name); + args[1] = _xml_string_zval(tag_name); if ((retval = xml_call_handler(parser, parser->endElementHandler, 2, args))) { zval_dtor(retval); @@ -760,9 +758,9 @@ array_init(tag); - _xml_add_to_info(parser,((char *) name) + parser->toffset); + _xml_add_to_info(parser,((char *) tag_name) + parser->toffset); - add_assoc_string(tag,"tag",((char *) name) + parser->toffset,1); /* cast to avoid gcc-warning */ + add_assoc_string(tag,"tag",((char *) tag_name) + parser->toffset,1); /* cast to avoid gcc-warning */ add_assoc_string(tag,"type","close",1); add_assoc_long(tag,"level",parser->level); @@ -772,12 +770,12 @@ parser->lastwasopen = 0; } - if (parser->case_folding) { - efree((char *)name); - } + efree(tag_name); + if (parser->ltags) { efree(parser->ltags[parser->level-1]); } + parser->level--; } } Index: php4/ext/xml/tests/007.phpt +++ php4/ext/xml/tests/007.phpt --TEST-- xml_parse_into_struct/umlauts in tags --SKIPIF-- <?php include("skipif.inc"); ?> --FILE-- <?php function startHandler($parser,$tag,$attr) { var_dump($tag,$attr); } function endHandler($parser,$tag) { var_dump($tag); } $xmldata = '<?xml version="1.0" encoding="ISO-8859-1"?><äöü üäß="Üäß">ÄÖÜ</äöü>'; $parser = xml_parser_create('ISO-8859-1'); xml_set_element_handler($parser, "startHandler", "endHandler"); xml_parse_into_struct($parser, $xmldata, $struct, $index); var_dump($struct); ?> --GET-- --POST-- --EXPECT-- string(3) "ÄÖÜ" array(1) { ["ÜÄß"]=> string(3) "Üäß" } string(3) "ÄÖÜ" array(1) { [0]=> array(5) { ["tag"]=> string(3) "ÄÖÜ" ["type"]=> string(8) "complete" ["level"]=> int(1) ["attributes"]=> array(1) { ["ÜÄß"]=> string(3) "Üäß" } ["value"]=> string(3) "ÄÖÜ" } }

« previous php.cvs (#6756) next »