Annotation of embedaddon/libxml2/xlink.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:  * xlink.c : implementation of the hyperlinks detection module
                      3:  *           This version supports both XML XLinks and HTML simple links
                      4:  *
                      5:  * See Copyright for the status of this software.
                      6:  *
                      7:  * daniel@veillard.com
                      8:  */
                      9: 
                     10: 
                     11: #define IN_LIBXML
                     12: #include "libxml.h"
                     13: 
                     14: #ifdef LIBXML_XPTR_ENABLED
                     15: #include <string.h> /* for memset() only */
                     16: #ifdef HAVE_CTYPE_H
                     17: #include <ctype.h>
                     18: #endif
                     19: #ifdef HAVE_STDLIB_H
                     20: #include <stdlib.h>
                     21: #endif
                     22: #ifdef HAVE_SYS_STAT_H
                     23: #include <sys/stat.h>
                     24: #endif
                     25: #ifdef HAVE_FCNTL_H
                     26: #include <fcntl.h>
                     27: #endif
                     28: #ifdef HAVE_UNISTD_H
                     29: #include <unistd.h>
                     30: #endif
                     31: #ifdef HAVE_ZLIB_H
                     32: #include <zlib.h>
                     33: #endif
                     34: 
                     35: #include <libxml/xmlmemory.h>
                     36: #include <libxml/tree.h>
                     37: #include <libxml/parser.h>
                     38: #include <libxml/valid.h>
                     39: #include <libxml/xlink.h>
                     40: #include <libxml/globals.h>
                     41: 
                     42: #define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/")
                     43: #define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/")
                     44: 
                     45: /****************************************************************
                     46:  *                                                             *
                     47:  *           Default setting and related functions             *
                     48:  *                                                             *
                     49:  ****************************************************************/
1.1.1.2 ! misho      50: 
1.1       misho      51: static xlinkHandlerPtr xlinkDefaultHandler = NULL;
                     52: static xlinkNodeDetectFunc     xlinkDefaultDetect = NULL;
                     53: 
                     54: /**
                     55:  * xlinkGetDefaultHandler:
                     56:  *
                     57:  * Get the default xlink handler.
                     58:  *
                     59:  * Returns the current xlinkHandlerPtr value.
                     60:  */
                     61: xlinkHandlerPtr
                     62: xlinkGetDefaultHandler(void) {
                     63:     return(xlinkDefaultHandler);
                     64: }
                     65: 
                     66: 
                     67: /**
                     68:  * xlinkSetDefaultHandler:
                     69:  * @handler:  the new value for the xlink handler block
                     70:  *
                     71:  * Set the default xlink handlers
                     72:  */
                     73: void
                     74: xlinkSetDefaultHandler(xlinkHandlerPtr handler) {
                     75:     xlinkDefaultHandler = handler;
                     76: }
                     77: 
                     78: /**
                     79:  * xlinkGetDefaultDetect:
                     80:  *
                     81:  * Get the default xlink detection routine
                     82:  *
                     83:  * Returns the current function or NULL;
                     84:  */
                     85: xlinkNodeDetectFunc
                     86: xlinkGetDefaultDetect  (void) {
                     87:     return(xlinkDefaultDetect);
                     88: }
                     89: 
                     90: /**
                     91:  * xlinkSetDefaultDetect:
                     92:  * @func: pointer to the new detection routine.
                     93:  *
                     94:  * Set the default xlink detection routine
                     95:  */
1.1.1.2 ! misho      96: void
1.1       misho      97: xlinkSetDefaultDetect  (xlinkNodeDetectFunc func) {
                     98:     xlinkDefaultDetect = func;
                     99: }
                    100: 
                    101: /****************************************************************
                    102:  *                                                             *
                    103:  *                  The detection routines                     *
                    104:  *                                                             *
                    105:  ****************************************************************/
                    106: 
1.1.1.2 ! misho     107: 
1.1       misho     108: /**
                    109:  * xlinkIsLink:
                    110:  * @doc:  the document containing the node
                    111:  * @node:  the node pointer itself
                    112:  *
                    113:  * Check whether the given node carries the attributes needed
                    114:  * to be a link element (or is one of the linking elements issued
                    115:  * from the (X)HTML DtDs).
                    116:  * This routine don't try to do full checking of the link validity
                    117:  * but tries to detect and return the appropriate link type.
                    118:  *
                    119:  * Returns the xlinkType of the node (XLINK_TYPE_NONE if there is no
                    120:  *         link detected.
                    121:  */
1.1.1.2 ! misho     122: xlinkType
1.1       misho     123: xlinkIsLink    (xmlDocPtr doc, xmlNodePtr node) {
                    124:     xmlChar *type = NULL, *role = NULL;
                    125:     xlinkType ret = XLINK_TYPE_NONE;
                    126: 
                    127:     if (node == NULL) return(XLINK_TYPE_NONE);
                    128:     if (doc == NULL) doc = node->doc;
                    129:     if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) {
                    130:         /*
                    131:         * This is an HTML document.
                    132:         */
                    133:     } else if ((node->ns != NULL) &&
                    134:                (xmlStrEqual(node->ns->href, XHTML_NAMESPACE))) {
                    135:        /*
                    136:         * !!!! We really need an IS_XHTML_ELEMENT function from HTMLtree.h @@@
                    137:         */
                    138:         /*
                    139:         * This is an XHTML element within an XML document
                    140:         * Check whether it's one of the element able to carry links
                    141:         * and in that case if it holds the attributes.
                    142:         */
                    143:     }
                    144: 
                    145:     /*
                    146:      * We don't prevent a-priori having XML Linking constructs on
                    147:      * XHTML elements
                    148:      */
                    149:     type = xmlGetNsProp(node, BAD_CAST"type", XLINK_NAMESPACE);
                    150:     if (type != NULL) {
                    151:        if (xmlStrEqual(type, BAD_CAST "simple")) {
                    152:             ret = XLINK_TYPE_SIMPLE;
                    153:        } if (xmlStrEqual(type, BAD_CAST "extended")) {
                    154:            role = xmlGetNsProp(node, BAD_CAST "role", XLINK_NAMESPACE);
                    155:            if (role != NULL) {
                    156:                xmlNsPtr xlink;
                    157:                xlink = xmlSearchNs(doc, node, XLINK_NAMESPACE);
                    158:                if (xlink == NULL) {
                    159:                    /* Humm, fallback method */
1.1.1.2 ! misho     160:                    if (xmlStrEqual(role, BAD_CAST"xlink:external-linkset"))
1.1       misho     161:                        ret = XLINK_TYPE_EXTENDED_SET;
                    162:                } else {
                    163:                    xmlChar buf[200];
                    164:                    snprintf((char *) buf, sizeof(buf), "%s:external-linkset",
                    165:                             (char *) xlink->prefix);
                    166:                     buf[sizeof(buf) - 1] = 0;
                    167:                    if (xmlStrEqual(role, buf))
                    168:                        ret = XLINK_TYPE_EXTENDED_SET;
                    169: 
                    170:                }
                    171: 
                    172:            }
                    173:            ret = XLINK_TYPE_EXTENDED;
                    174:        }
                    175:     }
                    176: 
                    177:     if (type != NULL) xmlFree(type);
                    178:     if (role != NULL) xmlFree(role);
                    179:     return(ret);
                    180: }
                    181: #endif /* LIBXML_XPTR_ENABLED */
                    182: #define bottom_xlink
                    183: #include "elfgcchack.h"

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