File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / xlink.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 19:53:30 2014 UTC (10 years ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, HEAD
libxml2 2.9.1

    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:  ****************************************************************/
   50: 
   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:  */
   96: void
   97: xlinkSetDefaultDetect	(xlinkNodeDetectFunc func) {
   98:     xlinkDefaultDetect = func;
   99: }
  100: 
  101: /****************************************************************
  102:  *								*
  103:  *                  The detection routines			*
  104:  *								*
  105:  ****************************************************************/
  106: 
  107: 
  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:  */
  122: xlinkType
  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 */
  160: 		    if (xmlStrEqual(role, BAD_CAST"xlink:external-linkset"))
  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>