Annotation of embedaddon/php/ext/xml/compat.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1997-2012 The PHP Group                                |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 3.01 of the PHP license,      |
        !             8:    | that is bundled with this package in the file LICENSE, and is        |
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.php.net/license/3_01.txt                                  |
        !            11:    | If you did not receive a copy of the PHP license and are unable to   |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@php.net so we can mail you a copy immediately.               |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: Sterling Hughes <sterling@php.net>                          |
        !            16:    +----------------------------------------------------------------------+
        !            17:  */
        !            18: 
        !            19: #include "php.h"
        !            20: #if defined(HAVE_LIBXML) && (defined(HAVE_XML) || defined(HAVE_XMLRPC)) && !defined(HAVE_LIBEXPAT)
        !            21: #include "expat_compat.h"
        !            22: 
        !            23: typedef struct _php_xml_ns {
        !            24:        xmlNsPtr nsptr;
        !            25:        int ref_count;
        !            26:        void *next;
        !            27:        void *prev;
        !            28: } php_xml_ns;
        !            29: 
        !            30: #ifdef LIBXML_EXPAT_COMPAT
        !            31: 
        !            32: #define IS_NS_DECL(__ns) \
        !            33:        ((__ns) != NULL && strlen(__ns) == 5 && *(__ns) == 'x' && *((__ns)+1) == 'm' && \
        !            34:         *((__ns)+2) == 'l' && *((__ns)+3) == 'n' && *((__ns)+4) == 's')
        !            35: 
        !            36: static void 
        !            37: _qualify_namespace(XML_Parser parser, const xmlChar *name, const xmlChar *URI, xmlChar **qualified)
        !            38: {
        !            39:        if (URI) {
        !            40:                        /* Use libxml functions otherwise its memory deallocation is screwed up */
        !            41:                        *qualified = xmlStrdup(URI);
        !            42:                        *qualified = xmlStrncat(*qualified, parser->_ns_seperator, 1);
        !            43:                        *qualified = xmlStrncat(*qualified, name, xmlStrlen(name));
        !            44:        } else {
        !            45:                *qualified = xmlStrdup(name);
        !            46:        }
        !            47: }
        !            48: 
        !            49: static void
        !            50: _start_element_handler(void *user, const xmlChar *name, const xmlChar **attributes)
        !            51: {
        !            52:        XML_Parser  parser = (XML_Parser) user;
        !            53:        xmlChar    *qualified_name = NULL;
        !            54: 
        !            55:        if (parser->h_start_element == NULL) {
        !            56:                if (parser->h_default) {
        !            57:                        int attno = 0;
        !            58: 
        !            59:                        qualified_name = xmlStrncatNew((xmlChar *)"<", name, xmlStrlen(name));
        !            60:                        if (attributes) {
        !            61:                                while (attributes[attno] != NULL) {
        !            62:                                        int att_len;
        !            63:                                        char *att_string, *att_name, *att_value;
        !            64: 
        !            65:                                        att_name = (char *)attributes[attno++];
        !            66:                                        att_value = (char *)attributes[attno++];
        !            67: 
        !            68:                                        att_len = spprintf(&att_string, 0, " %s=\"%s\"", att_name, att_value);
        !            69: 
        !            70:                                        qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_string, att_len);
        !            71:                                        efree(att_string);
        !            72:                                }
        !            73: 
        !            74:                        }
        !            75:                        qualified_name = xmlStrncat(qualified_name, (xmlChar *)">", 1);
        !            76:                        parser->h_default(parser->user, (const XML_Char *) qualified_name, xmlStrlen(qualified_name));
        !            77:                        xmlFree(qualified_name);
        !            78:                }
        !            79:                return;
        !            80:        }
        !            81: 
        !            82:        qualified_name = xmlStrdup(name);
        !            83: 
        !            84:        parser->h_start_element(parser->user, (const XML_Char *) qualified_name, (const XML_Char **) attributes);
        !            85: 
        !            86:        xmlFree(qualified_name);
        !            87: }
        !            88: 
        !            89: static void
        !            90: _start_element_handler_ns(void *user, const xmlChar *name, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar ** namespaces, int nb_attributes, int nb_defaulted, const xmlChar ** attributes)
        !            91: {
        !            92:        XML_Parser  parser = (XML_Parser) user;
        !            93:        xmlChar    *qualified_name = NULL;
        !            94:        xmlChar **attrs = NULL;
        !            95:        int i;
        !            96:        int z = 0;
        !            97:        int y = 0;
        !            98:        
        !            99:        if (nb_namespaces > 0 && parser->h_start_ns != NULL) {
        !           100:                for (i = 0; i < nb_namespaces; i += 1) {
        !           101:                        parser->h_start_ns(parser->user, (const XML_Char *) namespaces[y], (const XML_Char *) namespaces[y+1]);
        !           102:                        y += 2;
        !           103:                }
        !           104:                y = 0;
        !           105:        }
        !           106:        
        !           107:        if (parser->h_start_element == NULL) {
        !           108:                if (parser->h_default) {
        !           109: 
        !           110:                        if (prefix) {
        !           111:                                qualified_name = xmlStrncatNew((xmlChar *)"<", prefix, xmlStrlen(prefix));
        !           112:                                qualified_name = xmlStrncat(qualified_name, (xmlChar *)":", 1);
        !           113:                                qualified_name = xmlStrncat(qualified_name, name, xmlStrlen(name));
        !           114:                        } else {
        !           115:                                qualified_name = xmlStrncatNew((xmlChar *)"<", name, xmlStrlen(name));
        !           116:                        }
        !           117:                        
        !           118:                        if (namespaces) {
        !           119:                                int i, j;
        !           120:                                for (i = 0,j = 0;j < nb_namespaces;j++) {
        !           121:                                        int ns_len;
        !           122:                                        char *ns_string, *ns_prefix, *ns_url;
        !           123:                                        
        !           124:                                        ns_prefix = (char *) namespaces[i++];
        !           125:                                        ns_url = (char *) namespaces[i++];
        !           126:                                        
        !           127:                                        if (ns_prefix) {
        !           128:                                                ns_len = spprintf(&ns_string, 0, " xmlns:%s=\"%s\"", ns_prefix, ns_url);
        !           129:                                        } else {
        !           130:                                                ns_len = spprintf(&ns_string, 0, " xmlns=\"%s\"", ns_url);
        !           131:                                        }
        !           132:                                        qualified_name = xmlStrncat(qualified_name, (xmlChar *)ns_string, ns_len);
        !           133:                                        
        !           134:                                        efree(ns_string);
        !           135:                                }
        !           136:                        }
        !           137:                        
        !           138:                        if (attributes) {
        !           139:                                for (i = 0; i < nb_attributes; i += 1) {
        !           140:                                        int att_len;
        !           141:                                        char *att_string, *att_name, *att_value, *att_prefix, *att_valueend;
        !           142: 
        !           143:                                        att_name = (char *) attributes[y++];
        !           144:                                        att_prefix = (char *)attributes[y++];
        !           145:                                        y++;
        !           146:                                        att_value = (char *)attributes[y++];
        !           147:                                        att_valueend = (char *)attributes[y++];
        !           148: 
        !           149:                                        if (att_prefix) {
        !           150:                                                att_len = spprintf(&att_string, 0, " %s:%s=\"", att_prefix, att_name);
        !           151:                                        } else {
        !           152:                                                att_len = spprintf(&att_string, 0, " %s=\"", att_name);
        !           153:                                        }
        !           154: 
        !           155:                                        qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_string, att_len);
        !           156:                                        qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_value, att_valueend - att_value);
        !           157:                                        qualified_name = xmlStrncat(qualified_name, (xmlChar *)"\"", 1);
        !           158:                                        
        !           159:                                        efree(att_string);
        !           160:                                }
        !           161: 
        !           162:                        }
        !           163:                        qualified_name = xmlStrncat(qualified_name, (xmlChar *)">", 1);
        !           164:                        parser->h_default(parser->user, (const XML_Char *) qualified_name, xmlStrlen(qualified_name));
        !           165:                        xmlFree(qualified_name);
        !           166:                }
        !           167:                return;
        !           168:        }
        !           169:        _qualify_namespace(parser, name, URI, &qualified_name);
        !           170:        
        !           171:        if (attributes != NULL) {
        !           172:                xmlChar    *qualified_name_attr = NULL;
        !           173:                attrs = safe_emalloc((nb_attributes  * 2) + 1, sizeof(int *), 0);
        !           174: 
        !           175:                for (i = 0; i < nb_attributes; i += 1) {
        !           176: 
        !           177:                        if (attributes[y+1] != NULL) {
        !           178:                                _qualify_namespace(parser, attributes[y] , attributes[y + 2], &qualified_name_attr);
        !           179:                        } else {
        !           180:                                qualified_name_attr = xmlStrdup(attributes[y]);
        !           181:                        }
        !           182:                        attrs[z] = qualified_name_attr;
        !           183:                        attrs[z + 1] = xmlStrndup(attributes[y + 3] , (int) (attributes[y + 4] - attributes[y + 3]));
        !           184:                        z += 2;
        !           185:                        y += 5;
        !           186:                }
        !           187: 
        !           188:                attrs[z] = NULL;
        !           189:        }
        !           190:        parser->h_start_element(parser->user, (const XML_Char *) qualified_name, (const XML_Char **) attrs);
        !           191:        if (attrs) {
        !           192:                for (i = 0; i < z; i++) {
        !           193:                        xmlFree(attrs[i]);
        !           194:                }
        !           195:                efree(attrs);
        !           196:        }
        !           197:        xmlFree(qualified_name);
        !           198: }
        !           199: 
        !           200: static void
        !           201: _namespace_handler(XML_Parser parser, xmlNsPtr nsptr)
        !           202: {
        !           203:        if (nsptr != NULL) {
        !           204:                _namespace_handler(parser, nsptr->next);
        !           205:                parser->h_end_ns(parser->user, nsptr->prefix);
        !           206:        }
        !           207: }
        !           208: 
        !           209: static void
        !           210: _end_element_handler(void *user, const xmlChar *name)
        !           211: {
        !           212:        xmlChar    *qualified_name;
        !           213:        XML_Parser  parser = (XML_Parser) user;
        !           214: 
        !           215:        if (parser->h_end_element == NULL) {
        !           216:                if (parser->h_default) {
        !           217:                        char *end_element;
        !           218: 
        !           219:                        spprintf(&end_element, 0, "</%s>", (char *)name);
        !           220:                        parser->h_default(parser->user, (const XML_Char *) end_element, strlen(end_element));
        !           221:                        efree(end_element);
        !           222:                }
        !           223:                return;
        !           224:        }
        !           225:        
        !           226:        qualified_name = xmlStrdup(name);
        !           227: 
        !           228:        parser->h_end_element(parser->user, (const XML_Char *) qualified_name);
        !           229: 
        !           230:        xmlFree(qualified_name);
        !           231: }
        !           232: 
        !           233: static void
        !           234: _end_element_handler_ns(void *user, const xmlChar *name, const xmlChar * prefix, const xmlChar *URI)
        !           235: {
        !           236:        xmlChar    *qualified_name;
        !           237:        XML_Parser  parser = (XML_Parser) user;
        !           238: 
        !           239:        if (parser->h_end_element == NULL) {
        !           240:                if (parser->h_default) {
        !           241:                        char *end_element;
        !           242:                        int end_element_len;
        !           243: 
        !           244:                        if (prefix) {
        !           245:                                end_element_len = spprintf(&end_element, 0, "</%s:%s>", (char *) prefix, (char *)name);
        !           246:                        } else {
        !           247:                                end_element_len = spprintf(&end_element, 0, "</%s>", (char *)name);
        !           248:                        }
        !           249:                        parser->h_default(parser->user, (const XML_Char *) end_element, end_element_len);
        !           250:                        efree(end_element);
        !           251:                }
        !           252:                return;
        !           253:        }
        !           254: 
        !           255:        _qualify_namespace(parser, name, URI,  &qualified_name);
        !           256: 
        !           257:        parser->h_end_element(parser->user, (const XML_Char *) qualified_name);
        !           258: 
        !           259:        xmlFree(qualified_name);
        !           260: }
        !           261: 
        !           262: static void
        !           263: _cdata_handler(void *user, const xmlChar *cdata, int cdata_len)
        !           264: {
        !           265:        XML_Parser parser = (XML_Parser) user;
        !           266: 
        !           267:        if (parser->h_cdata == NULL) {
        !           268:                if (parser->h_default) {
        !           269:                        parser->h_default(parser->user, (const XML_Char *) cdata, cdata_len);
        !           270:                }
        !           271:                return;
        !           272:        }
        !           273: 
        !           274:        parser->h_cdata(parser->user, (const XML_Char *) cdata, cdata_len);
        !           275: }
        !           276: 
        !           277: static void
        !           278: _pi_handler(void *user, const xmlChar *target, const xmlChar *data)
        !           279: {
        !           280:        XML_Parser parser = (XML_Parser) user;
        !           281: 
        !           282:        if (parser->h_pi == NULL) {
        !           283:                if (parser->h_default) {
        !           284:                        char    *full_pi;
        !           285:                        spprintf(&full_pi, 0, "<?%s %s?>", (char *)target, (char *)data);
        !           286:                        parser->h_default(parser->user, (const XML_Char *) full_pi, strlen(full_pi));
        !           287:                        efree(full_pi);
        !           288:                }
        !           289:                return;
        !           290:        }
        !           291: 
        !           292:        parser->h_pi(parser->user, (const XML_Char *) target, (const XML_Char *) data);
        !           293: }
        !           294: 
        !           295: static void
        !           296: _unparsed_entity_decl_handler(void *user, 
        !           297:                               const xmlChar *name, 
        !           298:                                                          const xmlChar *pub_id, 
        !           299:                                                          const xmlChar *sys_id, 
        !           300:                                                          const xmlChar *notation)
        !           301: {
        !           302:        XML_Parser parser = (XML_Parser) user;
        !           303: 
        !           304:        if (parser->h_unparsed_entity_decl == NULL) {
        !           305:                return;
        !           306:        }
        !           307: 
        !           308:        parser->h_unparsed_entity_decl(parser->user, name, NULL, sys_id, pub_id, notation);
        !           309: }
        !           310: 
        !           311: static void
        !           312: _notation_decl_handler(void *user, const xmlChar *notation, const xmlChar *pub_id, const xmlChar *sys_id)
        !           313: {
        !           314:        XML_Parser parser = (XML_Parser) user;
        !           315: 
        !           316:        if (parser->h_notation_decl == NULL) {
        !           317:                return;
        !           318:        }
        !           319: 
        !           320:        parser->h_notation_decl(parser->user, notation, NULL, sys_id, pub_id);
        !           321: }
        !           322: 
        !           323: static void
        !           324: _build_comment(const xmlChar *data, int data_len, xmlChar **comment, int *comment_len)
        !           325: {
        !           326:        *comment_len = data_len + 7;
        !           327:        
        !           328:        *comment = xmlMalloc(*comment_len + 1);
        !           329:        memcpy(*comment, "<!--", 4);
        !           330:        memcpy(*comment + 4, data, data_len);
        !           331:        memcpy(*comment + 4 + data_len, "-->", 3);
        !           332: 
        !           333:        (*comment)[*comment_len] = '\0';
        !           334: }
        !           335: 
        !           336: static void
        !           337: _comment_handler(void *user, const xmlChar *comment)
        !           338: {
        !           339:        XML_Parser parser = (XML_Parser) user;
        !           340: 
        !           341:        if (parser->h_default) {
        !           342:                xmlChar *d_comment;
        !           343:                int      d_comment_len;
        !           344: 
        !           345:                _build_comment(comment, xmlStrlen(comment), &d_comment, &d_comment_len);
        !           346:                parser->h_default(parser->user, d_comment, d_comment_len);
        !           347:                xmlFree(d_comment);
        !           348:        }
        !           349: }
        !           350: 
        !           351: static void
        !           352: _build_entity(const xmlChar *name, int len, xmlChar **entity, int *entity_len) 
        !           353: {
        !           354:        *entity_len = len + 2;
        !           355:        *entity = xmlMalloc(*entity_len + 1);
        !           356:        (*entity)[0] = '&';
        !           357:        memcpy(*entity+1, name, len);
        !           358:        (*entity)[len+1] = ';';
        !           359:        (*entity)[*entity_len] = '\0';
        !           360: }
        !           361: 
        !           362: static void
        !           363: _external_entity_ref_handler(void *user, const xmlChar *names, int type, const xmlChar *sys_id, const xmlChar *pub_id, xmlChar *content)
        !           364: {
        !           365:        XML_Parser parser = (XML_Parser) user;
        !           366: 
        !           367:        if (parser->h_external_entity_ref == NULL) {
        !           368:                return;
        !           369:        }
        !           370: 
        !           371:        parser->h_external_entity_ref(parser, names, "", sys_id, pub_id);
        !           372: }
        !           373: 
        !           374: static xmlEntityPtr
        !           375: _get_entity(void *user, const xmlChar *name)
        !           376: {
        !           377:        XML_Parser parser = (XML_Parser) user;
        !           378:        xmlEntityPtr ret = NULL;
        !           379: 
        !           380:        if (parser->parser->inSubset == 0) {
        !           381:                ret = xmlGetPredefinedEntity(name);
        !           382:                if (ret == NULL)
        !           383:                        ret = xmlGetDocEntity(parser->parser->myDoc, name);
        !           384: 
        !           385:                if (ret == NULL || (parser->parser->instate != XML_PARSER_ENTITY_VALUE && parser->parser->instate != XML_PARSER_ATTRIBUTE_VALUE)) {
        !           386:                        if (ret == NULL || ret->etype == XML_INTERNAL_GENERAL_ENTITY || ret->etype == XML_INTERNAL_PARAMETER_ENTITY || ret->etype == XML_INTERNAL_PREDEFINED_ENTITY) {
        !           387:                                /* Predefined entities will expand unless no cdata handler is present */
        !           388:                                if (parser->h_default && ! (ret && ret->etype == XML_INTERNAL_PREDEFINED_ENTITY && parser->h_cdata)) {
        !           389:                                        xmlChar *entity;
        !           390:                                        int      len;
        !           391:                                        
        !           392:                                        _build_entity(name, xmlStrlen(name), &entity, &len);
        !           393:                                        parser->h_default(parser->user, (const xmlChar *) entity, len);
        !           394:                                        xmlFree(entity);
        !           395:                                } else {
        !           396:                                        /* expat will not expand internal entities if default handler is present otherwise
        !           397:                                        it will expand and pass them to cdata handler */
        !           398:                                        if (parser->h_cdata && ret) {
        !           399:                                                parser->h_cdata(parser->user, ret->content, xmlStrlen(ret->content));
        !           400:                                        }
        !           401:                                }
        !           402:                        } else {
        !           403:                                if (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
        !           404:                                        _external_entity_ref_handler(user, ret->name, ret->etype, ret->SystemID, ret->ExternalID, NULL);
        !           405:                                }
        !           406:                        }
        !           407:                }
        !           408:        }
        !           409: 
        !           410:        return ret;
        !           411: }
        !           412: 
        !           413: static xmlSAXHandler 
        !           414: php_xml_compat_handlers = {
        !           415:        NULL, /* internalSubset */
        !           416:        NULL, /* isStandalone */
        !           417:        NULL, /* hasInternalSubset */
        !           418:        NULL, /* hasExternalSubset */
        !           419:        NULL, /* resolveEntity */
        !           420:        _get_entity, /* getEntity */
        !           421:        NULL, /* entityDecl */
        !           422:        _notation_decl_handler,
        !           423:        NULL, /* attributeDecl */
        !           424:        NULL, /* elementDecl */
        !           425:        _unparsed_entity_decl_handler, /* unparsedEntity */
        !           426:        NULL, /* setDocumentLocator */
        !           427:        NULL, /* startDocument */
        !           428:        NULL, /* endDocument */
        !           429:        _start_element_handler, /* startElement */
        !           430:        _end_element_handler, /* endElement */
        !           431:        NULL, /* reference */
        !           432:        _cdata_handler,
        !           433:        NULL, /* ignorableWhitespace */
        !           434:        _pi_handler,
        !           435:        _comment_handler, /* comment */
        !           436:        NULL, /* warning */
        !           437:        NULL, /* error */
        !           438:        NULL,  /* fatalError */
        !           439:        NULL,  /* getParameterEntity */
        !           440:        _cdata_handler, /* cdataBlock */
        !           441:        NULL, /* externalSubset */
        !           442:        XML_SAX2_MAGIC,
        !           443:        NULL,
        !           444:        _start_element_handler_ns,
        !           445:        _end_element_handler_ns,
        !           446:        NULL    
        !           447: };
        !           448: 
        !           449: PHPAPI XML_Parser 
        !           450: XML_ParserCreate(const XML_Char *encoding)
        !           451: {
        !           452:        return XML_ParserCreate_MM(encoding, NULL, NULL);
        !           453: }
        !           454: 
        !           455: PHPAPI XML_Parser
        !           456: XML_ParserCreateNS(const XML_Char *encoding, const XML_Char sep)
        !           457: {
        !           458:        XML_Char tmp[2];
        !           459:        tmp[0] = sep;
        !           460:        tmp[1] = '\0';
        !           461:        return XML_ParserCreate_MM(encoding, NULL, tmp);
        !           462: }
        !           463: 
        !           464: PHPAPI XML_Parser
        !           465: XML_ParserCreate_MM(const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, const XML_Char *sep)
        !           466: {
        !           467:        XML_Parser parser;
        !           468: 
        !           469:        parser = (XML_Parser) emalloc(sizeof(struct _XML_Parser));
        !           470:        memset(parser, 0, sizeof(struct _XML_Parser));
        !           471:        parser->use_namespace = 0;
        !           472:        parser->_ns_seperator = NULL;
        !           473: 
        !           474:        parser->parser = xmlCreatePushParserCtxt((xmlSAXHandlerPtr) &php_xml_compat_handlers, (void *) parser, NULL, 0, NULL);
        !           475:        if (parser->parser == NULL) {
        !           476:                efree(parser);
        !           477:                return NULL;
        !           478:        }
        !           479: #if LIBXML_VERSION <= 20617
        !           480:        /* for older versions of libxml2, allow correct detection of
        !           481:         * charset in documents with a BOM: */
        !           482:        parser->parser->charset = XML_CHAR_ENCODING_NONE;
        !           483: #endif
        !           484: 
        !           485: #if LIBXML_VERSION >= 20703
        !           486:        xmlCtxtUseOptions(parser->parser, XML_PARSE_OLDSAX);
        !           487: #endif
        !           488: 
        !           489:        parser->parser->replaceEntities = 1;
        !           490:        parser->parser->wellFormed = 0;
        !           491:        if (sep != NULL) {
        !           492:                parser->use_namespace = 1;
        !           493:                parser->parser->sax2 = 1;
        !           494:                parser->_ns_seperator = xmlStrdup(sep);
        !           495:        } else {
        !           496:                /* Reset flag as XML_SAX2_MAGIC is needed for xmlCreatePushParserCtxt 
        !           497:                so must be set in the handlers */
        !           498:                parser->parser->sax->initialized = 1;
        !           499:        }
        !           500:        return parser;
        !           501: }
        !           502: 
        !           503: PHPAPI void
        !           504: XML_SetUserData(XML_Parser parser, void *user)
        !           505: {
        !           506:        parser->user = user;
        !           507: }
        !           508: 
        !           509: PHPAPI void *
        !           510: XML_GetUserData(XML_Parser parser)
        !           511: {
        !           512:        return parser->user;
        !           513: }
        !           514: 
        !           515: PHPAPI void
        !           516: XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end)
        !           517: {
        !           518:        parser->h_start_element = start;
        !           519:        parser->h_end_element = end;
        !           520: }
        !           521: 
        !           522: PHPAPI void
        !           523: XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler cdata)
        !           524: {
        !           525:        parser->h_cdata = cdata;
        !           526: }
        !           527: 
        !           528: PHPAPI void
        !           529: XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler pi)
        !           530: {
        !           531:        parser->h_pi = pi;
        !           532: }
        !           533: 
        !           534: PHPAPI void
        !           535: XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler comment)
        !           536: {
        !           537:        parser->h_comment = comment;
        !           538: }
        !           539: 
        !           540: PHPAPI void 
        !           541: XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler d)
        !           542: {
        !           543:        parser->h_default = d;
        !           544: }
        !           545: 
        !           546: PHPAPI void
        !           547: XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler unparsed_decl)
        !           548: {
        !           549:        parser->h_unparsed_entity_decl = unparsed_decl;
        !           550: }
        !           551: 
        !           552: PHPAPI void
        !           553: XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler notation_decl)
        !           554: {
        !           555:        parser->h_notation_decl = notation_decl;
        !           556: }
        !           557: 
        !           558: PHPAPI void
        !           559: XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler ext_entity)
        !           560: {
        !           561:        parser->h_external_entity_ref = ext_entity;
        !           562: }
        !           563: 
        !           564: PHPAPI void
        !           565: XML_SetStartNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start_ns)
        !           566: {
        !           567:        parser->h_start_ns = start_ns;
        !           568: }
        !           569: 
        !           570: PHPAPI void
        !           571: XML_SetEndNamespaceDeclHandler(XML_Parser parser, XML_EndNamespaceDeclHandler end_ns)
        !           572: {
        !           573:        parser->h_end_ns = end_ns;
        !           574: }
        !           575: 
        !           576: PHPAPI int
        !           577: XML_Parse(XML_Parser parser, const XML_Char *data, int data_len, int is_final)
        !           578: {
        !           579:        int error;
        !           580: 
        !           581: /* The following is a hack to keep BC with PHP 4 while avoiding 
        !           582: the inifite loop in libxml <= 2.6.17 which occurs when no encoding 
        !           583: has been defined and none can be detected */
        !           584: #if LIBXML_VERSION <= 20617
        !           585:        if (parser->parser->charset == XML_CHAR_ENCODING_NONE) {
        !           586:                if (data_len >= 4 || (parser->parser->input->buf->buffer->use + data_len >= 4)) {
        !           587:                        xmlChar start[4];
        !           588:                        int char_count;
        !           589: 
        !           590:                        char_count = parser->parser->input->buf->buffer->use;
        !           591:                        if (char_count > 4) {
        !           592:                                char_count = 4;
        !           593:                        }
        !           594: 
        !           595:                        memcpy(start, parser->parser->input->buf->buffer->content, (size_t)char_count);
        !           596:                        memcpy(start + char_count, data, (size_t)(4 - char_count));
        !           597: 
        !           598:                        if (xmlDetectCharEncoding(&start[0], 4) == XML_CHAR_ENCODING_NONE) {
        !           599:                                parser->parser->charset = XML_CHAR_ENCODING_UTF8;
        !           600:                        }
        !           601:                }
        !           602:        }
        !           603: #endif
        !           604: 
        !           605:        error = xmlParseChunk(parser->parser, data, data_len, is_final);
        !           606:        if (!error) {
        !           607:                return 1;
        !           608:        } else if (parser->parser->lastError.level > XML_ERR_WARNING ){
        !           609:                return 0;
        !           610:        } else {
        !           611:                return 1;
        !           612:        }
        !           613: }
        !           614: 
        !           615: PHPAPI int
        !           616: XML_GetErrorCode(XML_Parser parser)
        !           617: {
        !           618:        return parser->parser->errNo;
        !           619: }
        !           620: 
        !           621: static const XML_Char *const error_mapping[] = {
        !           622:        "No error",
        !           623:        "No memory",
        !           624:        "Invalid document start",
        !           625:        "Empty document",
        !           626:        "Not well-formed (invalid token)",
        !           627:        "Invalid document end",
        !           628:        "Invalid hexadecimal character reference",
        !           629:        "Invalid decimal character reference",
        !           630:        "Invalid character reference",
        !           631:        "Invalid character",
        !           632:        "XML_ERR_CHARREF_AT_EOF",
        !           633:        "XML_ERR_CHARREF_IN_PROLOG",
        !           634:        "XML_ERR_CHARREF_IN_EPILOG",
        !           635:        "XML_ERR_CHARREF_IN_DTD",
        !           636:        "XML_ERR_ENTITYREF_AT_EOF",
        !           637:        "XML_ERR_ENTITYREF_IN_PROLOG",
        !           638:        "XML_ERR_ENTITYREF_IN_EPILOG",
        !           639:        "XML_ERR_ENTITYREF_IN_DTD",
        !           640:        "PEReference at end of document",
        !           641:        "PEReference in prolog",
        !           642:        "PEReference in epilog",
        !           643:        "PEReference: forbidden within markup decl in internal subset",
        !           644:        "XML_ERR_ENTITYREF_NO_NAME",
        !           645:        "EntityRef: expecting ';'",
        !           646:        "PEReference: no name",
        !           647:        "PEReference: expecting ';'",
        !           648:        "Undeclared entity error",
        !           649:        "Undeclared entity warning",
        !           650:        "Unparsed Entity",
        !           651:        "XML_ERR_ENTITY_IS_EXTERNAL",
        !           652:        "XML_ERR_ENTITY_IS_PARAMETER",
        !           653:        "Unknown encoding",
        !           654:        "Unsupported encoding",
        !           655:        "String not started expecting ' or \"",
        !           656:        "String not closed expecting \" or '",
        !           657:        "Namespace declaration error",
        !           658:        "EntityValue: \" or ' expected",
        !           659:        "EntityValue: \" or ' expected",
        !           660:        "< in attribute",
        !           661:        "Attribute not started",
        !           662:        "Attribute not finished",
        !           663:        "Attribute without value",
        !           664:        "Attribute redefined",
        !           665:        "SystemLiteral \" or ' expected",
        !           666:        "SystemLiteral \" or ' expected",
        !           667:        /* "XML_ERR_COMMENT_NOT_STARTED", <= eliminated on purpose */
        !           668:        "Comment not finished",
        !           669:        "Processing Instruction not started",
        !           670:        "Processing Instruction not finished",
        !           671:        "NOTATION: Name expected here",
        !           672:        "'>' required to close NOTATION declaration",
        !           673:        "'(' required to start ATTLIST enumeration",
        !           674:        "'(' required to start ATTLIST enumeration",
        !           675:        "MixedContentDecl : '|' or ')*' expected",
        !           676:        "XML_ERR_MIXED_NOT_FINISHED",
        !           677:        "ELEMENT in DTD not started",
        !           678:        "ELEMENT in DTD not finished",
        !           679:        "XML declaration not started",
        !           680:        "XML declaration not finished",
        !           681:        "XML_ERR_CONDSEC_NOT_STARTED",
        !           682:        "XML conditional section not closed",
        !           683:        "Content error in the external subset",
        !           684:        "DOCTYPE not finished",
        !           685:        "Sequence ']]>' not allowed in content",
        !           686:        "CDATA not finished",
        !           687:        "Reserved XML Name",
        !           688:        "Space required",
        !           689:        "XML_ERR_SEPARATOR_REQUIRED",
        !           690:        "NmToken expected in ATTLIST enumeration",
        !           691:        "XML_ERR_NAME_REQUIRED",
        !           692:        "MixedContentDecl : '#PCDATA' expected",
        !           693:        "SYSTEM or PUBLIC, the URI is missing",
        !           694:        "PUBLIC, the Public Identifier is missing",
        !           695:        "< required",
        !           696:        "> required",
        !           697:        "</ required",
        !           698:        "= required",
        !           699:        "Mismatched tag",
        !           700:        "Tag not finished",
        !           701:        "standalone accepts only 'yes' or 'no'",
        !           702:        "Invalid XML encoding name",
        !           703:        "Comment must not contain '--' (double-hyphen)",
        !           704:        "Invalid encoding",
        !           705:        "external parsed entities cannot be standalone",
        !           706:        "XML conditional section '[' expected",
        !           707:        "Entity value required",
        !           708:        "chunk is not well balanced",
        !           709:        "extra content at the end of well balanced chunk",
        !           710:     "XML_ERR_ENTITY_CHAR_ERROR",
        !           711:     "PEReferences forbidden in internal subset",
        !           712:     "Detected an entity reference loop",
        !           713:     "XML_ERR_ENTITY_BOUNDARY",
        !           714:     "Invalid URI",
        !           715:     "Fragment not allowed",
        !           716:     "XML_WAR_CATALOG_PI",
        !           717:     "XML_ERR_NO_DTD",
        !           718:     "conditional section INCLUDE or IGNORE keyword expected", /* 95 */
        !           719:     "Version in XML Declaration missing", /* 96 */
        !           720:     "XML_WAR_UNKNOWN_VERSION", /* 97 */
        !           721:     "XML_WAR_LANG_VALUE", /* 98 */
        !           722:     "XML_WAR_NS_URI", /* 99 */
        !           723:     "XML_WAR_NS_URI_RELATIVE", /* 100 */
        !           724:     "Missing encoding in text declaration" /* 101 */
        !           725: };
        !           726: 
        !           727: PHPAPI const XML_Char *
        !           728: XML_ErrorString(int code)
        !           729: {
        !           730:        if (code < 0 || code >= (int)(sizeof(error_mapping) / sizeof(error_mapping[0]))) {
        !           731:                return "Unknown";
        !           732:        }
        !           733:        return error_mapping[code];
        !           734: }
        !           735: 
        !           736: PHPAPI int
        !           737: XML_GetCurrentLineNumber(XML_Parser parser)
        !           738: {
        !           739:        return parser->parser->input->line;
        !           740: }
        !           741: 
        !           742: PHPAPI int
        !           743: XML_GetCurrentColumnNumber(XML_Parser parser)
        !           744: {
        !           745:        return parser->parser->input->col;
        !           746: }
        !           747: 
        !           748: PHPAPI int
        !           749: XML_GetCurrentByteIndex(XML_Parser parser)
        !           750: {
        !           751:        return parser->parser->input->consumed +
        !           752:                        (parser->parser->input->cur - parser->parser->input->base);
        !           753: }
        !           754: 
        !           755: PHPAPI int
        !           756: XML_GetCurrentByteCount(XML_Parser parser)
        !           757: {
        !           758:        /* WARNING: this is identical to ByteIndex; it should probably
        !           759:         * be different */
        !           760:        return parser->parser->input->consumed +
        !           761:                        (parser->parser->input->cur - parser->parser->input->base);
        !           762: }
        !           763: 
        !           764: PHPAPI const XML_Char *XML_ExpatVersion(void)
        !           765: {
        !           766:        return "1.0";
        !           767: }
        !           768: 
        !           769: PHPAPI void
        !           770: XML_ParserFree(XML_Parser parser)
        !           771: {
        !           772:        if (parser->use_namespace) {
        !           773:                if (parser->_ns_seperator) {
        !           774:                        xmlFree(parser->_ns_seperator);
        !           775:                }
        !           776:        }
        !           777:        if (parser->parser->myDoc) {
        !           778:                xmlFreeDoc(parser->parser->myDoc);
        !           779:                parser->parser->myDoc = NULL;
        !           780:        }
        !           781:        xmlFreeParserCtxt(parser->parser);
        !           782:        efree(parser);
        !           783: }
        !           784: 
        !           785: #endif /* LIBXML_EXPAT_COMPAT */
        !           786: #endif
        !           787: 
        !           788: /**
        !           789:  * Local Variables:
        !           790:  * tab-width: 4
        !           791:  * c-basic-offset: 4
        !           792:  * indent-tabs-mode: t
        !           793:  * End:
        !           794:  * vim600: fdm=marker
        !           795:  * vim: ts=4 noet sw=4
        !           796:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>