| Index: third_party/libxslt/libxslt/attrvt.c
|
| diff --git a/third_party/libxslt/libxslt/attrvt.c b/third_party/libxslt/libxslt/attrvt.c
|
| deleted file mode 100644
|
| index 125159cedf3de40aa69b2d61659bf70d6036e2d3..0000000000000000000000000000000000000000
|
| --- a/third_party/libxslt/libxslt/attrvt.c
|
| +++ /dev/null
|
| @@ -1,387 +0,0 @@
|
| -/*
|
| - * attrvt.c: Implementation of the XSL Transformation 1.0 engine
|
| - * attribute value template handling part.
|
| - *
|
| - * References:
|
| - * http://www.w3.org/TR/1999/REC-xslt-19991116
|
| - *
|
| - * Michael Kay "XSLT Programmer's Reference" pp 637-643
|
| - * Writing Multiple Output Files
|
| - *
|
| - * See Copyright for the status of this software.
|
| - *
|
| - * daniel@veillard.com
|
| - */
|
| -
|
| -#define IN_LIBXSLT
|
| -#include "libxslt.h"
|
| -
|
| -#include <string.h>
|
| -
|
| -#include <libxml/xmlmemory.h>
|
| -#include <libxml/tree.h>
|
| -#include <libxml/xpath.h>
|
| -#include <libxml/xpathInternals.h>
|
| -#include "xslt.h"
|
| -#include "xsltutils.h"
|
| -#include "xsltInternals.h"
|
| -#include "templates.h"
|
| -
|
| -#ifdef WITH_XSLT_DEBUG
|
| -#define WITH_XSLT_DEBUG_AVT
|
| -#endif
|
| -
|
| -#define MAX_AVT_SEG 10
|
| -
|
| -typedef struct _xsltAttrVT xsltAttrVT;
|
| -typedef xsltAttrVT *xsltAttrVTPtr;
|
| -struct _xsltAttrVT {
|
| - struct _xsltAttrVT *next; /* next xsltAttrVT */
|
| - int nb_seg; /* Number of segments */
|
| - int max_seg; /* max capacity before re-alloc needed */
|
| - int strstart; /* is the start a string */
|
| - /*
|
| - * the namespaces in scope
|
| - */
|
| - xmlNsPtr *nsList;
|
| - int nsNr;
|
| - /*
|
| - * the content is an alternate of string and xmlXPathCompExprPtr
|
| - */
|
| - void *segments[MAX_AVT_SEG];
|
| -};
|
| -
|
| -/**
|
| - * xsltNewAttrVT:
|
| - * @style: a XSLT process context
|
| - *
|
| - * Build a new xsltAttrVT structure
|
| - *
|
| - * Returns the structure or NULL in case of error
|
| - */
|
| -static xsltAttrVTPtr
|
| -xsltNewAttrVT(xsltStylesheetPtr style) {
|
| - xsltAttrVTPtr cur;
|
| -
|
| - cur = (xsltAttrVTPtr) xmlMalloc(sizeof(xsltAttrVT));
|
| - if (cur == NULL) {
|
| - xsltTransformError(NULL, style, NULL,
|
| - "xsltNewAttrVTPtr : malloc failed\n");
|
| - if (style != NULL) style->errors++;
|
| - return(NULL);
|
| - }
|
| - memset(cur, 0, sizeof(xsltAttrVT));
|
| -
|
| - cur->nb_seg = 0;
|
| - cur->max_seg = MAX_AVT_SEG;
|
| - cur->strstart = 0;
|
| - cur->next = style->attVTs;
|
| - /*
|
| - * Note: this pointer may be changed by a re-alloc within xsltCompileAttr,
|
| - * so that code may change the stylesheet pointer also!
|
| - */
|
| - style->attVTs = (xsltAttrVTPtr) cur;
|
| -
|
| - return(cur);
|
| -}
|
| -
|
| -/**
|
| - * xsltFreeAttrVT:
|
| - * @avt: pointer to an xsltAttrVT structure
|
| - *
|
| - * Free up the memory associated to the attribute value template
|
| - */
|
| -static void
|
| -xsltFreeAttrVT(xsltAttrVTPtr avt) {
|
| - int i;
|
| -
|
| - if (avt == NULL) return;
|
| -
|
| - if (avt->strstart == 1) {
|
| - for (i = 0;i < avt->nb_seg; i += 2)
|
| - if (avt->segments[i] != NULL)
|
| - xmlFree((xmlChar *) avt->segments[i]);
|
| - for (i = 1;i < avt->nb_seg; i += 2)
|
| - xmlXPathFreeCompExpr((xmlXPathCompExprPtr) avt->segments[i]);
|
| - } else {
|
| - for (i = 0;i < avt->nb_seg; i += 2)
|
| - xmlXPathFreeCompExpr((xmlXPathCompExprPtr) avt->segments[i]);
|
| - for (i = 1;i < avt->nb_seg; i += 2)
|
| - if (avt->segments[i] != NULL)
|
| - xmlFree((xmlChar *) avt->segments[i]);
|
| - }
|
| - if (avt->nsList != NULL)
|
| - xmlFree(avt->nsList);
|
| - xmlFree(avt);
|
| -}
|
| -
|
| -/**
|
| - * xsltFreeAVTList:
|
| - * @avt: pointer to an list of AVT structures
|
| - *
|
| - * Free up the memory associated to the attribute value templates
|
| - */
|
| -void
|
| -xsltFreeAVTList(void *avt) {
|
| - xsltAttrVTPtr cur = (xsltAttrVTPtr) avt, next;
|
| -
|
| - while (cur != NULL) {
|
| - next = cur->next;
|
| - xsltFreeAttrVT(cur);
|
| - cur = next;
|
| - }
|
| -}
|
| -/**
|
| - * xsltSetAttrVTsegment:
|
| - * @ avt: pointer to an xsltAttrVT structure
|
| - * @ val: the value to be set to the next available segment
|
| - *
|
| - * Within xsltCompileAttr there are several places where a value
|
| - * needs to be added to the 'segments' array within the xsltAttrVT
|
| - * structure, and at each place the allocated size may have to be
|
| - * re-allocated. This routine takes care of that situation.
|
| - *
|
| - * Returns the avt pointer, which may have been changed by a re-alloc
|
| - */
|
| -static xsltAttrVTPtr
|
| -xsltSetAttrVTsegment(xsltAttrVTPtr avt, void *val) {
|
| - if (avt->nb_seg >= avt->max_seg) {
|
| - avt = (xsltAttrVTPtr) xmlRealloc(avt, sizeof(xsltAttrVT) +
|
| - avt->max_seg * sizeof(void *));
|
| - if (avt == NULL) {
|
| - return NULL;
|
| - }
|
| - memset(&avt->segments[avt->nb_seg], 0, MAX_AVT_SEG*sizeof(void *));
|
| - avt->max_seg += MAX_AVT_SEG;
|
| - }
|
| - avt->segments[avt->nb_seg++] = val;
|
| - return avt;
|
| -}
|
| -
|
| -/**
|
| - * xsltCompileAttr:
|
| - * @style: a XSLT process context
|
| - * @attr: the attribute coming from the stylesheet.
|
| - *
|
| - * Precompile an attribute in a stylesheet, basically it checks if it is
|
| - * an attrubute value template, and if yes establish some structures needed
|
| - * to process it at transformation time.
|
| - */
|
| -void
|
| -xsltCompileAttr(xsltStylesheetPtr style, xmlAttrPtr attr) {
|
| - const xmlChar *str;
|
| - const xmlChar *cur;
|
| - xmlChar *ret = NULL;
|
| - xmlChar *expr = NULL;
|
| - xsltAttrVTPtr avt;
|
| - int i = 0, lastavt = 0;
|
| -
|
| - if ((style == NULL) || (attr == NULL) || (attr->children == NULL))
|
| - return;
|
| - if ((attr->children->type != XML_TEXT_NODE) ||
|
| - (attr->children->next != NULL)) {
|
| - xsltTransformError(NULL, style, attr->parent,
|
| - "Attribute '%s': The content is expected to be a single text "
|
| - "node when compiling an AVT.\n", attr->name);
|
| - style->errors++;
|
| - return;
|
| - }
|
| - str = attr->children->content;
|
| - if ((xmlStrchr(str, '{') == NULL) &&
|
| - (xmlStrchr(str, '}') == NULL)) return;
|
| -
|
| -#ifdef WITH_XSLT_DEBUG_AVT
|
| - xsltGenericDebug(xsltGenericDebugContext,
|
| - "Found AVT %s: %s\n", attr->name, str);
|
| -#endif
|
| - if (attr->psvi != NULL) {
|
| -#ifdef WITH_XSLT_DEBUG_AVT
|
| - xsltGenericDebug(xsltGenericDebugContext,
|
| - "AVT %s: already compiled\n", attr->name);
|
| -#endif
|
| - return;
|
| - }
|
| - /*
|
| - * Create a new AVT object.
|
| - */
|
| - avt = xsltNewAttrVT(style);
|
| - if (avt == NULL)
|
| - return;
|
| - attr->psvi = avt;
|
| -
|
| - avt->nsList = xmlGetNsList(attr->doc, attr->parent);
|
| - if (avt->nsList != NULL) {
|
| - while (avt->nsList[i] != NULL)
|
| - i++;
|
| - }
|
| - avt->nsNr = i;
|
| -
|
| - cur = str;
|
| - while (*cur != 0) {
|
| - if (*cur == '{') {
|
| - if (*(cur+1) == '{') { /* escaped '{' */
|
| - cur++;
|
| - ret = xmlStrncat(ret, str, cur - str);
|
| - cur++;
|
| - str = cur;
|
| - continue;
|
| - }
|
| - if (*(cur+1) == '}') { /* skip empty AVT */
|
| - ret = xmlStrncat(ret, str, cur - str);
|
| - cur += 2;
|
| - str = cur;
|
| - continue;
|
| - }
|
| - if ((ret != NULL) || (cur - str > 0)) {
|
| - ret = xmlStrncat(ret, str, cur - str);
|
| - str = cur;
|
| - if (avt->nb_seg == 0)
|
| - avt->strstart = 1;
|
| - if ((avt = xsltSetAttrVTsegment(avt, (void *) ret)) == NULL)
|
| - goto error;
|
| - ret = NULL;
|
| - lastavt = 0;
|
| - }
|
| -
|
| - cur++;
|
| - while ((*cur != 0) && (*cur != '}')) {
|
| - /* Need to check for literal (bug539741) */
|
| - if ((*cur == '\'') || (*cur == '"')) {
|
| - char delim = *(cur++);
|
| - while ((*cur != 0) && (*cur != delim))
|
| - cur++;
|
| - if (*cur != 0)
|
| - cur++; /* skip the ending delimiter */
|
| - } else
|
| - cur++;
|
| - }
|
| - if (*cur == 0) {
|
| - xsltTransformError(NULL, style, attr->parent,
|
| - "Attribute '%s': The AVT has an unmatched '{'.\n",
|
| - attr->name);
|
| - style->errors++;
|
| - goto error;
|
| - }
|
| - str++;
|
| - expr = xmlStrndup(str, cur - str);
|
| - if (expr == NULL) {
|
| - /*
|
| - * TODO: What needs to be done here?
|
| - */
|
| - XSLT_TODO
|
| - goto error;
|
| - } else {
|
| - xmlXPathCompExprPtr comp;
|
| -
|
| - comp = xsltXPathCompile(style, expr);
|
| - if (comp == NULL) {
|
| - xsltTransformError(NULL, style, attr->parent,
|
| - "Attribute '%s': Failed to compile the expression "
|
| - "'%s' in the AVT.\n", attr->name, expr);
|
| - style->errors++;
|
| - goto error;
|
| - }
|
| - if (avt->nb_seg == 0)
|
| - avt->strstart = 0;
|
| - if (lastavt == 1) {
|
| - if ((avt = xsltSetAttrVTsegment(avt, NULL)) == NULL)
|
| - goto error;
|
| - }
|
| - if ((avt = xsltSetAttrVTsegment(avt, (void *) comp)) == NULL)
|
| - goto error;
|
| - lastavt = 1;
|
| - xmlFree(expr);
|
| - expr = NULL;
|
| - }
|
| - cur++;
|
| - str = cur;
|
| - } else if (*cur == '}') {
|
| - cur++;
|
| - if (*cur == '}') { /* escaped '}' */
|
| - ret = xmlStrncat(ret, str, cur - str);
|
| - cur++;
|
| - str = cur;
|
| - continue;
|
| - } else {
|
| - xsltTransformError(NULL, style, attr->parent,
|
| - "Attribute '%s': The AVT has an unmatched '}'.\n",
|
| - attr->name);
|
| - goto error;
|
| - }
|
| - } else
|
| - cur++;
|
| - }
|
| - if ((ret != NULL) || (cur - str > 0)) {
|
| - ret = xmlStrncat(ret, str, cur - str);
|
| - str = cur;
|
| - if (avt->nb_seg == 0)
|
| - avt->strstart = 1;
|
| - if ((avt = xsltSetAttrVTsegment(avt, (void *) ret)) == NULL)
|
| - goto error;
|
| - ret = NULL;
|
| - }
|
| -
|
| -error:
|
| - if (avt == NULL) {
|
| - xsltTransformError(NULL, style, attr->parent,
|
| - "xsltCompileAttr: malloc problem\n");
|
| - } else {
|
| - if (attr->psvi != avt) { /* may have changed from realloc */
|
| - attr->psvi = avt;
|
| - /*
|
| - * This is a "hack", but I can't see any clean method of
|
| - * doing it. If a re-alloc has taken place, then the pointer
|
| - * for this AVT may have changed. style->attVTs was set by
|
| - * xsltNewAttrVT, so it needs to be re-set to the new value!
|
| - */
|
| - style->attVTs = avt;
|
| - }
|
| - }
|
| - if (ret != NULL)
|
| - xmlFree(ret);
|
| - if (expr != NULL)
|
| - xmlFree(expr);
|
| -}
|
| -
|
| -
|
| -/**
|
| - * xsltEvalAVT:
|
| - * @ctxt: the XSLT transformation context
|
| - * @avt: the prevompiled attribute value template info
|
| - * @node: the node hosting the attribute
|
| - *
|
| - * Process the given AVT, and return the new string value.
|
| - *
|
| - * Returns the computed string value or NULL, must be deallocated by the
|
| - * caller.
|
| - */
|
| -xmlChar *
|
| -xsltEvalAVT(xsltTransformContextPtr ctxt, void *avt, xmlNodePtr node) {
|
| - xmlChar *ret = NULL, *tmp;
|
| - xmlXPathCompExprPtr comp;
|
| - xsltAttrVTPtr cur = (xsltAttrVTPtr) avt;
|
| - int i;
|
| - int str;
|
| -
|
| - if ((ctxt == NULL) || (avt == NULL) || (node == NULL))
|
| - return(NULL);
|
| - str = cur->strstart;
|
| - for (i = 0;i < cur->nb_seg;i++) {
|
| - if (str) {
|
| - ret = xmlStrcat(ret, (const xmlChar *) cur->segments[i]);
|
| - } else {
|
| - comp = (xmlXPathCompExprPtr) cur->segments[i];
|
| - tmp = xsltEvalXPathStringNs(ctxt, comp, cur->nsNr, cur->nsList);
|
| - if (tmp != NULL) {
|
| - if (ret != NULL) {
|
| - ret = xmlStrcat(ret, tmp);
|
| - xmlFree(tmp);
|
| - } else {
|
| - ret = tmp;
|
| - }
|
| - }
|
| - }
|
| - str = !str;
|
| - }
|
| - return(ret);
|
| -}
|
|
|