1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * regexp.c: generic and extensible Regular Expression engine 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Basically designed with the purpose of compiling regexps for 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variety of validation/shemas mechanisms now available in 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML related specifications these include: 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - XML-1.0 DTD validation 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - XML Schemas structure part 1 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - XML Schemas Datatypes part 2 especially Appendix F 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - RELAX-NG/TREX i.e. the counter proposal 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Daniel Veillard <veillard@redhat.com> 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_ERR */ 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdio.h> 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_LIMITS_H 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <limits.h> 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlregexp.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlautomata.h> 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlunicode.h> 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef INT_MAX 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INT_MAX 123456789 /* easy to flag and big enough for our needs */ 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_REGEXP_GRAPH */ 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_REGEXP_EXEC */ 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_PUSH */ 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_COMPACTION */ 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_PUSH 10000000 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#ifdef ERROR 4894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#undef ERROR 4994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR(str) \ 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XML_REGEXP_COMPILE_ERROR; \ 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrCompile(ctxt, str); 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ctxt->cur++ 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*(ctxt->cur)) 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(index) (ctxt->cur[index]) 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l) 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l) ctxt->cur += l; 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_REG_STRING_SEPARATOR '|' 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Need PREV to check on a '-' within a Character Group. May only be used 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when it's guaranteed that cur is not at the beginning of ctxt->string! 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PREV (ctxt->cur[-1]) 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * macro to flag unimplemented blocks 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define TODO \ 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 7794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 7894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Datatypes and structures * 7994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: the order of the enums below is significant, do not shuffle 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_EPSILON = 1, 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_RANGES, 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SUBREG, /* used for () sub regexps */ 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_STRING, 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_ANYCHAR, /* . */ 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_ANYSPACE, /* \s */ 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTSPACE, /* \S */ 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_INITNAME, /* \l */ 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTINITNAME, /* \L */ 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NAMECHAR, /* \c */ 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTNAMECHAR, /* \C */ 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_DECIMAL, /* \d */ 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTDECIMAL, /* \D */ 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_REALCHAR, /* \w */ 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTREALCHAR, /* \W */ 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER = 100, 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_UPPERCASE, 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_LOWERCASE, 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_TITLECASE, 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_MODIFIER, 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_OTHERS, 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK, 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_NONSPACING, 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_SPACECOMBINING, 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_ENCLOSING, 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER, 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER_DECIMAL, 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER_LETTER, 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER_OTHERS, 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT, 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_CONNECTOR, 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_DASH, 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_OPEN, 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_CLOSE, 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_INITQUOTE, 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_FINQUOTE, 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_OTHERS, 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR, 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR_SPACE, 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR_LINE, 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR_PARA, 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL, 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_MATH, 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_CURRENCY, 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_MODIFIER, 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_OTHERS, 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER, 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_CONTROL, 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_FORMAT, 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_PRIVATE, 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_NA, 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_BLOCK_NAME 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegAtomType; 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_EPSILON = 1, 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_ONCE, 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_OPT, 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_MULT, 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_PLUS, 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_ONCEONLY, 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_ALL, 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_RANGE 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegQuantType; 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_START_STATE = 1, 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE, 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_TRANS_STATE, 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE, 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_UNREACH_STATE 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegStateType; 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_NORMAL = 0, 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_START, 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_VISITED 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegMarkedType; 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegRange xmlRegRange; 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegRange *xmlRegRangePtr; 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegRange { 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg; /* 0 normal, 1 not, 2 exclude */ 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type; 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start; 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int end; 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *blockName; 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegAtom xmlRegAtom; 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegAtom *xmlRegAtomPtr; 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlAutomataState xmlRegState; 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegState *xmlRegStatePtr; 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegAtom { 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int no; 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type; 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegQuantType quant; 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min; 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max; 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *valuep; 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *valuep2; 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint; 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start; 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start0; 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr stop; 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxRanges; 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbRanges; 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr *ranges; 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegCounter xmlRegCounter; 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegCounter *xmlRegCounterPtr; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegCounter { 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min; 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max; 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegTrans xmlRegTrans; 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegTrans *xmlRegTransPtr; 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegTrans { 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int to; 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nd; 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlAutomataState { 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateType type; 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegMarkedType mark; 22594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlRegMarkedType markd; 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegMarkedType reached; 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int no; 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxTrans; 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbTrans; 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTrans *trans; 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* knowing states ponting to us can speed things up */ 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxTransTo; 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbTransTo; 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *transTo; 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlAutomata xmlRegParserCtxt; 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegParserCtxt *xmlRegParserCtxtPtr; 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 240df143a5041f03a22808b59c76698770b74692815Selim Gurun#define AM_AUTOMATA_RNG 1 241df143a5041f03a22808b59c76698770b74692815Selim Gurun 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlAutomata { 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *string; 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur; 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int error; 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg; 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start; 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr end; 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxAtoms; 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAtoms; 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr *atoms; 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxStates; 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStates; 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr *states; 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxCounters; 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbCounters; 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounter *counters; 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int determinist; 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int negs; 269df143a5041f03a22808b59c76698770b74692815Selim Gurun int flags; 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegexp { 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *string; 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStates; 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr *states; 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAtoms; 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr *atoms; 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbCounters; 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounter *counters; 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int determinist; 281df143a5041f03a22808b59c76698770b74692815Selim Gurun int flags; 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * That's the compact form for determinists automatas 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbstates; 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *compact; 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **transdata; 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbstrings; 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **stringMap; 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegExecRollback xmlRegExecRollback; 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegExecRollback *xmlRegExecRollbackPtr; 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegExecRollback { 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state;/* the current state */ 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int index; /* the index in the input stack */ 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nextbranch; /* the next transition to explore in that state */ 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *counts; /* save the automata state if it has some */ 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegInputToken xmlRegInputToken; 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegInputToken *xmlRegInputTokenPtr; 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegInputToken { 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegExecCtxt { 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int status; /* execution status != 0 indicate an error */ 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int determinist; /* did we find an indeterministic behaviour */ 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr comp; /* the compiled regexp */ 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCallbacks callback; 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state;/* the current state */ 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno; /* the current transition on that state */ 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transcount; /* the number of chars in char counted transitions */ 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A stack of rollback states 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxRollbacks; 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbRollbacks; 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecRollback *rollbacks; 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The state of the automata if any 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *counts; 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The input stack 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inputStackMax; 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inputStackNr; 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int index; 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *charStack; 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *inputString; /* when operating on characters */ 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegInputTokenPtr inputStack;/* when operating on strings */ 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error handling 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errStateNo; /* the error state number */ 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr errState; /* the error state */ 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *errString; /* the string raising the error */ 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *errCounts; /* counters at the error state */ 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbPush; 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define REGEXP_ALL_COUNTER 0x123456 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define REGEXP_ALL_LAX_COUNTER 0x123457 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top); 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRegFreeState(xmlRegStatePtr state); 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRegFreeAtom(xmlRegAtomPtr atom); 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr); 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint); 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg, int start, int end, const xmlChar *blockName); 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 364df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid xmlAutomataSetFlags(xmlAutomataPtr am, int flags); 365df143a5041f03a22808b59c76698770b74692815Selim Gurun 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 36894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Regexp memory error handler * 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpErrMemory: 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra information 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpErrMemory(xmlRegParserCtxtPtr ctxt, const char *extra) 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *regexp = NULL; 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp = (const char *) ctxt->string; 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XML_ERR_NO_MEMORY; 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp, NULL, 0, 0, 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpErrCompile: 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra information 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a compilation failure 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpErrCompile(xmlRegParserCtxtPtr ctxt, const char *extra) 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *regexp = NULL; 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idx = 0; 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp = (const char *) ctxt->string; 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project idx = ctxt->cur - ctxt->string; 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XML_REGEXP_COMPILE_ERROR; 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_COMPILE_ERROR, XML_ERR_FATAL, NULL, 0, extra, 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp, NULL, idx, 0, 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "failed to compile: %s\n", extra); 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 41594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 41694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Allocation/Deallocation * 41794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt); 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegEpxFromParse: 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context used to build it 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp and fill it with the result from the parser 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new regexp or NULL in case of error 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegexpPtr 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) { 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr ret; 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegexpPtr) xmlMalloc(sizeof(xmlRegexp)); 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegexp)); 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->string = ctxt->string; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbStates = ctxt->nbStates; 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->states = ctxt->states; 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAtoms = ctxt->nbAtoms; 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->atoms = ctxt->atoms; 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbCounters = ctxt->nbCounters; 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->counters = ctxt->counters; 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = ctxt->determinist; 447df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->flags = ctxt->flags; 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->determinist == -1) { 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpIsDeterminist(ret); 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->determinist != 0) && 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->nbCounters == 0) && 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->negs == 0) && 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms != NULL) && 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms[0] != NULL) && 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms[0]->type == XML_REGEXP_STRING)) { 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, nbstates = 0, nbatoms = 0; 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *stateRemap; 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *stringRemap; 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *transitions; 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **transdata; 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **stringMap; 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Switch to a compact representation 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1/ counting the effective number of states left 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2/ counting the unique number of atoms, and check that 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they are all of the string type 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3/ build a table state x atom for the transitions 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateRemap = xmlMalloc(ret->nbStates * sizeof(int)); 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stateRemap == NULL) { 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbStates;i++) { 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->states[i] != NULL) { 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateRemap[i] = nbstates; 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbstates++; 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateRemap[i] = -1; 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Final: %d states\n", nbstates); 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringMap = xmlMalloc(ret->nbAtoms * sizeof(char *)); 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stringMap == NULL) { 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringRemap = xmlMalloc(ret->nbAtoms * sizeof(int)); 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stringRemap == NULL) { 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbAtoms;i++) { 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->atoms[i]->type == XML_REGEXP_STRING) && 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms[i]->quant == XML_REGEXP_QUANT_ONCE)) { 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ret->atoms[i]->valuep; 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < nbatoms;j++) { 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(stringMap[j], value)) { 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringRemap[i] = j; 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (j >= nbatoms) { 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringRemap[i] = nbatoms; 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringMap[nbatoms] = xmlStrdup(value); 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stringMap[nbatoms] == NULL) { 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbatoms;i++) 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap[i]); 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbatoms++; 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbatoms;i++) 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap[i]); 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Final: %d atoms\n", nbatoms); 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transitions = (int *) xmlMalloc((nbstates + 1) * 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (nbatoms + 1) * sizeof(int)); 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transitions == NULL) { 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(transitions, 0, (nbstates + 1) * (nbatoms + 1) * sizeof(int)); 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate the transition table. The first entry for each 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state corresponds to the state type. 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transdata = NULL; 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbStates;i++) { 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stateno, atomno, targetno, prev; 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateno = stateRemap[i]; 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stateno == -1) 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ret->states[i]; 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transitions[stateno * (nbatoms + 1)] = state->type; 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < state->nbTrans;j++) { 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &(state->trans[j]); 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->to == -1) || (trans->atom == NULL)) 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atomno = stringRemap[trans->atom->no]; 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->atom->data != NULL) && (transdata == NULL)) { 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transdata = (void **) xmlMalloc(nbstates * nbatoms * 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(void *)); 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transdata != NULL) 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(transdata, 0, 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbstates * nbatoms * sizeof(void *)); 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project targetno = stateRemap[trans->to]; 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the same atom can generate transitions to 2 different 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * states then it means the automata is not determinist and 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the compact form can't be used ! 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = transitions[stateno * (nbatoms + 1) + atomno + 1]; 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev != 0) { 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev != targetno + 1) { 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = 0; 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Indet: state %d trans %d, atom %d to %d : %d to %d\n", 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i, j, trans->atom->no, trans->to, atomno, targetno); 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(" previous to is %d\n", prev); 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transdata != NULL) 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(transdata); 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(transitions); 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbatoms;i++) 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap[i]); 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_determ; 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("State %d trans %d: atom %d to %d : %d to %d\n", 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i, j, trans->atom->no, trans->to, atomno, targetno); 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transitions[stateno * (nbatoms + 1) + atomno + 1] = 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project targetno + 1; /* to avoid 0 */ 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transdata != NULL) 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transdata[stateno * nbatoms + atomno] = 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->atom->data; 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = 1; 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debug 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbstates;i++) { 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < nbatoms + 1;j++) { 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("%02d ", transitions[i * (nbatoms + 1) + j]); 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup of the old data 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->states != NULL) { 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbStates;i++) 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(ret->states[i]); 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->states); 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->states = NULL; 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbStates = 0; 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->atoms != NULL) { 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbAtoms;i++) 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(ret->atoms[i]); 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->atoms); 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->atoms = NULL; 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAtoms = 0; 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->compact = transitions; 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->transdata = transdata; 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringMap = stringMap; 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbstrings = nbatoms; 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbstates = nbstates; 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_determ: 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->string = NULL; 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbStates = 0; 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbAtoms = 0; 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms = NULL; 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbCounters = 0; 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters = NULL; 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewParserCtxt: 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string: the string to parse 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp parser context 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new context or NULL in case of error 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegParserCtxtPtr 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewParserCtxt(const xmlChar *string) { 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegParserCtxtPtr ret; 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegParserCtxtPtr) xmlMalloc(sizeof(xmlRegParserCtxt)); 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegParserCtxt)); 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string != NULL) 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->string = xmlStrdup(string); 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->cur = ret->string; 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->neg = 0; 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->negs = 0; 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = 0; 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = -1; 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewRange: 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neg: is that negative 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of range 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start: the start codepoint 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end: the end codepoint 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp range 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new range or NULL in case of error 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegRangePtr 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewRange(xmlRegParserCtxtPtr ctxt, 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg, xmlRegAtomType type, int start, int end) { 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr ret; 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegRangePtr) xmlMalloc(sizeof(xmlRegRange)); 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating range"); 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->neg = neg; 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->start = start; 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->end = end; 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeRange: 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range: the regexp range 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp range 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeRange(xmlRegRangePtr range) { 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range == NULL) 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->blockName != NULL) 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(range->blockName); 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(range); 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCopyRange: 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range: the regexp range 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy a regexp range 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new copy or NULL in case of error. 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegRangePtr 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCopyRange(xmlRegParserCtxtPtr ctxt, xmlRegRangePtr range) { 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr ret; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range == NULL) 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegNewRange(ctxt, range->neg, range->type, range->start, 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->end); 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->blockName != NULL) { 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->blockName = xmlStrdup(range->blockName); 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->blockName == NULL) { 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating range"); 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRange(ret); 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewAtom: 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of atom 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new atom 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new atom or NULL in case of error 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegAtomPtr 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomType type) { 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr ret; 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating atom"); 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegAtom)); 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->quant = XML_REGEXP_QUANT_ONCE; 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->min = 0; 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max = 0; 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeAtom: 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom: the regexp atom 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp atom 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeAtom(xmlRegAtomPtr atom) { 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom->nbRanges;i++) 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRange(atom->ranges[i]); 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->ranges != NULL) 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->ranges); 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->type == XML_REGEXP_STRING) && (atom->valuep != NULL)) 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->valuep); 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->type == XML_REGEXP_STRING) && (atom->valuep2 != NULL)) 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->valuep2); 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->type == XML_REGEXP_BLOCK_NAME) && (atom->valuep != NULL)) 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->valuep); 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom); 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCopyAtom: 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom: the oiginal atom 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp range 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new atom or NULL in case of error 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegAtomPtr 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCopyAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr ret; 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "copying atom"); 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegAtom)); 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = atom->type; 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->quant = atom->quant; 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->min = atom->min; 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max = atom->max; 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->nbRanges > 0) { 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ranges = (xmlRegRangePtr *) xmlMalloc(sizeof(xmlRegRangePtr) * 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->nbRanges); 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->ranges == NULL) { 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "copying atom"); 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom->nbRanges;i++) { 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ranges[i] = xmlRegCopyRange(ctxt, atom->ranges[i]); 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->ranges[i] == NULL) 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbRanges = i + 1; 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(ret); 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegStatePtr 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewState(xmlRegParserCtxtPtr ctxt) { 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr ret; 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegStatePtr) xmlMalloc(sizeof(xmlRegState)); 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating state"); 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegState)); 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_REGEXP_TRANS_STATE; 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->mark = XML_REGEXP_MARK_NORMAL; 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeState: 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: the regexp state 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp state 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeState(xmlRegStatePtr state) { 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->trans != NULL) 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state->trans); 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->transTo != NULL) 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state->transTo); 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state); 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeParserCtxt: 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp parser context 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeParserCtxt(xmlRegParserCtxtPtr ctxt) { 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->string != NULL) 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->string); 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbStates;i++) 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(ctxt->states[i]); 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->states); 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atoms != NULL) { 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbAtoms;i++) 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(ctxt->atoms[i]); 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->atoms); 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->counters != NULL) 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->counters); 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 93894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 93994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Display of Data structures * 94094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintAtomType(FILE *output, xmlRegAtomType type) { 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "epsilon "); break; 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "charval "); break; 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "ranges "); break; 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SUBREG: 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "subexpr "); break; 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "string "); break; 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYCHAR: 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "anychar "); break; 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "anyspace "); break; 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notspace "); break; 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "initname "); break; 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notinitname "); break; 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "namechar "); break; 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notnamechar "); break; 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "decimal "); break; 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notdecimal "); break; 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "realchar "); break; 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notrealchar "); break; 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER "); break; 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_UPPERCASE "); break; 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_LOWERCASE "); break; 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_TITLECASE "); break; 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_MODIFIER "); break; 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_OTHERS "); break; 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK "); break; 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK_NONSPACING "); break; 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK_SPACECOMBINING "); break; 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK_ENCLOSING "); break; 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER "); break; 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER_DECIMAL "); break; 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER_LETTER "); break; 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER_OTHERS "); break; 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT "); break; 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_CONNECTOR "); break; 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_DASH "); break; 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_OPEN "); break; 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_CLOSE "); break; 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_INITQUOTE "); break; 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_FINQUOTE "); break; 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_OTHERS "); break; 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR "); break; 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR_SPACE "); break; 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR_LINE "); break; 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR_PARA "); break; 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL "); break; 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_MATH "); break; 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_CURRENCY "); break; 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_MODIFIER "); break; 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_OTHERS "); break; 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER "); break; 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_CONTROL "); break; 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_FORMAT "); break; 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_PRIVATE "); break; 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_NA "); break; 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_BLOCK_NAME: 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "BLOCK "); break; 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintQuantType(FILE *output, xmlRegQuantType type) { 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_EPSILON: 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "epsilon "); break; 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_ONCE: 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "once "); break; 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_OPT: 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "? "); break; 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_MULT: 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "* "); break; 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_PLUS: 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "+ "); break; 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_RANGE: 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "range "); break; 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_ONCEONLY: 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "onceonly "); break; 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_ALL: 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "all "); break; 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintRange(FILE *output, xmlRegRangePtr range) { 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " range: "); 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->neg) 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "negative "); 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtomType(output, range->type); 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%c - %c\n", range->start, range->end); 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintAtom(FILE *output, xmlRegAtomPtr atom) { 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " atom: "); 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "not "); 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtomType(output, atom->type); 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintQuantType(output, atom->quant); 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->quant == XML_REGEXP_QUANT_RANGE) 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d-%d ", atom->min, atom->max); 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type == XML_REGEXP_STRING) 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'%s' ", (char *) atom->valuep); 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type == XML_REGEXP_CHARVAL) 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "char %c\n", atom->codepoint); 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (atom->type == XML_REGEXP_RANGES) { 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d entries\n", atom->nbRanges); 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < atom->nbRanges;i++) 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintRange(output, atom->ranges[i]); 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom->type == XML_REGEXP_SUBREG) { 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "start %d end %d\n", atom->start->no, atom->stop->no); 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) { 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " trans: "); 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans == NULL) { 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) { 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "removed\n"); 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->nd != 0) { 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->nd == 2) 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "last not determinist, "); 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "not determinist, "); 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "counted %d, ", trans->counter); 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_COUNTER) { 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "all transition, "); 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count >= 0) { 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "count based %d, ", trans->count); 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom == NULL) { 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "epsilon to %d\n", trans->to); 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom->type == XML_REGEXP_CHARVAL) 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "char %c ", trans->atom->codepoint); 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "atom %d, to %d\n", trans->atom->no, trans->to); 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 114794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintState(FILE *output, xmlRegStatePtr state) { 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " state: "); 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_START_STATE) 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "START "); 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_FINAL_STATE) 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "FINAL "); 116194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d, %d transitions:\n", state->no, state->nbTrans); 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < state->nbTrans; i++) { 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintTrans(output, &(state->trans[i])); 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintCtxt(FILE *output, xmlRegParserCtxtPtr ctxt) { 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " ctxt: "); 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'%s' ", ctxt->string); 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error) 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "error "); 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->neg) 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "neg "); 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d atoms:\n", ctxt->nbAtoms); 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbAtoms; i++) { 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %02d ", i); 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(output, ctxt->atoms[i]); 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "current atom:\n"); 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(output, ctxt->atom); 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d states:", ctxt->nbStates); 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->start != NULL) 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " start: %d", ctxt->start->no); 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->end != NULL) 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " end: %d", ctxt->end->no); 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbStates; i++) { 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintState(output, ctxt->states[i]); 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d counters:\n", ctxt->nbCounters); 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbCounters; i++) { 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %d: min %d max %d\n", i, ctxt->counters[i].min, 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[i].max); 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 121194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Finite Automata structures manipulations * 121394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 121694442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic void 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom, 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg, xmlRegAtomType type, int start, int end, 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *blockName) { 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr range; 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add range: atom is NULL"); 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type != XML_REGEXP_RANGES) { 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add range: atom is not ranges"); 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->maxRanges == 0) { 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges = 4; 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->ranges = (xmlRegRangePtr *) xmlMalloc(atom->maxRanges * 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegRangePtr)); 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->ranges == NULL) { 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding ranges"); 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges = 0; 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom->nbRanges >= atom->maxRanges) { 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr *tmp; 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges *= 2; 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegRangePtr *) xmlRealloc(atom->ranges, atom->maxRanges * 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegRangePtr)); 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding ranges"); 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges /= 2; 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->ranges = tmp; 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = xmlRegNewRange(ctxt, neg, type, start, end); 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range == NULL) 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->blockName = blockName; 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->ranges[atom->nbRanges++] = range; 125694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegGetCounter(xmlRegParserCtxtPtr ctxt) { 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->maxCounters == 0) { 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters = 4; 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters = (xmlRegCounter *) xmlMalloc(ctxt->maxCounters * 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegCounter)); 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->counters == NULL) { 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating counter"); 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters = 0; 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbCounters >= ctxt->maxCounters) { 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounter *tmp; 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters *= 2; 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegCounter *) xmlRealloc(ctxt->counters, ctxt->maxCounters * 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegCounter)); 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating counter"); 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters /= 2; 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters = tmp; 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[ctxt->nbCounters].min = -1; 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[ctxt->nbCounters].max = -1; 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->nbCounters++); 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 128794442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic int 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("atom push: atom is NULL"); 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->maxAtoms == 0) { 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms = 4; 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms = (xmlRegAtomPtr *) xmlMalloc(ctxt->maxAtoms * 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegAtomPtr)); 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atoms == NULL) { 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "pushing atom"); 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms = 0; 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbAtoms >= ctxt->maxAtoms) { 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr *tmp; 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms *= 2; 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegAtomPtr *) xmlRealloc(ctxt->atoms, ctxt->maxAtoms * 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegAtomPtr)); 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating counter"); 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms /= 2; 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms = tmp; 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->no = ctxt->nbAtoms; 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms[ctxt->nbAtoms++] = atom; 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 131994442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic void 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target, 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int from) { 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target->maxTransTo == 0) { 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo = 8; 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->transTo = (int *) xmlMalloc(target->maxTransTo * 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(int)); 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target->transTo == NULL) { 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo = 0; 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (target->nbTransTo >= target->maxTransTo) { 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *tmp; 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo *= 2; 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (int *) xmlRealloc(target->transTo, target->maxTransTo * 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(int)); 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo /= 2; 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->transTo = tmp; 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->transTo[target->nbTransTo] = from; 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->nbTransTo++; 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 134794442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic void 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom, xmlRegStatePtr target, 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter, int count) { 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nrtrans; 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add state: state is NULL"); 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target == NULL) { 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add state: target is NULL"); 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Other routines follow the philosophy 'When in doubt, add a transition' 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so we check here whether such a transition is already present and, if 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so, silently ignore this request. 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (nrtrans = state->nbTrans - 1; nrtrans >= 0; nrtrans--) { 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans = &(state->trans[nrtrans]); 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->atom == atom) && 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->to == target->no) && 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->counter == counter) && 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count == count)) { 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Ignoring duplicate transition from %d to %d\n", 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->no, target->no); 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->maxTrans == 0) { 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans = 8; 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans * 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegTrans)); 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->trans == NULL) { 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans = 0; 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (state->nbTrans >= state->maxTrans) { 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTrans *tmp; 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans *= 2; 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegTrans *) xmlRealloc(state->trans, state->maxTrans * 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegTrans)); 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans /= 2; 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans = tmp; 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Add trans from %d to %d ", state->no, target->no); 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count == REGEXP_ALL_COUNTER) 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("all transition\n"); 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (count >= 0) 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("count based %d\n", count); 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (counter >= 0) 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("counted %d\n", counter); 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (atom == NULL) 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("epsilon transition\n"); 141394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun else if (atom != NULL) 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(stdout, atom); 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].atom = atom; 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].to = target->no; 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].counter = counter; 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].count = count; 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].nd = 0; 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nbTrans++; 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTransTo(ctxt, target, state->no); 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStatePush(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state) { 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) return(-1); 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->maxStates == 0) { 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates = 4; 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = (xmlRegStatePtr *) xmlMalloc(ctxt->maxStates * 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegStatePtr)); 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) { 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding state"); 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates = 0; 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbStates >= ctxt->maxStates) { 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr *tmp; 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates *= 2; 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegStatePtr *) xmlRealloc(ctxt->states, ctxt->maxStates * 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegStatePtr)); 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding state"); 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates /= 2; 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = tmp; 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->no = ctxt->nbStates; 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[ctxt->nbStates++] = state; 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateAllTransition: 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lax: 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateAllTransition(xmlRegParserCtxtPtr ctxt, 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to, 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lax) { 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lax) 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_LAX_COUNTER); 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER); 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateEpsilonTransition: 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateEpsilonTransition(xmlRegParserCtxtPtr ctxt, 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to) { 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, -1); 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateCountedEpsilonTransition: 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * counter: the counter for that transition 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateCountedEpsilonTransition(xmlRegParserCtxtPtr ctxt, 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to, int counter) { 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, counter, -1); 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateCountedTransition: 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * counter: the counter for that transition 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateCountedTransition(xmlRegParserCtxtPtr ctxt, 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to, int counter) { 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, counter); 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateTransitions: 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom: the atom generating the transition 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error. 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to, xmlRegAtomPtr atom) { 154660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlRegStatePtr end; 154760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("genrate transition: atom == NULL"); 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type == XML_REGEXP_SUBREG) { 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a subexpression handling one should not need to 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * create a new node except for XML_REGEXP_QUANT_RANGE. 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegAtomPush(ctxt, atom) < 0) { 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((to != NULL) && (atom->stop != to) && 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom->quant != XML_REGEXP_QUANT_RANGE)) { 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generate an epsilon transition to link to the target 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DV 156794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) && 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom->quant != XML_REGEXP_QUANT_ONCE)) { 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom->quant) { 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_OPT: 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * transition done to the state after end of atom. 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1. set transition from atom start to new state 158194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 2. set transition from atom end to this state. 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1583df143a5041f03a22808b59c76698770b74692815Selim Gurun if (to == NULL) { 1584df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFAGenerateEpsilonTransition(ctxt, atom->start, 0); 1585df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFAGenerateEpsilonTransition(ctxt, atom->stop, 1586df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->state); 1587df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 1588df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFAGenerateEpsilonTransition(ctxt, atom->start, to); 1589df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_MULT: 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->start, atom->stop); 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_PLUS: 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_RANGE: { 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr inter, newstate; 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * create the final state now if needed 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to != NULL) { 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate = to; 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate = xmlRegNewState(ctxt); 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, newstate); 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The principle here is to use counted transition 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to avoid explosion in the number of states in the 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * graph. This is clearly more complex but should not 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be exploitable at runtime. 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->min == 0) && (atom->start0 == NULL)) { 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr copy; 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * duplicate a transition based on atom to count next 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurences after 1. We cannot loop to atom->start 162594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * directly because we need an epsilon transition to 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * newstate. 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ???? For some reason it seems we never reach that 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case, I suppose this got optimized out before when 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project building the automata */ 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy = xmlRegCopyAtom(ctxt, atom); 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (copy == NULL) 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy->quant = XML_REGEXP_QUANT_ONCE; 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy->min = 0; 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy->max = 0; 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(ctxt, atom->start, NULL, copy) 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project < 0) 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inter = ctxt->state; 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(ctxt); 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].min = atom->min - 1; 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].max = atom->max - 1; 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* count the number of times we see it again */ 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedEpsilonTransition(ctxt, inter, 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->stop, counter); 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* allow a way out based on the count */ 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedTransition(ctxt, inter, 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate, counter); 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* and also allow a direct exit for 0 */ 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->start, 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate); 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * either we need the atom at least once or there 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is an atom->start0 allowing to easilly plug the 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * epsilon transition. 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(ctxt); 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].min = atom->min - 1; 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].max = atom->max - 1; 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* count the number of times we see it again */ 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedEpsilonTransition(ctxt, atom->stop, 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->start, counter); 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* allow a way out based on the count */ 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedTransition(ctxt, atom->stop, 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate, counter); 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* and if needed allow a direct exit for 0 */ 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->min == 0) 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->start0, 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate); 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = 0; 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = 0; 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = newstate; 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 168494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->min == 0) && (atom->max == 0) && 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom->quant == XML_REGEXP_QUANT_RANGE)) { 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we can discard the atom and generate an epsilon transition instead 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to != NULL) 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, from, to); 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to != NULL) 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 171094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 171160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott end = to; 171294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((atom->quant == XML_REGEXP_QUANT_MULT) || 171360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (atom->quant == XML_REGEXP_QUANT_PLUS)) { 171460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 171560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Do not pollute the target state by adding transitions from 171660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * it as it is likely to be the shared target of multiple branches. 171760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * So isolate with an epsilon transition. 171860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 171960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlRegStatePtr tmp; 172094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 172160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tmp = xmlRegNewState(ctxt); 172260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tmp != NULL) 172360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlRegStatePush(ctxt, tmp); 172460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else { 172560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(-1); 172660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 172760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFAGenerateEpsilonTransition(ctxt, tmp, to); 172860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott to = tmp; 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegAtomPush(ctxt, atom) < 0) { 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, atom, to, -1, -1); 173460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->state = end; 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom->quant) { 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_OPT: 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, from, to); 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_MULT: 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, from, to); 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_PLUS: 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 174994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case XML_REGEXP_QUANT_RANGE: 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if DV_test 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->min == 0) { 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, from, to); 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAReduceEpsilonTransitions: 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fromnr: the from state 176694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @tonr: the to state 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: should that transition be associated to a counted 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tonr, int counter) { 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transnr; 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from; 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to; 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("xmlFAReduceEpsilonTransitions(%d, %d)\n", fromnr, tonr); 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from = ctxt->states[fromnr]; 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from == NULL) 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = ctxt->states[tonr]; 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((to->mark == XML_REGEXP_MARK_START) || 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (to->mark == XML_REGEXP_MARK_VISITED)) 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->mark = XML_REGEXP_MARK_VISITED; 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->type == XML_REGEXP_FINAL_STATE) { 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("State %d is final, so %d becomes final\n", tonr, fromnr); 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from->type = XML_REGEXP_FINAL_STATE; 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < to->nbTrans;transnr++) { 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].to < 0) 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].atom == NULL) { 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't remove counted transitions 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't loop either 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].to != fromnr) { 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].count >= 0) { 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = to->trans[transnr].to; 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, 181094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->states[newto], 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project -1, to->trans[transnr].count); 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found epsilon trans %d from %d to %d\n", 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, tonr, to->trans[transnr].to); 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].counter >= 0) { 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAReduceEpsilonTransitions(ctxt, fromnr, 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].to, 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].counter); 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAReduceEpsilonTransitions(ctxt, fromnr, 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].to, 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter); 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = to->trans[transnr].to; 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].counter >= 0) { 183294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, 183394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->states[newto], 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].counter, -1); 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 183694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto], counter, -1); 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->mark = XML_REGEXP_MARK_NORMAL; 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEliminateSimpleEpsilonTransitions: 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 184894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Eliminating general epsilon transitions can get costly in the general 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * algorithm due to the large amount of generated new transitions and 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associated comparisons. However for simple epsilon transition used just 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to separate building blocks when generating the automata this can be 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reduced to state elimination: 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - if there exists an epsilon from X to Y 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - if there is no other transition from X 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then X and Y are semantically equivalent and X can be eliminated 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If X is the start state then make Y the start state, else replace the 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target of all transitions to X by transitions to Y. 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int statenr, i, j, newto; 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state, tmp; 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbTrans != 1) 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_UNREACH_STATE) 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* is the only transition out a basic transition */ 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->trans[0].atom == NULL) && 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].to >= 0) && 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].to != statenr) && 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].counter < 0) && 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].count < 0)) { 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newto = state->trans[0].to; 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_START_STATE) { 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found simple epsilon trans from start %d to %d\n", 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project statenr, newto); 188494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found simple epsilon trans from %d to %d\n", 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project statenr, newto); 188994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < state->nbTransTo;i++) { 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->states[state->transTo[i]]; 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < tmp->nbTrans;j++) { 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->trans[j].to == statenr) { 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Changed transition %d on %d to go to %d\n", 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j, tmp->no, newto); 189794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->trans[j].to = -1; 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, tmp, tmp->trans[j].atom, 190094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->states[newto], 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->trans[j].counter, 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->trans[j].count); 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_FINAL_STATE) 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto]->type = XML_REGEXP_FINAL_STATE; 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* eliminate the transition completely */ 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nbTrans = 0; 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->type = XML_REGEXP_UNREACH_STATE; 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 191494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEliminateEpsilonTransitions: 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int statenr, transnr; 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_epsilon; 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) return; 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminate simple epsilon transition and the associated unreachable 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * states. 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAEliminateSimpleEpsilonTransitions(ctxt); 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state != NULL) && (state->type == XML_REGEXP_UNREACH_STATE)) { 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Removed unreachable state %d\n", statenr); 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(state); 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[statenr] = NULL; 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_epsilon = 0; 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build the completed transitions bypassing the epsilons 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use a marking algorithm to avoid loops 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark sink states too. 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process from the latests states backward to the start when 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there is long cascading epsilon chains this minimize the 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * recursions and transition compares when adding the new ones 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = ctxt->nbStates - 1;statenr >= 0;statenr--) { 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->nbTrans == 0) && 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->type != XML_REGEXP_FINAL_STATE)) { 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->type = XML_REGEXP_SINK_STATE; 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->trans[transnr].atom == NULL) && 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[transnr].to >= 0)) { 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->trans[transnr].to == statenr) { 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[transnr].to = -1; 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Removed loopback epsilon trans %d on %d\n", 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, statenr); 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (state->trans[transnr].count < 0) { 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = state->trans[transnr].to; 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found epsilon trans %d from %d to %d\n", 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, statenr, newto); 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_epsilon = 1; 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[transnr].to = -2; 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->mark = XML_REGEXP_MARK_START; 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAReduceEpsilonTransitions(ctxt, statenr, 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newto, state->trans[transnr].counter); 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->mark = XML_REGEXP_MARK_NORMAL; 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found counted transition %d on %d\n", 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, statenr); 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminate the epsilon transitions 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (has_epsilon) { 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans = &(state->trans[transnr]); 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->atom == NULL) && 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count < 0) && 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->to >= 0)) { 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->to = -1; 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use this pass to detect unreachable states too 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state != NULL) 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->reached = XML_REGEXP_MARK_NORMAL; 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[0]; 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state != NULL) 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->reached = XML_REGEXP_MARK_START; 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (state != NULL) { 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr target = NULL; 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->reached = XML_REGEXP_MARK_VISITED; 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark all states reachable from the current reachable state 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->trans[transnr].to >= 0) && 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((state->trans[transnr].atom != NULL) || 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[transnr].count >= 0))) { 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = state->trans[transnr].to; 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states[newto] == NULL) 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states[newto]->reached == XML_REGEXP_MARK_NORMAL) { 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto]->reached = XML_REGEXP_MARK_START; 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = ctxt->states[newto]; 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * find the next accessible state not explored 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target == NULL) { 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 1;statenr < ctxt->nbStates;statenr++) { 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state != NULL) && (state->reached == 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_START)) { 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = state; 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = target; 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state != NULL) && (state->reached == XML_REGEXP_MARK_NORMAL)) { 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Removed unreachable state %d\n", statenr); 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(state); 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[statenr] = NULL; 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) { 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range1->type == XML_REGEXP_RANGES) || 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_RANGES) || 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SUBREG) || 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range1->type == XML_REGEXP_SUBREG) || 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range1->type == XML_REGEXP_STRING) || 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_STRING)) 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* put them in order */ 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range1->type > range2->type) { 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr tmp; 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = range1; 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range1 = range2; 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range2 = tmp; 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range1->type == XML_REGEXP_ANYCHAR) || 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_ANYCHAR)) { 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((range1->type == XML_REGEXP_EPSILON) || 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_EPSILON)) { 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (range1->type == range2->type) { 2102df143a5041f03a22808b59c76698770b74692815Selim Gurun if (range1->type != XML_REGEXP_CHARVAL) 2103df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 1; 2104df143a5041f03a22808b59c76698770b74692815Selim Gurun else if ((range1->end < range2->start) || 2105df143a5041f03a22808b59c76698770b74692815Selim Gurun (range2->end < range1->start)) 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2107df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2108df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 1; 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (range1->type == XML_REGEXP_CHARVAL) { 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint; 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg = 0; 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just check all codepoints in the range for acceptance, 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is usually way cheaper since done only once at 211694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * compilation than testing over and over at runtime or 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pushing too many states when evaluating. 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((range1->neg == 0) && (range2->neg != 0)) || 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((range1->neg != 0) && (range2->neg == 0))) 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = 1; 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (codepoint = range1->start;codepoint <= range1->end ;codepoint++) { 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(range2->type, codepoint, 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, range2->start, range2->end, 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range2->blockName); 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((neg == 1) && (ret == 0)) || 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((neg == 0) && (ret == 1))) 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((range1->type == XML_REGEXP_BLOCK_NAME) || 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_BLOCK_NAME)) { 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range1->type == range2->type) { 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(range1->blockName, range2->blockName); 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparing a block range with anything else is way 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * too costly, and maintining the table is like too much 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * memory too, so let's force the automata to save state 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here. 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((range1->type < XML_REGEXP_LETTER) || 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type < XML_REGEXP_LETTER)) { 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range1->type == XML_REGEXP_ANYSPACE) && 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTSPACE)) 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_INITNAME) && 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTINITNAME)) 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_NAMECHAR) && 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTNAMECHAR)) 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_DECIMAL) && 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTDECIMAL)) 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_REALCHAR) && 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTREALCHAR)) 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* same thing to limit complexity */ 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* range1->type < range2->type here */ 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (range1->type) { 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all disjoint except in the subgroups */ 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_LETTER_UPPERCASE) || 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_LOWERCASE) || 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_TITLECASE) || 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_MODIFIER) || 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_OTHERS)) 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_MARK_NONSPACING) || 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_MARK_SPACECOMBINING) || 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_MARK_ENCLOSING)) 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_NUMBER_DECIMAL) || 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NUMBER_LETTER) || 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NUMBER_OTHERS)) 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_PUNCT_CONNECTOR) || 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_DASH) || 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_OPEN) || 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_CLOSE) || 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_INITQUOTE) || 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_FINQUOTE) || 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_OTHERS)) 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_SEPAR_SPACE) || 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SEPAR_LINE) || 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SEPAR_PARA)) 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_SYMBOL_MATH) || 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SYMBOL_CURRENCY) || 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SYMBOL_MODIFIER) || 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SYMBOL_OTHERS)) 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_OTHER_CONTROL) || 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_OTHER_FORMAT) || 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_OTHER_PRIVATE)) 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type >= XML_REGEXP_LETTER) && 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type < XML_REGEXP_BLOCK_NAME)) 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* safety net ! */ 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((range1->neg == 0) && (range2->neg != 0)) || 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((range1->neg != 0) && (range2->neg == 0))) 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 2235df143a5041f03a22808b59c76698770b74692815Selim Gurun return(ret); 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFACompareAtomTypes: 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type1: an atom type 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type2: an atom type 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms type to check whether they intersect in some ways, 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used by xmlFACompareAtoms only 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if they may intersect and 0 otherwise 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFACompareAtomTypes(xmlRegAtomType type1, xmlRegAtomType type2) { 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type1 == XML_REGEXP_EPSILON) || 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_CHARVAL) || 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_RANGES) || 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_SUBREG) || 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_STRING) || 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_ANYCHAR)) 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_EPSILON) || 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_CHARVAL) || 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_RANGES) || 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_SUBREG) || 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_STRING) || 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_ANYCHAR)) 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type1 == type2) return(1); 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* simplify subsequent compares by making sure type1 < type2 */ 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type1 > type2) { 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType tmp = type1; 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type1 = type2; 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type2 = tmp; 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type1) { 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: /* \s */ 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a letter, number, mark, pontuation, symbol */ 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTSPACE) || 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_LETTER) && 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_LETTER_OTHERS)) || 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_NUMBER) && 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_NUMBER_OTHERS)) || 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) return(0); 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: /* \S */ 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: /* \l */ 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a number, mark, separator, pontuation, symbol or other */ 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTINITNAME) || 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_NUMBER) && 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_NUMBER_OTHERS)) || 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) return(0); 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: /* \L */ 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: /* \c */ 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a mark, separator, pontuation, symbol or other */ 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTNAMECHAR) || 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) return(0); 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: /* \C */ 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: /* \d */ 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a letter, mark, separator, pontuation, symbol or other */ 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTDECIMAL) || 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_REALCHAR) || 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_LETTER) && 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_LETTER_OTHERS)) || 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project )return(0); 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: /* \D */ 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: /* \w */ 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a mark, separator, pontuation, symbol or other */ 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTDECIMAL) || 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project )return(0); 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: /* \W */ 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * at that point we know both type 1 and type2 are from 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character categories are ordered and are different, 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it becomes simple because this is a partition 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_LETTER_OTHERS) 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_MARK_ENCLOSING) 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_NUMBER_OTHERS) 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_PUNCT_OTHERS) 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_SEPAR_PARA) 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_SYMBOL_OTHERS) 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_OTHER_NA) 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEqualAtoms: 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom1: an atom 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom2: an atom 2443df143a5041f03a22808b59c76698770b74692815Selim Gurun * @deep: if not set only compare string pointers 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms to check whether they are the same exactly 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used to remove equivalent transitions 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if same and 0 otherwise 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2451df143a5041f03a22808b59c76698770b74692815Selim GurunxmlFAEqualAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1 == atom2) 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom1 == NULL) || (atom2 == NULL)) 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->type != atom2->type) 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom1->type) { 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 2466df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!deep) 2467df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = (atom1->valuep == atom2->valuep); 2468df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2469df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlStrEqual((xmlChar *)atom1->valuep, 2470df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlChar *)atom2->valuep); 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (atom1->codepoint == atom2->codepoint); 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* too hard to do in the general case */ 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFACompareAtoms: 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom1: an atom 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom2: an atom 2488df143a5041f03a22808b59c76698770b74692815Selim Gurun * @deep: if not set only compare string pointers 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms to check whether they intersect in some ways, 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used by xmlFAComputesDeterminism and xmlFARecurseDeterminism only 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes and 0 otherwise 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2496df143a5041f03a22808b59c76698770b74692815Selim GurunxmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1 == atom2) 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom1 == NULL) || (atom2 == NULL)) 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom1->type == XML_REGEXP_ANYCHAR) || 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom2->type == XML_REGEXP_ANYCHAR)) 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->type > atom2->type) { 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr tmp; 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = atom1; 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom1 = atom2; 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom2 = tmp; 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->type != atom2->type) { 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFACompareAtomTypes(atom1->type, atom2->type); 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if they can't intersect at the type level break now */ 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom1->type) { 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 2522df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!deep) 2523df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = (atom1->valuep != atom2->valuep); 2524df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2525df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlRegStrEqualWildcard((xmlChar *)atom1->valuep, 2526df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlChar *)atom2->valuep); 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_determinist; 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom2->type == XML_REGEXP_CHARVAL) { 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (atom1->codepoint == atom2->codepoint); 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom2, atom1->codepoint); 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom2->type == XML_REGEXP_RANGES) { 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, res; 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr r1, r2; 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need to check that none of the ranges eventually matches 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom1->nbRanges;i++) { 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < atom2->nbRanges;j++) { 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project r1 = atom1->ranges[i]; 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project r2 = atom2->ranges[j]; 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlFACompareRanges(r1, r2); 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == 1) { 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_determinist; 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->neg != atom2->neg) { 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_determinist: 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFARecurseDeterminism: 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the associated regexp is determinist, 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should be called after xmlFAEliminateEpsilonTransitions() 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int to, xmlRegAtomPtr atom) { 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transnr, nbTrans; 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t1; 2589df143a5041f03a22808b59c76698770b74692815Selim Gurun int deep = 1; 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 259394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (state->markd == XML_REGEXP_MARK_VISITED) 259494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return(ret); 2595df143a5041f03a22808b59c76698770b74692815Selim Gurun 2596df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->flags & AM_AUTOMATA_RNG) 2597df143a5041f03a22808b59c76698770b74692815Selim Gurun deep = 0; 2598df143a5041f03a22808b59c76698770b74692815Selim Gurun 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * don't recurse on transitions potentially added in the course of 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the elimination. 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbTrans = state->nbTrans; 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < nbTrans;transnr++) { 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1 = &(state->trans[transnr]); 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check transitions conflicting with the one looked at 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->atom == NULL) { 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to < 0) 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 261294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun state->markd = XML_REGEXP_MARK_VISITED; 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to, atom); 261594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun state->markd = 0; 2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == 0) { 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* t1->nd = 1; */ 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to != to) 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2624df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlFACompareAtoms(t1->atom, atom, deep)) { 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* mark the transition as non-deterministic */ 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1->nd = 1; 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAComputesDeterminism: 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the associated regexp is determinist, 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should be called after xmlFAEliminateEpsilonTransitions() 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt) { 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int statenr, transnr; 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t1, t2, last; 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 2648df143a5041f03a22808b59c76698770b74692815Selim Gurun int deep = 1; 2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("xmlFAComputesDeterminism\n"); 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintCtxt(stdout, ctxt); 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->determinist != -1) 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->determinist); 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2657df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->flags & AM_AUTOMATA_RNG) 2658df143a5041f03a22808b59c76698770b74692815Selim Gurun deep = 0; 2659df143a5041f03a22808b59c76698770b74692815Selim Gurun 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First cleanup the automata removing cancelled transitions 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbTrans < 2) 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1 = &(state->trans[transnr]); 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determinism checks in case of counted or all transitions 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will have to be handled separately 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->atom == NULL) { 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* t1->nd = 1; */ 2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to == -1) /* eliminated */ 2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < transnr;i++) { 2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2 = &(state->trans[i]); 2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->to == -1) /* eliminated */ 2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->atom != NULL) { 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to == t2->to) { 2687df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 2688df143a5041f03a22808b59c76698770b74692815Selim Gurun * Here we use deep because we want to keep the 2689df143a5041f03a22808b59c76698770b74692815Selim Gurun * transitions which indicate a conflict 2690df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 2691df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlFAEqualAtoms(t1->atom, t2->atom, deep) && 2692df143a5041f03a22808b59c76698770b74692815Selim Gurun (t1->counter == t2->counter) && 2693df143a5041f03a22808b59c76698770b74692815Selim Gurun (t1->count == t2->count)) 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2->to = -1; /* eliminated */ 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for all states that there aren't 2 transitions 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with the same atom and a different target. 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbTrans < 2) 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1 = &(state->trans[transnr]); 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determinism checks in case of counted or all transitions 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will have to be handled separately 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->atom == NULL) { 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to == -1) /* eliminated */ 2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < transnr;i++) { 2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2 = &(state->trans[i]); 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->to == -1) /* eliminated */ 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->atom != NULL) { 2728df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 2729df143a5041f03a22808b59c76698770b74692815Selim Gurun * But here we don't use deep because we want to 2730df143a5041f03a22808b59c76698770b74692815Selim Gurun * find transitions which indicate a conflict 2731df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 2732df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlFACompareAtoms(t1->atom, t2->atom, 1)) { 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* mark the transitions as non-deterministic ones */ 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1->nd = 1; 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2->nd = 1; 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = t1; 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (t1->to != -1) { 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * do the closure in case of remaining specific 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * epsilon transitions like choices or all 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2->to, t2->atom); 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't shortcut the computation so all non deterministic 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transition get marked down 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1->nd = 1; 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* t2->nd = 1; */ 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = t1; 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't shortcut the computation so all non deterministic 2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transition get marked down 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; */ 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * mark specifically the last non-deterministic transition 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from a state since there is no need to set-up rollback 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from it 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last != NULL) { 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->nd = 2; 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't shortcut the computation so all non deterministic 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transition get marked down 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; */ 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->determinist = ret; 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 278494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to check input against transition atoms * 278694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg, 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start, int end, const xmlChar *blockName) { 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SUBREG: 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYCHAR: 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((codepoint != '\n') && (codepoint != '\r')); 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((codepoint >= start) && (codepoint <= end)); 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: 2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((codepoint == '\n') || (codepoint == '\r') || 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '\t') || (codepoint == ' ')); 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: 281594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ret = (IS_LETTER(codepoint) || 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '_') || (codepoint == ':')); 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (IS_LETTER(codepoint) || IS_DIGIT(codepoint) || 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '.') || (codepoint == '-') || 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '_') || (codepoint == ':') || 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project IS_COMBINING(codepoint) || IS_EXTENDER(codepoint)); 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNd(codepoint); 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatP(codepoint); 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZ(codepoint); 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatC(codepoint); 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatL(codepoint); 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLu(codepoint); 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLl(codepoint); 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLt(codepoint); 2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLm(codepoint); 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLo(codepoint); 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatM(codepoint); 2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatMn(codepoint); 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatMc(codepoint); 2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatMe(codepoint); 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatN(codepoint); 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNd(codepoint); 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNl(codepoint); 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNo(codepoint); 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatP(codepoint); 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPc(codepoint); 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPd(codepoint); 2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPs(codepoint); 2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPe(codepoint); 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPi(codepoint); 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPf(codepoint); 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPo(codepoint); 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZ(codepoint); 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZs(codepoint); 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZl(codepoint); 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZp(codepoint); 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatS(codepoint); 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSm(codepoint); 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSc(codepoint); 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSk(codepoint); 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSo(codepoint); 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatC(codepoint); 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatCc(codepoint); 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatCf(codepoint); 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatCo(codepoint); 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ret = xmlUCSIsCatCn(codepoint); */ 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Seems it doesn't exist anymore in recent Unicode releases */ 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_BLOCK_NAME: 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsBlock(codepoint, (const char *) blockName); 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neg) 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(!ret); 2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint) { 2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret = 0; 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr range; 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom == NULL) || (!IS_CHAR(codepoint))) 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom->type) { 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SUBREG: 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(codepoint == atom->codepoint); 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: { 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int accept = 0; 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom->nbRanges;i++) { 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = atom->ranges[i]; 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->neg == 2) { 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(range->type, codepoint, 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, range->start, range->end, 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->blockName); 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); /* excluded char */ 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (range->neg) { 2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(range->type, codepoint, 2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, range->start, range->end, 2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->blockName); 2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project accept = 1; 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(range->type, codepoint, 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, range->start, range->end, 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->blockName); 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project accept = 1; /* might still be excluded */ 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(accept); 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("TODO: XML_REGEXP_STRING\n"); 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYCHAR: 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_BLOCK_NAME: 3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(atom->type, codepoint, 0, 0, 0, 3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *)atom->valuep); 3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 306394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Saving and restoring state of an execution context * 306594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegDebugExec(xmlRegExecCtxtPtr exec) { 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("state: %d:%d:idx %d", exec->state->no, exec->transno, exec->index); 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack != NULL) { 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(": "); 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;(i < 3) && (i < exec->inputStackNr);i++) 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("%s ", (const char *) 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr - (i + 1)].value); 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(": %s", &(exec->inputString[exec->index])); 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecSave(xmlRegExecCtxtPtr exec) { 3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("saving "); 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno++; 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegDebugExec(exec); 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno--; 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef MAX_PUSH 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->nbPush > MAX_PUSH) { 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbPush++; 3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->maxRollbacks == 0) { 3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 4; 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = (xmlRegExecRollback *) xmlMalloc(exec->maxRollbacks * 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegExecRollback)); 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks == NULL) { 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "saving regexp"); 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 0; 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec->rollbacks, 0, 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks * sizeof(xmlRegExecRollback)); 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->nbRollbacks >= exec->maxRollbacks) { 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecRollback *tmp; 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = exec->maxRollbacks; 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks *= 2; 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegExecRollback *) xmlRealloc(exec->rollbacks, 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks * sizeof(xmlRegExecRollback)); 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "saving regexp"); 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks /= 2; 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = tmp; 3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = &exec->rollbacks[len]; 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(tmp, 0, (exec->maxRollbacks - len) * sizeof(xmlRegExecRollback)); 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].state = exec->state; 3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].index = exec->index; 3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].nextbranch = exec->transno + 1; 3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->nbCounters > 0) { 3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { 3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].counts = (int *) 3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(exec->comp->nbCounters * sizeof(int)); 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "saving regexp"); 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -5; 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->rollbacks[exec->nbRollbacks].counts, exec->counts, 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks++; 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->nbRollbacks <= 0) { 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("rollback failed on empty stack\n"); 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks--; 3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = exec->rollbacks[exec->nbRollbacks].state; 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index = exec->rollbacks[exec->nbRollbacks].index; 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = exec->rollbacks[exec->nbRollbacks].nextbranch; 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->nbCounters > 0) { 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "exec save: allocation failed"); 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -6; 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts, 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("restored "); 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegDebugExec(exec); 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 317694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Verifier, running an input against a compiled regexp * 317894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxt execval; 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec = &execval; 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret, codepoint = 0, len, deter; 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputString = content; 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index = 0; 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbPush = 0; 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 1; 3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 0; 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks = 0; 3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = NULL; 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = 0; 3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp = comp; 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = comp->states[0]; 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack = NULL; 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 0; 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbCounters > 0) { 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int)); 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "running regexp"); 3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec->counts, 0, comp->nbCounters * sizeof(int)); 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = NULL; 321094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun while ((exec->status == 0) && (exec->state != NULL) && 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((exec->inputString[exec->index] != 0) || 321260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((exec->state != NULL) && 321360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (exec->state->type != XML_REGEXP_FINAL_STATE)))) { 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If end of input on non-terminal state, rollback, however we may 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * still have epsilon like transition for counted transitions 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on counters, in that case don't break too early. Additionally, 3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if we are working on a range like "AB{0,2}", where B is not present, 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we don't want to break. 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) { 3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if there is a transition, we must check if 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * atom allows minOccurs of 0 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transno < exec->state->nbTrans) { 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to >=0) { 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!((atom->min == 0) && (atom->max > 0))) 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;exec->transno < exec->state->nbTrans;exec->transno++) { 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project deter = 1; 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count >= 0) { 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A counted transition. 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->count]; 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->count]; 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing count %d: val %d, min %d, max %d\n", 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, count, counter->min, counter->max); 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((count >= counter->min) && (count <= counter->max)); 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret) && (counter->min != counter->max)) 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project deter = 0; 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom == NULL) { 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "epsilon transition left at runtime\n"); 3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -2; 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->inputString[exec->index] != 0) { 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (atom->min >= 0) && (atom->max > 0)) { 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to = comp->states[trans->to]; 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a multiple input sequence 3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If there is a counter associated increment it now. 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before potentially saving and rollback 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * do not increment if the counter is already over the 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * maximum limit in which case get to next transition 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->counts == NULL) || 3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp == NULL) || 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->counters == NULL)) { 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts[trans->counter] >= counter->max) 3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* for loop on transitions */ 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to progress as much as possible on the input 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount == atom->max) { 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input: stop here 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputString[exec->index] == 0) { 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index -= len; 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount >= atom->min) { 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno = exec->transno; 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state = exec->state; 3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The transition is acceptable save it 3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = -1; /* trick */ 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = to; 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = transno; 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = state; 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len); 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount++; 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (ret == 1); 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount < atom->min) 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the last check failed but one transition was found 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible, rollback 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Decreasing count %d\n", trans->counter); 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]--; 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((ret == 0) && (atom->min == 0) && (atom->max > 0)) { 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we don't match on the codepoint, but minOccurs of 0 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * says that's ok. Setting len to 0 inhibits stepping 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * over the codepoint. 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 0; 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((atom->min == 0) && (atom->max > 0)) { 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* another spot to match when minOccurs is 0 */ 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 0; 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->nd == 1) || 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((trans->count >= 0) && (deter == 0) && 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->nbTrans > exec->transno + 1))) { 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->nd == 1) 3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Saving on nd transition atom %d for %c at %d\n", 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->atom->no, codepoint, exec->index); 3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Saving on counted transition count %d for %c at %d\n", 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, codepoint, exec->index); 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* make sure we don't go over the counter maximum value */ 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->counts == NULL) || 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp == NULL) || 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->counters == NULL)) { 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts[trans->counter] >= counter->max) 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* for loop on transitions */ 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->count >= 0) && 3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count < REGEXP_ALL_COUNTER)) { 3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("resetting count %d on transition\n", 3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count); 3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->count] = 0; 3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", trans->to); 3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = comp->states[trans->to]; 3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom != NULL) { 3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto progress; 3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -4; 3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { 3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback: 3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find a way out 3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 0; 3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("rollback from state %d on %d:%c\n", exec->state->no, 3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint,codepoint); 3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecRollBack(exec); 3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress: 3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks != NULL) { 3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) { 3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->maxRollbacks;i++) 3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[i].counts != NULL) 3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks[i].counts); 3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks); 3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 346494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (exec->state == NULL) 346594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return(-1); 3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) 3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->counts); 3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == 0) 3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == -1) { 3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->nbPush > MAX_PUSH) 3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 347994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Progressive interface to the verifier one atom at a time * 348194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void testerr(xmlRegExecCtxtPtr exec); 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewExecCtxt: 3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: a precompiled regular expression 3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @callback: a callback function used for handling progresses in the 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * automata matching phase 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: the context data associated to the callback in this context 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a context used for progressive evaluation of a regexp. 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new context 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecCtxtPtr 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewExecCtxt(xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data) { 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->compact == NULL) && (comp->states == NULL)) 3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = (xmlRegExecCtxtPtr) xmlMalloc(sizeof(xmlRegExecCtxt)); 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) { 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "creating execution context"); 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec, 0, sizeof(xmlRegExecCtxt)); 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputString = NULL; 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index = 0; 3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 1; 3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 0; 3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks = 0; 3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = NULL; 3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = 0; 3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp = comp; 3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact == NULL) 3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = comp->states[0]; 3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->callback = callback; 3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->data = data; 3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbCounters > 0) { 3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For error handling, exec->counts is allocated twice the size 3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the second half is used to store the data in case of rollback 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int) 3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2); 3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "creating execution context"); 3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec); 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec->counts, 0, comp->nbCounters * sizeof(int) * 2); 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errCounts = &exec->counts[comp->nbCounters]; 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = NULL; 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errCounts = NULL; 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 0; 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackNr = 0; 3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack = NULL; 3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errStateNo = -1; 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = NULL; 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbPush = 0; 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec); 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeExecCtxt: 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regular expression evaulation context 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the structures associated to a regular expression evaulation context. 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeExecCtxt(xmlRegExecCtxtPtr exec) { 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks != NULL) { 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) { 3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->maxRollbacks;i++) 3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[i].counts != NULL) 3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks[i].counts); 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks); 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) 3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->counts); 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack != NULL) { 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->inputStackNr;i++) { 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack[i].value != NULL) 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->inputStack[i].value); 3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->inputStack); 3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec); 3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value, 3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("saving value: %d:%s\n", exec->inputStackNr, value); 3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackMax == 0) { 3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 4; 359894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun exec->inputStack = (xmlRegInputTokenPtr) 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(exec->inputStackMax * sizeof(xmlRegInputToken)); 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack == NULL) { 3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "pushing input string"); 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 0; 3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->inputStackNr + 1 >= exec->inputStackMax) { 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegInputTokenPtr tmp; 3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax *= 2; 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegInputTokenPtr) xmlRealloc(exec->inputStack, 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax * sizeof(xmlRegInputToken)); 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "pushing input string"); 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax /= 2; 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack = tmp; 3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].value = xmlStrdup(value); 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].data = data; 3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackNr++; 3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].value = NULL; 3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].data = NULL; 3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegStrEqualWildcard: 362794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @expStr: the string to be evaluated 3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valStr: the validation string 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if both strings are equal or have the same content. "*" 363194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * can be used as a wildcard in @valStr; "|" is used as a seperator of 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substrings in both @expStr and @valStr. 3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the comparison is satisfied and the number of substrings 3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is equal, 0 otherwise. 3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr) { 3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expStr == valStr) return(1); 3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expStr == NULL) return(0); 3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (valStr == NULL) return(0); 3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eval if we have a wildcard for the current item. 3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*expStr != *valStr) { 3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if one of them starts with a wildcard make valStr be it */ 3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*valStr == '*') { 3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tmp; 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valStr; 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valStr = expStr; 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project expStr = tmp; 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*valStr != 0) && (*expStr != 0) && (*expStr++ == '*')) { 3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*valStr == XML_REG_STRING_SEPARATOR) 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valStr++; 3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (*valStr != 0); 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project expStr++; 3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valStr++; 3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (*valStr != 0); 3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*expStr != 0) 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCompactPushString: 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context 3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled exec with a compact table 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input 3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCompactPushString(xmlRegExecCtxtPtr exec, 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr comp, 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value, 3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int state = exec->index; 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, target; 3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (comp->compact == NULL) || (comp->stringMap == NULL)) 3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 369794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are we at a final state ? 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[state * (comp->nbstrings + 1)] == 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE) 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value pushed: %s\n", value); 3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Examine all outside transitions from current state 3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < comp->nbstrings;i++) { 3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; 3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((target > 0) && (target <= comp->nbstates)) { 371894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun target--; /* to avoid 0 */ 3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegStrEqualWildcard(comp->stringMap[i], value)) { 372094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun exec->index = target; 3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->callback != NULL) && (comp->transdata != NULL)) { 3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->callback(exec->data, value, 3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->transdata[state * comp->nbstrings + i], data); 3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", target); 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[target * (comp->nbstrings + 1)] == 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE) 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[target * (comp->nbstrings + 1)] == 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE) 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find an exit transition out from current state for the 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * current token 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("failed to find a transition for %s on state %d\n", value, state); 3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = xmlStrdup(value); 3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errStateNo = state; 3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project testerr(exec); 3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushStringInternal: 3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end 3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input 3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @compound: value was assembled from 2 strings 3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value, 3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data, int compound) { 3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int final = 0; 3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int progress = 1; 3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp == NULL) 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->compact != NULL) 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegCompactPushString(exec, exec->comp, value, data)); 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->type == XML_REGEXP_FINAL_STATE) 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final = 1; 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value pushed: %s\n", value); 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we have an active rollback stack push the new value there 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and get back to where we were left 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value != NULL) && (exec->inputStackNr > 0)) { 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((exec->status == 0) && 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((value != NULL) || 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((final == 1) && 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->type != XML_REGEXP_FINAL_STATE)))) { 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input on non-terminal state, rollback, however we may 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * still have epsilon like transition for counted transitions 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on counters, in that case don't break too early. 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value == NULL) && (exec->counts == NULL)) 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;exec->transno < exec->state->nbTrans;exec->transno++) { 3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_LAX_COUNTER) { 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t; 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing all lax %d\n", trans->count); 3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all counted transitions from the current state 3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value == NULL) && (final)) { 3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (value != NULL) { 3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->state->nbTrans;i++) { 3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t = &exec->state->trans[i]; 3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((t->counter < 0) || (t == trans)) 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[t->counter]; 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[t->counter]; 385494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((count < counter->max) && 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (t->atom != NULL) && 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(value, t->atom->valuep))) { 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((count >= counter->min) && 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (count < counter->max) && 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (t->atom != NULL) && 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(value, t->atom->valuep))) { 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count == REGEXP_ALL_COUNTER) { 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t; 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing all %d\n", trans->count); 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all counted transitions from the current state 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->state->nbTrans;i++) { 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t = &exec->state->trans[i]; 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((t->counter < 0) || (t == trans)) 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[t->counter]; 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[t->counter]; 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((count < counter->min) || (count > counter->max)) { 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count >= 0) { 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A counted transition. 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->count]; 3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->count]; 3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing count %d: val %d, min %d, max %d\n", 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, count, counter->min, counter->max); 3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((count >= counter->min) && (count <= counter->max)); 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom == NULL) { 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "epsilon transition left at runtime\n"); 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -2; 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (value != NULL) { 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegStrEqualWildcard(atom->valuep, value); 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) { 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!compound) 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (trans->counter >= 0)) { 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->counter]; 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count >= counter->max) 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to = exec->comp->states[trans->to]; 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a multiple input sequence 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackNr <= 0) { 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to progress as much as possible on the input 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount == atom->max) { 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index++; 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input: stop here 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index --; 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount >= atom->min) { 3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno = exec->transno; 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state = exec->state; 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The transition is acceptable save it 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = -1; /* trick */ 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = to; 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackNr <= 0) { 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = transno; 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = state; 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(value, atom->valuep); 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount++; 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (ret == 1); 3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount < atom->min) 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the last check failed but one transition was found 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible, rollback 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->callback != NULL) && (atom != NULL) && 3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (data != NULL)) { 4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->callback(exec->data, atom->valuep, 4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data, data); 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackNr <= 0) { 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->count >= 0) && 4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count < REGEXP_ALL_COUNTER)) { 4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("resetting count %d on transition\n", 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count); 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->count] = 0; 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", trans->to); 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp->states[trans->to] != NULL) && 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->states[trans->to]->type == 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entering a sink state, save the current state as error 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state. 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = xmlStrdup(value); 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errState = exec->state; 4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->errCounts, exec->counts, 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = exec->comp->states[trans->to]; 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom != NULL) { 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack != NULL) { 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index++; 4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->index < exec->inputStackNr) { 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = NULL; 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = NULL; 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("end of input\n"); 4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = NULL; 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = NULL; 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("end of input\n"); 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto progress; 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -4; 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback: 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if we didn't yet rollback on the current input 4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * store the current state as the error state. 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((progress) && (exec->state != NULL) && 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->type != XML_REGEXP_SINK_STATE)) { 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 0; 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = xmlStrdup(value); 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errState = exec->state; 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->errCounts, exec->counts, 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find a way out 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 0; 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecRollBack(exec); 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == 0) { 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress: 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == 0) { 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->state->type == XML_REGEXP_FINAL_STATE); 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status < 0) { 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project testerr(exec); 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushString: 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input 4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecPushStringInternal(exec, value, data, 0)); 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushString2: 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the first string token input 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second string token input 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value, 4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value2, void *data) { 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[150]; 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp, ret; 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp == NULL) 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value2 == NULL) 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecPushString(exec, value, data)); 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) value2); 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) value); 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (150 < lenn + lenp + 2) { 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = buf; 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], value, lenp); 4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = XML_REG_STRING_SEPARATOR; 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], value2, lenn); 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->compact != NULL) 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCompactPushString(exec, exec->comp, str, data); 4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushStringInternal(exec, str, data, 1); 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != buf) 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecGetValues: 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: error extraction or normal one 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract informations from the regexp execution, internal routine to 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implement xmlRegExecNextValues() and xmlRegExecErrInfo() 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error. 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *nbval, int *nbneg, 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values, int *terminal) { 4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxval; 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb = 0; 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 421294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) || 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (values == NULL) || (*nbval <= 0)) 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxval = *nbval; 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *nbval = 0; 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *nbneg = 0; 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp != NULL) && (exec->comp->compact != NULL)) { 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr comp; 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int target, i, state; 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = exec->comp; 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err) { 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errStateNo == -1) return(-1); 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->errStateNo; 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->index; 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (terminal != NULL) { 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[state * (comp->nbstrings + 1)] == 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE) 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 1; 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 0; 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((target > 0) && (target <= comp->nbstates) && 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->compact[(target - 1) * (comp->nbstrings + 1)] != 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = comp->stringMap[i]; 4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbval)++; 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((target > 0) && (target <= comp->nbstates) && 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->compact[(target - 1) * (comp->nbstrings + 1)] == 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = comp->stringMap[i]; 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbneg)++; 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno; 4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (terminal != NULL) { 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->type == XML_REGEXP_FINAL_STATE) 4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 1; 4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 0; 4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err) { 4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errState == NULL) return(-1); 4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->errState; 4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state == NULL) return(-1); 4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->state; 4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transno = 0; 4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (transno < state->nbTrans) && (nb < maxval); 4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transno++) { 4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &state->trans[transno]; 4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom == NULL) || (atom->valuep == NULL)) 4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_LAX_COUNTER) { 4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* this should not be reached but ... */ 4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count == REGEXP_ALL_COUNTER) { 4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* this should not be reached but ... */ 4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->counter >= 0) { 4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter = NULL; 4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err) 4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->errCounts[trans->counter]; 4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->counter]; 4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp != NULL) 4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((counter == NULL) || (count < counter->max)) { 4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep2; 4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep; 4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbval)++; 4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp->states[trans->to] != NULL) && 4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->states[trans->to]->type != 4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep2; 4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep; 4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbval)++; 4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 431894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transno = 0; 4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (transno < state->nbTrans) && (nb < maxval); 4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transno++) { 4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &state->trans[transno]; 4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom == NULL) || (atom->valuep == NULL)) 4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_LAX_COUNTER) { 4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count == REGEXP_ALL_COUNTER) { 4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->counter >= 0) { 4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp->states[trans->to] != NULL) && 4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->states[trans->to]->type == 4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep2; 4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep; 4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbneg)++; 4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 434594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecNextValues: 4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context 4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT 4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions 4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values 4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state 4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract informations from the regexp execution, 4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parameter @values must point to an array of @nbval string pointers 4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on return nbval will contain the number of possible strings in that 4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state and the @values array will be updated with them. The string values 4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned will be freed with the @exec context and don't need to be 4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deallocated. 4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error. 4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, int *nbneg, 4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values, int *terminal) { 4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecGetValues(exec, 0, nbval, nbneg, values, terminal)); 4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecErrInfo: 4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context generating an error 4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string: return value for the error string 4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT 4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions 4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values 4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state 4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract error informations from the regexp execution, the parameter 4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string will be updated with the value pushed and not accepted, 4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parameter @values must point to an array of @nbval string pointers 4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on return nbval will contain the number of possible strings in that 4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state and the @values array will be updated with them. The string values 4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned will be freed with the @exec context and don't need to be 4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deallocated. 4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error. 4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string, 4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *nbval, int *nbneg, xmlChar **values, int *terminal) { 4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string != NULL) { 4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *string = exec->errString; 4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *string = NULL; 4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecGetValues(exec, 1, nbval, nbneg, values, terminal)); 4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void testerr(xmlRegExecCtxtPtr exec) { 4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *string; 4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *values[5]; 4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb = 5; 4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbneg; 4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int terminal; 4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecErrInfo(exec, &string, &nb, &nbneg, &values[0], &terminal); 4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushChar(xmlRegExecCtxtPtr exec, int UCS) { 4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint, len; 4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((exec->status == 0) && 4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((exec->inputString[exec->index] != 0) || 4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->type != XML_REGEXP_FINAL_STATE))) { 4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input on non-terminal state, rollback, however we may 4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * still have epsilon like transition for counted transitions 4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on counters, in that case don't break too early. 4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) 4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;exec->transno < exec->state->nbTrans;exec->transno++) { 4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count >= 0) { 4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A counted transition. 4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->count]; 4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->count]; 4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing count %d: val %d, min %d, max %d\n", 4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, count, counter->min, counter->max); 4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((count >= counter->min) && (count <= counter->max)); 4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom == NULL) { 4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "epsilon transition left at runtime\n"); 4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -2; 4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->inputString[exec->index] != 0) { 4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); 4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { 4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to = exec->comp->states[trans->to]; 4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a multiple input sequence 4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to progress as much as possible on the input 4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount == atom->max) { 4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input: stop here 4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputString[exec->index] == 0) { 4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index -= len; 4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount >= atom->min) { 4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno = exec->transno; 4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state = exec->state; 4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The transition is acceptable save it 4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = -1; /* trick */ 4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = to; 4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = transno; 4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = state; 4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), 4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len); 4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount++; 4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (ret == 1); 4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount < atom->min) 4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the last check failed but one transition was found 4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible, rollback 4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * restart count for expressions like this ((abc){2})* 4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count >= 0) { 4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Reset count %d\n", trans->count); 4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->count] = 0; 4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", trans->to); 4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = exec->comp->states[trans->to]; 4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom != NULL) { 4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto progress; 4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -4; 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback: 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find a way out 4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 0; 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecRollBack(exec); 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress: 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 457694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parser for the Schemas Datatype Regular Expressions * 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#regexs * 457994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAIsChar: 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [10] Char ::= [^.\?*+()|#x5B#x5D] 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAIsChar(xmlRegParserCtxtPtr ctxt) { 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_SCHAR(ctxt->cur, len); 4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '.') || (cur == '\\') || (cur == '?') || 4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '*') || (cur == '+') || (cur == '(') || 4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == ')') || (cur == '|') || (cur == 0x5B) || 4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x5D) || (cur == 0)) 4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharProp: 4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [27] charProp ::= IsCategory | IsBlock 4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [28] IsCategory ::= Letters | Marks | Numbers | Punctuation | 460894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Separators | Symbols | Others 4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29] Letters ::= 'L' [ultmo]? 4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30] Marks ::= 'M' [nce]? 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [31] Numbers ::= 'N' [dlo]? 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [32] Punctuation ::= 'P' [cdseifo]? 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [33] Separators ::= 'Z' [slp]? 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [34] Symbols ::= 'S' [mcko]? 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [35] Others ::= 'C' [cfon]? 4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [36] IsBlock ::= 'Is' [a-zA-Z0-9#x2D]+ 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type = (xmlRegAtomType) 0; 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *blockName = NULL; 462394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'L') { 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'u') { 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_UPPERCASE; 4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'l') { 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_LOWERCASE; 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 't') { 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_TITLECASE; 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'm') { 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_MODIFIER; 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_OTHERS; 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER; 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'M') { 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'n') { 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* nonspacing */ 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK_NONSPACING; 4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'c') { 4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* spacing combining */ 4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK_SPACECOMBINING; 4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'e') { 4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* enclosing */ 4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK_ENCLOSING; 4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all marks */ 4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK; 4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'N') { 4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'd') { 4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* digital */ 4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER_DECIMAL; 4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'l') { 4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* letter */ 4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER_LETTER; 4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* other */ 4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER_OTHERS; 4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all numbers */ 4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER; 4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'P') { 4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'c') { 4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* connector */ 4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_CONNECTOR; 4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'd') { 4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* dash */ 4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_DASH; 4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 's') { 4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* open */ 4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_OPEN; 4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'e') { 4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* close */ 4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_CLOSE; 4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'i') { 4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* initial quote */ 4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_INITQUOTE; 4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'f') { 4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* final quote */ 4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_FINQUOTE; 4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* other */ 4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_OTHERS; 4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all punctuation */ 4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT; 4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'Z') { 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 's') { 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* space */ 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR_SPACE; 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'l') { 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* line */ 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR_LINE; 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'p') { 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* paragraph */ 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR_PARA; 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all separators */ 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR; 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'S') { 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'm') { 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_MATH; 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* math */ 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'c') { 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_CURRENCY; 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* currency */ 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'k') { 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_MODIFIER; 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* modifiers */ 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_OTHERS; 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* other */ 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all symbols */ 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL; 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'C') { 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'c') { 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* control */ 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_CONTROL; 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'f') { 4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* format */ 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_FORMAT; 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* private use */ 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_PRIVATE; 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'n') { 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* not assigned */ 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_NA; 4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all others */ 4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER; 4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'I') { 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *start; 4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != 's') { 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("IsXXXX expected"); 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = ctxt->cur; 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 479594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (((cur >= 'a') && (cur <= 'z')) || 479694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ((cur >= 'A') && (cur <= 'Z')) || 479794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ((cur >= '0') && (cur <= '9')) || 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x2D)) { 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 480194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun while (((cur >= 'a') && (cur <= 'z')) || 480294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ((cur >= 'A') && (cur <= 'Z')) || 480394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ((cur >= '0') && (cur <= '9')) || 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x2D)) { 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_BLOCK_NAME; 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blockName = xmlStrndup(start, ctxt->cur - start); 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Unknown char property"); 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, type); 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->valuep = blockName; 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type, 0, 0, blockName); 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharClassEsc: 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 482994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E] 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [25] catEsc ::= '\p{' charProp '}' 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [26] complEsc ::= '\P{' charProp '}' 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [37] MultiCharEsc ::= '.' | ('\' [sSiIcCdDwW]) 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '.') { 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_ANYCHAR); 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_ANYCHAR, 0, 0, NULL); 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '\\') { 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Escaped sequence: expecting \\"); 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'p') { 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '{') { 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '{'"); 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharProp(ctxt); 4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '}') { 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '}'"); 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'P') { 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '{') { 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '{'"); 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharProp(ctxt); 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->neg = 1; 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '}') { 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '}'"); 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == 'n') || (cur == 'r') || (cur == 't') || (cur == '\\') || 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '|') || (cur == '.') || (cur == '?') || (cur == '*') || 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '+') || (cur == '(') || (cur == ')') || (cur == '{') || 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '}') || (cur == 0x2D) || (cur == 0x5B) || (cur == 0x5D) || 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x5E)) { 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = '\n'; 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'r': 4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = '\r'; 4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 't': 4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = '\t'; 4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = cur; 4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4905df143a5041f03a22808b59c76698770b74692815Selim Gurun switch (cur) { 4906df143a5041f03a22808b59c76698770b74692815Selim Gurun case 'n': 4907df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = '\n'; 4908df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4909df143a5041f03a22808b59c76698770b74692815Selim Gurun case 'r': 4910df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = '\r'; 4911df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4912df143a5041f03a22808b59c76698770b74692815Selim Gurun case 't': 4913df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = '\t'; 4914df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4915df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, cur, cur, NULL); 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == 's') || (cur == 'S') || (cur == 'i') || (cur == 'I') || 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 'c') || (cur == 'C') || (cur == 'd') || (cur == 'D') || 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 'w') || (cur == 'W')) { 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type = XML_REGEXP_ANYSPACE; 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 492694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 's': 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_ANYSPACE; 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 492994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'S': 4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTSPACE; 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 493294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'i': 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_INITNAME; 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 493594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'I': 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTINITNAME; 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 493894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'c': 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NAMECHAR; 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 494194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'C': 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTNAMECHAR; 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 494494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'd': 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_DECIMAL; 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 494794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'D': 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTDECIMAL; 4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 495094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'w': 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_REALCHAR; 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 495394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case 'W': 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTREALCHAR; 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, type); 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type, 0, 0, NULL); 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Wrong escape sequence, misuse of character '\\'"); 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharRange: 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 497394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [18] seRange ::= charOrEsc '-' charOrEsc 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [20] charOrEsc ::= XmlChar | SingleCharEsc 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [21] XmlChar ::= [^\#x2D#x5B#x5D] 4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [22] XmlCharIncDash ::= [^\#x5B#x5D] 4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) { 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur, len; 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start = -1; 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int end = -1; 4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '\0') { 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting ']'"); 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '\\') { 4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': start = 0xA; break; 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'r': start = 0xD; break; 4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 't': start = 0x9; break; 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '\\': case '|': case '.': case '-': case '^': case '?': 4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '*': case '+': case '{': case '}': case '(': case ')': 5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '[': case ']': 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = cur; break; 5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Invalid escape value"); 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = start; 5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur != 0x5B) && (cur != 0x5D)) { 5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = start = CUR_SCHAR(ctxt->cur, len); 5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting a char range"); 5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since we are "inside" a range, we can assume ctxt->cur is past 5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the start of ctxt->string, and PREV should be safe 5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((start == '-') && (NXT(1) != ']') && (PREV != '[') && (PREV != '^')) { 5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur != '-') || (NXT(1) == ']')) { 5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, start, end, NULL); 5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '\\') { 5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': end = 0xA; break; 5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'r': end = 0xD; break; 5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 't': end = 0x9; break; 5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '\\': case '|': case '.': case '-': case '^': case '?': 5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '*': case '+': case '{': case '}': case '(': case ')': 5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '[': case ']': 5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = cur; break; 5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Invalid escape value"); 5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur != 0x5B) && (cur != 0x5D)) { 5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = CUR_SCHAR(ctxt->cur, len); 5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting the end of a char range"); 5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO check that the values are acceptable character ranges for XML */ 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (end < start) { 5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("End of range is before start of range"); 5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, start, end, NULL); 5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParsePosCharGroup: 5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [14] posCharGroup ::= ( charRange | charClassEsc )+ 5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) { 5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 507360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (CUR == '\\') { 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharClassEsc(ctxt); 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharRange(ctxt); 5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((CUR != ']') && (CUR != '^') && (CUR != '-') && 5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR != 0) && (ctxt->error == 0)); 5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharGroup: 5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [13] charGroup ::= posCharGroup | negCharGroup | charClassSub 5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [15] negCharGroup ::= '^' posCharGroup 508894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [16] charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr 5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] charClassExpr ::= '[' charGroup ']' 5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharGroup(xmlRegParserCtxtPtr ctxt) { 5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int n = ctxt->neg; 5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR != ']') && (ctxt->error == 0)) { 5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '^') { 5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg = ctxt->neg; 5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = !ctxt->neg; 5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParsePosCharGroup(ctxt); 5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = neg; 5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '-') && (NXT(1) == '[')) { 5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg = ctxt->neg; 5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = 2; 5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; /* eat the '-' */ 5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; /* eat the '[' */ 5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharGroup(ctxt); 5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ']') { 5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("charClassExpr: ']' expected"); 5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = neg; 5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR != ']') { 5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParsePosCharGroup(ctxt); 5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = n; 5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharClass: 5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [11] charClass ::= charClassEsc | charClassExpr 5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] charClassExpr ::= '[' charGroup ']' 5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharClass(xmlRegParserCtxtPtr ctxt) { 5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '[') { 5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_RANGES); 5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) 5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharGroup(ctxt); 5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ']') { 5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("xmlFAParseCharClass: ']' expected"); 5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharClassEsc(ctxt); 5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseQuantExact: 5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8] QuantExact ::= [0-9]+ 5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success or -1 in case of error 5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseQuantExact(xmlRegParserCtxtPtr ctxt) { 5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ok = 0; 5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (CUR - '0'); 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ok != 1) { 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseQuantifier: 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] quantifier ::= [?*+] | ( '{' quantity '}' ) 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] quantity ::= quantRange | quantMin | QuantExact 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] quantRange ::= QuantExact ',' QuantExact 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [7] quantMin ::= QuantExact ',' 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8] QuantExact ::= [0-9]+ 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseQuantifier(xmlRegParserCtxtPtr ctxt) { 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '?') || (cur == '*') || (cur == '+')) { 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '?') 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_OPT; 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (cur == '*') 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_MULT; 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (cur == '+') 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_PLUS; 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '{') { 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min = 0, max = 0; 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlFAParseQuantExact(ctxt); 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur >= 0) 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = cur; 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ',') { 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '}') 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = INT_MAX; 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlFAParseQuantExact(ctxt); 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur >= 0) 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = cur; 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Improper quantifier"); 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '}') { 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Unterminated quantifier"); 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max == 0) 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = min; 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_RANGE; 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->min = min; 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->max = max; 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseAtom: 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [9] atom ::= Char | charClass | ( '(' regExp ')' ) 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseAtom(xmlRegParserCtxtPtr ctxt) { 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint, len; 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = xmlFAIsChar(ctxt); 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (codepoint > 0) { 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(ctxt->cur, len); 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = codepoint; 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '|') { 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == 0) { 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == ')') { 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '(') { 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start, oldend, start0; 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this extra Epsilon transition is needed if we count with 0 allowed 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * unfortunately this can't be known at that point 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start0 = ctxt->state; 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = ctxt->state; 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldend = ctxt->end; 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseRegExp(ctxt, 0); 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ')') { 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("xmlFAParseAtom: expecting ')'"); 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_SUBREG); 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->start = start; 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->start0 = start0; 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->stop = ctxt->state; 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = oldend; 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '[') || (CUR == '\\') || (CUR == '.')) { 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharClass(ctxt); 5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParsePiece: 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [3] piece ::= atom quantifier? 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParsePiece(xmlRegParserCtxtPtr ctxt) { 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAParseAtom(ctxt); 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("internal: no atom generated"); 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseQuantifier(ctxt); 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseBranch: 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: optional target to the end of the branch 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to is used to optimize by removing duplicate path in automata 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in expressions like (a|b)(c|d) 5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [2] branch ::= piece* 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) { 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr previous; 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project previous = ctxt->state; 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAParsePiece(ctxt); 5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 533694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (xmlFAGenerateTransitions(ctxt, previous, 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project previous = ctxt->state; 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ret != 0) && (ctxt->error == 0)) { 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAParsePiece(ctxt); 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 534594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (xmlFAGenerateTransitions(ctxt, previous, 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project previous = ctxt->state; 5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseRegExp: 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @top: is this the top-level expression ? 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [1] regExp ::= branch ( '|' branch )* 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) { 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start, end; 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if not top start should have been generated by an epsilon trans */ 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = ctxt->state; 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseBranch(ctxt, NULL); 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (top) { 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("State %d is final\n", ctxt->state->no); 5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->type = XML_REGEXP_FINAL_STATE; 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '|') { 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = ctxt->state; 5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = ctxt->state; 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '|') && (ctxt->error == 0)) { 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 538394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (CUR == 0) { 538494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ERROR("expecting a branch after |") 538594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return; 538694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = start; 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseBranch(ctxt, end); 5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!top) { 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = end; 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = end; 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 539894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 539994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * The basic API * 540094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpPrint: 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file for the output debug 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: the compiled regexp 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Print the content of the compiled regular expression 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpPrint(FILE *output, xmlRegexpPtr regexp) { 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " regexp: "); 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp == NULL) { 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'%s' ", regexp->string); 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d atoms:\n", regexp->nbAtoms); 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbAtoms; i++) { 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %02d ", i); 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(output, regexp->atoms[i]); 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d states:", regexp->nbStates); 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbStates; i++) { 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintState(output, regexp->states[i]); 5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d counters:\n", regexp->nbCounters); 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbCounters; i++) { 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %d: min %d max %d\n", i, regexp->counters[i].min, 5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp->counters[i].max); 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpCompile: 5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: a regular expression string 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a regular expression conforming to XML Schemas Part 2 Datatype 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Appendix F and builds an automata suitable for testing strings against 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that regular expression 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled expression or NULL in case of error 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpPtr 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpCompile(const xmlChar *regexp) { 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr ret; 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegParserCtxtPtr ctxt; 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlRegNewParserCtxt(regexp); 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* initialize the parser */ 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start = ctxt->state = xmlRegNewState(ctxt); 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, ctxt->start); 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* parse the expression building an automata */ 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseRegExp(ctxt, 1); 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != 0) { 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("xmlFAParseRegExp: extra characters"); 5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) { 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(ctxt); 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = ctxt->state; 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start->type = XML_REGEXP_START_STATE; 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end->type = XML_REGEXP_FINAL_STATE; 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* remove the Epsilon except for counted transitions */ 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAEliminateEpsilonTransitions(ctxt); 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) { 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(ctxt); 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegEpxFromParse(ctxt); 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(ctxt); 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpExec: 5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled regular expression 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the value to check against the regular expression 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the regular expression generates the value 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it matches, 0 if not and a negative value in case of error 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpExec(xmlRegexpPtr comp, const xmlChar *content) { 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (content == NULL)) 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlFARegExec(comp, content)); 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpIsDeterminist: 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled regular expression 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the regular expression is determinist 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it yes, 0 if not and a negative value in case of error 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpIsDeterminist(xmlRegexpPtr comp) { 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr am; 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->determinist != -1) 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp->determinist); 5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am = xmlNewAutomata(); 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am->states != NULL) { 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < am->nbStates;i++) 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(am->states[i]); 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(am->states); 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->nbAtoms = comp->nbAtoms; 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->atoms = comp->atoms; 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->nbStates = comp->nbStates; 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->states = comp->states; 5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->determinist = -1; 5537df143a5041f03a22808b59c76698770b74692815Selim Gurun am->flags = comp->flags; 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAComputesDeterminism(am); 5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->atoms = NULL; 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->states = NULL; 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(am); 5542df143a5041f03a22808b59c76698770b74692815Selim Gurun comp->determinist = ret; 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeRegexp: 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: the regexp 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeRegexp(xmlRegexpPtr regexp) { 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp == NULL) 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->string != NULL) 5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->string); 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->states != NULL) { 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbStates;i++) 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(regexp->states[i]); 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->states); 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->atoms != NULL) { 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbAtoms;i++) 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(regexp->atoms[i]); 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->atoms); 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->counters != NULL) 5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->counters); 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->compact != NULL) 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->compact); 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->transdata != NULL) 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->transdata); 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->stringMap != NULL) { 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < regexp->nbstrings;i++) 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->stringMap[i]); 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->stringMap); 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp); 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_AUTOMATA_ENABLED 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 558794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 558894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * The Automata interface * 558994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewAutomata: 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new automata 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object or NULL in case of failure 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataPtr 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewAutomata(void) { 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr ctxt; 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlRegNewParserCtxt(NULL); 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* initialize the parser */ 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start = ctxt->state = xmlRegNewState(ctxt); 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->start == NULL) { 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt); 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start->type = XML_REGEXP_START_STATE; 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegStatePush(ctxt, ctxt->start) < 0) { 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(ctxt->start); 5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt); 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5620df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->flags = 0; 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeAutomata: 5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an automata 5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeAutomata(xmlAutomataPtr am) { 5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(am); 5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5639df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlAutomataSetFlags: 5640df143a5041f03a22808b59c76698770b74692815Selim Gurun * @am: an automata 5641df143a5041f03a22808b59c76698770b74692815Selim Gurun * @flags: a set of internal flags 5642df143a5041f03a22808b59c76698770b74692815Selim Gurun * 5643df143a5041f03a22808b59c76698770b74692815Selim Gurun * Set some flags on the automata 5644df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 5645df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid 5646df143a5041f03a22808b59c76698770b74692815Selim GurunxmlAutomataSetFlags(xmlAutomataPtr am, int flags) { 5647df143a5041f03a22808b59c76698770b74692815Selim Gurun if (am == NULL) 5648df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 5649df143a5041f03a22808b59c76698770b74692815Selim Gurun am->flags |= flags; 5650df143a5041f03a22808b59c76698770b74692815Selim Gurun} 5651df143a5041f03a22808b59c76698770b74692815Selim Gurun 5652df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataGetInitState: 5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initial state lookup 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the initial state of the automata 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataGetInitState(xmlAutomataPtr am) { 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->start); 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataSetFinalState: 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a state in this automata 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes that state a final state 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or -1 in case of error 5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataSetFinalState(xmlAutomataPtr am, xmlAutomataStatePtr state) { 5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (state == NULL)) 5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->type = XML_REGEXP_FINAL_STATE; 5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewTransition: 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by the value of @token 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewTransition(xmlAutomataPtr am, xmlAutomataStatePtr from, 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewTransition2: 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the first input string associated to that transition 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by the value of @token 5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewTransition2(xmlAutomataPtr am, xmlAutomataStatePtr from, 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, void *data) { 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewNegTrans: 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the first input string associated to that transition 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by any value except (@token,@token2) 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that if @token2 is not NULL, then (X, NULL) won't match to follow 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project # the semantic of XSD ##other 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, void *data) { 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar err_msg[200]; 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->neg = 1; 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf((char *) err_msg, 199, "not %s", (const char *) atom->valuep); 5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err_msg[199] = 0; 5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep2 = xmlStrdup(err_msg); 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->negs++; 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountTrans2: 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 586094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * activated by a succession of input of value @token and @token2 and 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * whose number is between @min and @max 5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = 1; 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = min; 5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = max; 5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = am->state; 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(am, from, to); 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountTrans: 5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and whose number 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is between @min and @max 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = 1; 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = min; 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = max; 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = am->state; 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(am, from, to); 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewOnceTrans2: 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 601494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * activated by a succession of input of value @token and @token2 and whose 601594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * number is between @min and @max, moreover that transition can only be 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * crossed once. 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 1) 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 605794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCEONLY; 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = 1; 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = 1; 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 608094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewOnceTrans: 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and whose number 6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is between @min and @max, moreover that transition can only be crossed 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * once. 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewOnceTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 1) 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCEONLY; 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = 1; 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = 1; 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewState: 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new disconnected state in the automata 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new state or NULL in case of error 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewState(xmlAutomataPtr am) { 614994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlAutomataStatePtr to; 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewEpsilon: 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target state 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewEpsilon(xmlAutomataPtr am, xmlAutomataStatePtr from, 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to) { 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL)) 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(am, from, to); 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewAllTrans: 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lax: allow to transition if not all all transitions have been activated 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a an ALL transition from the @from state to the 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target state. That transition is an epsilon transition allowed only when 6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * all transitions from the @from node have been activated. 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, int lax) { 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL)) 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateAllTransition(am, from, to, lax); 6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCounter: 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimal value on the counter 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximal value on the counter 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new counter 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the counter number or -1 in case of error 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 621694442ad4107000e6d49f9b85a46a591495a57632Selim Gurunint 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCounter(xmlAutomataPtr am, int min, int max) { 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegGetCounter(am); 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[ret].min = min; 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[ret].max = max; 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountedTrans: 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: the counter associated to that transition 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the target state 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which will increment the counter provided 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountedTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, int counter) { 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (counter < 0)) 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedEpsilonTransition(am, from, to, counter); 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCounterTrans: 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: the counter associated to that transition 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the target state 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which will be allowed only if the counter is within the right range. 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCounterTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, int counter) { 6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (counter < 0)) 6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedTransition(am, from, to, counter); 6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataCompile: 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the automata into a Reg Exp ready for being executed. 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The automata should be free after this point. 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled regexp or NULL in case of error 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 628894442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlRegexpPtr 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataCompile(xmlAutomataPtr am) { 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr ret; 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (am->error != 0)) return(NULL); 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAEliminateEpsilonTransitions(am); 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAComputesDeterminism(am); */ 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegEpxFromParse(am); 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataIsDeterminist: 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if an automata is determinist. 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if not, and -1 in case of error 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 630894442ad4107000e6d49f9b85a46a591495a57632Selim Gurunint 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataIsDeterminist(xmlAutomataPtr am) { 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAComputesDeterminism(am); 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_AUTOMATA_ENABLED */ 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_EXPR_ENABLED 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formal Expression handling code * 6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Expression handling context * 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlExpCtxt { 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr *table; 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbElems; 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_nodes; 6338df143a5041f03a22808b59c76698770b74692815Selim Gurun int maxNodes; 6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *expr; 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *cur; 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_cons; 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tabSize; 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewCtxt: 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @maxNodes: the maximum number of nodes 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict: optional dictionnary to use internally 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new context for manipulating expressions 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the context or NULL in case of error 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtPtr 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewCtxt(int maxNodes, xmlDictPtr dict) { 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpCtxtPtr ret; 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size = 256; 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (maxNodes <= 4096) 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxNodes = 4096; 636194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlExpCtxtPtr) xmlMalloc(sizeof(xmlExpCtxt)); 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlExpCtxt)); 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->size = size; 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbElems = 0; 6368df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->maxNodes = maxNodes; 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->table = xmlMalloc(size * sizeof(xmlExpNodePtr)); 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->table == NULL) { 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret->table, 0, size * sizeof(xmlExpNodePtr)); 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict == NULL) { 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = xmlDictCreate(); 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->dict == NULL) { 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->table); 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = dict; 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(ret->dict); 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpFreeCtxt: 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context 6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an expression context 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpFreeCtxt(xmlExpCtxtPtr ctxt) { 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(ctxt->dict); 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table != NULL) 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->table); 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to an expression node * 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_NODES 10000 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_DERIV */ 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 641594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * TODO: 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - Wildcards 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - public API for creation 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Started 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - regression testing 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Done 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - split into module and test tool 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - memleaks 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_EXP_NILABLE = (1 << 0) 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlExpNodeInfo; 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NILLABLE(node) ((node)->info & XML_EXP_NILABLE) 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlExpNode { 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char type;/* xmlExpNodeType */ 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char info;/* OR of xmlExpNodeInfo */ 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short key; /* the hash key */ 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int ref; /* The number of references */ 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int c_max; /* the maximum length it can consume */ 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr exp_left; 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr next;/* the next node in the hash table or free list */ 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project union { 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct { 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f_min; 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f_max; 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } count; 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct { 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr f_right; 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } children; 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *f_str; 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } field; 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_min field.count.f_min 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_max field.count.f_max 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define exp_left field.children.f_left */ 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_right field.children.f_right 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_str field.f_str 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type); 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNode forbiddenExpNode = { 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_EXP_FORBID, 0, 0, 0, 0, NULL, NULL, {{ 0, 0}} 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr forbiddenExp = &forbiddenExpNode; 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNode emptyExpNode = { 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_EXP_EMPTY, 1, 0, 0, 0, NULL, NULL, {{ 0, 0}} 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr emptyExp = &emptyExpNode; 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The custom hash table for unicity and canonicalization * 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of sub-expressions pointers * 6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashNameComputeKey: 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculate the hash key for a token 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned short 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashNameComputeKey(const xmlChar *name) { 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short value = 0L; 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char ch; 648394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += 30 * (*name); 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name++) != 0) { 6487df143a5041f03a22808b59c76698770b74692815Selim Gurun value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (value); 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashComputeKey: 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculate the hash key for a compound expression 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned short 6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashComputeKey(xmlExpNodeType type, xmlExpNodePtr left, 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr right) { 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long value; 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short ret; 650294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = left->key; 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += right->key; 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value *= 3; 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned short) value; 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = left->key; 6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += right->key; 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value *= 7; 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned short) value; 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = left->key; 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += right->key; 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned short) value; 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type) { 6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nb_nodes >= MAX_NODES) 6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlExpNodePtr) xmlMalloc(sizeof(xmlExpNode)); 6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlExpNode)); 6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = NULL; 6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nb_nodes++; 6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nb_cons++; 6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashGetEntry: 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the unique entry from the hash table. The entry is created if 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * needed. @left and @right are consumed, i.e. their ref count will 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be decremented by the operation. 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the pointer or NULL in case of error 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type, 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr left, xmlExpNodePtr right, 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, int min, int max) { 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short kbase, key; 6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr entry; 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr insert; 6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for duplicate and insertion location. 6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_ATOM) { 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = xmlExpHashNameComputeKey(name); 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_COUNT) { 6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* COUNT reduction rule 1 */ 6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* a{1} -> a */ 6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == max) { 6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 1) { 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) { 6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) { 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max == -1) 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = min + 79; 6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = max - min; 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase += left->key; 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_OR) { 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Forbid reduction rules */ 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_FORBID) { 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_FORBID) { 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR reduction rule 1 */ 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* a | a reduced to a */ 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left == right) { 6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->ref--; 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR canonicalization rule 1 */ 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* linearize (a | b) | c into a | (b | c) */ 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left->type == XML_EXP_OR) && (right->type != XML_EXP_OR)) { 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp = left; 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left = right; 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = tmp; 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR reduction rule 2 */ 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* a | (a | b) and b | (a | b) are reduced to a | b */ 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_OR) { 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left == right->exp_left) || 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (left == right->exp_right)) { 6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR canonicalization rule 2 */ 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* linearize (a | b) | c into a | (b | c) */ 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_OR) { 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR canonicalization rule 2 */ 6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left->exp_right->type != XML_EXP_OR) && 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (left->exp_right->key < left->exp_left->key)) { 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = left->exp_right; 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_right = left->exp_left; 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_left = tmp; 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_right->ref++; 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_right, right, 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_left->ref++; 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_left, tmp, 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 664394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_OR) { 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Ordering in the tree */ 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* C | (A | B) -> A | (B | C) */ 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->key > right->exp_right->key) { 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_right->ref++; 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_right, 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left, NULL, 0, 0); 6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_left->ref++; 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp, NULL, 0, 0); 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Ordering in the tree */ 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* B | (A | C) -> A | (B | C) */ 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->key > right->exp_left->key) { 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_right->ref++; 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_right, NULL, 0, 0); 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_left->ref++; 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp, NULL, 0, 0); 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* we know both types are != XML_EXP_OR here */ 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (left->key > right->key) { 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp = left; 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left = right; 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = tmp; 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = xmlExpHashComputeKey(type, left, right); 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_SEQ) { 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Forbid reduction rules */ 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_FORBID) { 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_FORBID) { 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Empty reduction rules */ 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_EMPTY) { 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_EMPTY) { 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = xmlExpHashComputeKey(type, left, right); 670094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } else 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = kbase % ctxt->size; 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table[key] != NULL) { 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (insert = ctxt->table[key]; insert != NULL; 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = insert->next) { 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->key == kbase) && 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->type == type)) { 6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_ATOM) { 6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == insert->exp_str) { 6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->ref++; 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(insert); 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_COUNT) { 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->exp_min == min) && (insert->exp_max == max) && 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->exp_left == left)) { 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->ref++; 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->ref--; 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(insert); 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((insert->exp_left == left) && 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->exp_right == right)) { 6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->ref++; 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->ref--; 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->ref--; 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(insert); 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry = xmlExpNewNode(ctxt, type); 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entry == NULL) 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->key = kbase; 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_ATOM) { 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_str = name; 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = 1; 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_COUNT) { 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_min = min; 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_max = max; 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_left = left; 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((min == 0) || (IS_NILLABLE(left))) 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->info |= XML_EXP_NILABLE; 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max < 0) 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = -1; 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = max * entry->exp_left->c_max; 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_left = left; 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_right = right; 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_OR) { 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_NILLABLE(left)) || (IS_NILLABLE(right))) 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->info |= XML_EXP_NILABLE; 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entry->exp_left->c_max == -1) || 6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (entry->exp_right->c_max == -1)) 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = -1; 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (entry->exp_left->c_max > entry->exp_right->c_max) 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = entry->exp_left->c_max; 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = entry->exp_right->c_max; 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_NILLABLE(left)) && (IS_NILLABLE(right))) 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->info |= XML_EXP_NILABLE; 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entry->exp_left->c_max == -1) || 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (entry->exp_right->c_max == -1)) 6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = -1; 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = entry->exp_left->c_max + entry->exp_right->c_max; 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->ref = 1; 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table[key] != NULL) 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->next = ctxt->table[key]; 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->table[key] = entry; 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbElems++; 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(entry); 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpFree: 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dereference the expression 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpFree(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp) { 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (exp == forbiddenExp) || (exp == emptyExp)) 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->ref--; 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->ref == 0) { 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short key; 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Unlink it first from the hash table */ 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = exp->key % ctxt->size; 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table[key] == exp) { 6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->table[key] = exp->next; 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->table[key]; 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->next == exp) { 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = exp->next; 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp->type == XML_EXP_SEQ) || (exp->type == XML_EXP_OR)) { 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, exp->exp_left); 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, exp->exp_right); 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exp->type == XML_EXP_COUNT) { 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, exp->exp_left); 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exp); 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nb_nodes--; 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpRef: 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Increase the reference count of the expression 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpRef(xmlExpNodePtr exp) { 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp != NULL) 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->ref++; 6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewAtom: 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the atom name 684194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len: the atom name length in byte (or -1); 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to this name from that context 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewAtom(xmlExpCtxtPtr ctxt, const xmlChar *name, int len) { 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (name == NULL)) 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlDictLookup(ctxt->dict, name, len); 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, name, 0, 0)); 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewOr: 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @left: left expression 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @right: right expression 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the choice @left | @right 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @left and @right are consumed in the operation, to keep 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on them use xmlExpRef() and use xmlExpFree() to release them, 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL). 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewOr(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left == NULL) || (right == NULL)) { 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, right, NULL, 0, 0)); 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewSeq: 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @left: left expression 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @right: right expression 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the sequence @left , @right 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @left and @right are consumed in the operation, to keep 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on them use xmlExpRef() and use xmlExpFree() to release them, 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL). 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewSeq(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left == NULL) || (right == NULL)) { 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, left, right, NULL, 0, 0)); 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewRange: 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @subset: the expression to be repeated 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the lower bound for the repetition 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the upper bound for the repetition, -1 means infinite 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the range (@subset){@min, @max} 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @subset is consumed in the operation, to keep 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on it use xmlExpRef() and use xmlExpFree() to release it, 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL). 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewRange(xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max) { 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((subset == NULL) || (min < 0) || (max < -1) || 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((max >= 0) && (min > max))) { 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, subset); 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, subset, 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, min, max)); 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Public API for operations on expressions * 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 694194442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**list, int len, int nb) { 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp, tmp2; 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttail: 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (tmp = 0;tmp < nb;tmp++) 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[tmp] == exp->exp_str) 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nb >= len) 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 6954df143a5041f03a22808b59c76698770b74692815Selim Gurun list[nb] = exp->exp_str; 6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: 6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp = exp->exp_left; 6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto tail; 6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpGetLanguageInt(ctxt, exp->exp_left, list, len, nb); 6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) 6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpGetLanguageInt(ctxt, exp->exp_right, list, len, 6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb + tmp); 6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 < 0) 6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp2); 6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp + tmp2); 6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpGetLanguage: 6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @langList: where to store the tokens 697894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len: the allocated length of @list 6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find all the strings used in @exp and store them in @list 6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of unique strings found, -1 in case of errors and 6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -2 if there is more than @len strings 6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 698694442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**langList, int len) { 6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (exp == NULL) || (langList == NULL) || (len <= 0)) 6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpGetLanguageInt(ctxt, exp, langList, len, 0)); 6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 699494442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**list, int len, int nb) { 6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp, tmp2; 6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttail: 6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (tmp = 0;tmp < nb;tmp++) 7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[tmp] == exp->exp_str) 7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nb >= len) 7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 7009df143a5041f03a22808b59c76698770b74692815Selim Gurun list[nb] = exp->exp_str; 7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: 7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp = exp->exp_left; 7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto tail; 7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); 7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) 7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(exp->exp_left)) { 7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, 7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb + tmp); 7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 < 0) 7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp2); 7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp += tmp2; 7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); 7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) 7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, 7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb + tmp); 7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 < 0) 7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp2); 7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp + tmp2); 7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpGetStart: 7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tokList: where to store the tokens 704494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len: the allocated length of @list 7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find all the strings that appears at the start of the languages 7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * accepted by @exp and store them in @list. E.g. for (a, b) | c 7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it will return the list [a, c] 7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of unique strings found, -1 in case of errors and 7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -2 if there is more than @len strings 7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 705494442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**tokList, int len) { 7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (exp == NULL) || (tokList == NULL) || (len <= 0)) 7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpGetStartInt(ctxt, exp, tokList, len, 0)); 7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpIsNillable: 7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Finds if the expression is nillable, i.e. if it accepts the empty sequqnce 7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if nillable, 0 if not and -1 in case of error 7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpIsNillable(xmlExpNodePtr exp) { 7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp == NULL) 7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(IS_NILLABLE(exp) != 0); 7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpStringDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar *str) 7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_str == str) { 7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv atom: equal => Empty\n"); 7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = emptyExp; 7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv atom: mismatch => forbid\n"); 7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO wildcards here */ 7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = forbiddenExp; 7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: { 7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv or: => or(derivs)\n"); 7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); 7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); 7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, 7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv seq: starting with left\n"); 7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); 7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == forbiddenExp) { 7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(exp->exp_left)) { 7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv seq: left failed but nillable\n"); 7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); 7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv seq: left match => sequence\n"); 7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right->ref++; 7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right, 7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: { 7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == 0) 7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); 7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == forbiddenExp) { 7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv count: pattern mismatch => forbid\n"); 7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == 1) 7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < 0) /* unbounded */ 7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - 1; 7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > 0) 7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - 1; 7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_left->ref++; 7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL, 7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, min, max); 7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == emptyExp) { 7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv count: match to empty => new count\n"); 7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv count: match => sequence with new count\n"); 7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, tmp, 7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0)); 7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpStringDerive: 7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the string 7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the string len in bytes if available 7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do one step of Brzozowski derivation of the expression @exp with 7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * respect to the input string 7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error 7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpStringDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *str, int len) { 7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *input; 7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (ctxt == NULL) || (str == NULL)) { 7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the string is in the dictionnary, if yes use an interned 7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * copy, otherwise we know it's not an acceptable input 7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlDictExists(ctxt->dict, str, len); 7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpStringDeriveInt(ctxt, exp, input)); 7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCheckCard(xmlExpNodePtr exp, xmlExpNodePtr sub) { 7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->c_max == -1) { 7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->c_max != -1) 7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((exp->c_max >= 0) && (exp->c_max < sub->c_max)) { 7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_NILLABLE(sub)) && (!IS_NILLABLE(exp))) 7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr sub); 7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpDivide: 7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mult: the multiple expression 7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @remain: the remain from the derivation of the multiple 7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if exp is a multiple of sub, i.e. if there is a finite number n 7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so that sub{n} subsume exp 7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the multiple value if successful, 0 if it is not a multiple 7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and -1 in case of internel error. 7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDivide(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub, 7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr *mult, xmlExpNodePtr *remain) { 7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp, tmp2; 7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mult != NULL) *mult = NULL; 7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (remain != NULL) *remain = NULL; 7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->c_max == -1) return(0); 7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(exp) && (!IS_NILLABLE(sub))) return(0); 7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 1;i <= exp->c_max;i++) { 7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub->ref++; 7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, 7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub, NULL, NULL, i, i); 7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlExpCheckCard(tmp, exp)) { 7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpExpDeriveInt(ctxt, tmp, exp); 7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) { 7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp2 != forbiddenExp) && (IS_NILLABLE(tmp2))) { 7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (remain != NULL) 7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *remain = tmp2; 7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mult != NULL) 7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *mult = tmp; 7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Divide succeeded %d\n", i); 7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(i); 7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Divide failed\n"); 7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpExpDeriveInt: 7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to do a step of Brzozowski derivation but at a higher level 7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the input being a subexpression. 7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error 7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { 7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret, tmp, tmp2, tmp3; 7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **tab; 7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len, i; 7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In case of equality and if the expression can only consume a finite 7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * amount, then the derivation is empty 7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == sub) && (exp->c_max >= 0)) { 7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Equal(exp, sub) and finite -> Empty\n"); 7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decompose sub sequence first 7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_EMPTY) { 7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Empty(sub) -> Empty\n"); 7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->ref++; 7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exp); 7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_SEQ) { 7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq(sub) -> decompose\n"); 7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); 7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) 7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, tmp, sub->exp_right); 7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_OR) { 7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Or(sub) -> decompose\n"); 7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); 7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) 7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp, sub->exp_right); 7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == NULL) || (ret == forbiddenExp)) { 7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, NULL, 0, 0)); 7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlExpCheckCard(exp, sub)) { 7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("CheckCard(exp, sub) failed -> Forbid\n"); 7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub == emptyExp) 7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Empty(exp) -> Forbid\n"); 7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Forbid(exp) -> Forbid\n"); 7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_ATOM) { 7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle wildcards */ 7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_str == sub->exp_str) { 7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom match -> Empty\n"); 7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom mismatch -> Forbid\n"); 7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((sub->type == XML_EXP_COUNT) && 7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (sub->exp_max == 1) && 7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (sub->exp_left->type == XML_EXP_ATOM)) { 7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle wildcards */ 7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_str == sub->exp_left->exp_str) { 7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom match -> Empty\n"); 7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom mismatch -> Forbid\n"); 7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Compex exp vs Atom -> Forbid\n"); 7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* try to get the sequence consumed only if possible */ 7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlExpCheckCard(exp->exp_left, sub)) { 7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* See if the sequence can be consumed directly */ 7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq trying left only\n"); 7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); 7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret != forbiddenExp) && (ret != NULL)) { 7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq trying left only worked\n"); 7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: assumption here that we are determinist 7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * i.e. we won't get to a nillable exp left 7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * subset which could be matched by the right 7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * part too. 7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * e.g.: (a | b)+,(a | c) and 'a+,a' 7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right->ref++; 7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, 7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right, NULL, 0, 0)); 7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq: left too short\n"); 7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Try instead to decompose */ 7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_COUNT) { 7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq: sub is a count\n"); 7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); 7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != forbiddenExp) { 7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq , Count match on left\n"); 7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max < 0) 7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = sub->exp_max -1; 7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_min > 0) 7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = sub->exp_min -1; 7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right->ref++; 7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, 7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right, NULL, 0, 0); 7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub->exp_left->ref++; 7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, 7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub->exp_left, NULL, NULL, min, max); 7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) { 7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, tmp, tmp2); 7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* we made no progress on structured operations */ 7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Or , trying both side\n"); 7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); 7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp->exp_right, sub); 7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp, NULL, 0, 0)); 7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: { 7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_COUNT) { 7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to see if the loop is completely subsumed 7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); 7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) { 7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int mult; 7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count inner don't subsume\n"); 7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mult = xmlExpDivide(ctxt, sub->exp_left, exp->exp_left, 7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, &tmp); 7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mult <= 0) { 7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count not multiple => forbidden\n"); 7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max == -1) { 7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min <= sub->exp_min * mult) 7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min * mult; 7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count finite can't subsume infinite\n"); 7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loop consume mult finite loop\n"); 7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > sub->exp_min * mult) { 7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min * mult; 7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < sub->exp_max * mult) { 7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops max mult mismatch => forbidden\n"); 7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max * mult > exp->exp_min) 7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_max * mult; 7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - sub->exp_max * mult; 7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!IS_NILLABLE(tmp)) { 7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: loop here to try to grow if working on finite 7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * blocks. 7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count remain not nillable => forbidden\n"); 7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (sub->exp_max == -1) { 7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min <= sub->exp_min) { 7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loops Okay => COUNT(0,Inf)\n"); 7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loops min => Count(X,Inf)\n"); 7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min; 7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exp->exp_min > sub->exp_min) { 7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops min mismatch 1 => forbidden ???\n"); 7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loop consume finite loop\n"); 7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > sub->exp_min) { 7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min; 7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < sub->exp_max) { 7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops max mismatch => forbidden\n"); 7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max > exp->exp_min) 7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_max; 7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - sub->exp_max; 7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops match => SEQ(COUNT())\n"); 7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_left->ref++; 7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, 7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, min, max); 7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) { 7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, 7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); 7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) { 7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loop mismatch => forbidden\n"); 7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > 0) 7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - 1; 7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < 0) 7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - 1; 7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loop match => SEQ(COUNT())\n"); 7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_left->ref++; 7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, 7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, min, max); 7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) 7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, 7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Fallback to derivative\n"); 7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(sub)) { 7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!(IS_NILLABLE(exp))) 7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = emptyExp; 7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = NULL; 7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here the structured derivation made no progress so 7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we use the default token based derivation to force one more step 7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->tabSize == 0) 7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->tabSize = 40; 7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tab = (const xmlChar **) xmlMalloc(ctxt->tabSize * 7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(const xmlChar *)); 7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tab == NULL) { 7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * collect all the strings accepted by the subexpression on input 7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); 7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (len < 0) { 7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **temp; 7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (const xmlChar **) xmlRealloc((xmlChar **) tab, ctxt->tabSize * 2 * 7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(const xmlChar *)); 7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tab = temp; 7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->tabSize *= 2; 7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); 7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < len;i++) { 7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpStringDeriveInt(ctxt, exp, tab[i]); 7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp == NULL) || (tmp == forbiddenExp)) { 7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpStringDeriveInt(ctxt, sub, tab[i]); 7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp2 == NULL) || (tmp2 == forbiddenExp)) { 7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp3 = xmlExpExpDeriveInt(ctxt, tmp, tmp2); 7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp3 == NULL) || (tmp3 == forbiddenExp)) { 7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp3); 7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = tmp3; 7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp3, NULL, 0, 0); 7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 775194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpExpDerive: 7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates the expression resulting from @exp consuming a sub expression @sub 7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Based on algebraic derivation and sometimes direct Brzozowski derivation 7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it usually tatkes less than linear time and can handle expressions generating 7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * infinite languages. 7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error, the 7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * result must be freed 7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpExpDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { 7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) 7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * O(1) speedups 7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { 7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Sub nillable and not exp : can't subsume\n"); 7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlExpCheckCard(exp, sub) == 0) { 7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("sub generate longuer sequances than exp : can't subsume\n"); 7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpExpDeriveInt(ctxt, exp, sub)); 7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpSubsume: 7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether @exp accepts all the languages accexpted by @sub 7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the input being a subexpression. 7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true 0 if false and -1 in case of failure. 7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { 7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 780394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) 7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: speedup by checking the language of sub is a subset of the 7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * language of exp 7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * O(1) speedups 7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { 7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Sub nillable and not exp : can't subsume\n"); 7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlExpCheckCard(exp, sub) == 0) { 7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("sub generate longuer sequances than exp : can't subsume\n"); 7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp, sub); 7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Result derivation :\n"); 7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PRINT_EXP(tmp); 7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) 7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == emptyExp) 7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && (IS_NILLABLE(tmp))) { 7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 784794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Parsing expression * 7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpParseExpr(xmlExpCtxtPtr ctxt); 7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef CUR 7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur) 7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef NEXT 7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ctxt->cur++; 7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef IS_BLANK 7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK(c) ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) 7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP_BLANKS while (IS_BLANK(*ctxt->cur)) ctxt->cur++; 7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseNumber(xmlExpCtxtPtr ctxt) { 7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR < '0') || (CUR > '9')) 7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (CUR - '0'); 7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseOr(xmlExpCtxtPtr ctxt) { 7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *base; 7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *val; 7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = ctxt->cur; 7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->cur == '(') { 7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseExpr(ctxt); 7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->cur != ')') { 7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "unbalanced '(' : %s\n", base); 7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto parse_quantifier; 7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR != 0) && (!(IS_BLANK(CUR))) && (CUR != '(') && 7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR != ')') && (CUR != '|') && (CUR != ',') && (CUR != '{') && 7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR != '*') && (CUR != '+') && (CUR != '?') && (CUR != '}')) 7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlDictLookup(ctxt->dict, BAD_CAST base, ctxt->cur - base); 7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, val, 0, 0); 7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectparse_quantifier: 7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '{') { 7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = xmlExpParseNumber(ctxt); 7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) { 7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ',') { 7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = xmlExpParseNumber(ctxt); 7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = min; 7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '}') { 7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min, max); 7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '?') { 7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, 1); 7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '+') { 7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1, -1); 7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '*') { 7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, -1); 7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 795194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseSeq(xmlExpCtxtPtr ctxt) { 7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret, right; 7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseOr(ctxt); 7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '|') { 7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = xmlExpParseOr(ctxt); 7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right == NULL) { 7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, right, NULL, 0, 0); 7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseExpr(xmlExpCtxtPtr ctxt) { 7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret, right; 7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseSeq(ctxt); 7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == ',') { 7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = xmlExpParseSeq(ctxt); 7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right == NULL) { 7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, right, NULL, 0, 0); 7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpParse: 7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: the 0 terminated string 8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Minimal parser for regexps, it understand the following constructs 8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - string terminals 8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - choice operator | 8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - sequence operator , 8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - subexpressions (...) 8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - usual cardinality operators + * and ? 8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - finite sequences { min, max } 8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - infinite sequences { min, * } 8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There is minimal checkings made especially no checking on strings values 8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new expression or NULL in case of failure 8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParse(xmlExpCtxtPtr ctxt, const char *expr) { 8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->expr = expr; 8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = expr; 8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseExpr(ctxt); 8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->cur != 0) { 8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDumpInt(xmlBufferPtr buf, xmlExpNodePtr expr, int glob) { 8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr c; 8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expr == NULL) return; 8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) xmlBufferWriteChar(buf, "("); 8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (expr->type) { 8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "empty"); 8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "forbidden"); 8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, expr->exp_str); 8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_left; 8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " , "); 8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_right; 8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_left; 8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " | "); 8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_right; 8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: { 8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char rep[40]; 807394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_left; 8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((expr->exp_min == 0) && (expr->exp_max == 1)) { 8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[0] = '?'; 8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[1] = 0; 8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((expr->exp_min == 0) && (expr->exp_max == -1)) { 8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[0] = '*'; 8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[1] = 0; 8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((expr->exp_min == 1) && (expr->exp_max == -1)) { 8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[0] = '+'; 8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[1] = 0; 8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (expr->exp_max == expr->exp_min) { 8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(rep, 39, "{%d}", expr->exp_min); 8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (expr->exp_max < 0) { 8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(rep, 39, "{%d,inf}", expr->exp_min); 8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(rep, 39, "{%d,%d}", expr->exp_min, expr->exp_max); 8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[39] = 0; 8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, rep); 8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "Error in tree\n"); 8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) 8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ")"); 8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpDump: 8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: a buffer to receive the output 8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: the compiled expression 8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Serialize the expression as compiled to the buffer 8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDump(xmlBufferPtr buf, xmlExpNodePtr expr) { 8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (expr == NULL)) 8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, expr, 0); 8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpMaxToken: 8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: a compiled expression 8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Indicate the maximum number of input a expression can accept 8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the maximum length or -1 in case of error 8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpMaxToken(xmlExpNodePtr expr) { 8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expr == NULL) 8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(expr->c_max); 8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpCtxtNbNodes: 8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context 8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debugging facility provides the number of allocated nodes at a that point 8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes in use or -1 in case of error 8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt) { 8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->nb_nodes); 8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpCtxtNbCons: 8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context 8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debugging facility provides the number of allocated nodes over lifetime 8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes ever allocated or -1 in case of error 8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtNbCons(xmlExpCtxtPtr ctxt) { 8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->nb_cons); 8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_EXPR_ENABLED */ 8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlregexp 8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */ 8168