diff options
author | Thies C. Arntzen <thies@php.net> | 1999-09-24 18:02:58 +0000 |
---|---|---|
committer | Thies C. Arntzen <thies@php.net> | 1999-09-24 18:02:58 +0000 |
commit | c626d9e47bc189e9908a8e718439c1f3098bbb9b (patch) | |
tree | 34005af117aa63f7467127815310bfde00a9a991 /ext/xml/xml.c | |
parent | 79e729d6b274db58b5b8c5c49042e0e0f88a80a9 (diff) | |
download | php-git-c626d9e47bc189e9908a8e718439c1f3098bbb9b.tar.gz |
updated XML (only partly tested)
Diffstat (limited to 'ext/xml/xml.c')
-rw-r--r-- | ext/xml/xml.c | 240 |
1 files changed, 122 insertions, 118 deletions
diff --git a/ext/xml/xml.c b/ext/xml/xml.c index b26b97c842..5325309789 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -13,6 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Stig Sæther Bakken <ssb@fast.no> | + | Thies C. Arntzen <thies@digicol.de> | +----------------------------------------------------------------------+ */ @@ -119,7 +120,7 @@ PHP_RSHUTDOWN_FUNCTION(xml); PHP_MINFO_FUNCTION(xml); static void xml_destroy_parser(xml_parser *); -static void xml_set_handler(char **, pval *); +static void xml_set_handler(char **, pval **); inline static unsigned short xml_encode_iso_8859_1(unsigned char); inline static char xml_decode_iso_8859_1(unsigned short); inline static unsigned short xml_encode_us_ascii(unsigned char); @@ -335,14 +336,14 @@ xml_destroy_parser(xml_parser *parser) /* {{{ xml_set_handler() */ static void -xml_set_handler(char **nameBufp, pval *data) +xml_set_handler(char **nameBufp, pval **data) { - if (data->value.str.len > 0) { + if ((*data)->value.str.len > 0) { if (*nameBufp != NULL) { efree(*nameBufp); } - convert_to_string(data); - *nameBufp = estrndup(data->value.str.val, data->value.str.len); + convert_to_string_ex(data); + *nameBufp = estrndup((*data)->value.str.val, (*data)->value.str.len); } else { if (*nameBufp != NULL) { efree(*nameBufp); @@ -361,17 +362,26 @@ xml_call_handler(xml_parser *parser, char *funcName, int argc, pval **argv) if (parser && funcName) { pval *retval, *func; - int i; + int i; + int result; func = php3i_string_pval(funcName); - retval = emalloc(sizeof(pval)); + + MAKE_STD_ZVAL(retval); + retval->type = IS_BOOL; + retval->value.lval = IS_BOOL; + /* 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(EG(function_table), NULL, func, retval, argc, argv) == FAILURE) { + + result = call_user_function(EG(function_table), NULL, func, retval, argc, argv); + + if (result == FAILURE) { + php_error(E_WARNING, "Unable to call %s()",funcName); + zval_dtor(retval); efree(retval); - return NULL; } zval_dtor(func); efree(func); @@ -379,7 +389,11 @@ xml_call_handler(xml_parser *parser, char *funcName, int argc, pval **argv) zval_dtor(argv[i]); efree(argv[i]); } - return retval; + if (result == FAILURE) { + return NULL; + } else { + return retval; + } } return NULL; } @@ -987,34 +1001,34 @@ PHP_FUNCTION(xml_parser_create) { xml_parser *parser; int argc; - pval *encodingArg = NULL; + pval **encodingArg; XML_Char *encoding; char thisfunc[] = "xml_parser_create"; XMLLS_FETCH(); argc = ARG_COUNT(ht); - if (argc > 1 || getParameters(ht, argc, &encodingArg) == FAILURE) { + if (argc > 1 || getParametersEx(argc, &encodingArg) == FAILURE) { WRONG_PARAM_COUNT; } if (argc == 1) { - convert_to_string(encodingArg); + convert_to_string_ex(encodingArg); /* 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) { + 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) { + } 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) { + } else if (strncasecmp((*encodingArg)->value.str.val, "US-ASCII", + (*encodingArg)->value.str.len) == 0) { encoding = "US-ASCII"; } else { /* UTF-16 not supported */ php_error(E_WARNING, "%s: unsupported source encoding \"%s\"", - thisfunc, encodingArg->value.str.val); + thisfunc, (*encodingArg)->value.str.val); RETURN_FALSE; } } else { @@ -1037,17 +1051,14 @@ PHP_FUNCTION(xml_parser_create) PHP_FUNCTION(xml_set_element_handler) { xml_parser *parser; - pval *pind, *shdl, *ehdl; + pval **pind, **shdl, **ehdl; if (ARG_COUNT(ht) != 3 || - getParameters(ht, 3, &pind, &shdl, &ehdl) == FAILURE) { + getParametersEx(3, &pind, &shdl, &ehdl) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); - - convert_to_string(shdl); - convert_to_string(ehdl); + ZEND_FETCH_RESOURCE(parser,xml_parser *,pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->startElementHandler, shdl); xml_set_handler(&parser->endElementHandler, ehdl); @@ -1061,15 +1072,13 @@ PHP_FUNCTION(xml_set_element_handler) PHP_FUNCTION(xml_set_character_data_handler) { xml_parser *parser; - pval *pind, *hdl; + pval **pind, **hdl; - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) { + if (ARG_COUNT(ht) != 2 || getParametersEx(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); - - convert_to_string(hdl); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->characterDataHandler, hdl); XML_SetCharacterDataHandler(parser->parser, php3i_xml_characterDataHandler); @@ -1082,15 +1091,13 @@ PHP_FUNCTION(xml_set_character_data_handler) PHP_FUNCTION(xml_set_processing_instruction_handler) { xml_parser *parser; - pval *pind, *hdl; + pval **pind, **hdl; - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) { + if (ARG_COUNT(ht) != 2 || getParametersEx(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); - - convert_to_string(hdl); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->processingInstructionHandler, hdl); XML_SetProcessingInstructionHandler(parser->parser, php3i_xml_processingInstructionHandler); @@ -1103,14 +1110,12 @@ PHP_FUNCTION(xml_set_processing_instruction_handler) PHP_FUNCTION(xml_set_default_handler) { xml_parser *parser; - pval *pind, *hdl; + pval **pind, **hdl; - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) { + if (ARG_COUNT(ht) != 2 || getParametersEx(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); - - convert_to_string(hdl); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->defaultHandler, hdl); XML_SetDefaultHandler(parser->parser, php3i_xml_defaultHandler); @@ -1123,15 +1128,13 @@ PHP_FUNCTION(xml_set_default_handler) PHP_FUNCTION(xml_set_unparsed_entity_decl_handler) { xml_parser *parser; - pval *pind, *hdl; + pval **pind, **hdl; - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) { + if (ARG_COUNT(ht) != 2 || getParametersEx(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); - - convert_to_string(hdl); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->unparsedEntityDeclHandler, hdl); XML_SetUnparsedEntityDeclHandler(parser->parser, php3i_xml_unparsedEntityDeclHandler); @@ -1144,14 +1147,12 @@ PHP_FUNCTION(xml_set_unparsed_entity_decl_handler) PHP_FUNCTION(xml_set_notation_decl_handler) { xml_parser *parser; - pval *pind, *hdl; + pval **pind, **hdl; - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) { + if (ARG_COUNT(ht) != 2 || getParametersEx(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); - - convert_to_string(hdl); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->notationDeclHandler, hdl); XML_SetNotationDeclHandler(parser->parser, php3i_xml_notationDeclHandler); @@ -1164,14 +1165,12 @@ PHP_FUNCTION(xml_set_notation_decl_handler) PHP_FUNCTION(xml_set_external_entity_ref_handler) { xml_parser *parser; - pval *pind, *hdl; + pval **pind, **hdl; - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &hdl) == FAILURE) { + if (ARG_COUNT(ht) != 2 || getParametersEx(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); - - convert_to_string(hdl); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->externalEntityRefHandler, hdl); XML_SetExternalEntityRefHandler(parser->parser, php3i_xml_externalEntityRefHandler); @@ -1184,25 +1183,25 @@ PHP_FUNCTION(xml_set_external_entity_ref_handler) PHP_FUNCTION(xml_parse) { xml_parser *parser; - pval *pind, *data, *final; + pval **pind, **data, **final; int argc, isFinal, ret; argc = ARG_COUNT(ht); - if (argc < 2 || argc > 3 || getParameters(ht, argc, &pind, &data, &final) == FAILURE) { + if (argc < 2 || argc > 3 || getParametersEx(argc, &pind, &data, &final) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); - convert_to_string(data); + convert_to_string_ex(data); if (argc == 3) { - convert_to_long(final); - isFinal = final->value.lval; + convert_to_long_ex(final); + isFinal = (*final)->value.lval; } else { isFinal = 0; } - ret = XML_Parse(parser->parser, data->value.str.val, data->value.str.len, isFinal); + ret = XML_Parse(parser->parser, (*data)->value.str.val, (*data)->value.str.len, isFinal); RETVAL_LONG(ret); } @@ -1213,17 +1212,18 @@ PHP_FUNCTION(xml_parse) PHP_FUNCTION(xml_parse_into_struct) { xml_parser *parser; - pval *pind, *data, *xdata,*info = 0; + pval **pind, **data, **xdata, **info = 0; int argc, ret; argc = ARG_COUNT(ht); - if (getParameters(ht, 4, &pind, &data, &xdata,&info) == SUCCESS) { + if (getParametersEx(4, &pind, &data, &xdata,&info) == SUCCESS) { if (!ParameterPassedByReference(ht, 4)) { php_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) { + pval_destructor(*info); + array_init(*info); + } else if (getParametersEx(3, &pind, &data, &xdata) == FAILURE) { WRONG_PARAM_COUNT; } @@ -1232,13 +1232,15 @@ PHP_FUNCTION(xml_parse_into_struct) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); - convert_to_string(data); - array_init(xdata); + convert_to_string_ex(data); + pval_destructor(*xdata); + array_init(*xdata); - parser->data = xdata; - parser->info = info; + parser->data = *xdata; + if (info) + parser->info = *info; parser->level = 0; parser->ltags = emalloc(XML_MAXLEVEL * sizeof(char *)); @@ -1246,7 +1248,7 @@ PHP_FUNCTION(xml_parse_into_struct) XML_SetElementHandler(parser->parser, php3i_xml_startElementHandler, php3i_xml_endElementHandler); XML_SetCharacterDataHandler(parser->parser, php3i_xml_characterDataHandler); - ret = XML_Parse(parser->parser, data->value.str.val, data->value.str.len, 1); + ret = XML_Parse(parser->parser, (*data)->value.str.val, (*data)->value.str.len, 1); RETVAL_LONG(ret); } @@ -1257,12 +1259,12 @@ PHP_FUNCTION(xml_parse_into_struct) PHP_FUNCTION(xml_get_error_code) { xml_parser *parser; - pval *pind; + pval **pind; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &pind) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); RETVAL_LONG((long)XML_GetErrorCode(parser->parser)); } @@ -1272,14 +1274,14 @@ PHP_FUNCTION(xml_get_error_code) Get XML parser error string */ PHP_FUNCTION(xml_error_string) { - pval *code; + pval **code; char *str; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &code) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &code) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long(code); - str = (char *)XML_ErrorString((int)code->value.lval); + convert_to_long_ex(code); + str = (char *)XML_ErrorString((int)(*code)->value.lval); if (str) { RETVAL_STRING(str, 1); } @@ -1291,12 +1293,12 @@ PHP_FUNCTION(xml_error_string) PHP_FUNCTION(xml_get_current_line_number) { xml_parser *parser; - pval *pind; + pval **pind; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &pind) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); RETVAL_LONG(XML_GetCurrentLineNumber(parser->parser)); } @@ -1308,12 +1310,12 @@ PHP_FUNCTION(xml_get_current_line_number) PHP_FUNCTION(xml_get_current_column_number) { xml_parser *parser; - pval *pind; + pval **pind; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &pind) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); RETVAL_LONG(XML_GetCurrentColumnNumber(parser->parser)); } @@ -1324,12 +1326,12 @@ PHP_FUNCTION(xml_get_current_column_number) PHP_FUNCTION(xml_get_current_byte_index) { xml_parser *parser; - pval *pind; + pval **pind; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &pind) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); RETVAL_LONG(XML_GetCurrentByteIndex(parser->parser)); } @@ -1339,14 +1341,14 @@ PHP_FUNCTION(xml_get_current_byte_index) Free an XML parser */ PHP_FUNCTION(xml_parser_free) { - pval *pind; + pval **pind; xml_parser *parser; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &pind) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &pind) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); if (php3_list_delete(parser->index) == FAILURE) { RETURN_FALSE; @@ -1361,34 +1363,36 @@ PHP_FUNCTION(xml_parser_free) PHP_FUNCTION(xml_parser_set_option) { xml_parser *parser; - pval *pind, *opt, *val; + pval **pind, **opt, **val; char thisfunc[] = "xml_parser_set_option"; - if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &pind, &opt, &val) == FAILURE) { + if (ARG_COUNT(ht) != 3 || getParametersEx(3, &pind, &opt, &val) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); - convert_to_long(opt); + convert_to_long_ex(opt); - switch (opt->value.lval) { + switch ((*opt)->value.lval) { case PHP3_XML_OPTION_CASE_FOLDING: - convert_to_long(val); - parser->case_folding = val->value.lval; + convert_to_long_ex(val); + parser->case_folding = (*val)->value.lval; break; case PHP3_XML_OPTION_SKIP_TAGSTART: - convert_to_long(val); - parser->toffset = val->value.lval; + convert_to_long_ex(val); + parser->toffset = (*val)->value.lval; break; case PHP3_XML_OPTION_SKIP_WHITE: - convert_to_long(val); - parser->skipwhite = val->value.lval; + convert_to_long_ex(val); + parser->skipwhite = (*val)->value.lval; break; case PHP3_XML_OPTION_TARGET_ENCODING: { - xml_encoding *enc = xml_get_encoding(val->value.str.val); + xml_encoding *enc; + convert_to_string_ex(val); + enc = xml_get_encoding((*val)->value.str.val); if (enc == NULL) { php_error(E_WARNING, "%s: unsupported target encoding \"%s\"", - thisfunc, val->value.str.val); + thisfunc, (*val)->value.str.val); RETURN_FALSE; } parser->target_encoding = enc->name; @@ -1408,17 +1412,17 @@ PHP_FUNCTION(xml_parser_set_option) PHP_FUNCTION(xml_parser_get_option) { xml_parser *parser; - pval *pind, *opt; + pval **pind, **opt; char thisfunc[] = "xml_parser_get_option"; - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &pind, &opt) == FAILURE) { + if (ARG_COUNT(ht) != 2 || getParametersEx(2, &pind, &opt) == FAILURE) { WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser); + ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); - convert_to_long(opt); + convert_to_long_ex(opt); - switch (opt->value.lval) { + switch ((*opt)->value.lval) { case PHP3_XML_OPTION_CASE_FOLDING: RETURN_LONG(parser->case_folding); break; @@ -1438,15 +1442,15 @@ PHP_FUNCTION(xml_parser_get_option) Encodes an ISO-8859-1 string to UTF-8 */ PHP_FUNCTION(utf8_encode) { - pval *arg; + pval **arg; XML_Char *encoded; int len; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &arg) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string(arg); - encoded = xml_utf8_encode(arg->value.str.val, arg->value.str.len, &len, "ISO-8859-1"); + convert_to_string_ex(arg); + encoded = xml_utf8_encode((*arg)->value.str.val, (*arg)->value.str.len, &len, "ISO-8859-1"); if (encoded == NULL) { RETURN_FALSE; } @@ -1458,15 +1462,15 @@ PHP_FUNCTION(utf8_encode) Converts a UTF-8 encoded string to ISO-8859-1 */ PHP_FUNCTION(utf8_decode) { - pval *arg; + pval **arg; XML_Char *decoded; int len; - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) { + if (ARG_COUNT(ht) != 1 || getParametersEx(1, &arg) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string(arg); - decoded = xml_utf8_decode(arg->value.str.val, arg->value.str.len, &len, "ISO-8859-1"); + convert_to_string_ex(arg); + decoded = xml_utf8_decode((*arg)->value.str.val, (*arg)->value.str.len, &len, "ISO-8859-1"); if (decoded == NULL) { RETURN_FALSE; } |