CVS update: php3/functions

From: Date: Mon, 10 May 1999 08:52:03 +0000
Subject: CVS update: php3/functions
Groups: php.dev 
Request: Send a blank email to php-dev+get-5469@lists.php.net to get a copy of this message
Date: Monday May 10, 1999 @ 4:52 Author: thies Update of /repository/php3/functions In directory php:/tmp/cvs-serv27008/functions Modified Files: php3_xml.h xml.c Log Message: added function XML_Parse_Into_Struct Index: php3/functions/php3_xml.h diff -u php3/functions/php3_xml.h:1.11 php3/functions/php3_xml.h:1.12 --- php3/functions/php3_xml.h:1.11 Thu Apr 22 09:19:50 1999 +++ php3/functions/php3_xml.h Mon May 10 04:52:02 1999 @@ -60,6 +60,17 @@ char *notationDeclHandler; char *externalEntityRefHandler; char *unknownEncodingHandler; + + pval *data; + pval *info; + int level; + int toffset; + int curtag; + pval *ctag; + char **ltags; + int lastwasopen; + int skipwhite; + XML_Char *baseURI; } xml_parser; @@ -76,13 +87,19 @@ enum php3_xml_option { PHP3_XML_OPTION_CASE_FOLDING = 1, - PHP3_XML_OPTION_TARGET_ENCODING + PHP3_XML_OPTION_TARGET_ENCODING, + PHP3_XML_OPTION_SKIP_TAGSTART, + PHP3_XML_OPTION_SKIP_WHITE }; # define RETURN_OUT_OF_MEMORY \ php3_error(E_WARNING, "Out of memory");\ RETURN_FALSE +/* for xml_parse_into_struct */ + +#define XML_MAXLEVEL 255 /* XXX this shoud be dynamic */ + PHP_FUNCTION(xml_parser_create); PHP_FUNCTION(xml_set_element_handler); PHP_FUNCTION(xml_set_character_data_handler); @@ -92,6 +109,7 @@ PHP_FUNCTION(xml_set_notation_decl_handler); PHP_FUNCTION(xml_set_external_entity_ref_handler); PHP_FUNCTION(xml_parse); +PHP_FUNCTION(xml_parse_into_struct); PHP_FUNCTION(xml_get_error_code); PHP_FUNCTION(xml_error_string); PHP_FUNCTION(xml_get_current_line_number); Index: php3/functions/xml.c diff -u php3/functions/xml.c:1.24 php3/functions/xml.c:1.25 --- php3/functions/xml.c:1.24 Thu Apr 22 09:19:51 1999 +++ php3/functions/xml.c Mon May 10 04:52:03 1999 @@ -27,7 +27,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xml.c,v 1.24 1999/04/22 13:19:51 ssb Exp $ */ +/* $Id: xml.c,v 1.25 1999/05/10 08:52:03 thies Exp $ */ #define IS_EXT_MODULE #if COMPILE_DL # if PHP_31 @@ -118,7 +118,9 @@ 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); @@ -141,6 +143,7 @@ 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) @@ -231,6 +234,9 @@ REGISTER_LONG_CONSTANT("XML_OPTION_CASE_FOLDING", PHP3_XML_OPTION_CASE_FOLDING, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("XML_OPTION_TARGET_ENCODING", PHP3_XML_OPTION_TARGET_ENCODING, CONST_CS|CONST_PERSISTENT); + 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; } @@ -313,6 +319,9 @@ if (parser->parser) { XML_ParserFree(parser->parser); } + if (parser->ltags) { + efree(parser->ltags); + } if (parser->startElementHandler) { efree(parser->startElementHandler); } @@ -590,47 +599,126 @@ return len; } +/* }}} */ +/* {{{ php3i_add_to_info */ +static void php3i_add_to_info(xml_parser *parser,char *name) +{ + 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() */ +/* {{{ 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 && parser->startElementHandler) { + if (parser) { pval *retval, *args[3]; + parser->level++; + if (parser->case_folding) { name = _php3_strtoupper(estrdup(name)); } - args[0] = php3i_long_pval(parser->index); - 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)); + + if (parser->startElementHandler) { + args[0] = php3i_long_pval(parser->index); + 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_string(args[2], key, decoded_value, 0); + if (parser->case_folding) { + efree(key); + } + attributes += 2; } - decoded_value = xml_utf8_decode(value, strlen(value), - &decoded_len, - parser->target_encoding); - - add_assoc_string(args[2], key, decoded_value, 0); - if (parser->case_folding) { - efree(key); + + if ((retval = xml_call_handler(parser, parser->startElementHandler, 3, args))) { + php3tls_pval_destructor(retval); + efree(retval); } - 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); + } + attributes += 2; + } + + 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) { efree((char *)name); } @@ -645,21 +733,48 @@ xml_parser *parser = (xml_parser *)userData; XML_TLS_VARS; - if (parser && parser->endElementHandler) { + if (parser) { pval *retval, *args[2]; if (parser->case_folding) { name = _php3_strtoupper(estrdup(name)); } - 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->endElementHandler) { + 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); + + 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","close",1); + add_assoc_long(&tag,"level",parser->level); + + _php3_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(pval),NULL); + } + + parser->lastwasopen = 0; } + if (parser->case_folding) { efree((char *)name); } + efree(parser->ltags[parser->level-1]); + parser->level--; } } @@ -671,14 +786,60 @@ xml_parser *parser = (xml_parser *)userData; XML_TLS_VARS; - if (parser && parser->characterDataHandler) { + if (parser) { pval *retval, *args[2]; - 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->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; + } + } + if (doprint || (! parser->skipwhite)) { + if (parser->lastwasopen) { + add_assoc_string(parser->ctag,"value",decoded_value,0); + } else { + pval tag; + + 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); + } } } } @@ -1064,12 +1225,62 @@ if (parser == NULL) { RETURN_FALSE; } - fflush(stdout); + /* 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) { + WRONG_PARAM_COUNT; + } + + if (!ParameterPassedByReference(ht, 3)) { + php3_error(E_WARNING, "Array to be filled with values must be passed by reference."); + RETURN_FALSE; + } + convert_to_long(pind); + convert_to_string(data); + array_init(xdata); + + parser = xml_get_parser(pind->value.lval, "XML_Parse_Into_Struct", list); + if (parser == NULL) { + RETURN_FALSE; + } + + parser->data = xdata; + parser->info = info; + parser->level = 0; + parser->ltags = emalloc(XML_MAXLEVEL * sizeof(char *)); + + XML_SetDefaultHandler(parser->parser, php3i_xml_defaultHandler); + 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); + + RETVAL_LONG(ret); +} +/* }}} */ + /* {{{ proto int xml_get_error_code(int pind) Get XML parser error code */ PHP_FUNCTION(xml_get_error_code) @@ -1210,6 +1421,14 @@ case PHP3_XML_OPTION_CASE_FOLDING: convert_to_long(val); parser->case_folding = val->value.lval; + break; + case PHP3_XML_OPTION_SKIP_TAGSTART: + convert_to_long(val); + parser->toffset = val->value.lval; + break; + case PHP3_XML_OPTION_SKIP_WHITE: + convert_to_long(val); + parser->skipwhite = val->value.lval; break; case PHP3_XML_OPTION_TARGET_ENCODING: { xml_encoding *enc = xml_get_encoding(val->value.str.val); -- PHP Development Mailing List http://www.php.net/ To unsubscribe send an empty message to php-dev-unsubscribe@lists.php.net For help: php-dev-help@lists.php.net

« previous php.dev (#5469) next »