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