1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * regexp.c: generic and extensible Regular Expression engine 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 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 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR(str) \ 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XML_REGEXP_COMPILE_ERROR; \ 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrCompile(ctxt, str); 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ctxt->cur++ 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*(ctxt->cur)) 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(index) (ctxt->cur[index]) 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l) 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l) ctxt->cur += l; 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_REG_STRING_SEPARATOR '|' 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Need PREV to check on a '-' within a Character Group. May only be used 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when it's guaranteed that cur is not at the beginning of ctxt->string! 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PREV (ctxt->cur[-1]) 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * macro to flag unimplemented blocks 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TODO \ 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Datatypes and structures * 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: the order of the enums below is significant, do not shuffle 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_EPSILON = 1, 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_RANGES, 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SUBREG, /* used for () sub regexps */ 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_STRING, 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_ANYCHAR, /* . */ 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_ANYSPACE, /* \s */ 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTSPACE, /* \S */ 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_INITNAME, /* \l */ 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTINITNAME, /* \L */ 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NAMECHAR, /* \c */ 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTNAMECHAR, /* \C */ 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_DECIMAL, /* \d */ 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTDECIMAL, /* \D */ 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_REALCHAR, /* \w */ 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NOTREALCHAR, /* \W */ 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER = 100, 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_UPPERCASE, 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_LOWERCASE, 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_TITLECASE, 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_MODIFIER, 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_LETTER_OTHERS, 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK, 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_NONSPACING, 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_SPACECOMBINING, 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_ENCLOSING, 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER, 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER_DECIMAL, 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER_LETTER, 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_NUMBER_OTHERS, 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT, 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_CONNECTOR, 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_DASH, 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_OPEN, 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_CLOSE, 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_INITQUOTE, 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_FINQUOTE, 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_PUNCT_OTHERS, 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR, 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR_SPACE, 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR_LINE, 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SEPAR_PARA, 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL, 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_MATH, 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_CURRENCY, 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_MODIFIER, 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SYMBOL_OTHERS, 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER, 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_CONTROL, 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_FORMAT, 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_PRIVATE, 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_OTHER_NA, 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_BLOCK_NAME 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegAtomType; 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_EPSILON = 1, 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_ONCE, 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_OPT, 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_MULT, 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_PLUS, 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_ONCEONLY, 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_ALL, 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_QUANT_RANGE 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegQuantType; 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_START_STATE = 1, 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE, 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_TRANS_STATE, 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE, 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_UNREACH_STATE 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegStateType; 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_NORMAL = 0, 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_START, 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_VISITED 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegMarkedType; 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegRange xmlRegRange; 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegRange *xmlRegRangePtr; 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegRange { 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg; /* 0 normal, 1 not, 2 exclude */ 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type; 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start; 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int end; 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *blockName; 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegAtom xmlRegAtom; 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegAtom *xmlRegAtomPtr; 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlAutomataState xmlRegState; 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegState *xmlRegStatePtr; 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegAtom { 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int no; 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type; 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegQuantType quant; 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min; 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max; 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *valuep; 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *valuep2; 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg; 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint; 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start; 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start0; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr stop; 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxRanges; 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbRanges; 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr *ranges; 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegCounter xmlRegCounter; 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegCounter *xmlRegCounterPtr; 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegCounter { 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max; 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegTrans xmlRegTrans; 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegTrans *xmlRegTransPtr; 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegTrans { 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int to; 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nd; 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlAutomataState { 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateType type; 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegMarkedType mark; 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegMarkedType reached; 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int no; 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxTrans; 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbTrans; 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTrans *trans; 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* knowing states ponting to us can speed things up */ 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxTransTo; 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbTransTo; 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *transTo; 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlAutomata xmlRegParserCtxt; 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegParserCtxt *xmlRegParserCtxtPtr; 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 236df143a5041f03a22808b59c76698770b74692815Selim Gurun#define AM_AUTOMATA_RNG 1 237df143a5041f03a22808b59c76698770b74692815Selim Gurun 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlAutomata { 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *string; 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cur; 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int error; 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg; 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start; 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr end; 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxAtoms; 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAtoms; 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr *atoms; 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxStates; 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStates; 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr *states; 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxCounters; 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbCounters; 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounter *counters; 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int determinist; 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int negs; 265df143a5041f03a22808b59c76698770b74692815Selim Gurun int flags; 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegexp { 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *string; 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStates; 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr *states; 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbAtoms; 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr *atoms; 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbCounters; 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounter *counters; 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int determinist; 277df143a5041f03a22808b59c76698770b74692815Selim Gurun int flags; 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * That's the compact form for determinists automatas 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbstates; 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *compact; 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **transdata; 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbstrings; 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **stringMap; 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegExecRollback xmlRegExecRollback; 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegExecRollback *xmlRegExecRollbackPtr; 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegExecRollback { 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state;/* the current state */ 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int index; /* the index in the input stack */ 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nextbranch; /* the next transition to explore in that state */ 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *counts; /* save the automata state if it has some */ 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegInputToken xmlRegInputToken; 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegInputToken *xmlRegInputTokenPtr; 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegInputToken { 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegExecCtxt { 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int status; /* execution status != 0 indicate an error */ 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int determinist; /* did we find an indeterministic behaviour */ 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr comp; /* the compiled regexp */ 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCallbacks callback; 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state;/* the current state */ 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno; /* the current transition on that state */ 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transcount; /* the number of chars in char counted transitions */ 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A stack of rollback states 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxRollbacks; 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbRollbacks; 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecRollback *rollbacks; 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The state of the automata if any 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *counts; 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The input stack 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inputStackMax; 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inputStackNr; 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int index; 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *charStack; 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *inputString; /* when operating on characters */ 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegInputTokenPtr inputStack;/* when operating on strings */ 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error handling 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int errStateNo; /* the error state number */ 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr errState; /* the error state */ 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *errString; /* the string raising the error */ 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *errCounts; /* counters at the error state */ 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbPush; 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define REGEXP_ALL_COUNTER 0x123456 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define REGEXP_ALL_LAX_COUNTER 0x123457 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top); 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRegFreeState(xmlRegStatePtr state); 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRegFreeAtom(xmlRegAtomPtr atom); 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr); 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint); 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg, int start, int end, const xmlChar *blockName); 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 360df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid xmlAutomataSetFlags(xmlAutomataPtr am, int flags); 361df143a5041f03a22808b59c76698770b74692815Selim Gurun 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Regexp memory error handler * 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpErrMemory: 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra information 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpErrMemory(xmlRegParserCtxtPtr ctxt, const char *extra) 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *regexp = NULL; 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp = (const char *) ctxt->string; 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XML_ERR_NO_MEMORY; 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp, NULL, 0, 0, 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpErrCompile: 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra information 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a compilation failure 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpErrCompile(xmlRegParserCtxtPtr ctxt, const char *extra) 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *regexp = NULL; 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idx = 0; 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp = (const char *) ctxt->string; 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project idx = ctxt->cur - ctxt->string; 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XML_REGEXP_COMPILE_ERROR; 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_COMPILE_ERROR, XML_ERR_FATAL, NULL, 0, extra, 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp, NULL, idx, 0, 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "failed to compile: %s\n", extra); 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocation/Deallocation * 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt); 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegEpxFromParse: 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context used to build it 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp and fill it with the result from the parser 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new regexp or NULL in case of error 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegexpPtr 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) { 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr ret; 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegexpPtr) xmlMalloc(sizeof(xmlRegexp)); 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegexp)); 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->string = ctxt->string; 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbStates = ctxt->nbStates; 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->states = ctxt->states; 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAtoms = ctxt->nbAtoms; 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->atoms = ctxt->atoms; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbCounters = ctxt->nbCounters; 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->counters = ctxt->counters; 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = ctxt->determinist; 443df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->flags = ctxt->flags; 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->determinist == -1) { 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpIsDeterminist(ret); 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->determinist != 0) && 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->nbCounters == 0) && 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->negs == 0) && 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms != NULL) && 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms[0] != NULL) && 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms[0]->type == XML_REGEXP_STRING)) { 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, nbstates = 0, nbatoms = 0; 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *stateRemap; 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *stringRemap; 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *transitions; 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **transdata; 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **stringMap; 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Switch to a compact representation 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1/ counting the effective number of states left 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2/ counting the unique number of atoms, and check that 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they are all of the string type 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3/ build a table state x atom for the transitions 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateRemap = xmlMalloc(ret->nbStates * sizeof(int)); 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stateRemap == NULL) { 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbStates;i++) { 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->states[i] != NULL) { 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateRemap[i] = nbstates; 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbstates++; 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateRemap[i] = -1; 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Final: %d states\n", nbstates); 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringMap = xmlMalloc(ret->nbAtoms * sizeof(char *)); 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stringMap == NULL) { 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringRemap = xmlMalloc(ret->nbAtoms * sizeof(int)); 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stringRemap == NULL) { 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbAtoms;i++) { 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->atoms[i]->type == XML_REGEXP_STRING) && 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->atoms[i]->quant == XML_REGEXP_QUANT_ONCE)) { 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = ret->atoms[i]->valuep; 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < nbatoms;j++) { 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(stringMap[j], value)) { 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringRemap[i] = j; 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (j >= nbatoms) { 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringRemap[i] = nbatoms; 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stringMap[nbatoms] = xmlStrdup(value); 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stringMap[nbatoms] == NULL) { 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbatoms;i++) 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap[i]); 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbatoms++; 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbatoms;i++) 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap[i]); 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Final: %d atoms\n", nbatoms); 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transitions = (int *) xmlMalloc((nbstates + 1) * 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (nbatoms + 1) * sizeof(int)); 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transitions == NULL) { 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(transitions, 0, (nbstates + 1) * (nbatoms + 1) * sizeof(int)); 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate the transition table. The first entry for each 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state corresponds to the state type. 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transdata = NULL; 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbStates;i++) { 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stateno, atomno, targetno, prev; 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stateno = stateRemap[i]; 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stateno == -1) 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ret->states[i]; 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transitions[stateno * (nbatoms + 1)] = state->type; 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < state->nbTrans;j++) { 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &(state->trans[j]); 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->to == -1) || (trans->atom == NULL)) 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atomno = stringRemap[trans->atom->no]; 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->atom->data != NULL) && (transdata == NULL)) { 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transdata = (void **) xmlMalloc(nbstates * nbatoms * 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(void *)); 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transdata != NULL) 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(transdata, 0, 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbstates * nbatoms * sizeof(void *)); 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "compiling regexp"); 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project targetno = stateRemap[trans->to]; 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the same atom can generate transitions to 2 different 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * states then it means the automata is not determinist and 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the compact form can't be used ! 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = transitions[stateno * (nbatoms + 1) + atomno + 1]; 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev != 0) { 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev != targetno + 1) { 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = 0; 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Indet: state %d trans %d, atom %d to %d : %d to %d\n", 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i, j, trans->atom->no, trans->to, atomno, targetno); 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(" previous to is %d\n", prev); 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transdata != NULL) 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(transdata); 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(transitions); 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbatoms;i++) 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap[i]); 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringMap); 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_determ; 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("State %d trans %d: atom %d to %d : %d to %d\n", 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i, j, trans->atom->no, trans->to, atomno, targetno); 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transitions[stateno * (nbatoms + 1) + atomno + 1] = 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project targetno + 1; /* to avoid 0 */ 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (transdata != NULL) 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transdata[stateno * nbatoms + atomno] = 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->atom->data; 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = 1; 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debug 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < nbstates;i++) { 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < nbatoms + 1;j++) { 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("%02d ", transitions[i * (nbatoms + 1) + j]); 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup of the old data 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->states != NULL) { 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbStates;i++) 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(ret->states[i]); 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->states); 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->states = NULL; 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbStates = 0; 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->atoms != NULL) { 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ret->nbAtoms;i++) 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(ret->atoms[i]); 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->atoms); 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->atoms = NULL; 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbAtoms = 0; 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->compact = transitions; 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->transdata = transdata; 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringMap = stringMap; 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbstrings = nbatoms; 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbstates = nbstates; 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stateRemap); 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stringRemap); 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_determ: 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->string = NULL; 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbStates = 0; 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = NULL; 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbAtoms = 0; 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms = NULL; 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbCounters = 0; 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters = NULL; 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewParserCtxt: 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string: the string to parse 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp parser context 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new context or NULL in case of error 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegParserCtxtPtr 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewParserCtxt(const xmlChar *string) { 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegParserCtxtPtr ret; 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegParserCtxtPtr) xmlMalloc(sizeof(xmlRegParserCtxt)); 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegParserCtxt)); 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string != NULL) 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->string = xmlStrdup(string); 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->cur = ret->string; 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->neg = 0; 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->negs = 0; 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->error = 0; 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->determinist = -1; 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewRange: 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neg: is that negative 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of range 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start: the start codepoint 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end: the end codepoint 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp range 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new range or NULL in case of error 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegRangePtr 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewRange(xmlRegParserCtxtPtr ctxt, 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg, xmlRegAtomType type, int start, int end) { 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr ret; 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegRangePtr) xmlMalloc(sizeof(xmlRegRange)); 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating range"); 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->neg = neg; 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->start = start; 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->end = end; 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeRange: 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range: the regexp range 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp range 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeRange(xmlRegRangePtr range) { 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range == NULL) 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->blockName != NULL) 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(range->blockName); 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(range); 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCopyRange: 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range: the regexp range 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy a regexp range 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new copy or NULL in case of error. 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegRangePtr 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCopyRange(xmlRegParserCtxtPtr ctxt, xmlRegRangePtr range) { 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr ret; 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range == NULL) 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegNewRange(ctxt, range->neg, range->type, range->start, 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->end); 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->blockName != NULL) { 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->blockName = xmlStrdup(range->blockName); 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->blockName == NULL) { 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating range"); 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRange(ret); 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewAtom: 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of atom 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new atom 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new atom or NULL in case of error 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegAtomPtr 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomType type) { 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr ret; 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating atom"); 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegAtom)); 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->quant = XML_REGEXP_QUANT_ONCE; 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->min = 0; 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max = 0; 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeAtom: 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom: the regexp atom 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp atom 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeAtom(xmlRegAtomPtr atom) { 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom->nbRanges;i++) 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeRange(atom->ranges[i]); 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->ranges != NULL) 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->ranges); 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->type == XML_REGEXP_STRING) && (atom->valuep != NULL)) 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->valuep); 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->type == XML_REGEXP_STRING) && (atom->valuep2 != NULL)) 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->valuep2); 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->type == XML_REGEXP_BLOCK_NAME) && (atom->valuep != NULL)) 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom->valuep); 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(atom); 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCopyAtom: 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom: the oiginal atom 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp range 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new atom or NULL in case of error 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegAtomPtr 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCopyAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr ret; 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "copying atom"); 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegAtom)); 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = atom->type; 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->quant = atom->quant; 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->min = atom->min; 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max = atom->max; 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->nbRanges > 0) { 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ranges = (xmlRegRangePtr *) xmlMalloc(sizeof(xmlRegRangePtr) * 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->nbRanges); 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->ranges == NULL) { 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "copying atom"); 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom->nbRanges;i++) { 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ranges[i] = xmlRegCopyRange(ctxt, atom->ranges[i]); 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->ranges[i] == NULL) 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbRanges = i + 1; 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(ret); 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegStatePtr 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewState(xmlRegParserCtxtPtr ctxt) { 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr ret; 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlRegStatePtr) xmlMalloc(sizeof(xmlRegState)); 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating state"); 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlRegState)); 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_REGEXP_TRANS_STATE; 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->mark = XML_REGEXP_MARK_NORMAL; 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeState: 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: the regexp state 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp state 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeState(xmlRegStatePtr state) { 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->trans != NULL) 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state->trans); 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->transTo != NULL) 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state->transTo); 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(state); 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeParserCtxt: 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the regexp parser context 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp parser context 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeParserCtxt(xmlRegParserCtxtPtr ctxt) { 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->string != NULL) 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->string); 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states != NULL) { 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbStates;i++) 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(ctxt->states[i]); 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->states); 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atoms != NULL) { 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbAtoms;i++) 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(ctxt->atoms[i]); 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->atoms); 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->counters != NULL) 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->counters); 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Display of Data structures * 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintAtomType(FILE *output, xmlRegAtomType type) { 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "epsilon "); break; 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "charval "); break; 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "ranges "); break; 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SUBREG: 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "subexpr "); break; 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "string "); break; 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYCHAR: 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "anychar "); break; 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "anyspace "); break; 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notspace "); break; 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "initname "); break; 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notinitname "); break; 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "namechar "); break; 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notnamechar "); break; 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "decimal "); break; 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notdecimal "); break; 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "realchar "); break; 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "notrealchar "); break; 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER "); break; 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_UPPERCASE "); break; 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_LOWERCASE "); break; 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_TITLECASE "); break; 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_MODIFIER "); break; 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LETTER_OTHERS "); break; 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK "); break; 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK_NONSPACING "); break; 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK_SPACECOMBINING "); break; 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MARK_ENCLOSING "); break; 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER "); break; 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER_DECIMAL "); break; 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER_LETTER "); break; 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NUMBER_OTHERS "); break; 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT "); break; 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_CONNECTOR "); break; 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_DASH "); break; 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_OPEN "); break; 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_CLOSE "); break; 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_INITQUOTE "); break; 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_FINQUOTE "); break; 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PUNCT_OTHERS "); break; 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR "); break; 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR_SPACE "); break; 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR_LINE "); break; 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SEPAR_PARA "); break; 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL "); break; 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_MATH "); break; 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_CURRENCY "); break; 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_MODIFIER "); break; 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SYMBOL_OTHERS "); break; 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER "); break; 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_CONTROL "); break; 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_FORMAT "); break; 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_PRIVATE "); break; 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OTHER_NA "); break; 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_BLOCK_NAME: 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "BLOCK "); break; 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintQuantType(FILE *output, xmlRegQuantType type) { 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_EPSILON: 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "epsilon "); break; 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_ONCE: 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "once "); break; 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_OPT: 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "? "); break; 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_MULT: 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "* "); break; 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_PLUS: 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "+ "); break; 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_RANGE: 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "range "); break; 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_ONCEONLY: 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "onceonly "); break; 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_ALL: 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "all "); break; 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintRange(FILE *output, xmlRegRangePtr range) { 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " range: "); 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->neg) 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "negative "); 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtomType(output, range->type); 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%c - %c\n", range->start, range->end); 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintAtom(FILE *output, xmlRegAtomPtr atom) { 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " atom: "); 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "not "); 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtomType(output, atom->type); 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintQuantType(output, atom->quant); 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->quant == XML_REGEXP_QUANT_RANGE) 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d-%d ", atom->min, atom->max); 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type == XML_REGEXP_STRING) 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'%s' ", (char *) atom->valuep); 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type == XML_REGEXP_CHARVAL) 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "char %c\n", atom->codepoint); 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (atom->type == XML_REGEXP_RANGES) { 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d entries\n", atom->nbRanges); 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < atom->nbRanges;i++) 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintRange(output, atom->ranges[i]); 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom->type == XML_REGEXP_SUBREG) { 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "start %d end %d\n", atom->start->no, atom->stop->no); 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) { 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " trans: "); 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans == NULL) { 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) { 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "removed\n"); 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->nd != 0) { 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->nd == 2) 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "last not determinist, "); 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "not determinist, "); 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "counted %d, ", trans->counter); 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_COUNTER) { 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "all transition, "); 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count >= 0) { 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "count based %d, ", trans->count); 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom == NULL) { 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "epsilon to %d\n", trans->to); 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom->type == XML_REGEXP_CHARVAL) 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "char %c ", trans->atom->codepoint); 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "atom %d, to %d\n", trans->atom->no, trans->to); 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintState(FILE *output, xmlRegStatePtr state) { 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " state: "); 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_START_STATE) 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "START "); 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_FINAL_STATE) 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "FINAL "); 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d, %d transitions:\n", state->no, state->nbTrans); 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < state->nbTrans; i++) { 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintTrans(output, &(state->trans[i])); 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintCtxt(FILE *output, xmlRegParserCtxtPtr ctxt) { 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " ctxt: "); 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'%s' ", ctxt->string); 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error) 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "error "); 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->neg) 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "neg "); 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d atoms:\n", ctxt->nbAtoms); 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbAtoms; i++) { 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %02d ", i); 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(output, ctxt->atoms[i]); 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "current atom:\n"); 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(output, ctxt->atom); 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d states:", ctxt->nbStates); 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->start != NULL) 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " start: %d", ctxt->start->no); 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->end != NULL) 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " end: %d", ctxt->end->no); 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbStates; i++) { 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintState(output, ctxt->states[i]); 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d counters:\n", ctxt->nbCounters); 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbCounters; i++) { 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %d: min %d max %d\n", i, ctxt->counters[i].min, 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[i].max); 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Finite Automata structures manipulations * 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom, 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg, xmlRegAtomType type, int start, int end, 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *blockName) { 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr range; 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add range: atom is NULL"); 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type != XML_REGEXP_RANGES) { 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add range: atom is not ranges"); 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->maxRanges == 0) { 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges = 4; 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->ranges = (xmlRegRangePtr *) xmlMalloc(atom->maxRanges * 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegRangePtr)); 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->ranges == NULL) { 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding ranges"); 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges = 0; 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom->nbRanges >= atom->maxRanges) { 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr *tmp; 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges *= 2; 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegRangePtr *) xmlRealloc(atom->ranges, atom->maxRanges * 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegRangePtr)); 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding ranges"); 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->maxRanges /= 2; 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->ranges = tmp; 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = xmlRegNewRange(ctxt, neg, type, start, end); 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range == NULL) 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->blockName = blockName; 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->ranges[atom->nbRanges++] = range; 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegGetCounter(xmlRegParserCtxtPtr ctxt) { 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->maxCounters == 0) { 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters = 4; 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters = (xmlRegCounter *) xmlMalloc(ctxt->maxCounters * 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegCounter)); 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->counters == NULL) { 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating counter"); 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters = 0; 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbCounters >= ctxt->maxCounters) { 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounter *tmp; 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters *= 2; 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegCounter *) xmlRealloc(ctxt->counters, ctxt->maxCounters * 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegCounter)); 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating counter"); 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxCounters /= 2; 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters = tmp; 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[ctxt->nbCounters].min = -1; 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[ctxt->nbCounters].max = -1; 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->nbCounters++); 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("atom push: atom is NULL"); 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->maxAtoms == 0) { 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms = 4; 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms = (xmlRegAtomPtr *) xmlMalloc(ctxt->maxAtoms * 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegAtomPtr)); 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atoms == NULL) { 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "pushing atom"); 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms = 0; 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbAtoms >= ctxt->maxAtoms) { 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr *tmp; 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms *= 2; 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegAtomPtr *) xmlRealloc(ctxt->atoms, ctxt->maxAtoms * 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegAtomPtr)); 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "allocating counter"); 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxAtoms /= 2; 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms = tmp; 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->no = ctxt->nbAtoms; 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atoms[ctxt->nbAtoms++] = atom; 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target, 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int from) { 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target->maxTransTo == 0) { 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo = 8; 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->transTo = (int *) xmlMalloc(target->maxTransTo * 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(int)); 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target->transTo == NULL) { 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo = 0; 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (target->nbTransTo >= target->maxTransTo) { 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *tmp; 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo *= 2; 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (int *) xmlRealloc(target->transTo, target->maxTransTo * 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(int)); 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->maxTransTo /= 2; 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->transTo = tmp; 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->transTo[target->nbTransTo] = from; 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target->nbTransTo++; 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom, xmlRegStatePtr target, 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter, int count) { 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nrtrans; 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) { 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add state: state is NULL"); 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target == NULL) { 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("add state: target is NULL"); 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Other routines follow the philosophy 'When in doubt, add a transition' 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so we check here whether such a transition is already present and, if 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so, silently ignore this request. 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (nrtrans = state->nbTrans - 1; nrtrans >= 0; nrtrans--) { 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans = &(state->trans[nrtrans]); 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->atom == atom) && 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->to == target->no) && 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->counter == counter) && 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count == count)) { 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Ignoring duplicate transition from %d to %d\n", 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->no, target->no); 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->maxTrans == 0) { 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans = 8; 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans * 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegTrans)); 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->trans == NULL) { 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans = 0; 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (state->nbTrans >= state->maxTrans) { 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTrans *tmp; 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans *= 2; 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegTrans *) xmlRealloc(state->trans, state->maxTrans * 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegTrans)); 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding transition"); 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->maxTrans /= 2; 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans = tmp; 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Add trans from %d to %d ", state->no, target->no); 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count == REGEXP_ALL_COUNTER) 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("all transition\n"); 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (count >= 0) 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("count based %d\n", count); 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (counter >= 0) 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("counted %d\n", counter); 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (atom == NULL) 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("epsilon transition\n"); 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (atom != NULL) 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(stdout, atom); 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].atom = atom; 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].to = target->no; 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].counter = counter; 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].count = count; 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[state->nbTrans].nd = 0; 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nbTrans++; 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTransTo(ctxt, target, state->no); 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStatePush(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state) { 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) return(-1); 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->maxStates == 0) { 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates = 4; 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = (xmlRegStatePtr *) xmlMalloc(ctxt->maxStates * 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegStatePtr)); 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) { 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding state"); 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates = 0; 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbStates >= ctxt->maxStates) { 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr *tmp; 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates *= 2; 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegStatePtr *) xmlRealloc(ctxt->states, ctxt->maxStates * 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegStatePtr)); 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(ctxt, "adding state"); 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxStates /= 2; 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states = tmp; 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->no = ctxt->nbStates; 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[ctxt->nbStates++] = state; 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateAllTransition: 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lax: 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateAllTransition(xmlRegParserCtxtPtr ctxt, 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to, 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lax) { 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lax) 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_LAX_COUNTER); 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER); 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateEpsilonTransition: 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateEpsilonTransition(xmlRegParserCtxtPtr ctxt, 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to) { 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, -1); 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateCountedEpsilonTransition: 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * counter: the counter for that transition 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateCountedEpsilonTransition(xmlRegParserCtxtPtr ctxt, 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to, int counter) { 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, counter, -1); 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateCountedTransition: 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * counter: the counter for that transition 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateCountedTransition(xmlRegParserCtxtPtr ctxt, 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from, xmlRegStatePtr to, int counter) { 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, to, -1, counter); 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateTransitions: 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the from state 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target state or NULL for building a new one 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom: the atom generating the transition 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error. 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to, xmlRegAtomPtr atom) { 154260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlRegStatePtr end; 154360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) { 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("genrate transition: atom == NULL"); 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->type == XML_REGEXP_SUBREG) { 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a subexpression handling one should not need to 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * create a new node except for XML_REGEXP_QUANT_RANGE. 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegAtomPush(ctxt, atom) < 0) { 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((to != NULL) && (atom->stop != to) && 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom->quant != XML_REGEXP_QUANT_RANGE)) { 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generate an epsilon transition to link to the target 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DV 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) && 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom->quant != XML_REGEXP_QUANT_ONCE)) { 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom->quant) { 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_OPT: 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * transition done to the state after end of atom. 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1. set transition from atom start to new state 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2. set transition from atom end to this state. 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1579df143a5041f03a22808b59c76698770b74692815Selim Gurun if (to == NULL) { 1580df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFAGenerateEpsilonTransition(ctxt, atom->start, 0); 1581df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFAGenerateEpsilonTransition(ctxt, atom->stop, 1582df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->state); 1583df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 1584df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFAGenerateEpsilonTransition(ctxt, atom->start, to); 1585df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_MULT: 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->start, atom->stop); 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_PLUS: 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 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_RANGE: { 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr inter, newstate; 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * create the final state now if needed 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to != NULL) { 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate = to; 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate = xmlRegNewState(ctxt); 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, newstate); 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The principle here is to use counted transition 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to avoid explosion in the number of states in the 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * graph. This is clearly more complex but should not 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be exploitable at runtime. 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->min == 0) && (atom->start0 == NULL)) { 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr copy; 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * duplicate a transition based on atom to count next 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurences after 1. We cannot loop to atom->start 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * directly because we need an epsilon transition to 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * newstate. 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ???? For some reason it seems we never reach that 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case, I suppose this got optimized out before when 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project building the automata */ 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy = xmlRegCopyAtom(ctxt, atom); 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (copy == NULL) 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy->quant = XML_REGEXP_QUANT_ONCE; 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy->min = 0; 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copy->max = 0; 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(ctxt, atom->start, NULL, copy) 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project < 0) 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inter = ctxt->state; 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(ctxt); 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].min = atom->min - 1; 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].max = atom->max - 1; 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* count the number of times we see it again */ 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedEpsilonTransition(ctxt, inter, 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->stop, counter); 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* allow a way out based on the count */ 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedTransition(ctxt, inter, 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate, counter); 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* and also allow a direct exit for 0 */ 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->start, 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate); 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * either we need the atom at least once or there 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is an atom->start0 allowing to easilly plug the 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * epsilon transition. 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(ctxt); 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].min = atom->min - 1; 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->counters[counter].max = atom->max - 1; 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* count the number of times we see it again */ 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedEpsilonTransition(ctxt, atom->stop, 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->start, counter); 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* allow a way out based on the count */ 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedTransition(ctxt, atom->stop, 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate, counter); 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* and if needed allow a direct exit for 0 */ 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->min == 0) 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, atom->start0, 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newstate); 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = 0; 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = 0; 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = newstate; 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom->min == 0) && (atom->max == 0) && 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom->quant == XML_REGEXP_QUANT_RANGE)) { 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we can discard the atom and generate an epsilon transition instead 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to != NULL) 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, from, to); 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = to; 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(ctxt); 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to != NULL) 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, to); 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 170660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 170760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott end = to; 170860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((atom->quant == XML_REGEXP_QUANT_MULT) || 170960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (atom->quant == XML_REGEXP_QUANT_PLUS)) { 171060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 171160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Do not pollute the target state by adding transitions from 171260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * it as it is likely to be the shared target of multiple branches. 171360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * So isolate with an epsilon transition. 171460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 171560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlRegStatePtr tmp; 171660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 171760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tmp = xmlRegNewState(ctxt); 171860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tmp != NULL) 171960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlRegStatePush(ctxt, tmp); 172060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else { 172160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(-1); 172260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 172360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFAGenerateEpsilonTransition(ctxt, tmp, to); 172460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott to = tmp; 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegAtomPush(ctxt, atom) < 0) { 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, atom, to, -1, -1); 173060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->state = end; 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom->quant) { 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_OPT: 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, from, to); 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_MULT: 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 xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_QUANT_PLUS: 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCE; 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_RANGE: 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if DV_test 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->min == 0) { 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, from, to); 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAReduceEpsilonTransitions: 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fromnr: the from state 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tonr: the to state 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: should that transition be associated to a counted 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tonr, int counter) { 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transnr; 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr from; 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to; 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("xmlFAReduceEpsilonTransitions(%d, %d)\n", fromnr, tonr); 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from = ctxt->states[fromnr]; 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from == NULL) 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = ctxt->states[tonr]; 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((to->mark == XML_REGEXP_MARK_START) || 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (to->mark == XML_REGEXP_MARK_VISITED)) 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->mark = XML_REGEXP_MARK_VISITED; 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->type == XML_REGEXP_FINAL_STATE) { 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("State %d is final, so %d becomes final\n", tonr, fromnr); 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from->type = XML_REGEXP_FINAL_STATE; 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < to->nbTrans;transnr++) { 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].to < 0) 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].atom == NULL) { 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't remove counted transitions 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't loop either 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].to != fromnr) { 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].count >= 0) { 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = to->trans[transnr].to; 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, NULL, 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto], 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project -1, to->trans[transnr].count); 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found epsilon trans %d from %d to %d\n", 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, tonr, to->trans[transnr].to); 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].counter >= 0) { 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAReduceEpsilonTransitions(ctxt, fromnr, 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].to, 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].counter); 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAReduceEpsilonTransitions(ctxt, fromnr, 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].to, 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter); 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = to->trans[transnr].to; 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->trans[transnr].counter >= 0) { 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto], 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->trans[transnr].counter, -1); 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto], counter, -1); 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->mark = XML_REGEXP_MARK_NORMAL; 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEliminateSimpleEpsilonTransitions: 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminating general epsilon transitions can get costly in the general 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * algorithm due to the large amount of generated new transitions and 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associated comparisons. However for simple epsilon transition used just 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to separate building blocks when generating the automata this can be 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reduced to state elimination: 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - if there exists an epsilon from X to Y 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - if there is no other transition from X 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then X and Y are semantically equivalent and X can be eliminated 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If X is the start state then make Y the start state, else replace the 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target of all transitions to X by transitions to Y. 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int statenr, i, j, newto; 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state, tmp; 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbTrans != 1) 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_UNREACH_STATE) 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* is the only transition out a basic transition */ 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->trans[0].atom == NULL) && 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].to >= 0) && 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].to != statenr) && 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].counter < 0) && 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[0].count < 0)) { 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newto = state->trans[0].to; 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_START_STATE) { 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found simple epsilon trans from start %d to %d\n", 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project statenr, newto); 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found simple epsilon trans from %d to %d\n", 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project statenr, newto); 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < state->nbTransTo;i++) { 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->states[state->transTo[i]]; 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < tmp->nbTrans;j++) { 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->trans[j].to == statenr) { 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Changed transition %d on %d to go to %d\n", 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j, tmp->no, newto); 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->trans[j].to = -1; 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(ctxt, tmp, tmp->trans[j].atom, 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto], 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->trans[j].counter, 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->trans[j].count); 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->type == XML_REGEXP_FINAL_STATE) 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto]->type = XML_REGEXP_FINAL_STATE; 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* eliminate the transition completely */ 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->nbTrans = 0; 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->type = XML_REGEXP_UNREACH_STATE; 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEliminateEpsilonTransitions: 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int statenr, transnr; 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int has_epsilon; 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states == NULL) return; 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminate simple epsilon transition and the associated unreachable 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * states. 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAEliminateSimpleEpsilonTransitions(ctxt); 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state != NULL) && (state->type == XML_REGEXP_UNREACH_STATE)) { 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Removed unreachable state %d\n", statenr); 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(state); 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[statenr] = NULL; 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_epsilon = 0; 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build the completed transitions bypassing the epsilons 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use a marking algorithm to avoid loops 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark sink states too. 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process from the latests states backward to the start when 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there is long cascading epsilon chains this minimize the 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * recursions and transition compares when adding the new ones 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = ctxt->nbStates - 1;statenr >= 0;statenr--) { 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->nbTrans == 0) && 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->type != XML_REGEXP_FINAL_STATE)) { 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->type = XML_REGEXP_SINK_STATE; 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->trans[transnr].atom == NULL) && 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[transnr].to >= 0)) { 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->trans[transnr].to == statenr) { 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[transnr].to = -1; 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Removed loopback epsilon trans %d on %d\n", 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, statenr); 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (state->trans[transnr].count < 0) { 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = state->trans[transnr].to; 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found epsilon trans %d from %d to %d\n", 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, statenr, newto); 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project has_epsilon = 1; 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->trans[transnr].to = -2; 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->mark = XML_REGEXP_MARK_START; 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAReduceEpsilonTransitions(ctxt, statenr, 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newto, state->trans[transnr].counter); 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->mark = XML_REGEXP_MARK_NORMAL; 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Found counted transition %d on %d\n", 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transnr, statenr); 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminate the epsilon transitions 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (has_epsilon) { 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans = &(state->trans[transnr]); 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->atom == NULL) && 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count < 0) && 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->to >= 0)) { 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->to = -1; 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use this pass to detect unreachable states too 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state != NULL) 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->reached = XML_REGEXP_MARK_NORMAL; 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[0]; 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state != NULL) 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->reached = XML_REGEXP_MARK_START; 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (state != NULL) { 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr target = NULL; 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->reached = XML_REGEXP_MARK_VISITED; 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark all states reachable from the current reachable state 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state->trans[transnr].to >= 0) && 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((state->trans[transnr].atom != NULL) || 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (state->trans[transnr].count >= 0))) { 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int newto = state->trans[transnr].to; 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states[newto] == NULL) 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states[newto]->reached == XML_REGEXP_MARK_NORMAL) { 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[newto]->reached = XML_REGEXP_MARK_START; 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = ctxt->states[newto]; 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * find the next accessible state not explored 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target == NULL) { 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 1;statenr < ctxt->nbStates;statenr++) { 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state != NULL) && (state->reached == 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_MARK_START)) { 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = state; 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = target; 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((state != NULL) && (state->reached == XML_REGEXP_MARK_NORMAL)) { 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Removed unreachable state %d\n", statenr); 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(state); 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[statenr] = NULL; 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) { 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range1->type == XML_REGEXP_RANGES) || 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_RANGES) || 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SUBREG) || 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range1->type == XML_REGEXP_SUBREG) || 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range1->type == XML_REGEXP_STRING) || 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_STRING)) 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* put them in order */ 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range1->type > range2->type) { 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr tmp; 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = range1; 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range1 = range2; 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range2 = tmp; 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range1->type == XML_REGEXP_ANYCHAR) || 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_ANYCHAR)) { 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((range1->type == XML_REGEXP_EPSILON) || 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_EPSILON)) { 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (range1->type == range2->type) { 2098df143a5041f03a22808b59c76698770b74692815Selim Gurun if (range1->type != XML_REGEXP_CHARVAL) 2099df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 1; 2100df143a5041f03a22808b59c76698770b74692815Selim Gurun else if ((range1->end < range2->start) || 2101df143a5041f03a22808b59c76698770b74692815Selim Gurun (range2->end < range1->start)) 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2103df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2104df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = 1; 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (range1->type == XML_REGEXP_CHARVAL) { 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint; 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg = 0; 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just check all codepoints in the range for acceptance, 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is usually way cheaper since done only once at 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compilation than testing over and over at runtime or 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pushing too many states when evaluating. 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((range1->neg == 0) && (range2->neg != 0)) || 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((range1->neg != 0) && (range2->neg == 0))) 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = 1; 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (codepoint = range1->start;codepoint <= range1->end ;codepoint++) { 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(range2->type, codepoint, 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, range2->start, range2->end, 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range2->blockName); 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((neg == 1) && (ret == 0)) || 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((neg == 0) && (ret == 1))) 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((range1->type == XML_REGEXP_BLOCK_NAME) || 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_BLOCK_NAME)) { 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range1->type == range2->type) { 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(range1->blockName, range2->blockName); 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparing a block range with anything else is way 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * too costly, and maintining the table is like too much 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * memory too, so let's force the automata to save state 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here. 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((range1->type < XML_REGEXP_LETTER) || 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type < XML_REGEXP_LETTER)) { 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range1->type == XML_REGEXP_ANYSPACE) && 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTSPACE)) 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_INITNAME) && 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTINITNAME)) 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_NAMECHAR) && 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTNAMECHAR)) 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_DECIMAL) && 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTDECIMAL)) 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((range1->type == XML_REGEXP_REALCHAR) && 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NOTREALCHAR)) 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* same thing to limit complexity */ 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* range1->type < range2->type here */ 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (range1->type) { 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all disjoint except in the subgroups */ 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_LETTER_UPPERCASE) || 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_LOWERCASE) || 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_TITLECASE) || 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_MODIFIER) || 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_LETTER_OTHERS)) 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_MARK_NONSPACING) || 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_MARK_SPACECOMBINING) || 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_MARK_ENCLOSING)) 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_NUMBER_DECIMAL) || 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NUMBER_LETTER) || 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_NUMBER_OTHERS)) 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_PUNCT_CONNECTOR) || 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_DASH) || 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_OPEN) || 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_CLOSE) || 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_INITQUOTE) || 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_FINQUOTE) || 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_PUNCT_OTHERS)) 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_SEPAR_SPACE) || 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SEPAR_LINE) || 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SEPAR_PARA)) 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_SYMBOL_MATH) || 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SYMBOL_CURRENCY) || 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SYMBOL_MODIFIER) || 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_SYMBOL_OTHERS)) 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type == XML_REGEXP_OTHER_CONTROL) || 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_OTHER_FORMAT) || 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type == XML_REGEXP_OTHER_PRIVATE)) 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((range2->type >= XML_REGEXP_LETTER) && 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (range2->type < XML_REGEXP_BLOCK_NAME)) 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* safety net ! */ 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((range1->neg == 0) && (range2->neg != 0)) || 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((range1->neg != 0) && (range2->neg == 0))) 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 2231df143a5041f03a22808b59c76698770b74692815Selim Gurun return(ret); 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFACompareAtomTypes: 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type1: an atom type 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type2: an atom type 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms type to check whether they intersect in some ways, 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used by xmlFACompareAtoms only 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if they may intersect and 0 otherwise 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFACompareAtomTypes(xmlRegAtomType type1, xmlRegAtomType type2) { 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type1 == XML_REGEXP_EPSILON) || 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_CHARVAL) || 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_RANGES) || 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_SUBREG) || 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_STRING) || 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type1 == XML_REGEXP_ANYCHAR)) 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_EPSILON) || 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_CHARVAL) || 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_RANGES) || 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_SUBREG) || 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_STRING) || 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_ANYCHAR)) 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type1 == type2) return(1); 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* simplify subsequent compares by making sure type1 < type2 */ 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type1 > type2) { 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType tmp = type1; 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type1 = type2; 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type2 = tmp; 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type1) { 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: /* \s */ 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a letter, number, mark, pontuation, symbol */ 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTSPACE) || 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_LETTER) && 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_LETTER_OTHERS)) || 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_NUMBER) && 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_NUMBER_OTHERS)) || 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) return(0); 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: /* \S */ 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: /* \l */ 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a number, mark, separator, pontuation, symbol or other */ 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTINITNAME) || 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_NUMBER) && 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_NUMBER_OTHERS)) || 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) return(0); 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: /* \L */ 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: /* \c */ 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a mark, separator, pontuation, symbol or other */ 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTNAMECHAR) || 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) return(0); 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: /* \C */ 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: /* \d */ 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a letter, mark, separator, pontuation, symbol or other */ 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTDECIMAL) || 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 == XML_REGEXP_REALCHAR) || 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_LETTER) && 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_LETTER_OTHERS)) || 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project )return(0); 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: /* \D */ 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: /* \w */ 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* can't be a mark, separator, pontuation, symbol or other */ 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((type2 == XML_REGEXP_NOTDECIMAL) || 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_MARK) && 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_MARK_ENCLOSING)) || 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_PUNCT) && 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_PUNCT_OTHERS)) || 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SEPAR) && 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SEPAR_PARA)) || 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_SYMBOL) && 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((type2 >= XML_REGEXP_OTHER) && 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type2 <= XML_REGEXP_OTHER_NA)) 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project )return(0); 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: /* \W */ 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * at that point we know both type 1 and type2 are from 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character categories are ordered and are different, 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it becomes simple because this is a partition 2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_LETTER_OTHERS) 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_MARK_ENCLOSING) 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_NUMBER_OTHERS) 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_PUNCT_OTHERS) 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_SEPAR_PARA) 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_SYMBOL_OTHERS) 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type2 <= XML_REGEXP_OTHER_NA) 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEqualAtoms: 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom1: an atom 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom2: an atom 2439df143a5041f03a22808b59c76698770b74692815Selim Gurun * @deep: if not set only compare string pointers 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms to check whether they are the same exactly 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used to remove equivalent transitions 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if same and 0 otherwise 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2447df143a5041f03a22808b59c76698770b74692815Selim GurunxmlFAEqualAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1 == atom2) 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom1 == NULL) || (atom2 == NULL)) 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->type != atom2->type) 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom1->type) { 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 2462df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!deep) 2463df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = (atom1->valuep == atom2->valuep); 2464df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2465df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlStrEqual((xmlChar *)atom1->valuep, 2466df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlChar *)atom2->valuep); 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (atom1->codepoint == atom2->codepoint); 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* too hard to do in the general case */ 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFACompareAtoms: 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom1: an atom 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom2: an atom 2484df143a5041f03a22808b59c76698770b74692815Selim Gurun * @deep: if not set only compare string pointers 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms to check whether they intersect in some ways, 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used by xmlFAComputesDeterminism and xmlFARecurseDeterminism only 2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes and 0 otherwise 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2492df143a5041f03a22808b59c76698770b74692815Selim GurunxmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1 == atom2) 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom1 == NULL) || (atom2 == NULL)) 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom1->type == XML_REGEXP_ANYCHAR) || 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (atom2->type == XML_REGEXP_ANYCHAR)) 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->type > atom2->type) { 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr tmp; 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = atom1; 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom1 = atom2; 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom2 = tmp; 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->type != atom2->type) { 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFACompareAtomTypes(atom1->type, atom2->type); 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if they can't intersect at the type level break now */ 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom1->type) { 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 2518df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!deep) 2519df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = (atom1->valuep != atom2->valuep); 2520df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2521df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlRegStrEqualWildcard((xmlChar *)atom1->valuep, 2522df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlChar *)atom2->valuep); 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_determinist; 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom2->type == XML_REGEXP_CHARVAL) { 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (atom1->codepoint == atom2->codepoint); 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom2, atom1->codepoint); 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom2->type == XML_REGEXP_RANGES) { 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, res; 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr r1, r2; 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need to check that none of the ranges eventually matches 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom1->nbRanges;i++) { 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < atom2->nbRanges;j++) { 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project r1 = atom1->ranges[i]; 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project r2 = atom2->ranges[j]; 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlFACompareRanges(r1, r2); 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == 1) { 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_determinist; 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom1->neg != atom2->neg) { 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_determinist: 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFARecurseDeterminism: 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the associated regexp is determinist, 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should be called after xmlFAEliminateEpsilonTransitions() 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int to, xmlRegAtomPtr atom) { 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transnr, nbTrans; 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t1; 2585df143a5041f03a22808b59c76698770b74692815Selim Gurun int deep = 1; 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2589df143a5041f03a22808b59c76698770b74692815Selim Gurun 2590df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->flags & AM_AUTOMATA_RNG) 2591df143a5041f03a22808b59c76698770b74692815Selim Gurun deep = 0; 2592df143a5041f03a22808b59c76698770b74692815Selim Gurun 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * don't recurse on transitions potentially added in the course of 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the elimination. 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbTrans = state->nbTrans; 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < nbTrans;transnr++) { 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1 = &(state->trans[transnr]); 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check transitions conflicting with the one looked at 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->atom == NULL) { 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to < 0) 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to, atom); 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == 0) { 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* t1->nd = 1; */ 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to != to) 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2616df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlFACompareAtoms(t1->atom, atom, deep)) { 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* mark the transition as non-deterministic */ 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1->nd = 1; 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAComputesDeterminism: 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the associated regexp is determinist, 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should be called after xmlFAEliminateEpsilonTransitions() 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt) { 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int statenr, transnr; 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t1, t2, last; 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 2640df143a5041f03a22808b59c76698770b74692815Selim Gurun int deep = 1; 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("xmlFAComputesDeterminism\n"); 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintCtxt(stdout, ctxt); 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->determinist != -1) 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->determinist); 2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2649df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->flags & AM_AUTOMATA_RNG) 2650df143a5041f03a22808b59c76698770b74692815Selim Gurun deep = 0; 2651df143a5041f03a22808b59c76698770b74692815Selim Gurun 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First cleanup the automata removing cancelled transitions 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbTrans < 2) 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1 = &(state->trans[transnr]); 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determinism checks in case of counted or all transitions 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will have to be handled separately 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->atom == NULL) { 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* t1->nd = 1; */ 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to == -1) /* eliminated */ 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < transnr;i++) { 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2 = &(state->trans[i]); 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->to == -1) /* eliminated */ 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->atom != NULL) { 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to == t2->to) { 2679df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 2680df143a5041f03a22808b59c76698770b74692815Selim Gurun * Here we use deep because we want to keep the 2681df143a5041f03a22808b59c76698770b74692815Selim Gurun * transitions which indicate a conflict 2682df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 2683df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlFAEqualAtoms(t1->atom, t2->atom, deep) && 2684df143a5041f03a22808b59c76698770b74692815Selim Gurun (t1->counter == t2->counter) && 2685df143a5041f03a22808b59c76698770b74692815Selim Gurun (t1->count == t2->count)) 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2->to = -1; /* eliminated */ 2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for all states that there aren't 2 transitions 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with the same atom and a different target. 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (statenr = 0;statenr < ctxt->nbStates;statenr++) { 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->states[statenr]; 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state == NULL) 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (state->nbTrans < 2) 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transnr = 0;transnr < state->nbTrans;transnr++) { 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1 = &(state->trans[transnr]); 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determinism checks in case of counted or all transitions 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will have to be handled separately 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->atom == NULL) { 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t1->to == -1) /* eliminated */ 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < transnr;i++) { 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2 = &(state->trans[i]); 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->to == -1) /* eliminated */ 2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (t2->atom != NULL) { 2720df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 2721df143a5041f03a22808b59c76698770b74692815Selim Gurun * But here we don't use deep because we want to 2722df143a5041f03a22808b59c76698770b74692815Selim Gurun * find transitions which indicate a conflict 2723df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 2724df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlFACompareAtoms(t1->atom, t2->atom, 1)) { 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* mark the transitions as non-deterministic ones */ 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1->nd = 1; 2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2->nd = 1; 2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = t1; 2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (t1->to != -1) { 2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * do the closure in case of remaining specific 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * epsilon transitions like choices or all 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t2->to, t2->atom); 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't shortcut the computation so all non deterministic 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transition get marked down 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t1->nd = 1; 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* t2->nd = 1; */ 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = t1; 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't shortcut the computation so all non deterministic 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transition get marked down 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; */ 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * mark specifically the last non-deterministic transition 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from a state since there is no need to set-up rollback 2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from it 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (last != NULL) { 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last->nd = 2; 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* don't shortcut the computation so all non deterministic 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transition get marked down 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; */ 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->determinist = ret; 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to check input against transition atoms * 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg, 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start, int end, const xmlChar *blockName) { 2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SUBREG: 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYCHAR: 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((codepoint != '\n') && (codepoint != '\r')); 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((codepoint >= start) && (codepoint <= end)); 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((codepoint == '\n') || (codepoint == '\r') || 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '\t') || (codepoint == ' ')); 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (IS_LETTER(codepoint) || 2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '_') || (codepoint == ':')); 2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (IS_LETTER(codepoint) || IS_DIGIT(codepoint) || 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '.') || (codepoint == '-') || 2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (codepoint == '_') || (codepoint == ':') || 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project IS_COMBINING(codepoint) || IS_EXTENDER(codepoint)); 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNd(codepoint); 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project neg = !neg; 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatP(codepoint); 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZ(codepoint); 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatC(codepoint); 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatL(codepoint); 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLu(codepoint); 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLl(codepoint); 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLt(codepoint); 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLm(codepoint); 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatLo(codepoint); 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatM(codepoint); 2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatMn(codepoint); 2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatMc(codepoint); 2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatMe(codepoint); 2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatN(codepoint); 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNd(codepoint); 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNl(codepoint); 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatNo(codepoint); 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatP(codepoint); 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPc(codepoint); 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPd(codepoint); 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPs(codepoint); 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPe(codepoint); 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPi(codepoint); 2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPf(codepoint); 2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatPo(codepoint); 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZ(codepoint); 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZs(codepoint); 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZl(codepoint); 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatZp(codepoint); 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatS(codepoint); 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSm(codepoint); 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSc(codepoint); 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSk(codepoint); 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatSo(codepoint); 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatC(codepoint); 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatCc(codepoint); 2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatCf(codepoint); 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsCatCo(codepoint); 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ret = xmlUCSIsCatCn(codepoint); */ 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Seems it doesn't exist anymore in recent Unicode releases */ 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_BLOCK_NAME: 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUCSIsBlock(codepoint, (const char *) blockName); 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neg) 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(!ret); 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint) { 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret = 0; 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegRangePtr range; 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom == NULL) || (!IS_CHAR(codepoint))) 2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (atom->type) { 2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SUBREG: 2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_EPSILON: 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_CHARVAL: 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(codepoint == atom->codepoint); 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_RANGES: { 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int accept = 0; 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < atom->nbRanges;i++) { 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = atom->ranges[i]; 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range->neg == 2) { 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(range->type, codepoint, 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, range->start, range->end, 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->blockName); 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); /* excluded char */ 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (range->neg) { 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(range->type, codepoint, 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, range->start, range->end, 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range->blockName); 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project accept = 1; 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 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; /* might still be excluded */ 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(accept); 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_STRING: 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("TODO: XML_REGEXP_STRING\n"); 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYCHAR: 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_ANYSPACE: 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTSPACE: 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_INITNAME: 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTINITNAME: 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NAMECHAR: 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTNAMECHAR: 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_DECIMAL: 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTDECIMAL: 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_REALCHAR: 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NOTREALCHAR: 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER: 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_UPPERCASE: 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_LOWERCASE: 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_TITLECASE: 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_MODIFIER: 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_LETTER_OTHERS: 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK: 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_NONSPACING: 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_SPACECOMBINING: 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_MARK_ENCLOSING: 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER: 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_DECIMAL: 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_LETTER: 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_NUMBER_OTHERS: 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT: 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CONNECTOR: 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_DASH: 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OPEN: 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_CLOSE: 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_INITQUOTE: 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_FINQUOTE: 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_PUNCT_OTHERS: 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR: 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_SPACE: 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_LINE: 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SEPAR_PARA: 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL: 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MATH: 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_CURRENCY: 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_MODIFIER: 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_SYMBOL_OTHERS: 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER: 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_CONTROL: 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_FORMAT: 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_PRIVATE: 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_OTHER_NA: 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_REGEXP_BLOCK_NAME: 3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacterRange(atom->type, codepoint, 0, 0, 0, 3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *)atom->valuep); 3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Saving and restoring state of an execution context * 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegDebugExec(xmlRegExecCtxtPtr exec) { 3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("state: %d:%d:idx %d", exec->state->no, exec->transno, exec->index); 3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack != NULL) { 3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(": "); 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;(i < 3) && (i < exec->inputStackNr);i++) 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("%s ", (const char *) 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr - (i + 1)].value); 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(": %s", &(exec->inputString[exec->index])); 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecSave(xmlRegExecCtxtPtr exec) { 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("saving "); 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno++; 3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegDebugExec(exec); 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno--; 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef MAX_PUSH 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->nbPush > MAX_PUSH) { 3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbPush++; 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->maxRollbacks == 0) { 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 4; 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = (xmlRegExecRollback *) xmlMalloc(exec->maxRollbacks * 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlRegExecRollback)); 3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks == NULL) { 3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "saving regexp"); 3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 0; 3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec->rollbacks, 0, 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks * sizeof(xmlRegExecRollback)); 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->nbRollbacks >= exec->maxRollbacks) { 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecRollback *tmp; 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = exec->maxRollbacks; 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks *= 2; 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegExecRollback *) xmlRealloc(exec->rollbacks, 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks * sizeof(xmlRegExecRollback)); 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "saving regexp"); 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks /= 2; 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = tmp; 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = &exec->rollbacks[len]; 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(tmp, 0, (exec->maxRollbacks - len) * sizeof(xmlRegExecRollback)); 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].state = exec->state; 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].index = exec->index; 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].nextbranch = exec->transno + 1; 3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->nbCounters > 0) { 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { 3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks[exec->nbRollbacks].counts = (int *) 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(exec->comp->nbCounters * sizeof(int)); 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "saving regexp"); 3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -5; 3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->rollbacks[exec->nbRollbacks].counts, exec->counts, 3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks++; 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->nbRollbacks <= 0) { 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("rollback failed on empty stack\n"); 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks--; 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = exec->rollbacks[exec->nbRollbacks].state; 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index = exec->rollbacks[exec->nbRollbacks].index; 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = exec->rollbacks[exec->nbRollbacks].nextbranch; 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->nbCounters > 0) { 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { 3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "exec save: allocation failed"); 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -6; 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts, 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("restored "); 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegDebugExec(exec); 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Verifier, running an input against a compiled regexp * 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxt execval; 3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec = &execval; 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret, codepoint = 0, len, deter; 3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputString = content; 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index = 0; 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbPush = 0; 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 1; 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 0; 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks = 0; 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = NULL; 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = 0; 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp = comp; 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = comp->states[0]; 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack = NULL; 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 0; 3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbCounters > 0) { 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int)); 3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "running regexp"); 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec->counts, 0, comp->nbCounters * sizeof(int)); 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = NULL; 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((exec->status == 0) && 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((exec->inputString[exec->index] != 0) || 320460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((exec->state != NULL) && 320560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (exec->state->type != XML_REGEXP_FINAL_STATE)))) { 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If end of input on non-terminal state, rollback, however we may 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * still have epsilon like transition for counted transitions 3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on counters, in that case don't break too early. Additionally, 3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if we are working on a range like "AB{0,2}", where B is not present, 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we don't want to break. 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) { 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if there is a transition, we must check if 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * atom allows minOccurs of 0 3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transno < exec->state->nbTrans) { 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to >=0) { 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!((atom->min == 0) && (atom->max > 0))) 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;exec->transno < exec->state->nbTrans;exec->transno++) { 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project deter = 1; 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count >= 0) { 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A counted transition. 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->count]; 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->count]; 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing count %d: val %d, min %d, max %d\n", 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, count, counter->min, counter->max); 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((count >= counter->min) && (count <= counter->max)); 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret) && (counter->min != counter->max)) 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project deter = 0; 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom == NULL) { 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "epsilon transition left at runtime\n"); 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -2; 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->inputString[exec->index] != 0) { 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (atom->min >= 0) && (atom->max > 0)) { 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to = comp->states[trans->to]; 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a multiple input sequence 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If there is a counter associated increment it now. 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before potentially saving and rollback 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * do not increment if the counter is already over the 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * maximum limit in which case get to next transition 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->counts == NULL) || 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp == NULL) || 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->counters == NULL)) { 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts[trans->counter] >= counter->max) 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* for loop on transitions */ 3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to progress as much as possible on the input 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount == atom->max) { 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input: stop here 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputString[exec->index] == 0) { 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index -= len; 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount >= atom->min) { 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno = exec->transno; 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state = exec->state; 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The transition is acceptable save it 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = -1; /* trick */ 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = to; 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = transno; 3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = state; 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), 3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len); 3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount++; 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (ret == 1); 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount < atom->min) 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the last check failed but one transition was found 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible, rollback 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Decreasing count %d\n", trans->counter); 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]--; 3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((ret == 0) && (atom->min == 0) && (atom->max > 0)) { 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we don't match on the codepoint, but minOccurs of 0 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * says that's ok. Setting len to 0 inhibits stepping 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * over the codepoint. 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 0; 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((atom->min == 0) && (atom->max > 0)) { 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* another spot to match when minOccurs is 0 */ 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 0; 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->nd == 1) || 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((trans->count >= 0) && (deter == 0) && 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->nbTrans > exec->transno + 1))) { 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->nd == 1) 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Saving on nd transition atom %d for %c at %d\n", 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->atom->no, codepoint, exec->index); 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Saving on counted transition count %d for %c at %d\n", 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, codepoint, exec->index); 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* make sure we don't go over the counter maximum value */ 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->counts == NULL) || 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp == NULL) || 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->counters == NULL)) { 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts[trans->counter] >= counter->max) 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* for loop on transitions */ 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->count >= 0) && 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count < REGEXP_ALL_COUNTER)) { 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("resetting count %d on transition\n", 3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count); 3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->count] = 0; 3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", trans->to); 3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = comp->states[trans->to]; 3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom != NULL) { 3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto progress; 3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -4; 3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { 3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback: 3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find a way out 3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 0; 3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("rollback from state %d on %d:%c\n", exec->state->no, 3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint,codepoint); 3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecRollBack(exec); 3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress: 3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks != NULL) { 3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) { 3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->maxRollbacks;i++) 3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[i].counts != NULL) 3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks[i].counts); 3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks); 3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) 3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->counts); 3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == 0) 3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == -1) { 3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->nbPush > MAX_PUSH) 3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Progressive interface to the verifier one atom at a time * 3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void testerr(xmlRegExecCtxtPtr exec); 3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewExecCtxt: 3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: a precompiled regular expression 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @callback: a callback function used for handling progresses in the 3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * automata matching phase 3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: the context data associated to the callback in this context 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a context used for progressive evaluation of a regexp. 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new context 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecCtxtPtr 3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewExecCtxt(xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data) { 3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecCtxtPtr exec; 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->compact == NULL) && (comp->states == NULL)) 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec = (xmlRegExecCtxtPtr) xmlMalloc(sizeof(xmlRegExecCtxt)); 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) { 3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "creating execution context"); 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec, 0, sizeof(xmlRegExecCtxt)); 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputString = NULL; 3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index = 0; 3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 1; 3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->maxRollbacks = 0; 3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbRollbacks = 0; 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->rollbacks = NULL; 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = 0; 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp = comp; 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact == NULL) 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = comp->states[0]; 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->callback = callback; 3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->data = data; 3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbCounters > 0) { 3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For error handling, exec->counts is allocated twice the size 3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the second half is used to store the data in case of rollback 3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int) 3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2); 3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts == NULL) { 3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "creating execution context"); 3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec); 3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(exec->counts, 0, comp->nbCounters * sizeof(int) * 2); 3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errCounts = &exec->counts[comp->nbCounters]; 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts = NULL; 3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errCounts = NULL; 3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 0; 3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackNr = 0; 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack = NULL; 3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errStateNo = -1; 3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = NULL; 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->nbPush = 0; 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec); 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeExecCtxt: 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regular expression evaulation context 3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the structures associated to a regular expression evaulation context. 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeExecCtxt(xmlRegExecCtxtPtr exec) { 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks != NULL) { 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) { 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->maxRollbacks;i++) 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->rollbacks[i].counts != NULL) 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks[i].counts); 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->rollbacks); 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->counts != NULL) 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->counts); 3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack != NULL) { 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->inputStackNr;i++) { 3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack[i].value != NULL) 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->inputStack[i].value); 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->inputStack); 3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec); 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value, 3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("saving value: %d:%s\n", exec->inputStackNr, value); 3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackMax == 0) { 3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 4; 3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack = (xmlRegInputTokenPtr) 3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(exec->inputStackMax * sizeof(xmlRegInputToken)); 3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack == NULL) { 3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "pushing input string"); 3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax = 0; 3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->inputStackNr + 1 >= exec->inputStackMax) { 3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegInputTokenPtr tmp; 3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax *= 2; 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlRegInputTokenPtr) xmlRealloc(exec->inputStack, 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax * sizeof(xmlRegInputToken)); 3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpErrMemory(NULL, "pushing input string"); 3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackMax /= 2; 3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack = tmp; 3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].value = xmlStrdup(value); 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].data = data; 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStackNr++; 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].value = NULL; 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->inputStack[exec->inputStackNr].data = NULL; 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegStrEqualWildcard: 3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expStr: the string to be evaluated 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valStr: the validation string 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if both strings are equal or have the same content. "*" 3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * can be used as a wildcard in @valStr; "|" is used as a seperator of 3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substrings in both @expStr and @valStr. 3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the comparison is satisfied and the number of substrings 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is equal, 0 otherwise. 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr) { 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expStr == valStr) return(1); 3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expStr == NULL) return(0); 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (valStr == NULL) return(0); 3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eval if we have a wildcard for the current item. 3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*expStr != *valStr) { 3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if one of them starts with a wildcard make valStr be it */ 3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*valStr == '*') { 3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tmp; 3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valStr; 3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valStr = expStr; 3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project expStr = tmp; 3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*valStr != 0) && (*expStr != 0) && (*expStr++ == '*')) { 3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*valStr == XML_REG_STRING_SEPARATOR) 3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valStr++; 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (*valStr != 0); 3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project expStr++; 3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valStr++; 3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (*valStr != 0); 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*expStr != 0) 3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCompactPushString: 3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context 3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled exec with a compact table 3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCompactPushString(xmlRegExecCtxtPtr exec, 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr comp, 3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value, 3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int state = exec->index; 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, target; 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (comp->compact == NULL) || (comp->stringMap == NULL)) 3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are we at a final state ? 3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[state * (comp->nbstrings + 1)] == 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE) 3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value pushed: %s\n", value); 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Examine all outside transitions from current state 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < comp->nbstrings;i++) { 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((target > 0) && (target <= comp->nbstates)) { 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target--; /* to avoid 0 */ 3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegStrEqualWildcard(comp->stringMap[i], value)) { 3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index = target; 3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->callback != NULL) && (comp->transdata != NULL)) { 3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->callback(exec->data, value, 3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->transdata[state * comp->nbstrings + i], data); 3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", target); 3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[target * (comp->nbstrings + 1)] == 3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE) 3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[target * (comp->nbstrings + 1)] == 3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE) 3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find an exit transition out from current state for the 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * current token 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("failed to find a transition for %s on state %d\n", value, state); 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = xmlStrdup(value); 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errStateNo = state; 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project testerr(exec); 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushStringInternal: 3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end 3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input 3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @compound: value was assembled from 2 strings 3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value, 3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data, int compound) { 3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int final = 0; 3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int progress = 1; 3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp == NULL) 3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->compact != NULL) 3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegCompactPushString(exec, exec->comp, value, data)); 3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->type == XML_REGEXP_FINAL_STATE) 3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final = 1; 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value pushed: %s\n", value); 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we have an active rollback stack push the new value there 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and get back to where we were left 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value != NULL) && (exec->inputStackNr > 0)) { 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((exec->status == 0) && 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((value != NULL) || 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((final == 1) && 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->type != XML_REGEXP_FINAL_STATE)))) { 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input on non-terminal state, rollback, however we may 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * still have epsilon like transition for counted transitions 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on counters, in that case don't break too early. 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value == NULL) && (exec->counts == NULL)) 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;exec->transno < exec->state->nbTrans;exec->transno++) { 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_LAX_COUNTER) { 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t; 3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing all lax %d\n", trans->count); 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all counted transitions from the current state 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value == NULL) && (final)) { 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (value != NULL) { 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->state->nbTrans;i++) { 3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t = &exec->state->trans[i]; 3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((t->counter < 0) || (t == trans)) 3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[t->counter]; 3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[t->counter]; 3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((count < counter->max) && 3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (t->atom != NULL) && 3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(value, t->atom->valuep))) { 3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((count >= counter->min) && 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (count < counter->max) && 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (t->atom != NULL) && 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(value, t->atom->valuep))) { 3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count == REGEXP_ALL_COUNTER) { 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr t; 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing all %d\n", trans->count); 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all counted transitions from the current state 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < exec->state->nbTrans;i++) { 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project t = &exec->state->trans[i]; 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((t->counter < 0) || (t == trans)) 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[t->counter]; 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[t->counter]; 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((count < counter->min) || (count > counter->max)) { 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count >= 0) { 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A counted transition. 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->count]; 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->count]; 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing count %d: val %d, min %d, max %d\n", 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, count, counter->min, counter->max); 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((count >= counter->min) && (count <= counter->max)); 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom == NULL) { 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "epsilon transition left at runtime\n"); 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -2; 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (value != NULL) { 3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegStrEqualWildcard(atom->valuep, value); 3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) { 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = !ret; 3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!compound) 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (trans->counter >= 0)) { 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->counter]; 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count >= counter->max) 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to = exec->comp->states[trans->to]; 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a multiple input sequence 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackNr <= 0) { 3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to progress as much as possible on the input 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount == atom->max) { 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index++; 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input: stop here 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) { 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index --; 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount >= atom->min) { 3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno = exec->transno; 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state = exec->state; 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The transition is acceptable save it 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = -1; /* trick */ 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = to; 3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackNr <= 0) { 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = transno; 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = state; 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(value, atom->valuep); 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount++; 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (ret == 1); 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount < atom->min) 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the last check failed but one transition was found 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible, rollback 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->callback != NULL) && (atom != NULL) && 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (data != NULL)) { 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->callback(exec->data, atom->valuep, 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data, data); 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStackNr <= 0) { 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSaveInputString(exec, value, data); 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((trans->count >= 0) && 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (trans->count < REGEXP_ALL_COUNTER)) { 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("resetting count %d on transition\n", 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count); 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->count] = 0; 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", trans->to); 4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp->states[trans->to] != NULL) && 4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->states[trans->to]->type == 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entering a sink state, save the current state as error 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state. 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = xmlStrdup(value); 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errState = exec->state; 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->errCounts, exec->counts, 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = exec->comp->states[trans->to]; 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom != NULL) { 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputStack != NULL) { 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index++; 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->index < exec->inputStackNr) { 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = NULL; 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = NULL; 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("end of input\n"); 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = NULL; 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = NULL; 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("end of input\n"); 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto progress; 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -4; 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback: 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if we didn't yet rollback on the current input 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * store the current state as the error state. 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((progress) && (exec->state != NULL) && 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->type != XML_REGEXP_SINK_STATE)) { 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 0; 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errString != NULL) 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exec->errString); 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errString = xmlStrdup(value); 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->errState = exec->state; 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(exec->errCounts, exec->counts, 4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->comp->nbCounters * sizeof(int)); 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find a way out 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 0; 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecRollBack(exec); 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == 0) { 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = exec->inputStack[exec->index].value; 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = exec->inputStack[exec->index].data; 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("value loaded: %s\n", value); 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress: 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project progress = 1; 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status == 0) { 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->state->type == XML_REGEXP_FINAL_STATE); 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status < 0) { 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project testerr(exec); 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushString: 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecPushStringInternal(exec, value, data, 0)); 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushString2: 4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the first string token input 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second string token input 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a negative value in case of error. 4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value, 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value2, void *data) { 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[150]; 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp, ret; 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp == NULL) 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value2 == NULL) 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecPushString(exec, value, data)); 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) value2); 4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) value); 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (150 < lenn + lenp + 2) { 4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -1; 4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = buf; 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], value, lenp); 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = XML_REG_STRING_SEPARATOR; 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], value2, lenn); 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp->compact != NULL) 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCompactPushString(exec, exec->comp, str, data); 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegExecPushStringInternal(exec, str, data, 1); 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != buf) 4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecGetValues: 4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: error extraction or normal one 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract informations from the regexp execution, internal routine to 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implement xmlRegExecNextValues() and xmlRegExecErrInfo() 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error. 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *nbval, int *nbneg, 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values, int *terminal) { 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxval; 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb = 0; 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) || 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (values == NULL) || (*nbval <= 0)) 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxval = *nbval; 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *nbval = 0; 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *nbneg = 0; 4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp != NULL) && (exec->comp->compact != NULL)) { 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr comp; 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int target, i, state; 4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = exec->comp; 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err) { 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errStateNo == -1) return(-1); 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->errStateNo; 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->index; 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (terminal != NULL) { 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->compact[state * (comp->nbstrings + 1)] == 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_FINAL_STATE) 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 1; 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 0; 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((target > 0) && (target <= comp->nbstates) && 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->compact[(target - 1) * (comp->nbstrings + 1)] != 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = comp->stringMap[i]; 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbval)++; 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((target > 0) && (target <= comp->nbstates) && 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->compact[(target - 1) * (comp->nbstrings + 1)] == 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = comp->stringMap[i]; 4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbneg)++; 4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno; 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state; 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (terminal != NULL) { 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->type == XML_REGEXP_FINAL_STATE) 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 1; 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *terminal = 0; 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err) { 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->errState == NULL) return(-1); 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->errState; 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state == NULL) return(-1); 4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = exec->state; 4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transno = 0; 4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (transno < state->nbTrans) && (nb < maxval); 4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transno++) { 4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &state->trans[transno]; 4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom == NULL) || (atom->valuep == NULL)) 4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_LAX_COUNTER) { 4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* this should not be reached but ... */ 4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count == REGEXP_ALL_COUNTER) { 4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* this should not be reached but ... */ 4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->counter >= 0) { 4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter = NULL; 4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err) 4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->errCounts[trans->counter]; 4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->counter]; 4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->comp != NULL) 4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->counter]; 4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((counter == NULL) || (count < counter->max)) { 4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep2; 4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep; 4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbval)++; 4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp->states[trans->to] != NULL) && 4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->states[trans->to]->type != 4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 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 } 4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (transno = 0; 4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (transno < state->nbTrans) && (nb < maxval); 4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project transno++) { 4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &state->trans[transno]; 4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((atom == NULL) || (atom->valuep == NULL)) 4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count == REGEXP_ALL_LAX_COUNTER) { 4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->count == REGEXP_ALL_COUNTER) { 4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (trans->counter >= 0) { 4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->comp->states[trans->to] != NULL) && 4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->comp->states[trans->to]->type == 4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_SINK_STATE)) { 4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom->neg) 4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep2; 4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values[nb++] = (xmlChar *) atom->valuep; 4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*nbneg)++; 4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecNextValues: 4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context 4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT 4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions 4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values 4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state 4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract informations from the regexp execution, 4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parameter @values must point to an array of @nbval string pointers 4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on return nbval will contain the number of possible strings in that 4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state and the @values array will be updated with them. The string values 4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned will be freed with the @exec context and don't need to be 4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deallocated. 4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error. 4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, int *nbneg, 4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values, int *terminal) { 4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecGetValues(exec, 0, nbval, nbneg, values, terminal)); 4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecErrInfo: 4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context generating an error 4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string: return value for the error string 4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT 4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions 4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values 4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state 4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract error informations from the regexp execution, the parameter 4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string will be updated with the value pushed and not accepted, 4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parameter @values must point to an array of @nbval string pointers 4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on return nbval will contain the number of possible strings in that 4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state and the @values array will be updated with them. The string values 4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned will be freed with the @exec context and don't need to be 4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deallocated. 4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error. 4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string, 4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *nbval, int *nbneg, xmlChar **values, int *terminal) { 4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string != NULL) { 4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *string = exec->errString; 4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *string = NULL; 4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlRegExecGetValues(exec, 1, nbval, nbneg, values, terminal)); 4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR 4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void testerr(xmlRegExecCtxtPtr exec) { 4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *string; 4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *values[5]; 4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb = 5; 4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbneg; 4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int terminal; 4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegExecErrInfo(exec, &string, &nb, &nbneg, &values[0], &terminal); 4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushChar(xmlRegExecCtxtPtr exec, int UCS) { 4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegTransPtr trans; 4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint, len; 4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec == NULL) 4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->status != 0) 4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exec->status); 4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((exec->status == 0) && 4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((exec->inputString[exec->index] != 0) || 4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exec->state->type != XML_REGEXP_FINAL_STATE))) { 4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input on non-terminal state, rollback, however we may 4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * still have epsilon like transition for counted transitions 4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on counters, in that case don't break too early. 4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) 4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 0; 4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;exec->transno < exec->state->nbTrans;exec->transno++) { 4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans = &exec->state->trans[exec->transno]; 4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->to < 0) 4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = trans->atom; 4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count >= 0) { 4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count; 4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegCounterPtr counter; 4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A counted transition. 4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = exec->counts[trans->count]; 4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = &exec->comp->counters[trans->count]; 4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("testing count %d: val %d, min %d, max %d\n", 4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project trans->count, count, counter->min, counter->max); 4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((count >= counter->min) && (count <= counter->max)); 4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (atom == NULL) { 4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "epsilon transition left at runtime\n"); 4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -2; 4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exec->inputString[exec->index] != 0) { 4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); 4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { 4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr to = exec->comp->states[trans->to]; 4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a multiple input sequence 4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount = 1; 4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to progress as much as possible on the input 4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount == atom->max) { 4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End of input: stop here 4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->inputString[exec->index] == 0) { 4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index -= len; 4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount >= atom->min) { 4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int transno = exec->transno; 4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr state = exec->state; 4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The transition is acceptable save it 4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = -1; /* trick */ 4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = to; 4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = transno; 4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = state; 4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), 4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len); 4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegCheckCharacter(atom, codepoint); 4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transcount++; 4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (ret == 1); 4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->transcount < atom->min) 4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the last check failed but one transition was found 4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possible, rollback 4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) { 4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 1) { 4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exec->state->nbTrans > exec->transno + 1) { 4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecSave(exec); 4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * restart count for expressions like this ((abc){2})* 4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->count >= 0) { 4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Reset count %d\n", trans->count); 4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->count] = 0; 4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->counter >= 0) { 4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Increasing count %d\n", trans->counter); 4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->counts[trans->counter]++; 4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC 4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("entering state %d\n", trans->to); 4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->state = exec->comp->states[trans->to]; 4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->transno = 0; 4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (trans->atom != NULL) { 4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->index += len; 4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto progress; 4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret < 0) { 4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->status = -4; 4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { 4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback: 4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Failed to find a way out 4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exec->determinist = 0; 4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFARegExecRollBack(exec); 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress: 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parser for the Schemas Datatype Regular Expressions * 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#regexs * 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAIsChar: 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [10] Char ::= [^.\?*+()|#x5B#x5D] 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAIsChar(xmlRegParserCtxtPtr ctxt) { 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_SCHAR(ctxt->cur, len); 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '.') || (cur == '\\') || (cur == '?') || 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '*') || (cur == '+') || (cur == '(') || 4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == ')') || (cur == '|') || (cur == 0x5B) || 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x5D) || (cur == 0)) 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharProp: 4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [27] charProp ::= IsCategory | IsBlock 4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [28] IsCategory ::= Letters | Marks | Numbers | Punctuation | 4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Separators | Symbols | Others 4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29] Letters ::= 'L' [ultmo]? 4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30] Marks ::= 'M' [nce]? 4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [31] Numbers ::= 'N' [dlo]? 4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [32] Punctuation ::= 'P' [cdseifo]? 4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [33] Separators ::= 'Z' [slp]? 4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [34] Symbols ::= 'S' [mcko]? 4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [35] Others ::= 'C' [cfon]? 4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [36] IsBlock ::= 'Is' [a-zA-Z0-9#x2D]+ 4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { 4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type = (xmlRegAtomType) 0; 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *blockName = NULL; 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'L') { 4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'u') { 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_UPPERCASE; 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'l') { 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_LOWERCASE; 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 't') { 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_TITLECASE; 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'm') { 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_MODIFIER; 4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER_OTHERS; 4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_LETTER; 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'M') { 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'n') { 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* nonspacing */ 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK_NONSPACING; 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'c') { 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* spacing combining */ 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK_SPACECOMBINING; 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'e') { 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* enclosing */ 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK_ENCLOSING; 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all marks */ 4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_MARK; 4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'N') { 4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'd') { 4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* digital */ 4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER_DECIMAL; 4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'l') { 4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* letter */ 4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER_LETTER; 4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* other */ 4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER_OTHERS; 4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all numbers */ 4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NUMBER; 4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'P') { 4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'c') { 4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* connector */ 4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_CONNECTOR; 4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'd') { 4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* dash */ 4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_DASH; 4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 's') { 4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* open */ 4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_OPEN; 4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'e') { 4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* close */ 4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_CLOSE; 4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'i') { 4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* initial quote */ 4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_INITQUOTE; 4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'f') { 4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* final quote */ 4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_FINQUOTE; 4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* other */ 4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT_OTHERS; 4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all punctuation */ 4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_PUNCT; 4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'Z') { 4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 's') { 4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* space */ 4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR_SPACE; 4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'l') { 4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* line */ 4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR_LINE; 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'p') { 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* paragraph */ 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR_PARA; 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all separators */ 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SEPAR; 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'S') { 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'm') { 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_MATH; 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* math */ 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'c') { 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_CURRENCY; 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* currency */ 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'k') { 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_MODIFIER; 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* modifiers */ 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL_OTHERS; 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* other */ 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all symbols */ 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_SYMBOL; 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'C') { 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'c') { 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* control */ 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_CONTROL; 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'f') { 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* format */ 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_FORMAT; 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'o') { 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* private use */ 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_PRIVATE; 4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'n') { 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* not assigned */ 4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER_NA; 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* all others */ 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_OTHER; 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'I') { 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *start; 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != 's') { 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("IsXXXX expected"); 4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = ctxt->cur; 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((cur >= 'a') && (cur <= 'z')) || 4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur >= 'A') && (cur <= 'Z')) || 4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur >= '0') && (cur <= '9')) || 4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x2D)) { 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((cur >= 'a') && (cur <= 'z')) || 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur >= 'A') && (cur <= 'Z')) || 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur >= '0') && (cur <= '9')) || 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x2D)) { 4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_BLOCK_NAME; 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blockName = xmlStrndup(start, ctxt->cur - start); 4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Unknown char property"); 4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, type); 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->valuep = blockName; 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type, 0, 0, blockName); 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharClassEsc: 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E] 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [25] catEsc ::= '\p{' charProp '}' 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [26] complEsc ::= '\P{' charProp '}' 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [37] MultiCharEsc ::= '.' | ('\' [sSiIcCdDwW]) 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '.') { 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_ANYCHAR); 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_ANYCHAR, 0, 0, NULL); 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '\\') { 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Escaped sequence: expecting \\"); 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 'p') { 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '{') { 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '{'"); 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharProp(ctxt); 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '}') { 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '}'"); 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == 'P') { 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '{') { 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '{'"); 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharProp(ctxt); 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->neg = 1; 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '}') { 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting '}'"); 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == 'n') || (cur == 'r') || (cur == 't') || (cur == '\\') || 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '|') || (cur == '.') || (cur == '?') || (cur == '*') || 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '+') || (cur == '(') || (cur == ')') || (cur == '{') || 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == '}') || (cur == 0x2D) || (cur == 0x5B) || (cur == 0x5D) || 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 0x5E)) { 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = '\n'; 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'r': 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = '\r'; 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 't': 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = '\t'; 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = cur; 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4895df143a5041f03a22808b59c76698770b74692815Selim Gurun switch (cur) { 4896df143a5041f03a22808b59c76698770b74692815Selim Gurun case 'n': 4897df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = '\n'; 4898df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4899df143a5041f03a22808b59c76698770b74692815Selim Gurun case 'r': 4900df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = '\r'; 4901df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4902df143a5041f03a22808b59c76698770b74692815Selim Gurun case 't': 4903df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = '\t'; 4904df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4905df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, cur, cur, NULL); 4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == 's') || (cur == 'S') || (cur == 'i') || (cur == 'I') || 4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 'c') || (cur == 'C') || (cur == 'd') || (cur == 'D') || 4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur == 'w') || (cur == 'W')) { 4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomType type = XML_REGEXP_ANYSPACE; 4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 's': 4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_ANYSPACE; 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'S': 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTSPACE; 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'i': 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_INITNAME; 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'I': 4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTINITNAME; 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'c': 4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NAMECHAR; 4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'C': 4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTNAMECHAR; 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'd': 4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_DECIMAL; 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'D': 4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTDECIMAL; 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'w': 4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_REALCHAR; 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'W': 4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = XML_REGEXP_NOTREALCHAR; 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, type); 4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->atom->type == XML_REGEXP_RANGES) { 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type, 0, 0, NULL); 4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Wrong escape sequence, misuse of character '\\'"); 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharRange: 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [18] seRange ::= charOrEsc '-' charOrEsc 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [20] charOrEsc ::= XmlChar | SingleCharEsc 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [21] XmlChar ::= [^\#x2D#x5B#x5D] 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [22] XmlCharIncDash ::= [^\#x5B#x5D] 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) { 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur, len; 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int start = -1; 4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int end = -1; 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '\0') { 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting ']'"); 4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '\\') { 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': start = 0xA; break; 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'r': start = 0xD; break; 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 't': start = 0x9; break; 4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '\\': case '|': case '.': case '-': case '^': case '?': 4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '*': case '+': case '{': case '}': case '(': case ')': 4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '[': case ']': 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = cur; break; 4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Invalid escape value"); 4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = start; 4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur != 0x5B) && (cur != 0x5D)) { 4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = start = CUR_SCHAR(ctxt->cur, len); 5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting a char range"); 5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since we are "inside" a range, we can assume ctxt->cur is past 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the start of ctxt->string, and PREV should be safe 5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((start == '-') && (NXT(1) != ']') && (PREV != '[') && (PREV != '^')) { 5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur != '-') || (NXT(1) == ']')) { 5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, start, end, NULL); 5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '\\') { 5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur) { 5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': end = 0xA; break; 5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'r': end = 0xD; break; 5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 't': end = 0x9; break; 5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '\\': case '|': case '.': case '-': case '^': case '?': 5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '*': case '+': case '{': case '}': case '(': case ')': 5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case '[': case ']': 5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = cur; break; 5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Invalid escape value"); 5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur != 0x5B) && (cur != 0x5D)) { 5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = CUR_SCHAR(ctxt->cur, len); 5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Expecting the end of a char range"); 5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO check that the values are acceptable character ranges for XML */ 5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (end < start) { 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("End of range is before start of range"); 5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, 5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_REGEXP_CHARVAL, start, end, NULL); 5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParsePosCharGroup: 5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [14] posCharGroup ::= ( charRange | charClassEsc )+ 5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) { 5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 506360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (CUR == '\\') { 5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharClassEsc(ctxt); 5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharRange(ctxt); 5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((CUR != ']') && (CUR != '^') && (CUR != '-') && 5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR != 0) && (ctxt->error == 0)); 5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharGroup: 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [13] charGroup ::= posCharGroup | negCharGroup | charClassSub 5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [15] negCharGroup ::= '^' posCharGroup 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [16] charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr 5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] charClassExpr ::= '[' charGroup ']' 5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharGroup(xmlRegParserCtxtPtr ctxt) { 5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int n = ctxt->neg; 5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR != ']') && (ctxt->error == 0)) { 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '^') { 5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg = ctxt->neg; 5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = !ctxt->neg; 5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParsePosCharGroup(ctxt); 5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = neg; 5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '-') && (NXT(1) == '[')) { 5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int neg = ctxt->neg; 5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = 2; 5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; /* eat the '-' */ 5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; /* eat the '[' */ 5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharGroup(ctxt); 5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ']') { 5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("charClassExpr: ']' expected"); 5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = neg; 5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR != ']') { 5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParsePosCharGroup(ctxt); 5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->neg = n; 5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharClass: 5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [11] charClass ::= charClassEsc | charClassExpr 5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] charClassExpr ::= '[' charGroup ']' 5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharClass(xmlRegParserCtxtPtr ctxt) { 5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '[') { 5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_RANGES); 5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) 5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharGroup(ctxt); 5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ']') { 5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("xmlFAParseCharClass: ']' expected"); 5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharClassEsc(ctxt); 5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseQuantExact: 5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8] QuantExact ::= [0-9]+ 5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success or -1 in case of error 5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseQuantExact(xmlRegParserCtxtPtr ctxt) { 5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ok = 0; 5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (CUR - '0'); 5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ok != 1) { 5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseQuantifier: 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] quantifier ::= [?*+] | ( '{' quantity '}' ) 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] quantity ::= quantRange | quantMin | QuantExact 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] quantRange ::= QuantExact ',' QuantExact 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [7] quantMin ::= QuantExact ',' 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8] QuantExact ::= [0-9]+ 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseQuantifier(xmlRegParserCtxtPtr ctxt) { 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur; 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '?') || (cur == '*') || (cur == '+')) { 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '?') 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_OPT; 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (cur == '*') 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_MULT; 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (cur == '+') 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_PLUS; 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == '{') { 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min = 0, max = 0; 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlFAParseQuantExact(ctxt); 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur >= 0) 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = cur; 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ',') { 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '}') 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = INT_MAX; 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlFAParseQuantExact(ctxt); 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur >= 0) 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = cur; 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Improper quantifier"); 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '}') { 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("Unterminated quantifier"); 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max == 0) 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = min; 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom != NULL) { 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->quant = XML_REGEXP_QUANT_RANGE; 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->min = min; 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->max = max; 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseAtom: 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [9] atom ::= Char | charClass | ( '(' regExp ')' ) 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseAtom(xmlRegParserCtxtPtr ctxt) { 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int codepoint, len; 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = xmlFAIsChar(ctxt); 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (codepoint > 0) { 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project codepoint = CUR_SCHAR(ctxt->cur, len); 5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->codepoint = codepoint; 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(len); 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '|') { 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == 0) { 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == ')') { 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '(') { 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start, oldend, start0; 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this extra Epsilon transition is needed if we count with 0 allowed 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * unfortunately this can't be known at that point 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start0 = ctxt->state; 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = ctxt->state; 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldend = ctxt->end; 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseRegExp(ctxt, 0); 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ')') { 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("xmlFAParseAtom: expecting ')'"); 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_SUBREG); 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->start = start; 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->start0 = start0; 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom->stop = ctxt->state; 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = oldend; 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '[') || (CUR == '\\') || (CUR == '.')) { 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseCharClass(ctxt); 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParsePiece: 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [3] piece ::= atom quantifier? 5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParsePiece(xmlRegParserCtxtPtr ctxt) { 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAParseAtom(ctxt); 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atom == NULL) { 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("internal: no atom generated"); 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseQuantifier(ctxt); 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseBranch: 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: optional target to the end of the branch 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to is used to optimize by removing duplicate path in automata 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in expressions like (a|b)(c|d) 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [2] branch ::= piece* 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) { 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr previous; 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project previous = ctxt->state; 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAParsePiece(ctxt); 5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(ctxt, previous, 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project previous = ctxt->state; 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ret != 0) && (ctxt->error == 0)) { 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAParsePiece(ctxt); 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) { 5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(ctxt, previous, 5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project previous = ctxt->state; 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atom = NULL; 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseRegExp: 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a regexp parser context 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @top: is this the top-level expression ? 5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [1] regExp ::= branch ( '|' branch )* 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) { 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePtr start, end; 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if not top start should have been generated by an epsilon trans */ 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = ctxt->state; 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseBranch(ctxt, NULL); 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (top) { 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("State %d is final\n", ctxt->state->no); 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state->type = XML_REGEXP_FINAL_STATE; 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '|') { 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = ctxt->state; 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project end = ctxt->state; 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '|') && (ctxt->error == 0)) { 5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = start; 5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseBranch(ctxt, end); 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!top) { 5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->state = end; 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = end; 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The basic API * 5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpPrint: 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file for the output debug 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: the compiled regexp 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Print the content of the compiled regular expression 5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpPrint(FILE *output, xmlRegexpPtr regexp) { 5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " regexp: "); 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp == NULL) { 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NULL\n"); 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'%s' ", regexp->string); 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d atoms:\n", regexp->nbAtoms); 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbAtoms; i++) { 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %02d ", i); 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintAtom(output, regexp->atoms[i]); 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d states:", regexp->nbStates); 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbStates; i++) { 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegPrintState(output, regexp->states[i]); 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d counters:\n", regexp->nbCounters); 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbCounters; i++) { 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " %d: min %d max %d\n", i, regexp->counters[i].min, 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project regexp->counters[i].max); 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpCompile: 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: a regular expression string 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a regular expression conforming to XML Schemas Part 2 Datatype 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Appendix F and builds an automata suitable for testing strings against 5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that regular expression 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled expression or NULL in case of error 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpPtr 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpCompile(const xmlChar *regexp) { 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr ret; 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegParserCtxtPtr ctxt; 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlRegNewParserCtxt(regexp); 5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* initialize the parser */ 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start = ctxt->state = xmlRegNewState(ctxt); 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(ctxt, ctxt->start); 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* parse the expression building an automata */ 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAParseRegExp(ctxt, 1); 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != 0) { 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR("xmlFAParseRegExp: extra characters"); 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) { 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(ctxt); 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = ctxt->state; 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start->type = XML_REGEXP_START_STATE; 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end->type = XML_REGEXP_FINAL_STATE; 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* remove the Epsilon except for counted transitions */ 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAEliminateEpsilonTransitions(ctxt); 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) { 5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(ctxt); 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegEpxFromParse(ctxt); 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(ctxt); 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpExec: 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled regular expression 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the value to check against the regular expression 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the regular expression generates the value 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it matches, 0 if not and a negative value in case of error 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpExec(xmlRegexpPtr comp, const xmlChar *content) { 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (content == NULL)) 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlFARegExec(comp, content)); 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpIsDeterminist: 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled regular expression 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the regular expression is determinist 5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it yes, 0 if not and a negative value in case of error 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpIsDeterminist(xmlRegexpPtr comp) { 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr am; 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->determinist != -1) 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp->determinist); 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am = xmlNewAutomata(); 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am->states != NULL) { 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < am->nbStates;i++) 5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(am->states[i]); 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(am->states); 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->nbAtoms = comp->nbAtoms; 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->atoms = comp->atoms; 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->nbStates = comp->nbStates; 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->states = comp->states; 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->determinist = -1; 5523df143a5041f03a22808b59c76698770b74692815Selim Gurun am->flags = comp->flags; 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAComputesDeterminism(am); 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->atoms = NULL; 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->states = NULL; 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(am); 5528df143a5041f03a22808b59c76698770b74692815Selim Gurun comp->determinist = ret; 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeRegexp: 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: the regexp 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp 5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeRegexp(xmlRegexpPtr regexp) { 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp == NULL) 5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->string != NULL) 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->string); 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->states != NULL) { 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbStates;i++) 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(regexp->states[i]); 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->states); 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->atoms != NULL) { 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < regexp->nbAtoms;i++) 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(regexp->atoms[i]); 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->atoms); 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->counters != NULL) 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->counters); 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->compact != NULL) 5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->compact); 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->transdata != NULL) 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->transdata); 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (regexp->stringMap != NULL) { 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < regexp->nbstrings;i++) 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->stringMap[i]); 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp->stringMap); 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(regexp); 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_AUTOMATA_ENABLED 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The Automata interface * 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewAutomata: 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new automata 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object or NULL in case of failure 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataPtr 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewAutomata(void) { 5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataPtr ctxt; 5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlRegNewParserCtxt(NULL); 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* initialize the parser */ 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->end = NULL; 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start = ctxt->state = xmlRegNewState(ctxt); 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->start == NULL) { 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt); 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->start->type = XML_REGEXP_START_STATE; 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlRegStatePush(ctxt, ctxt->start) < 0) { 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeState(ctxt->start); 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeAutomata(ctxt); 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5606df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->flags = 0; 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeAutomata: 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an automata 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeAutomata(xmlAutomataPtr am) { 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeParserCtxt(am); 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5625df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlAutomataSetFlags: 5626df143a5041f03a22808b59c76698770b74692815Selim Gurun * @am: an automata 5627df143a5041f03a22808b59c76698770b74692815Selim Gurun * @flags: a set of internal flags 5628df143a5041f03a22808b59c76698770b74692815Selim Gurun * 5629df143a5041f03a22808b59c76698770b74692815Selim Gurun * Set some flags on the automata 5630df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 5631df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid 5632df143a5041f03a22808b59c76698770b74692815Selim GurunxmlAutomataSetFlags(xmlAutomataPtr am, int flags) { 5633df143a5041f03a22808b59c76698770b74692815Selim Gurun if (am == NULL) 5634df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 5635df143a5041f03a22808b59c76698770b74692815Selim Gurun am->flags |= flags; 5636df143a5041f03a22808b59c76698770b74692815Selim Gurun} 5637df143a5041f03a22808b59c76698770b74692815Selim Gurun 5638df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataGetInitState: 5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initial state lookup 5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the initial state of the automata 5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataGetInitState(xmlAutomataPtr am) { 5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->start); 5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataSetFinalState: 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a state in this automata 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes that state a final state 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or -1 in case of error 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataSetFinalState(xmlAutomataPtr am, xmlAutomataStatePtr state) { 5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (state == NULL)) 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state->type = XML_REGEXP_FINAL_STATE; 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewTransition: 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated 5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by the value of @token 5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewTransition(xmlAutomataPtr am, xmlAutomataStatePtr from, 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data) { 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewTransition2: 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the first input string associated to that transition 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by the value of @token 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewTransition2(xmlAutomataPtr am, xmlAutomataStatePtr from, 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, void *data) { 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewNegTrans: 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the first input string associated to that transition 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by any value except (@token,@token2) 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that if @token2 is not NULL, then (X, NULL) won't match to follow 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project # the semantic of XSD ##other 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, void *data) { 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar err_msg[200]; 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->neg = 1; 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf((char *) err_msg, 199, "not %s", (const char *) atom->valuep); 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err_msg[199] = 0; 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep2 = xmlStrdup(err_msg); 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->negs++; 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountTrans2: 5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and @token2 and 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * whose number is between @min and @max 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) 5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = 1; 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = min; 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = max; 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = am->state; 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(am, from, to); 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountTrans: 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and whose number 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is between @min and @max 5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = 1; 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = min; 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = max; 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = am->state; 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(am, from, to); 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewOnceTrans2: 5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and @token2 and whose 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number is between @min and @max, moreover that transition can only be 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * crossed once. 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *token2, 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 1) 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((token2 == NULL) || (*token2 == 0)) { 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lenn, lenp; 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenn = strlen((char *) token2); 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lenp = strlen((char *) token); 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str == NULL) { 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegFreeAtom(atom); 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[0], token, lenp); 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenp] = '|'; 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&str[lenp + 1], token2, lenn); 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str[lenn + lenp + 1] = 0; 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = str; 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCEONLY; 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = 1; 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = 1; 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewOnceTrans: 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimum successive occurences of token 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximum successive occurences of token 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the transition 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state 6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and whose number 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is between @min and @max, moreover that transition can only be crossed 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * once. 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewOnceTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, const xmlChar *token, 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, int max, void *data) { 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPtr atom; 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int counter; 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (token == NULL)) 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 1) 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((max < min) || (max < 1)) 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom = xmlRegNewAtom(am, XML_REGEXP_STRING); 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atom == NULL) 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->valuep = xmlStrdup(token); 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->data = data; 6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->quant = XML_REGEXP_QUANT_ONCEONLY; 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->min = min; 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atom->max = max; 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associate a counter to the transition. 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project counter = xmlRegGetCounter(am); 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].min = 1; 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[counter].max = 1; 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAGenerateTransitions(am, from, to, atom); */ 6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) { 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStateAddTrans(am, from, atom, to, counter, -1); 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegAtomPush(am, atom); 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->state = to; 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewState: 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new disconnected state in the automata 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new state or NULL in case of error 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewState(xmlAutomataPtr am) { 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to; 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = xmlRegNewState(am); 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegStatePush(am, to); 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewEpsilon: 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target state 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewEpsilon(xmlAutomataPtr am, xmlAutomataStatePtr from, 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to) { 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL)) 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateEpsilonTransition(am, from, to); 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewAllTrans: 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lax: allow to transition if not all all transitions have been activated 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a an ALL transition from the @from state to the 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target state. That transition is an epsilon transition allowed only when 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * all transitions from the @from node have been activated. 6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, int lax) { 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL)) 6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateAllTransition(am, from, to, lax); 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCounter: 6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minimal value on the counter 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maximal value on the counter 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new counter 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the counter number or -1 in case of error 6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCounter(xmlAutomataPtr am, int min, int max) { 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegGetCounter(am); 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[ret].min = min; 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project am->counters[ret].max = max; 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountedTrans: 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: the counter associated to that transition 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the target state 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which will increment the counter provided 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountedTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, int counter) { 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (counter < 0)) 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedEpsilonTransition(am, from, to, counter); 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCounterTrans: 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition 6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL 6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: the counter associated to that transition 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the target state 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which will be allowed only if the counter is within the right range. 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCounterTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAutomataStatePtr to, int counter) { 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (from == NULL) || (counter < 0)) 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAGenerateCountedTransition(am, from, to, counter); 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to == NULL) 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(am->state); 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(to); 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataCompile: 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the automata into a Reg Exp ready for being executed. 6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The automata should be free after this point. 6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled regexp or NULL in case of error 6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpPtr 6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataCompile(xmlAutomataPtr am) { 6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRegexpPtr ret; 6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((am == NULL) || (am->error != 0)) return(NULL); 6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFAEliminateEpsilonTransitions(am); 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* xmlFAComputesDeterminism(am); */ 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlRegEpxFromParse(am); 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataIsDeterminist: 6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if an automata is determinist. 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if not, and -1 in case of error 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataIsDeterminist(xmlAutomataPtr am) { 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (am == NULL) 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlFAComputesDeterminism(am); 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_AUTOMATA_ENABLED */ 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_EXPR_ENABLED 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formal Expression handling code * 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Expression handling context * 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlExpCtxt { 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr *table; 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbElems; 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_nodes; 6324df143a5041f03a22808b59c76698770b74692815Selim Gurun int maxNodes; 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *expr; 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *cur; 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_cons; 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tabSize; 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewCtxt: 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @maxNodes: the maximum number of nodes 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict: optional dictionnary to use internally 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new context for manipulating expressions 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the context or NULL in case of error 6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtPtr 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewCtxt(int maxNodes, xmlDictPtr dict) { 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpCtxtPtr ret; 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size = 256; 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (maxNodes <= 4096) 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxNodes = 4096; 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlExpCtxtPtr) xmlMalloc(sizeof(xmlExpCtxt)); 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlExpCtxt)); 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->size = size; 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbElems = 0; 6354df143a5041f03a22808b59c76698770b74692815Selim Gurun ret->maxNodes = maxNodes; 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->table = xmlMalloc(size * sizeof(xmlExpNodePtr)); 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->table == NULL) { 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret->table, 0, size * sizeof(xmlExpNodePtr)); 6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict == NULL) { 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = xmlDictCreate(); 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->dict == NULL) { 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->table); 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = dict; 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(ret->dict); 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpFreeCtxt: 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an expression context 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpFreeCtxt(xmlExpCtxtPtr ctxt) { 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(ctxt->dict); 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table != NULL) 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->table); 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to an expression node * 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_NODES 10000 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_DERIV */ 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - Wildcards 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - public API for creation 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Started 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - regression testing 6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Done 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - split into module and test tool 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - memleaks 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_EXP_NILABLE = (1 << 0) 6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlExpNodeInfo; 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NILLABLE(node) ((node)->info & XML_EXP_NILABLE) 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlExpNode { 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char type;/* xmlExpNodeType */ 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char info;/* OR of xmlExpNodeInfo */ 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short key; /* the hash key */ 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int ref; /* The number of references */ 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int c_max; /* the maximum length it can consume */ 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr exp_left; 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr next;/* the next node in the hash table or free list */ 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project union { 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct { 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f_min; 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f_max; 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } count; 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct { 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr f_right; 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } children; 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *f_str; 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } field; 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_min field.count.f_min 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_max field.count.f_max 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define exp_left field.children.f_left */ 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_right field.children.f_right 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_str field.f_str 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type); 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNode forbiddenExpNode = { 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_EXP_FORBID, 0, 0, 0, 0, NULL, NULL, {{ 0, 0}} 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr forbiddenExp = &forbiddenExpNode; 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNode emptyExpNode = { 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_EXP_EMPTY, 1, 0, 0, 0, NULL, NULL, {{ 0, 0}} 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr emptyExp = &emptyExpNode; 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The custom hash table for unicity and canonicalization * 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of sub-expressions pointers * 6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashNameComputeKey: 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculate the hash key for a token 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned short 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashNameComputeKey(const xmlChar *name) { 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short value = 0L; 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char ch; 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += 30 * (*name); 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name++) != 0) { 6473df143a5041f03a22808b59c76698770b74692815Selim Gurun value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (value); 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashComputeKey: 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculate the hash key for a compound expression 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned short 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashComputeKey(xmlExpNodeType type, xmlExpNodePtr left, 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr right) { 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long value; 6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short ret; 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = left->key; 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += right->key; 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value *= 3; 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned short) value; 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = left->key; 6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += right->key; 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value *= 7; 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned short) value; 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = left->key; 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += right->key; 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned short) value; 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type) { 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nb_nodes >= MAX_NODES) 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlExpNodePtr) xmlMalloc(sizeof(xmlExpNode)); 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlExpNode)); 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = NULL; 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nb_nodes++; 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nb_cons++; 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashGetEntry: 6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the unique entry from the hash table. The entry is created if 6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * needed. @left and @right are consumed, i.e. their ref count will 6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be decremented by the operation. 6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the pointer or NULL in case of error 6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type, 6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr left, xmlExpNodePtr right, 6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, int min, int max) { 6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short kbase, key; 6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr entry; 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr insert; 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for duplicate and insertion location. 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_ATOM) { 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = xmlExpHashNameComputeKey(name); 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_COUNT) { 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* COUNT reduction rule 1 */ 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* a{1} -> a */ 6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == max) { 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 1) { 6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min == 0) { 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) { 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max == -1) 6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = min + 79; 6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = max - min; 6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase += left->key; 6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_OR) { 6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Forbid reduction rules */ 6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_FORBID) { 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_FORBID) { 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR reduction rule 1 */ 6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* a | a reduced to a */ 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left == right) { 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->ref--; 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR canonicalization rule 1 */ 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* linearize (a | b) | c into a | (b | c) */ 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left->type == XML_EXP_OR) && (right->type != XML_EXP_OR)) { 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp = left; 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left = right; 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = tmp; 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR reduction rule 2 */ 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* a | (a | b) and b | (a | b) are reduced to a | b */ 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_OR) { 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left == right->exp_left) || 6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (left == right->exp_right)) { 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR canonicalization rule 2 */ 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* linearize (a | b) | c into a | (b | c) */ 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_OR) { 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OR canonicalization rule 2 */ 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left->exp_right->type != XML_EXP_OR) && 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (left->exp_right->key < left->exp_left->key)) { 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = left->exp_right; 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_right = left->exp_left; 6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_left = tmp; 6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_right->ref++; 6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_right, right, 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->exp_left->ref++; 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_left, tmp, 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_OR) { 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Ordering in the tree */ 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* C | (A | B) -> A | (B | C) */ 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->key > right->exp_right->key) { 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_right->ref++; 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_right, 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left, NULL, 0, 0); 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_left->ref++; 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, 6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp, NULL, 0, 0); 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Ordering in the tree */ 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* B | (A | C) -> A | (B | C) */ 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->key > right->exp_left->key) { 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_right->ref++; 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_right, NULL, 0, 0); 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->exp_left->ref++; 6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp, NULL, 0, 0); 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* we know both types are != XML_EXP_OR here */ 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (left->key > right->key) { 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp = left; 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left = right; 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = tmp; 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = xmlExpHashComputeKey(type, left, right); 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_SEQ) { 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Forbid reduction rules */ 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_FORBID) { 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_FORBID) { 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Empty reduction rules */ 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right->type == XML_EXP_EMPTY) { 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(left); 6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (left->type == XML_EXP_EMPTY) { 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(right); 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project kbase = xmlExpHashComputeKey(type, left, right); 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = kbase % ctxt->size; 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table[key] != NULL) { 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (insert = ctxt->table[key]; insert != NULL; 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = insert->next) { 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->key == kbase) && 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->type == type)) { 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_ATOM) { 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == insert->exp_str) { 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->ref++; 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(insert); 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_COUNT) { 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->exp_min == min) && (insert->exp_max == max) && 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->exp_left == left)) { 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->ref++; 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->ref--; 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(insert); 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((insert->exp_left == left) && 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->exp_right == right)) { 6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->ref++; 6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project left->ref--; 6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right->ref--; 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(insert); 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry = xmlExpNewNode(ctxt, type); 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entry == NULL) 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->key = kbase; 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_ATOM) { 6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_str = name; 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = 1; 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == XML_EXP_COUNT) { 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_min = min; 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_max = max; 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_left = left; 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((min == 0) || (IS_NILLABLE(left))) 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->info |= XML_EXP_NILABLE; 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max < 0) 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = -1; 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = max * entry->exp_left->c_max; 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_left = left; 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->exp_right = right; 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_EXP_OR) { 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_NILLABLE(left)) || (IS_NILLABLE(right))) 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->info |= XML_EXP_NILABLE; 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entry->exp_left->c_max == -1) || 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (entry->exp_right->c_max == -1)) 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = -1; 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (entry->exp_left->c_max > entry->exp_right->c_max) 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = entry->exp_left->c_max; 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = entry->exp_right->c_max; 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_NILLABLE(left)) && (IS_NILLABLE(right))) 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->info |= XML_EXP_NILABLE; 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entry->exp_left->c_max == -1) || 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (entry->exp_right->c_max == -1)) 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = -1; 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->c_max = entry->exp_left->c_max + entry->exp_right->c_max; 6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->ref = 1; 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table[key] != NULL) 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->next = ctxt->table[key]; 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->table[key] = entry; 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbElems++; 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(entry); 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpFree: 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dereference the expression 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpFree(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp) { 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (exp == forbiddenExp) || (exp == emptyExp)) 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->ref--; 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->ref == 0) { 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned short key; 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Unlink it first from the hash table */ 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = exp->key % ctxt->size; 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->table[key] == exp) { 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->table[key] = exp->next; 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ctxt->table[key]; 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->next == exp) { 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp->next = exp->next; 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp->type == XML_EXP_SEQ) || (exp->type == XML_EXP_OR)) { 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, exp->exp_left); 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, exp->exp_right); 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exp->type == XML_EXP_COUNT) { 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, exp->exp_left); 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(exp); 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nb_nodes--; 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpRef: 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Increase the reference count of the expression 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpRef(xmlExpNodePtr exp) { 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp != NULL) 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->ref++; 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewAtom: 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the atom name 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the atom name lenght in byte (or -1); 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to this name from that context 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewAtom(xmlExpCtxtPtr ctxt, const xmlChar *name, int len) { 6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (name == NULL)) 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlDictLookup(ctxt->dict, name, len); 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, name, 0, 0)); 6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewOr: 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @left: left expression 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @right: right expression 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the choice @left | @right 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @left and @right are consumed in the operation, to keep 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on them use xmlExpRef() and use xmlExpFree() to release them, 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL). 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewOr(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left == NULL) || (right == NULL)) { 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, right, NULL, 0, 0)); 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewSeq: 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @left: left expression 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @right: right expression 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the sequence @left , @right 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @left and @right are consumed in the operation, to keep 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on them use xmlExpRef() and use xmlExpFree() to release them, 6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL). 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewSeq(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((left == NULL) || (right == NULL)) { 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, left); 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, right); 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, left, right, NULL, 0, 0)); 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewRange: 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @subset: the expression to be repeated 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the lower bound for the repetition 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the upper bound for the repetition, -1 means infinite 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the range (@subset){@min, @max} 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @subset is consumed in the operation, to keep 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on it use xmlExpRef() and use xmlExpFree() to release it, 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL). 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewRange(xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max) { 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((subset == NULL) || (min < 0) || (max < -1) || 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((max >= 0) && (min > max))) { 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, subset); 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, subset, 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, min, max)); 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Public API for operations on expressions * 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**list, int len, int nb) { 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp, tmp2; 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttail: 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (tmp = 0;tmp < nb;tmp++) 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[tmp] == exp->exp_str) 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nb >= len) 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 6940df143a5041f03a22808b59c76698770b74692815Selim Gurun list[nb] = exp->exp_str; 6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp = exp->exp_left; 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto tail; 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpGetLanguageInt(ctxt, exp->exp_left, list, len, nb); 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpGetLanguageInt(ctxt, exp->exp_right, list, len, 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb + tmp); 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 < 0) 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp2); 6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp + tmp2); 6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpGetLanguage: 6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @langList: where to store the tokens 6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the allocated lenght of @list 6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find all the strings used in @exp and store them in @list 6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of unique strings found, -1 in case of errors and 6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -2 if there is more than @len strings 6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**langList, int len) { 6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (exp == NULL) || (langList == NULL) || (len <= 0)) 6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpGetLanguageInt(ctxt, exp, langList, len, 0)); 6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**list, int len, int nb) { 6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp, tmp2; 6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttail: 6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (tmp = 0;tmp < nb;tmp++) 6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list[tmp] == exp->exp_str) 6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nb >= len) 6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 6995df143a5041f03a22808b59c76698770b74692815Selim Gurun list[nb] = exp->exp_str; 6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: 6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp = exp->exp_left; 6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto tail; 7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); 7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) 7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(exp->exp_left)) { 7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, 7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb + tmp); 7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 < 0) 7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp2); 7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp += tmp2; 7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); 7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) 7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, 7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb + tmp); 7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 < 0) 7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp2); 7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp + tmp2); 7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpGetStart: 7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tokList: where to store the tokens 7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the allocated lenght of @list 7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find all the strings that appears at the start of the languages 7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * accepted by @exp and store them in @list. E.g. for (a, b) | c 7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it will return the list [a, c] 7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of unique strings found, -1 in case of errors and 7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -2 if there is more than @len strings 7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar**tokList, int len) { 7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (exp == NULL) || (tokList == NULL) || (len <= 0)) 7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpGetStartInt(ctxt, exp, tokList, len, 0)); 7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpIsNillable: 7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Finds if the expression is nillable, i.e. if it accepts the empty sequqnce 7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if nillable, 0 if not and -1 in case of error 7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpIsNillable(xmlExpNodePtr exp) { 7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp == NULL) 7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(IS_NILLABLE(exp) != 0); 7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpStringDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar *str) 7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_str == str) { 7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv atom: equal => Empty\n"); 7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = emptyExp; 7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv atom: mismatch => forbid\n"); 7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO wildcards here */ 7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = forbiddenExp; 7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: { 7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv or: => or(derivs)\n"); 7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); 7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); 7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, 7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv seq: starting with left\n"); 7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); 7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == forbiddenExp) { 7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(exp->exp_left)) { 7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv seq: left failed but nillable\n"); 7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); 7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv seq: left match => sequence\n"); 7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right->ref++; 7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right, 7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: { 7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == 0) 7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); 7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == forbiddenExp) { 7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv count: pattern mismatch => forbid\n"); 7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == 1) 7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < 0) /* unbounded */ 7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - 1; 7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > 0) 7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - 1; 7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_left->ref++; 7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL, 7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, min, max); 7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == emptyExp) { 7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv count: match to empty => new count\n"); 7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("deriv count: match => sequence with new count\n"); 7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, tmp, 7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0)); 7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpStringDerive: 7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context 7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression 7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the string 7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the string len in bytes if available 7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do one step of Brzozowski derivation of the expression @exp with 7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * respect to the input string 7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error 7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpStringDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *str, int len) { 7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *input; 7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (ctxt == NULL) || (str == NULL)) { 7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the string is in the dictionnary, if yes use an interned 7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * copy, otherwise we know it's not an acceptable input 7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlDictExists(ctxt->dict, str, len); 7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpStringDeriveInt(ctxt, exp, input)); 7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCheckCard(xmlExpNodePtr exp, xmlExpNodePtr sub) { 7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 1; 7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->c_max == -1) { 7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->c_max != -1) 7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((exp->c_max >= 0) && (exp->c_max < sub->c_max)) { 7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((IS_NILLABLE(sub)) && (!IS_NILLABLE(exp))) 7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, 7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr sub); 7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpDivide: 7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mult: the multiple expression 7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @remain: the remain from the derivation of the multiple 7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if exp is a multiple of sub, i.e. if there is a finite number n 7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so that sub{n} subsume exp 7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the multiple value if successful, 0 if it is not a multiple 7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and -1 in case of internel error. 7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDivide(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub, 7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr *mult, xmlExpNodePtr *remain) { 7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp, tmp2; 7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mult != NULL) *mult = NULL; 7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (remain != NULL) *remain = NULL; 7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->c_max == -1) return(0); 7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(exp) && (!IS_NILLABLE(sub))) return(0); 7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 1;i <= exp->c_max;i++) { 7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub->ref++; 7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, 7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub, NULL, NULL, i, i); 7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlExpCheckCard(tmp, exp)) { 7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpExpDeriveInt(ctxt, tmp, exp); 7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) { 7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp2 != forbiddenExp) && (IS_NILLABLE(tmp2))) { 7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (remain != NULL) 7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *remain = tmp2; 7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mult != NULL) 7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *mult = tmp; 7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Divide succeeded %d\n", i); 7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(i); 7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Divide failed\n"); 7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpExpDeriveInt: 7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to do a step of Brzozowski derivation but at a higher level 7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the input being a subexpression. 7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error 7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { 7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret, tmp, tmp2, tmp3; 7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **tab; 7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len, i; 7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In case of equality and if the expression can only consume a finite 7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * amount, then the derivation is empty 7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == sub) && (exp->c_max >= 0)) { 7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Equal(exp, sub) and finite -> Empty\n"); 7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decompose sub sequence first 7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_EMPTY) { 7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Empty(sub) -> Empty\n"); 7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->ref++; 7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(exp); 7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_SEQ) { 7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq(sub) -> decompose\n"); 7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); 7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) 7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, tmp, sub->exp_right); 7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_OR) { 7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Or(sub) -> decompose\n"); 7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); 7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) 7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp, sub->exp_right); 7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret == NULL) || (ret == forbiddenExp)) { 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 return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, NULL, 0, 0)); 7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlExpCheckCard(exp, sub)) { 7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("CheckCard(exp, sub) failed -> Forbid\n"); 7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (exp->type) { 7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub == emptyExp) 7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Empty(exp) -> Forbid\n"); 7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Forbid(exp) -> Forbid\n"); 7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_ATOM) { 7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle wildcards */ 7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_str == sub->exp_str) { 7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom match -> Empty\n"); 7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom mismatch -> Forbid\n"); 7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((sub->type == XML_EXP_COUNT) && 7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (sub->exp_max == 1) && 7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (sub->exp_left->type == XML_EXP_ATOM)) { 7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: handle wildcards */ 7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_str == sub->exp_left->exp_str) { 7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom match -> Empty\n"); 7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(emptyExp); 7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Atom mismatch -> Forbid\n"); 7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Compex exp vs Atom -> Forbid\n"); 7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* try to get the sequence consumed only if possible */ 7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlExpCheckCard(exp->exp_left, sub)) { 7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* See if the sequence can be consumed directly */ 7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq trying left only\n"); 7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); 7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret != forbiddenExp) && (ret != NULL)) { 7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq trying left only worked\n"); 7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: assumption here that we are determinist 7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * i.e. we won't get to a nillable exp left 7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * subset which could be matched by the right 7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * part too. 7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * e.g.: (a | b)+,(a | c) and 'a+,a' 7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right->ref++; 7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, 7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right, NULL, 0, 0)); 7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq: left too short\n"); 7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Try instead to decompose */ 7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_COUNT) { 7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq: sub is a count\n"); 7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); 7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != forbiddenExp) { 7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Seq , Count match on left\n"); 7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max < 0) 7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = sub->exp_max -1; 7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_min > 0) 7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = sub->exp_min -1; 7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right->ref++; 7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, 7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_right, NULL, 0, 0); 7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub->exp_left->ref++; 7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, 7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sub->exp_left, NULL, NULL, min, max); 7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) { 7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, tmp, tmp2); 7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* we made no progress on structured operations */ 7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Or , trying both side\n"); 7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); 7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp->exp_right, sub); 7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp, NULL, 0, 0)); 7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: { 7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->type == XML_EXP_COUNT) { 7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to see if the loop is completely subsumed 7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); 7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) { 7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int mult; 7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count inner don't subsume\n"); 7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mult = xmlExpDivide(ctxt, sub->exp_left, exp->exp_left, 7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, &tmp); 7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (mult <= 0) { 7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count not multiple => forbidden\n"); 7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max == -1) { 7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min <= sub->exp_min * mult) 7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min * mult; 7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count finite can't subsume infinite\n"); 7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loop consume mult finite loop\n"); 7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > sub->exp_min * mult) { 7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min * mult; 7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < sub->exp_max * mult) { 7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops max mult mismatch => forbidden\n"); 7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max * mult > exp->exp_min) 7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_max * mult; 7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - sub->exp_max * mult; 7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (!IS_NILLABLE(tmp)) { 7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: loop here to try to grow if working on finite 7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * blocks. 7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Count, Count remain not nillable => forbidden\n"); 7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (sub->exp_max == -1) { 7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min <= sub->exp_min) { 7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loops Okay => COUNT(0,Inf)\n"); 7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loops min => Count(X,Inf)\n"); 7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min; 7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (exp->exp_min > sub->exp_min) { 7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops min mismatch 1 => forbidden ???\n"); 7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max == -1) { 7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Infinite loop consume finite loop\n"); 7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > sub->exp_min) { 7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_min; 7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < sub->exp_max) { 7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops max mismatch => forbidden\n"); 7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sub->exp_max > exp->exp_min) 7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - sub->exp_max; 7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - sub->exp_max; 7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loops match => SEQ(COUNT())\n"); 7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_left->ref++; 7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, 7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, min, max); 7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) { 7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, 7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); 7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) { 7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loop mismatch => forbidden\n"); 7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_min > 0) 7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = exp->exp_min - 1; 7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = 0; 7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exp->exp_max < 0) 7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = -1; 7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = exp->exp_max - 1; 7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("loop match => SEQ(COUNT())\n"); 7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exp->exp_left->ref++; 7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, 7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, min, max); 7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp2 == NULL) 7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, 7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0); 7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Fallback to derivative\n"); 7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(sub)) { 7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!(IS_NILLABLE(exp))) 7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = emptyExp; 7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = NULL; 7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here the structured derivation made no progress so 7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we use the default token based derivation to force one more step 7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->tabSize == 0) 7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->tabSize = 40; 7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tab = (const xmlChar **) xmlMalloc(ctxt->tabSize * 7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(const xmlChar *)); 7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tab == NULL) { 7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * collect all the strings accepted by the subexpression on input 7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); 7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (len < 0) { 7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **temp; 7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (const xmlChar **) xmlRealloc((xmlChar **) tab, ctxt->tabSize * 2 * 7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(const xmlChar *)); 7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tab = temp; 7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->tabSize *= 2; 7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); 7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < len;i++) { 7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpStringDeriveInt(ctxt, exp, tab[i]); 7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp == NULL) || (tmp == forbiddenExp)) { 7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp2 = xmlExpStringDeriveInt(ctxt, sub, tab[i]); 7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp2 == NULL) || (tmp2 == forbiddenExp)) { 7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp); 7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp3 = xmlExpExpDeriveInt(ctxt, tmp, tmp2); 7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp2); 7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp3 == NULL) || (tmp3 == forbiddenExp)) { 7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp3); 7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = tmp3; 7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp3, NULL, 0, 0); 7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **) tab); 7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpExpDerive: 7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates the expression resulting from @exp consuming a sub expression @sub 7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Based on algebraic derivation and sometimes direct Brzozowski derivation 7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it usually tatkes less than linear time and can handle expressions generating 7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * infinite languages. 7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error, the 7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * result must be freed 7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpExpDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { 7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) 7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * O(1) speedups 7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { 7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Sub nillable and not exp : can't subsume\n"); 7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlExpCheckCard(exp, sub) == 0) { 7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("sub generate longuer sequances than exp : can't subsume\n"); 7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(forbiddenExp); 7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlExpExpDeriveInt(ctxt, exp, sub)); 7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpSubsume: 7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression 7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression 7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether @exp accepts all the languages accexpted by @sub 7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the input being a subexpression. 7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true 0 if false and -1 in case of failure. 7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { 7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr tmp; 7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) 7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: speedup by checking the language of sub is a subset of the 7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * language of exp 7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * O(1) speedups 7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { 7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Sub nillable and not exp : can't subsume\n"); 7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlExpCheckCard(exp, sub) == 0) { 7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("sub generate longuer sequances than exp : can't subsume\n"); 7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlExpExpDeriveInt(ctxt, exp, sub); 7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV 7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Result derivation :\n"); 7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PRINT_EXP(tmp); 7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == forbiddenExp) 7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == emptyExp) 7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && (IS_NILLABLE(tmp))) { 7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, tmp); 7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parsing expression * 7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpParseExpr(xmlExpCtxtPtr ctxt); 7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef CUR 7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur) 7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef NEXT 7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ctxt->cur++; 7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef IS_BLANK 7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK(c) ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) 7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP_BLANKS while (IS_BLANK(*ctxt->cur)) ctxt->cur++; 7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseNumber(xmlExpCtxtPtr ctxt) { 7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR < '0') || (CUR > '9')) 7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (CUR - '0'); 7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseOr(xmlExpCtxtPtr ctxt) { 7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *base; 7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *val; 7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = ctxt->cur; 7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->cur == '(') { 7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseExpr(ctxt); 7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->cur != ')') { 7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "unbalanced '(' : %s\n", base); 7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto parse_quantifier; 7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR != 0) && (!(IS_BLANK(CUR))) && (CUR != '(') && 7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR != ')') && (CUR != '|') && (CUR != ',') && (CUR != '{') && 7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR != '*') && (CUR != '+') && (CUR != '?') && (CUR != '}')) 7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlDictLookup(ctxt->dict, BAD_CAST base, ctxt->cur - base); 7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, val, 0, 0); 7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectparse_quantifier: 7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '{') { 7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int min, max; 7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min = xmlExpParseNumber(ctxt); 7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min < 0) { 7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ',') { 7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = xmlExpParseNumber(ctxt); 7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = min; 7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '}') { 7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min, max); 7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '?') { 7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, 1); 7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '+') { 7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1, -1); 7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '*') { 7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, 7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, -1); 7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseSeq(xmlExpCtxtPtr ctxt) { 7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret, right; 7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseOr(ctxt); 7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '|') { 7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = xmlExpParseOr(ctxt); 7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right == NULL) { 7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, right, NULL, 0, 0); 7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr 7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseExpr(xmlExpCtxtPtr ctxt) { 7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret, right; 7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseSeq(ctxt); 7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == ',') { 7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT 7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project right = xmlExpParseSeq(ctxt); 7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (right == NULL) { 7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, right, NULL, 0, 0); 7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpParse: 7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context 7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: the 0 terminated string 7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Minimal parser for regexps, it understand the following constructs 7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - string terminals 7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - choice operator | 7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - sequence operator , 7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - subexpressions (...) 7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - usual cardinality operators + * and ? 7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - finite sequences { min, max } 7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - infinite sequences { min, * } 7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There is minimal checkings made especially no checking on strings values 7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new expression or NULL in case of failure 7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr 8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParse(xmlExpCtxtPtr ctxt, const char *expr) { 8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr ret; 8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->expr = expr; 8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = expr; 8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlExpParseExpr(ctxt); 8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS 8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->cur != 0) { 8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpFree(ctxt, ret); 8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDumpInt(xmlBufferPtr buf, xmlExpNodePtr expr, int glob) { 8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpNodePtr c; 8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expr == NULL) return; 8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) xmlBufferWriteChar(buf, "("); 8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (expr->type) { 8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_EMPTY: 8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "empty"); 8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_FORBID: 8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "forbidden"); 8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_ATOM: 8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, expr->exp_str); 8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_SEQ: 8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_left; 8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " , "); 8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_right; 8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_OR: 8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_left; 8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " | "); 8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_right; 8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXP_COUNT: { 8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char rep[40]; 8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = expr->exp_left; 8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) 8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 1); 8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, c, 0); 8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((expr->exp_min == 0) && (expr->exp_max == 1)) { 8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[0] = '?'; 8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[1] = 0; 8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((expr->exp_min == 0) && (expr->exp_max == -1)) { 8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[0] = '*'; 8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[1] = 0; 8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((expr->exp_min == 1) && (expr->exp_max == -1)) { 8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[0] = '+'; 8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[1] = 0; 8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (expr->exp_max == expr->exp_min) { 8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(rep, 39, "{%d}", expr->exp_min); 8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (expr->exp_max < 0) { 8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(rep, 39, "{%d,inf}", expr->exp_min); 8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(rep, 39, "{%d,%d}", expr->exp_min, expr->exp_max); 8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rep[39] = 0; 8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, rep); 8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "Error in tree\n"); 8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (glob) 8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ")"); 8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpDump: 8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: a buffer to receive the output 8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: the compiled expression 8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Serialize the expression as compiled to the buffer 8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDump(xmlBufferPtr buf, xmlExpNodePtr expr) { 8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (expr == NULL)) 8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlExpDumpInt(buf, expr, 0); 8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpMaxToken: 8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: a compiled expression 8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Indicate the maximum number of input a expression can accept 8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the maximum length or -1 in case of error 8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpMaxToken(xmlExpNodePtr expr) { 8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expr == NULL) 8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(expr->c_max); 8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpCtxtNbNodes: 8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context 8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debugging facility provides the number of allocated nodes at a that point 8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes in use or -1 in case of error 8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt) { 8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->nb_nodes); 8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpCtxtNbCons: 8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context 8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debugging facility provides the number of allocated nodes over lifetime 8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes ever allocated or -1 in case of error 8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtNbCons(xmlExpCtxtPtr ctxt) { 8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->nb_cons); 8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_EXPR_ENABLED */ 8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlregexp 8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */ 8154