1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * regexp.c: generic and extensible Regular Expression engine
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Basically designed with the purpose of compiling regexps for
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variety of validation/shemas mechanisms now available in
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML related specifications these include:
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - XML-1.0 DTD validation
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - XML Schemas structure part 1
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - XML Schemas Datatypes part 2 especially Appendix F
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - RELAX-NG/TREX i.e. the counter proposal
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Daniel Veillard <veillard@redhat.com>
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_REGEXP_ENABLED
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_ERR */
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdio.h>
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_LIMITS_H
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <limits.h>
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h>
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlregexp.h>
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlautomata.h>
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlunicode.h>
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef INT_MAX
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INT_MAX 123456789 /* easy to flag and big enough for our needs */
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_REGEXP_GRAPH */
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_REGEXP_EXEC */
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_PUSH */
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_COMPACTION */
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_PUSH 10000000
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#ifdef ERROR
4894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#undef ERROR
4994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR(str)							\
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = XML_REGEXP_COMPILE_ERROR;				\
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegexpErrCompile(ctxt, str);
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ctxt->cur++
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*(ctxt->cur))
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(index) (ctxt->cur[index])
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l)
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l) ctxt->cur += l;
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_REG_STRING_SEPARATOR '|'
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Need PREV to check on a '-' within a Character Group. May only be used
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when it's guaranteed that cur is not at the beginning of ctxt->string!
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PREV (ctxt->cur[-1])
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO:
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * macro to flag unimplemented blocks
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define TODO								\
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Unimplemented block at %s:%d\n",				\
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
7794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
7894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Datatypes and structures			*
7994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: the order of the enums below is significant, do not shuffle
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_EPSILON = 1,
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_CHARVAL,
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_RANGES,
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SUBREG,  /* used for () sub regexps */
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_STRING,
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_ANYCHAR, /* . */
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_ANYSPACE, /* \s */
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NOTSPACE, /* \S */
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_INITNAME, /* \l */
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NOTINITNAME, /* \L */
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NAMECHAR, /* \c */
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NOTNAMECHAR, /* \C */
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_DECIMAL, /* \d */
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NOTDECIMAL, /* \D */
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_REALCHAR, /* \w */
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NOTREALCHAR, /* \W */
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_LETTER = 100,
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_LETTER_UPPERCASE,
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_LETTER_LOWERCASE,
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_LETTER_TITLECASE,
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_LETTER_MODIFIER,
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_LETTER_OTHERS,
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_MARK,
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_MARK_NONSPACING,
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_MARK_SPACECOMBINING,
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_MARK_ENCLOSING,
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NUMBER,
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NUMBER_DECIMAL,
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NUMBER_LETTER,
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_NUMBER_OTHERS,
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT,
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT_CONNECTOR,
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT_DASH,
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT_OPEN,
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT_CLOSE,
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT_INITQUOTE,
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT_FINQUOTE,
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_PUNCT_OTHERS,
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SEPAR,
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SEPAR_SPACE,
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SEPAR_LINE,
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SEPAR_PARA,
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SYMBOL,
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SYMBOL_MATH,
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SYMBOL_CURRENCY,
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SYMBOL_MODIFIER,
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SYMBOL_OTHERS,
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_OTHER,
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_OTHER_CONTROL,
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_OTHER_FORMAT,
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_OTHER_PRIVATE,
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_OTHER_NA,
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_BLOCK_NAME
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegAtomType;
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_EPSILON = 1,
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_ONCE,
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_OPT,
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_MULT,
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_PLUS,
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_ONCEONLY,
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_ALL,
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_QUANT_RANGE
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegQuantType;
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_START_STATE = 1,
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_FINAL_STATE,
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_TRANS_STATE,
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_SINK_STATE,
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_UNREACH_STATE
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegStateType;
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_MARK_NORMAL = 0,
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_MARK_START,
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_REGEXP_MARK_VISITED
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRegMarkedType;
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegRange xmlRegRange;
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegRange *xmlRegRangePtr;
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegRange {
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int neg;		/* 0 normal, 1 not, 2 exclude */
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomType type;
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int start;
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int end;
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *blockName;
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegAtom xmlRegAtom;
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegAtom *xmlRegAtomPtr;
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlAutomataState xmlRegState;
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegState *xmlRegStatePtr;
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegAtom {
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int no;
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomType type;
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegQuantType quant;
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min;
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int max;
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *valuep;
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *valuep2;
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int neg;
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int codepoint;
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr start;
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr start0;
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr stop;
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxRanges;
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbRanges;
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegRangePtr *ranges;
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data;
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegCounter xmlRegCounter;
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegCounter *xmlRegCounterPtr;
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegCounter {
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min;
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int max;
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegTrans xmlRegTrans;
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegTrans *xmlRegTransPtr;
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegTrans {
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int to;
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int counter;
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int count;
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nd;
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlAutomataState {
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateType type;
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegMarkedType mark;
22594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlRegMarkedType markd;
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegMarkedType reached;
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int no;
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxTrans;
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbTrans;
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegTrans *trans;
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*  knowing states ponting to us can speed things up */
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxTransTo;
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbTransTo;
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int *transTo;
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlAutomata xmlRegParserCtxt;
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegParserCtxt *xmlRegParserCtxtPtr;
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
240df143a5041f03a22808b59c76698770b74692815Selim Gurun#define AM_AUTOMATA_RNG 1
241df143a5041f03a22808b59c76698770b74692815Selim Gurun
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlAutomata {
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *string;
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cur;
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int error;
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int neg;
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr start;
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr end;
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr state;
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxAtoms;
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAtoms;
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr *atoms;
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxStates;
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbStates;
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr *states;
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxCounters;
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbCounters;
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegCounter *counters;
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int determinist;
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int negs;
269df143a5041f03a22808b59c76698770b74692815Selim Gurun    int flags;
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegexp {
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *string;
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbStates;
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr *states;
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAtoms;
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr *atoms;
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbCounters;
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegCounter *counters;
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int determinist;
281df143a5041f03a22808b59c76698770b74692815Selim Gurun    int flags;
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * That's the compact form for determinists automatas
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbstates;
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int *compact;
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void **transdata;
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbstrings;
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar **stringMap;
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegExecRollback xmlRegExecRollback;
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegExecRollback *xmlRegExecRollbackPtr;
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegExecRollback {
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr state;/* the current state */
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int index;		/* the index in the input stack */
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nextbranch;	/* the next transition to explore in that state */
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int *counts;	/* save the automata state if it has some */
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRegInputToken xmlRegInputToken;
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRegInputToken *xmlRegInputTokenPtr;
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegInputToken {
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data;
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRegExecCtxt {
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int status;		/* execution status != 0 indicate an error */
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int determinist;	/* did we find an indeterministic behaviour */
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegexpPtr comp;	/* the compiled regexp */
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCallbacks callback;
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data;
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr state;/* the current state */
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int transno;	/* the current transition on that state */
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int transcount;	/* the number of chars in char counted transitions */
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * A stack of rollback states
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxRollbacks;
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbRollbacks;
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecRollback *rollbacks;
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * The state of the automata if any
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int *counts;
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * The input stack
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int inputStackMax;
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int inputStackNr;
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int index;
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int *charStack;
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *inputString; /* when operating on characters */
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegInputTokenPtr inputStack;/* when operating on strings */
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * error handling
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errStateNo;		/* the error state number */
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr errState;    /* the error state */
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *errString;		/* the string raising the error */
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int *errCounts;		/* counters at the error state */
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbPush;
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define REGEXP_ALL_COUNTER	0x123456
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define REGEXP_ALL_LAX_COUNTER	0x123457
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top);
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRegFreeState(xmlRegStatePtr state);
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRegFreeAtom(xmlRegAtomPtr atom);
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr);
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint);
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint,
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  int neg, int start, int end, const xmlChar *blockName);
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
364df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid xmlAutomataSetFlags(xmlAutomataPtr am, int flags);
365df143a5041f03a22808b59c76698770b74692815Selim Gurun
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
36894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Regexp memory error handler				*
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpErrMemory:
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra information
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpErrMemory(xmlRegParserCtxtPtr ctxt, const char *extra)
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *regexp = NULL;
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        regexp = (const char *) ctxt->string;
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->error = XML_ERR_NO_MEMORY;
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP,
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra,
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    regexp, NULL, 0, 0,
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Memory allocation failed : %s\n", extra);
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpErrCompile:
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra information
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a compilation failure
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpErrCompile(xmlRegParserCtxtPtr ctxt, const char *extra)
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *regexp = NULL;
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idx = 0;
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        regexp = (const char *) ctxt->string;
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	idx = ctxt->cur - ctxt->string;
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->error = XML_REGEXP_COMPILE_ERROR;
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP,
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_REGEXP_COMPILE_ERROR, XML_ERR_FATAL, NULL, 0, extra,
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    regexp, NULL, idx, 0,
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "failed to compile: %s\n", extra);
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
41594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
41694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Allocation/Deallocation				*
41794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt);
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegEpxFromParse:
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context used to build it
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp and fill it with the result from the parser
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new regexp or NULL in case of error
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegexpPtr
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) {
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegexpPtr ret;
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRegexpPtr) xmlMalloc(sizeof(xmlRegexp));
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegexpErrMemory(ctxt, "compiling regexp");
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRegexp));
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->string = ctxt->string;
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbStates = ctxt->nbStates;
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->states = ctxt->states;
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbAtoms = ctxt->nbAtoms;
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->atoms = ctxt->atoms;
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbCounters = ctxt->nbCounters;
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->counters = ctxt->counters;
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->determinist = ctxt->determinist;
447df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret->flags = ctxt->flags;
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->determinist == -1) {
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegexpIsDeterminist(ret);
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret->determinist != 0) &&
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ret->nbCounters == 0) &&
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ctxt->negs == 0) &&
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ret->atoms != NULL) &&
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ret->atoms[0] != NULL) &&
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ret->atoms[0]->type == XML_REGEXP_STRING)) {
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j, nbstates = 0, nbatoms = 0;
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int *stateRemap;
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int *stringRemap;
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int *transitions;
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	void **transdata;
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar **stringMap;
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlChar *value;
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Switch to a compact representation
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * 1/ counting the effective number of states left
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * 2/ counting the unique number of atoms, and check that
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 *    they are all of the string type
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * 3/ build a table state x atom for the transitions
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	stateRemap = xmlMalloc(ret->nbStates * sizeof(int));
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (stateRemap == NULL) {
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "compiling regexp");
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ret->nbStates;i++) {
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret->states[i] != NULL) {
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		stateRemap[i] = nbstates;
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nbstates++;
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		stateRemap[i] = -1;
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("Final: %d states\n", nbstates);
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	stringMap = xmlMalloc(ret->nbAtoms * sizeof(char *));
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (stringMap == NULL) {
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "compiling regexp");
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(stateRemap);
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	stringRemap = xmlMalloc(ret->nbAtoms * sizeof(int));
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (stringRemap == NULL) {
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "compiling regexp");
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(stringMap);
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(stateRemap);
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ret->nbAtoms;i++) {
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret->atoms[i]->type == XML_REGEXP_STRING) &&
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(ret->atoms[i]->quant == XML_REGEXP_QUANT_ONCE)) {
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = ret->atoms[i]->valuep;
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                for (j = 0;j < nbatoms;j++) {
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlStrEqual(stringMap[j], value)) {
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			stringRemap[i] = j;
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (j >= nbatoms) {
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    stringRemap[i] = nbatoms;
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    stringMap[nbatoms] = xmlStrdup(value);
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (stringMap[nbatoms] == NULL) {
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			for (i = 0;i < nbatoms;i++)
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFree(stringMap[i]);
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(stringRemap);
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(stringMap);
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(stateRemap);
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(ret);
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(NULL);
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nbatoms++;
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(stateRemap);
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(stringRemap);
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0;i < nbatoms;i++)
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(stringMap[i]);
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(stringMap);
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(ret);
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("Final: %d atoms\n", nbatoms);
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	transitions = (int *) xmlMalloc((nbstates + 1) *
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                (nbatoms + 1) * sizeof(int));
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (transitions == NULL) {
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(stateRemap);
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(stringRemap);
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(stringMap);
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(transitions, 0, (nbstates + 1) * (nbatoms + 1) * sizeof(int));
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Allocate the transition table. The first entry for each
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * state corresponds to the state type.
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	transdata = NULL;
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ret->nbStates;i++) {
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int stateno, atomno, targetno, prev;
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegStatePtr state;
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegTransPtr trans;
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    stateno = stateRemap[i];
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (stateno == -1)
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state = ret->states[i];
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    transitions[stateno * (nbatoms + 1)] = state->type;
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0;j < state->nbTrans;j++) {
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		trans = &(state->trans[j]);
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((trans->to == -1) || (trans->atom == NULL))
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                atomno = stringRemap[trans->atom->no];
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((trans->atom->data != NULL) && (transdata == NULL)) {
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    transdata = (void **) xmlMalloc(nbstates * nbatoms *
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                            sizeof(void *));
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (transdata != NULL)
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			memset(transdata, 0,
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       nbstates * nbatoms * sizeof(void *));
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else {
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlRegexpErrMemory(ctxt, "compiling regexp");
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		targetno = stateRemap[trans->to];
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * if the same atom can generate transitions to 2 different
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * states then it means the automata is not determinist and
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * the compact form can't be used !
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		prev = transitions[stateno * (nbatoms + 1) + atomno + 1];
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (prev != 0) {
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (prev != targetno + 1) {
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret->determinist = 0;
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("Indet: state %d trans %d, atom %d to %d : %d to %d\n",
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       i, j, trans->atom->no, trans->to, atomno, targetno);
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("       previous to is %d\n", prev);
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (transdata != NULL)
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFree(transdata);
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(transitions);
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(stateRemap);
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(stringRemap);
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			for (i = 0;i < nbatoms;i++)
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFree(stringMap[i]);
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(stringMap);
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto not_determ;
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("State %d trans %d: atom %d to %d : %d to %d\n",
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   i, j, trans->atom->no, trans->to, atomno, targetno);
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    transitions[stateno * (nbatoms + 1) + atomno + 1] =
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			targetno + 1; /* to avoid 0 */
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (transdata != NULL)
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			transdata[stateno * nbatoms + atomno] =
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    trans->atom->data;
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->determinist = 1;
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPACTION
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Debug
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < nbstates;i++) {
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0;j < nbatoms + 1;j++) {
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                printf("%02d ", transitions[i * (nbatoms + 1) + j]);
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\n");
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("\n");
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Cleanup of the old data
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->states != NULL) {
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < ret->nbStates;i++)
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegFreeState(ret->states[i]);
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret->states);
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->states = NULL;
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->nbStates = 0;
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->atoms != NULL) {
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < ret->nbAtoms;i++)
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegFreeAtom(ret->atoms[i]);
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret->atoms);
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->atoms = NULL;
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->nbAtoms = 0;
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->compact = transitions;
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->transdata = transdata;
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->stringMap = stringMap;
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->nbstrings = nbatoms;
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->nbstates = nbstates;
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(stateRemap);
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(stringRemap);
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_determ:
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->string = NULL;
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nbStates = 0;
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->states = NULL;
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nbAtoms = 0;
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->atoms = NULL;
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nbCounters = 0;
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->counters = NULL;
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewParserCtxt:
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string:  the string to parse
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp parser context
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new context or NULL in case of error
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegParserCtxtPtr
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewParserCtxt(const xmlChar *string) {
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegParserCtxtPtr ret;
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRegParserCtxtPtr) xmlMalloc(sizeof(xmlRegParserCtxt));
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRegParserCtxt));
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string != NULL)
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->string = xmlStrdup(string);
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->cur = ret->string;
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->neg = 0;
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->negs = 0;
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->error = 0;
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->determinist = -1;
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewRange:
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the regexp parser context
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neg:  is that negative
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type of range
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the start codepoint
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @end:  the end codepoint
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp range
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new range or NULL in case of error
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegRangePtr
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewRange(xmlRegParserCtxtPtr ctxt,
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       int neg, xmlRegAtomType type, int start, int end) {
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegRangePtr ret;
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRegRangePtr) xmlMalloc(sizeof(xmlRegRange));
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegexpErrMemory(ctxt, "allocating range");
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->neg = neg;
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->start = start;
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->end = end;
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeRange:
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range:  the regexp range
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp range
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeRange(xmlRegRangePtr range) {
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range == NULL)
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range->blockName != NULL)
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(range->blockName);
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(range);
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCopyRange:
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @range:  the regexp range
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy a regexp range
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new copy or NULL in case of error.
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegRangePtr
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCopyRange(xmlRegParserCtxtPtr ctxt, xmlRegRangePtr range) {
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegRangePtr ret;
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range == NULL)
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegNewRange(ctxt, range->neg, range->type, range->start,
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         range->end);
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range->blockName != NULL) {
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->blockName = xmlStrdup(range->blockName);
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->blockName == NULL) {
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "allocating range");
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeRange(ret);
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewAtom:
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the regexp parser context
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type of atom
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new atom
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new atom or NULL in case of error
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegAtomPtr
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomType type) {
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr ret;
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom));
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegexpErrMemory(ctxt, "allocating atom");
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRegAtom));
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->quant = XML_REGEXP_QUANT_ONCE;
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->min = 0;
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->max = 0;
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeAtom:
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom:  the regexp atom
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp atom
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeAtom(xmlRegAtomPtr atom) {
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < atom->nbRanges;i++)
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegFreeRange(atom->ranges[i]);
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->ranges != NULL)
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(atom->ranges);
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom->type == XML_REGEXP_STRING) && (atom->valuep != NULL))
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(atom->valuep);
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom->type == XML_REGEXP_STRING) && (atom->valuep2 != NULL))
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(atom->valuep2);
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom->type == XML_REGEXP_BLOCK_NAME) && (atom->valuep != NULL))
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(atom->valuep);
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(atom);
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCopyAtom:
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the regexp parser context
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom:  the oiginal atom
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new regexp range
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new atom or NULL in case of error
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegAtomPtr
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCopyAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) {
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr ret;
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom));
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegexpErrMemory(ctxt, "copying atom");
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRegAtom));
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = atom->type;
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->quant = atom->quant;
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->min = atom->min;
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->max = atom->max;
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->nbRanges > 0) {
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->ranges = (xmlRegRangePtr *) xmlMalloc(sizeof(xmlRegRangePtr) *
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                           atom->nbRanges);
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->ranges == NULL) {
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "copying atom");
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto error;
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < atom->nbRanges;i++) {
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->ranges[i] = xmlRegCopyRange(ctxt, atom->ranges[i]);
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret->ranges[i] == NULL)
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        goto error;
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->nbRanges = i + 1;
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegFreeAtom(ret);
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegStatePtr
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewState(xmlRegParserCtxtPtr ctxt) {
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr ret;
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRegStatePtr) xmlMalloc(sizeof(xmlRegState));
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegexpErrMemory(ctxt, "allocating state");
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRegState));
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_REGEXP_TRANS_STATE;
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->mark = XML_REGEXP_MARK_NORMAL;
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeState:
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  the regexp state
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp state
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeState(xmlRegStatePtr state) {
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL)
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->trans != NULL)
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(state->trans);
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->transTo != NULL)
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(state->transTo);
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(state);
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeParserCtxt:
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the regexp parser context
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp parser context
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeParserCtxt(xmlRegParserCtxtPtr ctxt) {
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->string != NULL)
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->string);
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->states != NULL) {
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ctxt->nbStates;i++)
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeState(ctxt->states[i]);
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->states);
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->atoms != NULL) {
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < ctxt->nbAtoms;i++)
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeAtom(ctxt->atoms[i]);
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->atoms);
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->counters != NULL)
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->counters);
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
93894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
93994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Display of Data structures			*
94094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintAtomType(FILE *output, xmlRegAtomType type) {
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_EPSILON:
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "epsilon "); break;
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_CHARVAL:
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "charval "); break;
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_RANGES:
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "ranges "); break;
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SUBREG:
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "subexpr "); break;
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_STRING:
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "string "); break;
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_ANYCHAR:
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "anychar "); break;
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_ANYSPACE:
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "anyspace "); break;
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTSPACE:
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "notspace "); break;
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_INITNAME:
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "initname "); break;
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTINITNAME:
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "notinitname "); break;
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NAMECHAR:
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "namechar "); break;
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTNAMECHAR:
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "notnamechar "); break;
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_DECIMAL:
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "decimal "); break;
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTDECIMAL:
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "notdecimal "); break;
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_REALCHAR:
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "realchar "); break;
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTREALCHAR:
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "notrealchar "); break;
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER:
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "LETTER "); break;
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_UPPERCASE:
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "LETTER_UPPERCASE "); break;
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_LOWERCASE:
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "LETTER_LOWERCASE "); break;
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_TITLECASE:
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "LETTER_TITLECASE "); break;
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_MODIFIER:
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "LETTER_MODIFIER "); break;
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_OTHERS:
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "LETTER_OTHERS "); break;
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK:
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "MARK "); break;
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_NONSPACING:
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "MARK_NONSPACING "); break;
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_SPACECOMBINING:
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "MARK_SPACECOMBINING "); break;
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_ENCLOSING:
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "MARK_ENCLOSING "); break;
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER:
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "NUMBER "); break;
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_DECIMAL:
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "NUMBER_DECIMAL "); break;
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_LETTER:
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "NUMBER_LETTER "); break;
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_OTHERS:
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "NUMBER_OTHERS "); break;
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT:
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT "); break;
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CONNECTOR:
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT_CONNECTOR "); break;
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_DASH:
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT_DASH "); break;
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OPEN:
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT_OPEN "); break;
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CLOSE:
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT_CLOSE "); break;
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_INITQUOTE:
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT_INITQUOTE "); break;
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_FINQUOTE:
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT_FINQUOTE "); break;
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OTHERS:
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "PUNCT_OTHERS "); break;
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR:
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SEPAR "); break;
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_SPACE:
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SEPAR_SPACE "); break;
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_LINE:
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SEPAR_LINE "); break;
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_PARA:
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SEPAR_PARA "); break;
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL:
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SYMBOL "); break;
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MATH:
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SYMBOL_MATH "); break;
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_CURRENCY:
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SYMBOL_CURRENCY "); break;
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MODIFIER:
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SYMBOL_MODIFIER "); break;
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_OTHERS:
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "SYMBOL_OTHERS "); break;
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER:
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "OTHER "); break;
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_CONTROL:
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "OTHER_CONTROL "); break;
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_FORMAT:
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "OTHER_FORMAT "); break;
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_PRIVATE:
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "OTHER_PRIVATE "); break;
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_NA:
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "OTHER_NA "); break;
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_BLOCK_NAME:
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "BLOCK "); break;
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintQuantType(FILE *output, xmlRegQuantType type) {
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_QUANT_EPSILON:
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "epsilon "); break;
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_QUANT_ONCE:
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "once "); break;
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_QUANT_OPT:
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "? "); break;
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_QUANT_MULT:
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "* "); break;
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_QUANT_PLUS:
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "+ "); break;
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_QUANT_RANGE:
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "range "); break;
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_QUANT_ONCEONLY:
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "onceonly "); break;
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_QUANT_ALL:
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "all "); break;
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintRange(FILE *output, xmlRegRangePtr range) {
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "  range: ");
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range->neg)
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "negative ");
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegPrintAtomType(output, range->type);
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%c - %c\n", range->start, range->end);
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintAtom(FILE *output, xmlRegAtomPtr atom) {
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, " atom: ");
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL) {
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "NULL\n");
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->neg)
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "not ");
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegPrintAtomType(output, atom->type);
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegPrintQuantType(output, atom->quant);
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->quant == XML_REGEXP_QUANT_RANGE)
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "%d-%d ", atom->min, atom->max);
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->type == XML_REGEXP_STRING)
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "'%s' ", (char *) atom->valuep);
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->type == XML_REGEXP_CHARVAL)
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "char %c\n", atom->codepoint);
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (atom->type == XML_REGEXP_RANGES) {
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "%d entries\n", atom->nbRanges);
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < atom->nbRanges;i++)
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegPrintRange(output, atom->ranges[i]);
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (atom->type == XML_REGEXP_SUBREG) {
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "start %d end %d\n", atom->start->no, atom->stop->no);
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "\n");
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) {
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "  trans: ");
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (trans == NULL) {
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "NULL\n");
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (trans->to < 0) {
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "removed\n");
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (trans->nd != 0) {
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (trans->nd == 2)
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "last not determinist, ");
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "not determinist, ");
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (trans->counter >= 0) {
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "counted %d, ", trans->counter);
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (trans->count == REGEXP_ALL_COUNTER) {
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "all transition, ");
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (trans->count >= 0) {
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "count based %d, ", trans->count);
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (trans->atom == NULL) {
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "epsilon to %d\n", trans->to);
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (trans->atom->type == XML_REGEXP_CHARVAL)
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "char %c ", trans->atom->codepoint);
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "atom %d, to %d\n", trans->atom->no, trans->to);
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
114794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintState(FILE *output, xmlRegStatePtr state) {
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, " state: ");
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "NULL\n");
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->type == XML_REGEXP_START_STATE)
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "START ");
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->type == XML_REGEXP_FINAL_STATE)
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "FINAL ");
116194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d, %d transitions:\n", state->no, state->nbTrans);
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < state->nbTrans; i++) {
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegPrintTrans(output, &(state->trans[i]));
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegPrintCtxt(FILE *output, xmlRegParserCtxtPtr ctxt) {
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, " ctxt: ");
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "NULL\n");
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "'%s' ", ctxt->string);
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->error)
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "error ");
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->neg)
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "neg ");
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d atoms:\n", ctxt->nbAtoms);
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ctxt->nbAtoms; i++) {
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " %02d ", i);
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegPrintAtom(output, ctxt->atoms[i]);
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->atom != NULL) {
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "current atom:\n");
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegPrintAtom(output, ctxt->atom);
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d states:", ctxt->nbStates);
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->start != NULL)
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " start: %d", ctxt->start->no);
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->end != NULL)
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " end: %d", ctxt->end->no);
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ctxt->nbStates; i++) {
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegPrintState(output, ctxt->states[i]);
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d counters:\n", ctxt->nbCounters);
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < ctxt->nbCounters; i++) {
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " %d: min %d max %d\n", i, ctxt->counters[i].min,
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                                ctxt->counters[i].max);
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
121194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		 Finite Automata structures manipulations		*
121394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
121694442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic void
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom,
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           int neg, xmlRegAtomType type, int start, int end,
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlChar *blockName) {
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegRangePtr range;
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL) {
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("add range: atom is NULL");
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->type != XML_REGEXP_RANGES) {
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("add range: atom is not ranges");
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->maxRanges == 0) {
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->maxRanges = 4;
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->ranges = (xmlRegRangePtr *) xmlMalloc(atom->maxRanges *
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegRangePtr));
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (atom->ranges == NULL) {
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding ranges");
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom->maxRanges = 0;
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (atom->nbRanges >= atom->maxRanges) {
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegRangePtr *tmp;
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->maxRanges *= 2;
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (xmlRegRangePtr *) xmlRealloc(atom->ranges, atom->maxRanges *
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegRangePtr));
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding ranges");
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom->maxRanges /= 2;
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->ranges = tmp;
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    range = xmlRegNewRange(ctxt, neg, type, start, end);
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range == NULL)
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    range->blockName = blockName;
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->ranges[atom->nbRanges++] = range;
125694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegGetCounter(xmlRegParserCtxtPtr ctxt) {
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->maxCounters == 0) {
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->maxCounters = 4;
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->counters = (xmlRegCounter *) xmlMalloc(ctxt->maxCounters *
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegCounter));
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->counters == NULL) {
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "allocating counter");
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->maxCounters = 0;
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->nbCounters >= ctxt->maxCounters) {
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegCounter *tmp;
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->maxCounters *= 2;
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (xmlRegCounter *) xmlRealloc(ctxt->counters, ctxt->maxCounters *
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                           sizeof(xmlRegCounter));
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "allocating counter");
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->maxCounters /= 2;
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->counters = tmp;
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->counters[ctxt->nbCounters].min = -1;
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->counters[ctxt->nbCounters].max = -1;
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ctxt->nbCounters++);
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
128794442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic int
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) {
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL) {
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("atom push: atom is NULL");
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->maxAtoms == 0) {
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->maxAtoms = 4;
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atoms = (xmlRegAtomPtr *) xmlMalloc(ctxt->maxAtoms *
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegAtomPtr));
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atoms == NULL) {
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "pushing atom");
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->maxAtoms = 0;
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->nbAtoms >= ctxt->maxAtoms) {
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegAtomPtr *tmp;
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->maxAtoms *= 2;
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (xmlRegAtomPtr *) xmlRealloc(ctxt->atoms, ctxt->maxAtoms *
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegAtomPtr));
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "allocating counter");
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->maxAtoms /= 2;
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atoms = tmp;
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->no = ctxt->nbAtoms;
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->atoms[ctxt->nbAtoms++] = atom;
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
131994442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic void
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target,
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      int from) {
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (target->maxTransTo == 0) {
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	target->maxTransTo = 8;
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	target->transTo = (int *) xmlMalloc(target->maxTransTo *
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(int));
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (target->transTo == NULL) {
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding transition");
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    target->maxTransTo = 0;
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (target->nbTransTo >= target->maxTransTo) {
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int *tmp;
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	target->maxTransTo *= 2;
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (int *) xmlRealloc(target->transTo, target->maxTransTo *
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(int));
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding transition");
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    target->maxTransTo /= 2;
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	target->transTo = tmp;
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    target->transTo[target->nbTransTo] = from;
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    target->nbTransTo++;
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
134794442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic void
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state,
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            xmlRegAtomPtr atom, xmlRegStatePtr target,
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int counter, int count) {
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nrtrans;
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("add state: state is NULL");
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (target == NULL) {
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("add state: target is NULL");
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Other routines follow the philosophy 'When in doubt, add a transition'
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * so we check here whether such a transition is already present and, if
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * so, silently ignore this request.
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (nrtrans = state->nbTrans - 1; nrtrans >= 0; nrtrans--) {
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegTransPtr trans = &(state->trans[nrtrans]);
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((trans->atom == atom) &&
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (trans->to == target->no) &&
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (trans->counter == counter) &&
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (trans->count == count)) {
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Ignoring duplicate transition from %d to %d\n",
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    state->no, target->no);
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->maxTrans == 0) {
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state->maxTrans = 8;
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans *
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegTrans));
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state->trans == NULL) {
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding transition");
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state->maxTrans = 0;
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (state->nbTrans >= state->maxTrans) {
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegTrans *tmp;
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state->maxTrans *= 2;
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (xmlRegTrans *) xmlRealloc(state->trans, state->maxTrans *
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegTrans));
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding transition");
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state->maxTrans /= 2;
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state->trans = tmp;
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("Add trans from %d to %d ", state->no, target->no);
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (count == REGEXP_ALL_COUNTER)
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("all transition\n");
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (count >= 0)
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("count based %d\n", count);
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (counter >= 0)
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("counted %d\n", counter);
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (atom == NULL)
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("epsilon transition\n");
141394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    else if (atom != NULL)
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegPrintAtom(stdout, atom);
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->trans[state->nbTrans].atom = atom;
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->trans[state->nbTrans].to = target->no;
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->trans[state->nbTrans].counter = counter;
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->trans[state->nbTrans].count = count;
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->trans[state->nbTrans].nd = 0;
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->nbTrans++;
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTransTo(ctxt, target, state->no);
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStatePush(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state) {
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) return(-1);
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->maxStates == 0) {
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->maxStates = 4;
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->states = (xmlRegStatePtr *) xmlMalloc(ctxt->maxStates *
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegStatePtr));
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->states == NULL) {
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding state");
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->maxStates = 0;
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->nbStates >= ctxt->maxStates) {
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePtr *tmp;
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->maxStates *= 2;
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (xmlRegStatePtr *) xmlRealloc(ctxt->states, ctxt->maxStates *
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegStatePtr));
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(ctxt, "adding state");
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->maxStates /= 2;
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->states = tmp;
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->no = ctxt->nbStates;
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->states[ctxt->nbStates++] = state;
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateAllTransition:
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from:  the from state
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to:  the target state or NULL for building a new one
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lax:
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateAllTransition(xmlRegParserCtxtPtr ctxt,
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlRegStatePtr from, xmlRegStatePtr to,
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   int lax) {
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = xmlRegNewState(ctxt);
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(ctxt, to);
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state = to;
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lax)
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_LAX_COUNTER);
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER);
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateEpsilonTransition:
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from:  the from state
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to:  the target state or NULL for building a new one
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateEpsilonTransition(xmlRegParserCtxtPtr ctxt,
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlRegStatePtr from, xmlRegStatePtr to) {
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = xmlRegNewState(ctxt);
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(ctxt, to);
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state = to;
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(ctxt, from, NULL, to, -1, -1);
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateCountedEpsilonTransition:
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from:  the from state
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to:  the target state or NULL for building a new one
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * counter:  the counter for that transition
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateCountedEpsilonTransition(xmlRegParserCtxtPtr ctxt,
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegStatePtr from, xmlRegStatePtr to, int counter) {
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = xmlRegNewState(ctxt);
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(ctxt, to);
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state = to;
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(ctxt, from, NULL, to, counter, -1);
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateCountedTransition:
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from:  the from state
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to:  the target state or NULL for building a new one
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * counter:  the counter for that transition
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateCountedTransition(xmlRegParserCtxtPtr ctxt,
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegStatePtr from, xmlRegStatePtr to, int counter) {
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = xmlRegNewState(ctxt);
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(ctxt, to);
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state = to;
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(ctxt, from, NULL, to, -1, counter);
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAGenerateTransitions:
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from:  the from state
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to:  the target state or NULL for building a new one
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom:  the atom generating the transition
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error.
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from,
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlRegStatePtr to, xmlRegAtomPtr atom) {
154660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlRegStatePtr end;
154760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL) {
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("genrate transition: atom == NULL");
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom->type == XML_REGEXP_SUBREG) {
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * this is a subexpression handling one should not need to
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * create a new node except for XML_REGEXP_QUANT_RANGE.
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlRegAtomPush(ctxt, atom) < 0) {
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((to != NULL) && (atom->stop != to) &&
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (atom->quant != XML_REGEXP_QUANT_RANGE)) {
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Generate an epsilon transition to link to the target
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to);
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DV
156794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	} else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) &&
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (atom->quant != XML_REGEXP_QUANT_ONCE)) {
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    to = xmlRegNewState(ctxt);
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegStatePush(ctxt, to);
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = to;
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to);
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (atom->quant) {
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_QUANT_OPT:
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		atom->quant = XML_REGEXP_QUANT_ONCE;
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * transition done to the state after end of atom.
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 *      1. set transition from atom start to new state
158194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		 *      2. set transition from atom end to this state.
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
1583df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (to == NULL) {
1584df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlFAGenerateEpsilonTransition(ctxt, atom->start, 0);
1585df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlFAGenerateEpsilonTransition(ctxt, atom->stop,
1586df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                   ctxt->state);
1587df143a5041f03a22808b59c76698770b74692815Selim Gurun                } else {
1588df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlFAGenerateEpsilonTransition(ctxt, atom->start, to);
1589df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_QUANT_MULT:
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		atom->quant = XML_REGEXP_QUANT_ONCE;
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFAGenerateEpsilonTransition(ctxt, atom->start, atom->stop);
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start);
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_QUANT_PLUS:
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		atom->quant = XML_REGEXP_QUANT_ONCE;
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start);
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_QUANT_RANGE: {
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int counter;
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegStatePtr inter, newstate;
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * create the final state now if needed
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (to != NULL) {
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    newstate = to;
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    newstate = xmlRegNewState(ctxt);
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegStatePush(ctxt, newstate);
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * The principle here is to use counted transition
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * to avoid explosion in the number of states in the
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * graph. This is clearly more complex but should not
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * be exploitable at runtime.
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((atom->min == 0) && (atom->start0 == NULL)) {
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegAtomPtr copy;
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * duplicate a transition based on atom to count next
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * occurences after 1. We cannot loop to atom->start
162594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		     * directly because we need an epsilon transition to
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * newstate.
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     /* ???? For some reason it seems we never reach that
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        case, I suppose this got optimized out before when
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			building the automata */
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    copy = xmlRegCopyAtom(ctxt, atom);
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (copy == NULL)
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return(-1);
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    copy->quant = XML_REGEXP_QUANT_ONCE;
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    copy->min = 0;
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    copy->max = 0;
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlFAGenerateTransitions(ctxt, atom->start, NULL, copy)
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        < 0)
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inter = ctxt->state;
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    counter = xmlRegGetCounter(ctxt);
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->counters[counter].min = atom->min - 1;
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->counters[counter].max = atom->max - 1;
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* count the number of times we see it again */
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFAGenerateCountedEpsilonTransition(ctxt, inter,
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   atom->stop, counter);
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* allow a way out based on the count */
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFAGenerateCountedTransition(ctxt, inter,
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                           newstate, counter);
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* and also allow a direct exit for 0 */
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFAGenerateEpsilonTransition(ctxt, atom->start,
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                                   newstate);
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * either we need the atom at least once or there
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * is an atom->start0 allowing to easilly plug the
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * epsilon transition.
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    counter = xmlRegGetCounter(ctxt);
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->counters[counter].min = atom->min - 1;
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->counters[counter].max = atom->max - 1;
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* count the number of times we see it again */
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFAGenerateCountedEpsilonTransition(ctxt, atom->stop,
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   atom->start, counter);
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* allow a way out based on the count */
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFAGenerateCountedTransition(ctxt, atom->stop,
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                           newstate, counter);
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* and if needed allow a direct exit for 0 */
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (atom->min == 0)
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFAGenerateEpsilonTransition(ctxt, atom->start0,
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						       newstate);
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		atom->min = 0;
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		atom->max = 0;
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		atom->quant = XML_REGEXP_QUANT_ONCE;
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->state = newstate;
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
168494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom->min == 0) && (atom->max == 0) &&
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (atom->quant == XML_REGEXP_QUANT_RANGE)) {
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * we can discard the atom and generate an epsilon transition instead
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (to == NULL) {
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    to = xmlRegNewState(ctxt);
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (to != NULL)
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegStatePush(ctxt, to);
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAGenerateEpsilonTransition(ctxt, from, to);
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state = to;
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegFreeAtom(atom);
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = xmlRegNewState(ctxt);
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (to != NULL)
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegStatePush(ctxt, to);
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
171094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
171160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    end = to;
171294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if ((atom->quant == XML_REGEXP_QUANT_MULT) ||
171360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        (atom->quant == XML_REGEXP_QUANT_PLUS)) {
171460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
171560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 * Do not pollute the target state by adding transitions from
171660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 * it as it is likely to be the shared target of multiple branches.
171760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 * So isolate with an epsilon transition.
171860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	 */
171960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        xmlRegStatePtr tmp;
172094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
172160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	tmp = xmlRegNewState(ctxt);
172260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (tmp != NULL)
172360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlRegStatePush(ctxt, tmp);
172460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	else {
172560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    return(-1);
172660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
172760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlFAGenerateEpsilonTransition(ctxt, tmp, to);
172860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	to = tmp;
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRegAtomPush(ctxt, atom) < 0) {
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(ctxt, from, atom, to, -1, -1);
173460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ctxt->state = end;
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (atom->quant) {
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_QUANT_OPT:
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom->quant = XML_REGEXP_QUANT_ONCE;
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAGenerateEpsilonTransition(ctxt, from, to);
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_QUANT_MULT:
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom->quant = XML_REGEXP_QUANT_ONCE;
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAGenerateEpsilonTransition(ctxt, from, to);
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1);
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_QUANT_PLUS:
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom->quant = XML_REGEXP_QUANT_ONCE;
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1);
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
174994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	case XML_REGEXP_QUANT_RANGE:
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if DV_test
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (atom->min == 0) {
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFAGenerateEpsilonTransition(ctxt, from, to);
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAReduceEpsilonTransitions:
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fromnr:  the from state
176694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @tonr:  the to state
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter:  should that transition be associated to a counted
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr,
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                      int tonr, int counter) {
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int transnr;
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr from;
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr to;
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("xmlFAReduceEpsilonTransitions(%d, %d)\n", fromnr, tonr);
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    from = ctxt->states[fromnr];
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (from == NULL)
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    to = ctxt->states[tonr];
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((to->mark == XML_REGEXP_MARK_START) ||
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(to->mark == XML_REGEXP_MARK_VISITED))
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    to->mark = XML_REGEXP_MARK_VISITED;
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to->type == XML_REGEXP_FINAL_STATE) {
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("State %d is final, so %d becomes final\n", tonr, fromnr);
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	from->type = XML_REGEXP_FINAL_STATE;
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (transnr = 0;transnr < to->nbTrans;transnr++) {
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (to->trans[transnr].to < 0)
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (to->trans[transnr].atom == NULL) {
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Don't remove counted transitions
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Don't loop either
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (to->trans[transnr].to != fromnr) {
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (to->trans[transnr].count >= 0) {
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int newto = to->trans[transnr].to;
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegStateAddTrans(ctxt, from, NULL,
181094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun					ctxt->states[newto],
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					-1, to->trans[transnr].count);
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Found epsilon trans %d from %d to %d\n",
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   transnr, tonr, to->trans[transnr].to);
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (to->trans[transnr].counter >= 0) {
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFAReduceEpsilonTransitions(ctxt, fromnr,
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      to->trans[transnr].to,
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      to->trans[transnr].counter);
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFAReduceEpsilonTransitions(ctxt, fromnr,
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      to->trans[transnr].to,
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      counter);
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int newto = to->trans[transnr].to;
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (to->trans[transnr].counter >= 0) {
183294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom,
183394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun				    ctxt->states[newto],
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    to->trans[transnr].counter, -1);
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
183694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom,
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->states[newto], counter, -1);
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    to->mark = XML_REGEXP_MARK_NORMAL;
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEliminateSimpleEpsilonTransitions:
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
184894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Eliminating general epsilon transitions can get costly in the general
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * algorithm due to the large amount of generated new transitions and
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * associated comparisons. However for simple epsilon transition used just
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to separate building blocks when generating the automata this can be
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reduced to state elimination:
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - if there exists an epsilon from X to Y
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    - if there is no other transition from X
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then X and Y are semantically equivalent and X can be eliminated
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If X is the start state then make Y the start state, else replace the
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target of all transitions to X by transitions to Y.
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) {
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int statenr, i, j, newto;
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr state, tmp;
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = ctxt->states[statenr];
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state == NULL)
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state->nbTrans != 1)
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state->type == XML_REGEXP_UNREACH_STATE)
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* is the only transition out a basic transition */
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((state->trans[0].atom == NULL) &&
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (state->trans[0].to >= 0) &&
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (state->trans[0].to != statenr) &&
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (state->trans[0].counter < 0) &&
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (state->trans[0].count < 0)) {
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    newto = state->trans[0].to;
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (state->type == XML_REGEXP_START_STATE) {
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Found simple epsilon trans from start %d to %d\n",
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       statenr, newto);
188494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Found simple epsilon trans from %d to %d\n",
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       statenr, newto);
188994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        for (i = 0;i < state->nbTransTo;i++) {
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = ctxt->states[state->transTo[i]];
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0;j < tmp->nbTrans;j++) {
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (tmp->trans[j].to == statenr) {
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("Changed transition %d on %d to go to %d\n",
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   j, tmp->no, newto);
189794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmp->trans[j].to = -1;
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlRegStateAddTrans(ctxt, tmp, tmp->trans[j].atom,
190094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun						ctxt->states[newto],
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					        tmp->trans[j].counter,
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						tmp->trans[j].count);
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (state->type == XML_REGEXP_FINAL_STATE)
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->states[newto]->type = XML_REGEXP_FINAL_STATE;
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* eliminate the transition completely */
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		state->nbTrans = 0;
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                state->type = XML_REGEXP_UNREACH_STATE;
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
191494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEliminateEpsilonTransitions:
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) {
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int statenr, transnr;
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr state;
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int has_epsilon;
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->states == NULL) return;
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Eliminate simple epsilon transition and the associated unreachable
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * states.
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAEliminateSimpleEpsilonTransitions(ctxt);
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = ctxt->states[statenr];
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((state != NULL) && (state->type == XML_REGEXP_UNREACH_STATE)) {
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Removed unreachable state %d\n", statenr);
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeState(state);
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->states[statenr] = NULL;
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    has_epsilon = 0;
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Build the completed transitions bypassing the epsilons
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Use a marking algorithm to avoid loops
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Mark sink states too.
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Process from the latests states backward to the start when
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * there is long cascading epsilon chains this minimize the
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * recursions and transition compares when adding the new ones
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (statenr = ctxt->nbStates - 1;statenr >= 0;statenr--) {
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = ctxt->states[statenr];
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state == NULL)
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((state->nbTrans == 0) &&
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (state->type != XML_REGEXP_FINAL_STATE)) {
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state->type = XML_REGEXP_SINK_STATE;
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (transnr = 0;transnr < state->nbTrans;transnr++) {
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((state->trans[transnr].atom == NULL) &&
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(state->trans[transnr].to >= 0)) {
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (state->trans[transnr].to == statenr) {
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    state->trans[transnr].to = -1;
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Removed loopback epsilon trans %d on %d\n",
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   transnr, statenr);
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (state->trans[transnr].count < 0) {
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int newto = state->trans[transnr].to;
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Found epsilon trans %d from %d to %d\n",
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   transnr, statenr, newto);
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    has_epsilon = 1;
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    state->trans[transnr].to = -2;
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    state->mark = XML_REGEXP_MARK_START;
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFAReduceEpsilonTransitions(ctxt, statenr,
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      newto, state->trans[transnr].counter);
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    state->mark = XML_REGEXP_MARK_NORMAL;
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Found counted transition %d on %d\n",
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   transnr, statenr);
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        }
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Eliminate the epsilon transitions
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (has_epsilon) {
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state = ctxt->states[statenr];
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (state == NULL)
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (transnr = 0;transnr < state->nbTrans;transnr++) {
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegTransPtr trans = &(state->trans[transnr]);
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((trans->atom == NULL) &&
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (trans->count < 0) &&
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (trans->to >= 0)) {
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    trans->to = -1;
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Use this pass to detect unreachable states too
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = ctxt->states[statenr];
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state != NULL)
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state->reached = XML_REGEXP_MARK_NORMAL;
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = ctxt->states[0];
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state != NULL)
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state->reached = XML_REGEXP_MARK_START;
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (state != NULL) {
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePtr target = NULL;
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state->reached = XML_REGEXP_MARK_VISITED;
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Mark all states reachable from the current reachable state
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (transnr = 0;transnr < state->nbTrans;transnr++) {
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((state->trans[transnr].to >= 0) &&
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((state->trans[transnr].atom != NULL) ||
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (state->trans[transnr].count >= 0))) {
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int newto = state->trans[transnr].to;
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->states[newto] == NULL)
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->states[newto]->reached == XML_REGEXP_MARK_NORMAL) {
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->states[newto]->reached = XML_REGEXP_MARK_START;
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    target = ctxt->states[newto];
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * find the next accessible state not explored
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (target == NULL) {
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (statenr = 1;statenr < ctxt->nbStates;statenr++) {
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		state = ctxt->states[statenr];
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((state != NULL) && (state->reached ==
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_REGEXP_MARK_START)) {
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    target = state;
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = target;
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = ctxt->states[statenr];
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((state != NULL) && (state->reached == XML_REGEXP_MARK_NORMAL)) {
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Removed unreachable state %d\n", statenr);
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeState(state);
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->states[statenr] = NULL;
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) {
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((range1->type == XML_REGEXP_RANGES) ||
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (range2->type == XML_REGEXP_RANGES) ||
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (range2->type == XML_REGEXP_SUBREG) ||
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (range1->type == XML_REGEXP_SUBREG) ||
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (range1->type == XML_REGEXP_STRING) ||
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (range2->type == XML_REGEXP_STRING))
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* put them in order */
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (range1->type > range2->type) {
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegRangePtr tmp;
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = range1;
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	range1 = range2;
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	range2 = tmp;
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((range1->type == XML_REGEXP_ANYCHAR) ||
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (range2->type == XML_REGEXP_ANYCHAR)) {
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 1;
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((range1->type == XML_REGEXP_EPSILON) ||
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (range2->type == XML_REGEXP_EPSILON)) {
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (range1->type == range2->type) {
2102df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (range1->type != XML_REGEXP_CHARVAL)
2103df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
2104df143a5041f03a22808b59c76698770b74692815Selim Gurun        else if ((range1->end < range2->start) ||
2105df143a5041f03a22808b59c76698770b74692815Selim Gurun	         (range2->end < range1->start))
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2107df143a5041f03a22808b59c76698770b74692815Selim Gurun	else
2108df143a5041f03a22808b59c76698770b74692815Selim Gurun	    ret = 1;
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (range1->type == XML_REGEXP_CHARVAL) {
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int codepoint;
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int neg = 0;
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * just check all codepoints in the range for acceptance,
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * this is usually way cheaper since done only once at
211694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	 * compilation than testing over and over at runtime or
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * pushing too many states when evaluating.
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((range1->neg == 0) && (range2->neg != 0)) ||
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((range1->neg != 0) && (range2->neg == 0)))
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = 1;
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (codepoint = range1->start;codepoint <= range1->end ;codepoint++) {
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlRegCheckCharacterRange(range2->type, codepoint,
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    0, range2->start, range2->end,
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    range2->blockName);
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0)
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(-1);
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((neg == 1) && (ret == 0)) ||
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((neg == 0) && (ret == 1)))
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((range1->type == XML_REGEXP_BLOCK_NAME) ||
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (range2->type == XML_REGEXP_BLOCK_NAME)) {
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (range1->type == range2->type) {
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlStrEqual(range1->blockName, range2->blockName);
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * comparing a block range with anything else is way
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * too costly, and maintining the table is like too much
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * memory too, so let's force the automata to save state
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * here.
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((range1->type < XML_REGEXP_LETTER) ||
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (range2->type < XML_REGEXP_LETTER)) {
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((range1->type == XML_REGEXP_ANYSPACE) &&
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (range2->type == XML_REGEXP_NOTSPACE))
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if ((range1->type == XML_REGEXP_INITNAME) &&
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         (range2->type == XML_REGEXP_NOTINITNAME))
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if ((range1->type == XML_REGEXP_NAMECHAR) &&
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         (range2->type == XML_REGEXP_NOTNAMECHAR))
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if ((range1->type == XML_REGEXP_DECIMAL) &&
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         (range2->type == XML_REGEXP_NOTDECIMAL))
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if ((range1->type == XML_REGEXP_REALCHAR) &&
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         (range2->type == XML_REGEXP_NOTREALCHAR))
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* same thing to limit complexity */
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* range1->type < range2->type here */
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (range1->type) {
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_LETTER:
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         /* all disjoint except in the subgroups */
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type == XML_REGEXP_LETTER_UPPERCASE) ||
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_LETTER_LOWERCASE) ||
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_LETTER_TITLECASE) ||
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_LETTER_MODIFIER) ||
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_LETTER_OTHERS))
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 1;
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 break;
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_MARK:
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type == XML_REGEXP_MARK_NONSPACING) ||
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_MARK_SPACECOMBINING) ||
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_MARK_ENCLOSING))
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 1;
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 break;
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_NUMBER:
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type == XML_REGEXP_NUMBER_DECIMAL) ||
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_NUMBER_LETTER) ||
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_NUMBER_OTHERS))
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 1;
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 break;
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_PUNCT:
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type == XML_REGEXP_PUNCT_CONNECTOR) ||
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_PUNCT_DASH) ||
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_PUNCT_OPEN) ||
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_PUNCT_CLOSE) ||
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_PUNCT_INITQUOTE) ||
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_PUNCT_FINQUOTE) ||
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_PUNCT_OTHERS))
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 1;
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 break;
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_SEPAR:
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type == XML_REGEXP_SEPAR_SPACE) ||
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_SEPAR_LINE) ||
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_SEPAR_PARA))
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 1;
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 break;
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_SYMBOL:
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type == XML_REGEXP_SYMBOL_MATH) ||
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_SYMBOL_CURRENCY) ||
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_SYMBOL_MODIFIER) ||
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_SYMBOL_OTHERS))
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 1;
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 break;
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_REGEXP_OTHER:
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type == XML_REGEXP_OTHER_CONTROL) ||
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_OTHER_FORMAT) ||
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type == XML_REGEXP_OTHER_PRIVATE))
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 1;
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 break;
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            default:
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         if ((range2->type >= XML_REGEXP_LETTER) &&
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (range2->type < XML_REGEXP_BLOCK_NAME))
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ret = 0;
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 else {
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     /* safety net ! */
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     return(1);
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 }
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((range1->neg == 0) && (range2->neg != 0)) ||
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((range1->neg != 0) && (range2->neg == 0)))
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = !ret;
2235df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFACompareAtomTypes:
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type1:  an atom type
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type2:  an atom type
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms type to check whether they intersect in some ways,
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used by xmlFACompareAtoms only
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if they may intersect and 0 otherwise
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFACompareAtomTypes(xmlRegAtomType type1, xmlRegAtomType type2) {
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type1 == XML_REGEXP_EPSILON) ||
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (type1 == XML_REGEXP_CHARVAL) ||
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type1 == XML_REGEXP_RANGES) ||
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type1 == XML_REGEXP_SUBREG) ||
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type1 == XML_REGEXP_STRING) ||
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type1 == XML_REGEXP_ANYCHAR))
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type2 == XML_REGEXP_EPSILON) ||
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (type2 == XML_REGEXP_CHARVAL) ||
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type2 == XML_REGEXP_RANGES) ||
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type2 == XML_REGEXP_SUBREG) ||
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type2 == XML_REGEXP_STRING) ||
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type2 == XML_REGEXP_ANYCHAR))
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type1 == type2) return(1);
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* simplify subsequent compares by making sure type1 < type2 */
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type1 > type2) {
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegAtomType tmp = type1;
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type1 = type2;
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type2 = tmp;
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type1) {
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_ANYSPACE: /* \s */
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* can't be a letter, number, mark, pontuation, symbol */
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((type2 == XML_REGEXP_NOTSPACE) ||
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((type2 >= XML_REGEXP_LETTER) &&
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_LETTER_OTHERS)) ||
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_NUMBER) &&
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_NUMBER_OTHERS)) ||
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_MARK) &&
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_MARK_ENCLOSING)) ||
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_PUNCT) &&
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_PUNCT_OTHERS)) ||
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SYMBOL) &&
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SYMBOL_OTHERS))
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ) return(0);
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTSPACE: /* \S */
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_INITNAME: /* \l */
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* can't be a number, mark, separator, pontuation, symbol or other */
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((type2 == XML_REGEXP_NOTINITNAME) ||
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_NUMBER) &&
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_NUMBER_OTHERS)) ||
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_MARK) &&
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_MARK_ENCLOSING)) ||
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SEPAR) &&
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SEPAR_PARA)) ||
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_PUNCT) &&
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_PUNCT_OTHERS)) ||
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SYMBOL) &&
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SYMBOL_OTHERS)) ||
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_OTHER) &&
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_OTHER_NA))
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		) return(0);
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTINITNAME: /* \L */
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NAMECHAR: /* \c */
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* can't be a mark, separator, pontuation, symbol or other */
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((type2 == XML_REGEXP_NOTNAMECHAR) ||
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_MARK) &&
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_MARK_ENCLOSING)) ||
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_PUNCT) &&
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_PUNCT_OTHERS)) ||
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SEPAR) &&
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SEPAR_PARA)) ||
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SYMBOL) &&
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SYMBOL_OTHERS)) ||
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_OTHER) &&
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_OTHER_NA))
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		) return(0);
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTNAMECHAR: /* \C */
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_DECIMAL: /* \d */
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* can't be a letter, mark, separator, pontuation, symbol or other */
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((type2 == XML_REGEXP_NOTDECIMAL) ||
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (type2 == XML_REGEXP_REALCHAR) ||
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((type2 >= XML_REGEXP_LETTER) &&
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_LETTER_OTHERS)) ||
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_MARK) &&
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_MARK_ENCLOSING)) ||
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_PUNCT) &&
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_PUNCT_OTHERS)) ||
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SEPAR) &&
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SEPAR_PARA)) ||
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SYMBOL) &&
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SYMBOL_OTHERS)) ||
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_OTHER) &&
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_OTHER_NA))
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		)return(0);
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTDECIMAL: /* \D */
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_REALCHAR: /* \w */
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* can't be a mark, separator, pontuation, symbol or other */
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((type2 == XML_REGEXP_NOTDECIMAL) ||
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_MARK) &&
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_MARK_ENCLOSING)) ||
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_PUNCT) &&
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_PUNCT_OTHERS)) ||
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SEPAR) &&
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SEPAR_PARA)) ||
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_SYMBOL) &&
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_SYMBOL_OTHERS)) ||
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((type2 >= XML_REGEXP_OTHER) &&
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (type2 <= XML_REGEXP_OTHER_NA))
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		)return(0);
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTREALCHAR: /* \W */
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * at that point we know both type 1 and type2 are from
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * character categories are ordered and are different,
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * it becomes simple because this is a partition
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER:
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type2 <= XML_REGEXP_LETTER_OTHERS)
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(1);
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_UPPERCASE:
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_LOWERCASE:
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_TITLECASE:
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_MODIFIER:
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_OTHERS:
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK:
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type2 <= XML_REGEXP_MARK_ENCLOSING)
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(1);
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_NONSPACING:
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_SPACECOMBINING:
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_ENCLOSING:
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER:
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type2 <= XML_REGEXP_NUMBER_OTHERS)
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(1);
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_DECIMAL:
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_LETTER:
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_OTHERS:
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT:
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type2 <= XML_REGEXP_PUNCT_OTHERS)
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(1);
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CONNECTOR:
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_DASH:
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OPEN:
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CLOSE:
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_INITQUOTE:
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_FINQUOTE:
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OTHERS:
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR:
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type2 <= XML_REGEXP_SEPAR_PARA)
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(1);
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_SPACE:
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_LINE:
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_PARA:
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL:
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type2 <= XML_REGEXP_SYMBOL_OTHERS)
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(1);
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MATH:
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_CURRENCY:
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MODIFIER:
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_OTHERS:
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER:
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type2 <= XML_REGEXP_OTHER_NA)
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(1);
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_CONTROL:
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_FORMAT:
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_PRIVATE:
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_NA:
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAEqualAtoms:
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom1:  an atom
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom2:  an atom
2443df143a5041f03a22808b59c76698770b74692815Selim Gurun * @deep: if not set only compare string pointers
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms to check whether they are the same exactly
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used to remove equivalent transitions
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if same and 0 otherwise
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2451df143a5041f03a22808b59c76698770b74692815Selim GurunxmlFAEqualAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) {
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom1 == atom2)
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom1 == NULL) || (atom2 == NULL))
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom1->type != atom2->type)
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (atom1->type) {
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_EPSILON:
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_STRING:
2466df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (!deep)
2467df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = (atom1->valuep == atom2->valuep);
2468df143a5041f03a22808b59c76698770b74692815Selim Gurun            else
2469df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = xmlStrEqual((xmlChar *)atom1->valuep,
2470df143a5041f03a22808b59c76698770b74692815Selim Gurun                                  (xmlChar *)atom2->valuep);
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_CHARVAL:
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (atom1->codepoint == atom2->codepoint);
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_RANGES:
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* too hard to do in the general case */
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFACompareAtoms:
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom1:  an atom
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atom2:  an atom
2488df143a5041f03a22808b59c76698770b74692815Selim Gurun * @deep: if not set only compare string pointers
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compares two atoms to check whether they intersect in some ways,
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is used by xmlFAComputesDeterminism and xmlFARecurseDeterminism only
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes and 0 otherwise
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2496df143a5041f03a22808b59c76698770b74692815Selim GurunxmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) {
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom1 == atom2)
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom1 == NULL) || (atom2 == NULL))
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom1->type == XML_REGEXP_ANYCHAR) ||
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (atom2->type == XML_REGEXP_ANYCHAR))
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom1->type > atom2->type) {
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegAtomPtr tmp;
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = atom1;
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom1 = atom2;
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom2 = tmp;
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom1->type != atom2->type) {
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlFACompareAtomTypes(atom1->type, atom2->type);
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* if they can't intersect at the type level break now */
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == 0)
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (atom1->type) {
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_STRING:
2522df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (!deep)
2523df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = (atom1->valuep != atom2->valuep);
2524df143a5041f03a22808b59c76698770b74692815Selim Gurun            else
2525df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = xmlRegStrEqualWildcard((xmlChar *)atom1->valuep,
2526df143a5041f03a22808b59c76698770b74692815Selim Gurun                                             (xmlChar *)atom2->valuep);
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_EPSILON:
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto not_determinist;
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_CHARVAL:
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (atom2->type == XML_REGEXP_CHARVAL) {
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = (atom1->codepoint == atom2->codepoint);
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ret = xmlRegCheckCharacter(atom2, atom1->codepoint);
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0)
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_RANGES:
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (atom2->type == XML_REGEXP_RANGES) {
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        int i, j, res;
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegRangePtr r1, r2;
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * need to check that none of the ranges eventually matches
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0;i < atom1->nbRanges;i++) {
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0;j < atom2->nbRanges;j++) {
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			r1 = atom1->ranges[i];
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			r2 = atom2->ranges[j];
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			res = xmlFACompareRanges(r1, r2);
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res == 1) {
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto done;
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto not_determinist;
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom1->neg != atom2->neg) {
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = !ret;
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_determinist:
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFARecurseDeterminism:
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the associated regexp is determinist,
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should be called after xmlFAEliminateEpsilonTransitions()
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state,
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 int to, xmlRegAtomPtr atom) {
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int transnr, nbTrans;
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegTransPtr t1;
2589df143a5041f03a22808b59c76698770b74692815Selim Gurun    int deep = 1;
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL)
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
259394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (state->markd == XML_REGEXP_MARK_VISITED)
259494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	return(ret);
2595df143a5041f03a22808b59c76698770b74692815Selim Gurun
2596df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->flags & AM_AUTOMATA_RNG)
2597df143a5041f03a22808b59c76698770b74692815Selim Gurun        deep = 0;
2598df143a5041f03a22808b59c76698770b74692815Selim Gurun
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * don't recurse on transitions potentially added in the course of
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the elimination.
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nbTrans = state->nbTrans;
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (transnr = 0;transnr < nbTrans;transnr++) {
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	t1 = &(state->trans[transnr]);
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * check transitions conflicting with the one looked at
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (t1->atom == NULL) {
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (t1->to < 0)
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
261294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    state->markd = XML_REGEXP_MARK_VISITED;
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to],
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                           to, atom);
261594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    state->markd = 0;
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 0) {
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ret = 0;
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* t1->nd = 1; */
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (t1->to != to)
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2624df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (xmlFACompareAtoms(t1->atom, atom, deep)) {
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* mark the transition as non-deterministic */
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    t1->nd = 1;
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAComputesDeterminism:
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the associated regexp is determinist,
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should be called after xmlFAEliminateEpsilonTransitions()
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt) {
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int statenr, transnr;
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr state;
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegTransPtr t1, t2, last;
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
2648df143a5041f03a22808b59c76698770b74692815Selim Gurun    int deep = 1;
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("xmlFAComputesDeterminism\n");
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegPrintCtxt(stdout, ctxt);
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->determinist != -1)
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->determinist);
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2657df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->flags & AM_AUTOMATA_RNG)
2658df143a5041f03a22808b59c76698770b74692815Selim Gurun        deep = 0;
2659df143a5041f03a22808b59c76698770b74692815Selim Gurun
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * First cleanup the automata removing cancelled transitions
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = ctxt->states[statenr];
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state == NULL)
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state->nbTrans < 2)
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (transnr = 0;transnr < state->nbTrans;transnr++) {
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    t1 = &(state->trans[transnr]);
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Determinism checks in case of counted or all transitions
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * will have to be handled separately
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (t1->atom == NULL) {
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* t1->nd = 1; */
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (t1->to == -1) /* eliminated */
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < transnr;i++) {
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		t2 = &(state->trans[i]);
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (t2->to == -1) /* eliminated */
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (t2->atom != NULL) {
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (t1->to == t2->to) {
2687df143a5041f03a22808b59c76698770b74692815Selim Gurun                        /*
2688df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * Here we use deep because we want to keep the
2689df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * transitions which indicate a conflict
2690df143a5041f03a22808b59c76698770b74692815Selim Gurun                         */
2691df143a5041f03a22808b59c76698770b74692815Selim Gurun			if (xmlFAEqualAtoms(t1->atom, t2->atom, deep) &&
2692df143a5041f03a22808b59c76698770b74692815Selim Gurun                            (t1->counter == t2->counter) &&
2693df143a5041f03a22808b59c76698770b74692815Selim Gurun                            (t1->count == t2->count))
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    t2->to = -1; /* eliminated */
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check for all states that there aren't 2 transitions
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * with the same atom and a different target.
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	state = ctxt->states[statenr];
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state == NULL)
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (state->nbTrans < 2)
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	last = NULL;
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (transnr = 0;transnr < state->nbTrans;transnr++) {
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    t1 = &(state->trans[transnr]);
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Determinism checks in case of counted or all transitions
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * will have to be handled separately
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (t1->atom == NULL) {
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (t1->to == -1) /* eliminated */
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < transnr;i++) {
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		t2 = &(state->trans[i]);
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (t2->to == -1) /* eliminated */
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (t2->atom != NULL) {
2728df143a5041f03a22808b59c76698770b74692815Selim Gurun                    /*
2729df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * But here we don't use deep because we want to
2730df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * find transitions which indicate a conflict
2731df143a5041f03a22808b59c76698770b74692815Selim Gurun                     */
2732df143a5041f03a22808b59c76698770b74692815Selim Gurun		    if (xmlFACompareAtoms(t1->atom, t2->atom, 1)) {
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* mark the transitions as non-deterministic ones */
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			t1->nd = 1;
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			t2->nd = 1;
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			last = t1;
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (t1->to != -1) {
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * do the closure in case of remaining specific
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * epsilon transitions like choices or all
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to],
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						   t2->to, t2->atom);
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* don't shortcut the computation so all non deterministic
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       transition get marked down
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == 0)
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(0);
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == 0) {
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			t1->nd = 1;
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* t2->nd = 1; */
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			last = t1;
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* don't shortcut the computation so all non deterministic
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       transition get marked down
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 0)
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break; */
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * mark specifically the last non-deterministic transition
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * from a state since there is no need to set-up rollback
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * from it
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (last != NULL) {
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last->nd = 2;
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* don't shortcut the computation so all non deterministic
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   transition get marked down
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == 0)
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break; */
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->determinist = ret;
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
278494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	Routines to check input against transition atoms		*
278694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg,
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                  int start, int end, const xmlChar *blockName) {
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_STRING:
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SUBREG:
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_RANGES:
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_EPSILON:
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_ANYCHAR:
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = ((codepoint != '\n') && (codepoint != '\r'));
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_CHARVAL:
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = ((codepoint >= start) && (codepoint <= end));
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTSPACE:
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = !neg;
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_ANYSPACE:
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = ((codepoint == '\n') || (codepoint == '\r') ||
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (codepoint == '\t') || (codepoint == ' '));
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTINITNAME:
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = !neg;
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_INITNAME:
281594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    ret = (IS_LETTER(codepoint) ||
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (codepoint == '_') || (codepoint == ':'));
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTNAMECHAR:
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = !neg;
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NAMECHAR:
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (IS_LETTER(codepoint) || IS_DIGIT(codepoint) ||
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (codepoint == '.') || (codepoint == '-') ||
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (codepoint == '_') || (codepoint == ':') ||
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   IS_COMBINING(codepoint) || IS_EXTENDER(codepoint));
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTDECIMAL:
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = !neg;
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_DECIMAL:
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatNd(codepoint);
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_REALCHAR:
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = !neg;
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTREALCHAR:
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatP(codepoint);
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 0)
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlUCSIsCatZ(codepoint);
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 0)
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlUCSIsCatC(codepoint);
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER:
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatL(codepoint);
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_UPPERCASE:
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatLu(codepoint);
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_LOWERCASE:
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatLl(codepoint);
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_TITLECASE:
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatLt(codepoint);
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_MODIFIER:
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatLm(codepoint);
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_OTHERS:
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatLo(codepoint);
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK:
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatM(codepoint);
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_NONSPACING:
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatMn(codepoint);
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_SPACECOMBINING:
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatMc(codepoint);
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_ENCLOSING:
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatMe(codepoint);
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER:
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatN(codepoint);
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_DECIMAL:
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatNd(codepoint);
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_LETTER:
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatNl(codepoint);
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_OTHERS:
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatNo(codepoint);
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT:
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatP(codepoint);
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CONNECTOR:
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatPc(codepoint);
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_DASH:
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatPd(codepoint);
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OPEN:
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatPs(codepoint);
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CLOSE:
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatPe(codepoint);
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_INITQUOTE:
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatPi(codepoint);
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_FINQUOTE:
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatPf(codepoint);
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OTHERS:
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatPo(codepoint);
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR:
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatZ(codepoint);
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_SPACE:
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatZs(codepoint);
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_LINE:
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatZl(codepoint);
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_PARA:
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatZp(codepoint);
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL:
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatS(codepoint);
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MATH:
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatSm(codepoint);
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_CURRENCY:
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatSc(codepoint);
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MODIFIER:
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatSk(codepoint);
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_OTHERS:
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatSo(codepoint);
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER:
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatC(codepoint);
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_CONTROL:
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatCc(codepoint);
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_FORMAT:
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatCf(codepoint);
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_PRIVATE:
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsCatCo(codepoint);
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_NA:
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* ret = xmlUCSIsCatCn(codepoint); */
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Seems it doesn't exist anymore in recent Unicode releases */
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_BLOCK_NAME:
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlUCSIsBlock(codepoint, (const char *) blockName);
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (neg)
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(!ret);
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint) {
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, ret = 0;
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegRangePtr range;
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((atom == NULL) || (!IS_CHAR(codepoint)))
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (atom->type) {
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SUBREG:
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_EPSILON:
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_CHARVAL:
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(codepoint == atom->codepoint);
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_RANGES: {
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int accept = 0;
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < atom->nbRanges;i++) {
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		range = atom->ranges[i];
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (range->neg == 2) {
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlRegCheckCharacterRange(range->type, codepoint,
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						0, range->start, range->end,
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						range->blockName);
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(0); /* excluded char */
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (range->neg) {
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlRegCheckCharacterRange(range->type, codepoint,
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						0, range->start, range->end,
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						range->blockName);
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == 0)
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        accept = 1;
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return(0);
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlRegCheckCharacterRange(range->type, codepoint,
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						0, range->start, range->end,
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						range->blockName);
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			accept = 1; /* might still be excluded */
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(accept);
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_STRING:
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("TODO: XML_REGEXP_STRING\n");
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_ANYCHAR:
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_ANYSPACE:
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTSPACE:
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_INITNAME:
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTINITNAME:
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NAMECHAR:
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTNAMECHAR:
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_DECIMAL:
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTDECIMAL:
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_REALCHAR:
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NOTREALCHAR:
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER:
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_UPPERCASE:
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_LOWERCASE:
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_TITLECASE:
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_MODIFIER:
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_LETTER_OTHERS:
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK:
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_NONSPACING:
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_SPACECOMBINING:
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_MARK_ENCLOSING:
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER:
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_DECIMAL:
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_LETTER:
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_NUMBER_OTHERS:
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT:
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CONNECTOR:
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_DASH:
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OPEN:
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_CLOSE:
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_INITQUOTE:
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_FINQUOTE:
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_PUNCT_OTHERS:
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR:
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_SPACE:
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_LINE:
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SEPAR_PARA:
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL:
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MATH:
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_CURRENCY:
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_MODIFIER:
3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_SYMBOL_OTHERS:
3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER:
3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_CONTROL:
3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_FORMAT:
3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_PRIVATE:
3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_REGEXP_OTHER_NA:
3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_REGEXP_BLOCK_NAME:
3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlRegCheckCharacterRange(atom->type, codepoint, 0, 0, 0,
3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                            (const xmlChar *)atom->valuep);
3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (atom->neg)
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = !ret;
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
306394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	Saving and restoring state of an execution context		*
306594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegDebugExec(xmlRegExecCtxtPtr exec) {
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("state: %d:%d:idx %d", exec->state->no, exec->transno, exec->index);
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->inputStack != NULL) {
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf(": ");
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;(i < 3) && (i < exec->inputStackNr);i++)
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("%s ", (const char *)
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           exec->inputStack[exec->inputStackNr - (i + 1)].value);
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf(": %s", &(exec->inputString[exec->index]));
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("\n");
3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecSave(xmlRegExecCtxtPtr exec) {
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("saving ");
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->transno++;
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFARegDebugExec(exec);
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->transno--;
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef MAX_PUSH
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->nbPush > MAX_PUSH) {
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->nbPush++;
3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->maxRollbacks == 0) {
3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->maxRollbacks = 4;
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->rollbacks = (xmlRegExecRollback *) xmlMalloc(exec->maxRollbacks *
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             sizeof(xmlRegExecRollback));
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->rollbacks == NULL) {
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(NULL, "saving regexp");
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->maxRollbacks = 0;
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(exec->rollbacks, 0,
3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       exec->maxRollbacks * sizeof(xmlRegExecRollback));
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (exec->nbRollbacks >= exec->maxRollbacks) {
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegExecRollback *tmp;
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int len = exec->maxRollbacks;
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->maxRollbacks *= 2;
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (xmlRegExecRollback *) xmlRealloc(exec->rollbacks,
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->maxRollbacks * sizeof(xmlRegExecRollback));
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(NULL, "saving regexp");
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->maxRollbacks /= 2;
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->rollbacks = tmp;
3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = &exec->rollbacks[len];
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(tmp, 0, (exec->maxRollbacks - len) * sizeof(xmlRegExecRollback));
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->rollbacks[exec->nbRollbacks].state = exec->state;
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->rollbacks[exec->nbRollbacks].index = exec->index;
3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->rollbacks[exec->nbRollbacks].nextbranch = exec->transno + 1;
3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->comp->nbCounters > 0) {
3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->rollbacks[exec->nbRollbacks].counts == NULL) {
3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->rollbacks[exec->nbRollbacks].counts = (int *)
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlMalloc(exec->comp->nbCounters * sizeof(int));
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->rollbacks[exec->nbRollbacks].counts == NULL) {
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegexpErrMemory(NULL, "saving regexp");
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->status = -5;
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return;
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(exec->rollbacks[exec->nbRollbacks].counts, exec->counts,
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       exec->comp->nbCounters * sizeof(int));
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->nbRollbacks++;
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecRollBack(xmlRegExecCtxtPtr exec) {
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->nbRollbacks <= 0) {
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->status = -1;
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("rollback failed on empty stack\n");
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->nbRollbacks--;
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->state = exec->rollbacks[exec->nbRollbacks].state;
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->index = exec->rollbacks[exec->nbRollbacks].index;
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->transno = exec->rollbacks[exec->nbRollbacks].nextbranch;
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->comp->nbCounters > 0) {
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->rollbacks[exec->nbRollbacks].counts == NULL) {
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(stderr, "exec save: allocation failed");
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->status = -6;
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts,
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       exec->comp->nbCounters * sizeof(int));
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("restored ");
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFARegDebugExec(exec);
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
317694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	Verifier, running an input against a compiled regexp		*
317894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) {
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxt execval;
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr exec = &execval;
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, codepoint = 0, len, deter;
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputString = content;
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->index = 0;
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->nbPush = 0;
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->determinist = 1;
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->maxRollbacks = 0;
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->nbRollbacks = 0;
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->rollbacks = NULL;
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->status = 0;
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->comp = comp;
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->state = comp->states[0];
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->transno = 0;
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->transcount = 0;
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStack = NULL;
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStackMax = 0;
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->nbCounters > 0) {
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int));
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->counts == NULL) {
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(NULL, "running regexp");
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(exec->counts, 0, comp->nbCounters * sizeof(int));
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->counts = NULL;
321094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    while ((exec->status == 0) && (exec->state != NULL) &&
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   ((exec->inputString[exec->index] != 0) ||
321260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    ((exec->state != NULL) &&
321360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	     (exec->state->type != XML_REGEXP_FINAL_STATE)))) {
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegTransPtr trans;
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegAtomPtr atom;
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * If end of input on non-terminal state, rollback, however we may
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * still have epsilon like transition for counted transitions
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * on counters, in that case don't break too early.  Additionally,
3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * if we are working on a range like "AB{0,2}", where B is not present,
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * we don't want to break.
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len = 1;
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) {
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * if there is a transition, we must check if
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     *  atom allows minOccurs of 0
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->transno < exec->state->nbTrans) {
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        trans = &exec->state->trans[exec->transno];
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->to >=0) {
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    atom = trans->atom;
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!((atom->min == 0) && (atom->max > 0)))
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        goto rollback;
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        goto rollback;
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->transcount = 0;
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (;exec->transno < exec->state->nbTrans;exec->transno++) {
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    trans = &exec->state->trans[exec->transno];
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->to < 0)
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom = trans->atom;
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    deter = 1;
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->count >= 0) {
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int count;
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegCounterPtr counter;
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (exec->counts == NULL) {
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->status = -1;
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * A counted transition.
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		count = exec->counts[trans->count];
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		counter = &exec->comp->counters[trans->count];
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("testing count %d: val %d, min %d, max %d\n",
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       trans->count, count, counter->min,  counter->max);
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = ((count >= counter->min) && (count <= counter->max));
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret) && (counter->min != counter->max))
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    deter = 0;
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (atom == NULL) {
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(stderr, "epsilon transition left at runtime\n");
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->status = -2;
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (exec->inputString[exec->index] != 0) {
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len);
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlRegCheckCharacter(atom, codepoint);
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret == 1) && (atom->min >= 0) && (atom->max > 0)) {
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegStatePtr to = comp->states[trans->to];
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * this is a multiple input sequence
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * If there is a counter associated increment it now.
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * before potentially saving and rollback
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * do not increment if the counter is already over the
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * maximum limit in which case get to next transition
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (trans->counter >= 0) {
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlRegCounterPtr counter;
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((exec->counts == NULL) ||
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (exec->comp == NULL) ||
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (exec->comp->counters == NULL)) {
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->status = -1;
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto error;
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			counter = &exec->comp->counters[trans->counter];
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->counts[trans->counter] >= counter->max)
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    continue; /* for loop on transitions */
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("Increasing count %d\n", trans->counter);
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->counts[trans->counter]++;
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->state->nbTrans > exec->transno + 1) {
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFARegExecSave(exec);
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->transcount = 1;
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 * Try to progress as much as possible on the input
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 */
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->transcount == atom->max) {
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->index += len;
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 * End of input: stop here
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 */
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->inputString[exec->index] == 0) {
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->index -= len;
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->transcount >= atom->min) {
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int transno = exec->transno;
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlRegStatePtr state = exec->state;
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     * The transition is acceptable save it
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     */
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->transno = -1; /* trick */
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->state = to;
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFARegExecSave(exec);
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->transno = transno;
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->state = state;
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			codepoint = CUR_SCHAR(&(exec->inputString[exec->index]),
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				              len);
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlRegCheckCharacter(atom, codepoint);
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->transcount++;
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (ret == 1);
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->transcount < atom->min)
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * If the last check failed but one transition was found
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * possible, rollback
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0)
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == 0) {
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto rollback;
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (trans->counter >= 0) {
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->counts == NULL) {
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->status = -1;
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto error;
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("Decreasing count %d\n", trans->counter);
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->counts[trans->counter]--;
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((ret == 0) && (atom->min == 0) && (atom->max > 0)) {
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * we don't match on the codepoint, but minOccurs of 0
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * says that's ok.  Setting len to 0 inhibits stepping
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * over the codepoint.
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->transcount = 1;
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    len = 0;
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((atom->min == 0) && (atom->max > 0)) {
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        /* another spot to match when minOccurs is 0 */
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->transcount = 1;
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len = 0;
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 1) {
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((trans->nd == 1) ||
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((trans->count >= 0) && (deter == 0) &&
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (exec->state->nbTrans > exec->transno + 1))) {
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (trans->nd == 1)
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        printf("Saving on nd transition atom %d for %c at %d\n",
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       trans->atom->no, codepoint, exec->index);
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        printf("Saving on counted transition count %d for %c at %d\n",
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       trans->count, codepoint, exec->index);
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFARegExecSave(exec);
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->counter >= 0) {
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegCounterPtr counter;
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* make sure we don't go over the counter maximum value */
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((exec->counts == NULL) ||
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(exec->comp == NULL) ||
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(exec->comp->counters == NULL)) {
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->status = -1;
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto error;
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    counter = &exec->comp->counters[trans->counter];
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->counts[trans->counter] >= counter->max)
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			continue; /* for loop on transitions */
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Increasing count %d\n", trans->counter);
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->counts[trans->counter]++;
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((trans->count >= 0) &&
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (trans->count < REGEXP_ALL_COUNTER)) {
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->counts == NULL) {
3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        exec->status = -1;
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto error;
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("resetting count %d on transition\n",
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		           trans->count);
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->counts[trans->count] = 0;
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("entering state %d\n", trans->to);
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->state = comp->states[trans->to];
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->transno = 0;
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->atom != NULL) {
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->index += len;
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto progress;
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (ret < 0) {
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->status = -4;
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((exec->transno != 0) || (exec->state->nbTrans == 0)) {
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback:
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Failed to find a way out
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->determinist = 0;
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("rollback from state %d on %d:%c\n", exec->state->no,
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           codepoint,codepoint);
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFARegExecRollBack(exec);
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress:
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	continue;
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->rollbacks != NULL) {
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->counts != NULL) {
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < exec->maxRollbacks;i++)
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (exec->rollbacks[i].counts != NULL)
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(exec->rollbacks[i].counts);
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(exec->rollbacks);
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
346494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (exec->state == NULL)
346594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        return(-1);
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->counts != NULL)
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(exec->counts);
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->status == 0)
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->status == -1) {
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->nbPush > MAX_PUSH)
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(exec->status);
3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
347994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	Progressive interface to the verifier one atom at a time	*
348194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void testerr(xmlRegExecCtxtPtr exec);
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegNewExecCtxt:
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: a precompiled regular expression
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @callback: a callback function used for handling progresses in the
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *            automata matching phase
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: the context data associated to the callback in this context
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a context used for progressive evaluation of a regexp.
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new context
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecCtxtPtr
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegNewExecCtxt(xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data) {
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr exec;
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp == NULL)
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((comp->compact == NULL) && (comp->states == NULL))
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec = (xmlRegExecCtxtPtr) xmlMalloc(sizeof(xmlRegExecCtxt));
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL) {
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegexpErrMemory(NULL, "creating execution context");
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(exec, 0, sizeof(xmlRegExecCtxt));
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputString = NULL;
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->index = 0;
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->determinist = 1;
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->maxRollbacks = 0;
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->nbRollbacks = 0;
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->rollbacks = NULL;
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->status = 0;
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->comp = comp;
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->compact == NULL)
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->state = comp->states[0];
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->transno = 0;
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->transcount = 0;
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->callback = callback;
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->data = data;
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->nbCounters > 0) {
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * For error handling, exec->counts is allocated twice the size
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * the second half is used to store the data in case of rollback
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int)
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                 * 2);
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->counts == NULL) {
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(NULL, "creating execution context");
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(exec);
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(exec->counts, 0, comp->nbCounters * sizeof(int) * 2);
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->errCounts = &exec->counts[comp->nbCounters];
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->counts = NULL;
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->errCounts = NULL;
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStackMax = 0;
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStackNr = 0;
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStack = NULL;
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->errStateNo = -1;
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->errString = NULL;
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->nbPush = 0;
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(exec);
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeExecCtxt:
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regular expression evaulation context
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the structures associated to a regular expression evaulation context.
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeExecCtxt(xmlRegExecCtxtPtr exec) {
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL)
3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->rollbacks != NULL) {
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->counts != NULL) {
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0;i < exec->maxRollbacks;i++)
3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (exec->rollbacks[i].counts != NULL)
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(exec->rollbacks[i].counts);
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(exec->rollbacks);
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->counts != NULL)
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(exec->counts);
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->inputStack != NULL) {
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < exec->inputStackNr;i++) {
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->inputStack[i].value != NULL)
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(exec->inputStack[i].value);
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(exec->inputStack);
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->errString != NULL)
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(exec->errString);
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(exec);
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value,
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                    void *data) {
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("saving value: %d:%s\n", exec->inputStackNr, value);
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->inputStackMax == 0) {
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->inputStackMax = 4;
359894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	exec->inputStack = (xmlRegInputTokenPtr)
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(exec->inputStackMax * sizeof(xmlRegInputToken));
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (exec->inputStack == NULL) {
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(NULL, "pushing input string");
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->inputStackMax = 0;
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (exec->inputStackNr + 1 >= exec->inputStackMax) {
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegInputTokenPtr tmp;
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->inputStackMax *= 2;
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = (xmlRegInputTokenPtr) xmlRealloc(exec->inputStack,
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->inputStackMax * sizeof(xmlRegInputToken));
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegexpErrMemory(NULL, "pushing input string");
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->inputStackMax /= 2;
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->inputStack = tmp;
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStack[exec->inputStackNr].value = xmlStrdup(value);
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStack[exec->inputStackNr].data = data;
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStackNr++;
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStack[exec->inputStackNr].value = NULL;
3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->inputStack[exec->inputStackNr].data = NULL;
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegStrEqualWildcard:
362794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @expStr:  the string to be evaluated
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valStr:  the validation string
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if both strings are equal or have the same content. "*"
363194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * can be used as a wildcard in @valStr; "|" is used as a seperator of
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substrings in both @expStr and @valStr.
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the comparison is satisfied and the number of substrings
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is equal, 0 otherwise.
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr) {
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (expStr == valStr) return(1);
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (expStr == NULL) return(0);
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (valStr == NULL) return(0);
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Eval if we have a wildcard for the current item.
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*expStr != *valStr) {
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* if one of them starts with a wildcard make valStr be it */
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*valStr == '*') {
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        const xmlChar *tmp;
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = valStr;
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		valStr = expStr;
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		expStr = tmp;
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((*valStr != 0) && (*expStr != 0) && (*expStr++ == '*')) {
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*valStr == XML_REG_STRING_SEPARATOR)
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valStr++;
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (*valStr != 0);
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	expStr++;
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valStr++;
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*valStr != 0);
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*expStr != 0)
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegCompactPushString:
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the precompiled exec with a compact table
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     a negative value in case of error.
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegCompactPushString(xmlRegExecCtxtPtr exec,
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                xmlRegexpPtr comp,
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                const xmlChar *value,
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                void *data) {
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int state = exec->index;
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, target;
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((comp == NULL) || (comp->compact == NULL) || (comp->stringMap == NULL))
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
369794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) {
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * are we at a final state ?
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (comp->compact[state * (comp->nbstrings + 1)] ==
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            XML_REGEXP_FINAL_STATE)
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("value pushed: %s\n", value);
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Examine all outside transitions from current state
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < comp->nbstrings;i++) {
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	target = comp->compact[state * (comp->nbstrings + 1) + i + 1];
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((target > 0) && (target <= comp->nbstates)) {
371894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    target--; /* to avoid 0 */
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlRegStrEqualWildcard(comp->stringMap[i], value)) {
372094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		exec->index = target;
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((exec->callback != NULL) && (comp->transdata != NULL)) {
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->callback(exec->data, value,
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  comp->transdata[state * comp->nbstrings + i], data);
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("entering state %d\n", target);
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (comp->compact[target * (comp->nbstrings + 1)] ==
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_REGEXP_SINK_STATE)
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto error;
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (comp->compact[target * (comp->nbstrings + 1)] ==
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_REGEXP_FINAL_STATE)
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(1);
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Failed to find an exit transition out from current state for the
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * current token
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("failed to find a transition for %s on state %d\n", value, state);
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->errString != NULL)
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(exec->errString);
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->errString = xmlStrdup(value);
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->errStateNo = state;
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec->status = -1;
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    testerr(exec);
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushStringInternal:
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @compound: value was assembled from 2 strings
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     a negative value in case of error.
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value,
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                     void *data, int compound) {
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegTransPtr trans;
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int final = 0;
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int progress = 1;
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL)
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->comp == NULL)
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->status != 0)
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(exec->status);
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->comp->compact != NULL)
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlRegCompactPushString(exec, exec->comp, value, data));
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) {
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (exec->state->type == XML_REGEXP_FINAL_STATE)
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	final = 1;
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("value pushed: %s\n", value);
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * If we have an active rollback stack push the new value there
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * and get back to where we were left
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((value != NULL) && (exec->inputStackNr > 0)) {
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFARegExecSaveInputString(exec, value, data);
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	value = exec->inputStack[exec->index].value;
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	data = exec->inputStack[exec->index].data;
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("value loaded: %s\n", value);
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((exec->status == 0) &&
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   ((value != NULL) ||
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((final == 1) &&
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (exec->state->type != XML_REGEXP_FINAL_STATE)))) {
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * End of input on non-terminal state, rollback, however we may
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * still have epsilon like transition for counted transitions
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * on counters, in that case don't break too early.
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((value == NULL) && (exec->counts == NULL))
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto rollback;
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->transcount = 0;
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (;exec->transno < exec->state->nbTrans;exec->transno++) {
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    trans = &exec->state->trans[exec->transno];
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->to < 0)
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom = trans->atom;
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->count == REGEXP_ALL_LAX_COUNTER) {
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int count;
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegTransPtr t;
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegCounterPtr counter;
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("testing all lax %d\n", trans->count);
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Check all counted transitions from the current state
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((value == NULL) && (final)) {
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (value != NULL) {
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (i = 0;i < exec->state->nbTrans;i++) {
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			t = &exec->state->trans[i];
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((t->counter < 0) || (t == trans))
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    continue;
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			counter = &exec->comp->counters[t->counter];
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			count = exec->counts[t->counter];
385494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			if ((count < counter->max) &&
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		            (t->atom != NULL) &&
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (xmlStrEqual(value, t->atom->valuep))) {
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 0;
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((count >= counter->min) &&
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (count < counter->max) &&
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (t->atom != NULL) &&
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (xmlStrEqual(value, t->atom->valuep))) {
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = 1;
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (trans->count == REGEXP_ALL_COUNTER) {
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int count;
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegTransPtr t;
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegCounterPtr counter;
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("testing all %d\n", trans->count);
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Check all counted transitions from the current state
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0;i < exec->state->nbTrans;i++) {
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    t = &exec->state->trans[i];
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((t->counter < 0) || (t == trans))
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			continue;
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    counter = &exec->comp->counters[t->counter];
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    count = exec->counts[t->counter];
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((count < counter->min) || (count > counter->max)) {
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (trans->count >= 0) {
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int count;
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegCounterPtr counter;
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * A counted transition.
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		count = exec->counts[trans->count];
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		counter = &exec->comp->counters[trans->count];
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("testing count %d: val %d, min %d, max %d\n",
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       trans->count, count, counter->min,  counter->max);
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = ((count >= counter->min) && (count <= counter->max));
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (atom == NULL) {
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(stderr, "epsilon transition left at runtime\n");
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->status = -2;
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (value != NULL) {
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlRegStrEqualWildcard(atom->valuep, value);
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (atom->neg) {
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = !ret;
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!compound)
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ret = 0;
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret == 1) && (trans->counter >= 0)) {
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegCounterPtr counter;
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int count;
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    count = exec->counts[trans->counter];
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    counter = &exec->comp->counters[trans->counter];
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (count >= counter->max)
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) {
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegStatePtr to = exec->comp->states[trans->to];
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * this is a multiple input sequence
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->state->nbTrans > exec->transno + 1) {
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->inputStackNr <= 0) {
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFARegExecSaveInputString(exec, value, data);
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFARegExecSave(exec);
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->transcount = 1;
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 * Try to progress as much as possible on the input
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 */
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->transcount == atom->max) {
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->index++;
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value = exec->inputStack[exec->index].value;
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			data = exec->inputStack[exec->index].data;
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("value loaded: %s\n", value);
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 * End of input: stop here
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 */
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (value == NULL) {
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->index --;
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->transcount >= atom->min) {
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int transno = exec->transno;
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlRegStatePtr state = exec->state;
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     * The transition is acceptable save it
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     */
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->transno = -1; /* trick */
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->state = to;
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (exec->inputStackNr <= 0) {
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlFARegExecSaveInputString(exec, value, data);
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFARegExecSave(exec);
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->transno = transno;
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->state = state;
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlStrEqual(value, atom->valuep);
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->transcount++;
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (ret == 1);
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->transcount < atom->min)
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * If the last check failed but one transition was found
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * possible, rollback
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0)
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == 0) {
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto rollback;
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 1) {
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((exec->callback != NULL) && (atom != NULL) &&
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(data != NULL)) {
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->callback(exec->data, atom->valuep,
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			           atom->data, data);
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (exec->state->nbTrans > exec->transno + 1) {
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->inputStackNr <= 0) {
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFARegExecSaveInputString(exec, value, data);
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFARegExecSave(exec);
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->counter >= 0) {
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Increasing count %d\n", trans->counter);
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->counts[trans->counter]++;
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((trans->count >= 0) &&
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (trans->count < REGEXP_ALL_COUNTER)) {
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("resetting count %d on transition\n",
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		           trans->count);
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->counts[trans->count] = 0;
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("entering state %d\n", trans->to);
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((exec->comp->states[trans->to] != NULL) &&
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (exec->comp->states[trans->to]->type ==
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     XML_REGEXP_SINK_STATE)) {
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * entering a sink state, save the current state as error
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * state.
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->errString != NULL)
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(exec->errString);
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->errString = xmlStrdup(value);
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->errState = exec->state;
4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memcpy(exec->errCounts, exec->counts,
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   exec->comp->nbCounters * sizeof(int));
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->state = exec->comp->states[trans->to];
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->transno = 0;
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->atom != NULL) {
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->inputStack != NULL) {
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->index++;
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->index < exec->inputStackNr) {
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value = exec->inputStack[exec->index].value;
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    data = exec->inputStack[exec->index].data;
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("value loaded: %s\n", value);
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value = NULL;
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    data = NULL;
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("end of input\n");
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value = NULL;
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			data = NULL;
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("end of input\n");
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto progress;
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (ret < 0) {
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->status = -4;
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((exec->transno != 0) || (exec->state->nbTrans == 0)) {
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback:
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * if we didn't yet rollback on the current input
4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * store the current state as the error state.
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((progress) && (exec->state != NULL) &&
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (exec->state->type != XML_REGEXP_SINK_STATE)) {
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        progress = 0;
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (exec->errString != NULL)
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(exec->errString);
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->errString = xmlStrdup(value);
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->errState = exec->state;
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memcpy(exec->errCounts, exec->counts,
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       exec->comp->nbCounters * sizeof(int));
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Failed to find a way out
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->determinist = 0;
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFARegExecRollBack(exec);
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->status == 0) {
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = exec->inputStack[exec->index].value;
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		data = exec->inputStack[exec->index].data;
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("value loaded: %s\n", value);
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	continue;
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress:
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        progress = 1;
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	continue;
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->status == 0) {
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(exec->state->type == XML_REGEXP_FINAL_STATE);
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->status < 0) {
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	testerr(exec);
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(exec->status);
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushString:
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a string token input
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context
4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     a negative value in case of error.
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value,
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	             void *data) {
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlRegExecPushStringInternal(exec, value, data, 0));
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecPushString2:
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context or NULL to indicate the end
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the first string token input
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second string token input
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data associated to the token to reuse in callbacks
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push one input token in the execution context
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 if the regexp reached a final state, 0 if non-final, and
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     a negative value in case of error.
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value,
4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      const xmlChar *value2, void *data) {
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar buf[150];
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int lenn, lenp, ret;
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str;
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL)
4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->comp == NULL)
4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->status != 0)
4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(exec->status);
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value2 == NULL)
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlRegExecPushString(exec, value, data));
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lenn = strlen((char *) value2);
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lenp = strlen((char *) value);
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (150 < lenn + lenp + 2) {
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2);
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (str == NULL) {
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->status = -1;
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = buf;
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(&str[0], value, lenp);
4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str[lenp] = XML_REG_STRING_SEPARATOR;
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(&str[lenp + 1], value2, lenn);
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    str[lenn + lenp + 1] = 0;
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->comp->compact != NULL)
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlRegCompactPushString(exec, exec->comp, str, data);
4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRegExecPushStringInternal(exec, str, data, 1);
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str != buf)
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(str);
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecGetValues:
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: error extraction or normal one
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract informations from the regexp execution, internal routine to
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implement xmlRegExecNextValues() and xmlRegExecErrInfo()
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error.
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err,
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int *nbval, int *nbneg,
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar **values, int *terminal) {
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxval;
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb = 0;
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
421294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) ||
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (values == NULL) || (*nbval <= 0))
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    maxval = *nbval;
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *nbval = 0;
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *nbneg = 0;
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exec->comp != NULL) && (exec->comp->compact != NULL)) {
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegexpPtr comp;
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int target, i, state;
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        comp = exec->comp;
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (err) {
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->errStateNo == -1) return(-1);
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state = exec->errStateNo;
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state = exec->index;
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (terminal != NULL) {
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (comp->compact[state * (comp->nbstrings + 1)] ==
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        XML_REGEXP_FINAL_STATE)
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*terminal = 1;
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*terminal = 0;
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) {
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    target = comp->compact[state * (comp->nbstrings + 1) + i + 1];
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((target > 0) && (target <= comp->nbstates) &&
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (comp->compact[(target - 1) * (comp->nbstrings + 1)] !=
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 XML_REGEXP_SINK_STATE)) {
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        values[nb++] = comp->stringMap[i];
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(*nbval)++;
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) {
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    target = comp->compact[state * (comp->nbstrings + 1) + i + 1];
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((target > 0) && (target <= comp->nbstates) &&
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (comp->compact[(target - 1) * (comp->nbstrings + 1)] ==
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 XML_REGEXP_SINK_STATE)) {
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        values[nb++] = comp->stringMap[i];
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(*nbneg)++;
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int transno;
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegTransPtr trans;
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegAtomPtr atom;
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePtr state;
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (terminal != NULL) {
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->state->type == XML_REGEXP_FINAL_STATE)
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*terminal = 1;
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*terminal = 0;
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (err) {
4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->errState == NULL) return(-1);
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state = exec->errState;
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exec->state == NULL) return(-1);
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    state = exec->state;
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (transno = 0;
4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (transno < state->nbTrans) && (nb < maxval);
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     transno++) {
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    trans = &state->trans[transno];
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->to < 0)
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom = trans->atom;
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((atom == NULL) || (atom->valuep == NULL))
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->count == REGEXP_ALL_LAX_COUNTER) {
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        /* this should not be reached but ... */
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        TODO;
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (trans->count == REGEXP_ALL_COUNTER) {
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        /* this should not be reached but ... */
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        TODO;
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (trans->counter >= 0) {
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegCounterPtr counter = NULL;
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int count;
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (err)
4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    count = exec->errCounts[trans->counter];
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    count = exec->counts[trans->counter];
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (exec->comp != NULL)
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    counter = &exec->comp->counters[trans->counter];
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((counter == NULL) || (count < counter->max)) {
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (atom->neg)
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			values[nb++] = (xmlChar *) atom->valuep2;
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			values[nb++] = (xmlChar *) atom->valuep;
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (*nbval)++;
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((exec->comp->states[trans->to] != NULL) &&
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (exec->comp->states[trans->to]->type !=
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     XML_REGEXP_SINK_STATE)) {
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (atom->neg)
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			values[nb++] = (xmlChar *) atom->valuep2;
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			values[nb++] = (xmlChar *) atom->valuep;
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (*nbval)++;
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
431894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (transno = 0;
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (transno < state->nbTrans) && (nb < maxval);
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     transno++) {
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    trans = &state->trans[transno];
4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->to < 0)
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom = trans->atom;
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((atom == NULL) || (atom->valuep == NULL))
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->count == REGEXP_ALL_LAX_COUNTER) {
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        continue;
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (trans->count == REGEXP_ALL_COUNTER) {
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        continue;
4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (trans->counter >= 0) {
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        continue;
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((exec->comp->states[trans->to] != NULL) &&
4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (exec->comp->states[trans->to]->type ==
4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     XML_REGEXP_SINK_STATE)) {
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (atom->neg)
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			values[nb++] = (xmlChar *) atom->valuep2;
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			values[nb++] = (xmlChar *) atom->valuep;
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (*nbneg)++;
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
434594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    }
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecNextValues:
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract informations from the regexp execution,
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parameter @values must point to an array of @nbval string pointers
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on return nbval will contain the number of possible strings in that
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state and the @values array will be updated with them. The string values
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned will be freed with the @exec context and don't need to be
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deallocated.
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error.
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, int *nbneg,
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlChar **values, int *terminal) {
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlRegExecGetValues(exec, 0, nbval, nbneg, values, terminal));
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegExecErrInfo:
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec: a regexp execution context generating an error
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string: return value for the error string
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbval: pointer to the number of accepted values IN/OUT
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nbneg: return number of negative transitions
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @values: pointer to the array of acceptable values
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminal: return value if this was a terminal state
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract error informations from the regexp execution, the parameter
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string will be updated with the value pushed and not accepted,
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parameter @values must point to an array of @nbval string pointers
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on return nbval will contain the number of possible strings in that
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state and the @values array will be updated with them. The string values
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned will be freed with the @exec context and don't need to be
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deallocated.
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 0 in case of success or -1 in case of error.
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string,
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  int *nbval, int *nbneg, xmlChar **values, int *terminal) {
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL)
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (string != NULL) {
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (exec->status != 0)
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *string = exec->errString;
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *string = NULL;
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlRegExecGetValues(exec, 1, nbval, nbneg, values, terminal));
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERR
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void testerr(xmlRegExecCtxtPtr exec) {
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *string;
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *values[5];
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb = 5;
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbneg;
4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int terminal;
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecErrInfo(exec, &string, &nb, &nbneg, &values[0], &terminal);
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegExecPushChar(xmlRegExecCtxtPtr exec, int UCS) {
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegTransPtr trans;
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int codepoint, len;
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL)
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec->status != 0)
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(exec->status);
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((exec->status == 0) &&
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   ((exec->inputString[exec->index] != 0) ||
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (exec->state->type != XML_REGEXP_FINAL_STATE))) {
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * End of input on non-terminal state, rollback, however we may
4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * still have epsilon like transition for counted transitions
4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * on counters, in that case don't break too early.
4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL))
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto rollback;
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exec->transcount = 0;
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (;exec->transno < exec->state->nbTrans;exec->transno++) {
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    trans = &exec->state->trans[exec->transno];
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->to < 0)
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    atom = trans->atom;
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (trans->count >= 0) {
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int count;
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegCounterPtr counter;
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * A counted transition.
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		count = exec->counts[trans->count];
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		counter = &exec->comp->counters[trans->count];
4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("testing count %d: val %d, min %d, max %d\n",
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       trans->count, count, counter->min,  counter->max);
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = ((count >= counter->min) && (count <= counter->max));
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (atom == NULL) {
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(stderr, "epsilon transition left at runtime\n");
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->status = -2;
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (exec->inputString[exec->index] != 0) {
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len);
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlRegCheckCharacter(atom, codepoint);
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) {
4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegStatePtr to = exec->comp->states[trans->to];
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * this is a multiple input sequence
4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->state->nbTrans > exec->transno + 1) {
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFARegExecSave(exec);
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->transcount = 1;
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 * Try to progress as much as possible on the input
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 */
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->transcount == atom->max) {
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->index += len;
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 * End of input: stop here
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 */
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->inputString[exec->index] == 0) {
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->index -= len;
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exec->transcount >= atom->min) {
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int transno = exec->transno;
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlRegStatePtr state = exec->state;
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     * The transition is acceptable save it
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     */
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->transno = -1; /* trick */
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->state = to;
4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFARegExecSave(exec);
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->transno = transno;
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exec->state = state;
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			codepoint = CUR_SCHAR(&(exec->inputString[exec->index]),
4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				              len);
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlRegCheckCharacter(atom, codepoint);
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exec->transcount++;
4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (ret == 1);
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exec->transcount < atom->min)
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * If the last check failed but one transition was found
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * possible, rollback
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0)
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 0;
4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == 0) {
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto rollback;
4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 1) {
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (exec->state->nbTrans > exec->transno + 1) {
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFARegExecSave(exec);
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * restart count for expressions like this ((abc){2})*
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->count >= 0) {
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Reset count %d\n", trans->count);
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->counts[trans->count] = 0;
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->counter >= 0) {
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Increasing count %d\n", trans->counter);
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->counts[trans->counter]++;
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_EXEC
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("entering state %d\n", trans->to);
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->state = exec->comp->states[trans->to];
4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->transno = 0;
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (trans->atom != NULL) {
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exec->index += len;
4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto progress;
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (ret < 0) {
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exec->status = -4;
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((exec->transno != 0) || (exec->state->nbTrans == 0)) {
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback:
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Failed to find a way out
4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exec->determinist = 0;
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFARegExecRollBack(exec);
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectprogress:
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	continue;
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
457694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	Parser for the Schemas Datatype Regular Expressions		*
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *	http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#regexs	*
457994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAIsChar:
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [10]   Char   ::=   [^.\?*+()|#x5B#x5D]
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAIsChar(xmlRegParserCtxtPtr ctxt) {
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cur;
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = CUR_SCHAR(ctxt->cur, len);
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == '.') || (cur == '\\') || (cur == '?') ||
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == '*') || (cur == '+') || (cur == '(') ||
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == ')') || (cur == '|') || (cur == 0x5B) ||
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == 0x5D) || (cur == 0))
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(cur);
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharProp:
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [27]   charProp   ::=   IsCategory | IsBlock
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [28]   IsCategory ::= Letters | Marks | Numbers | Punctuation |
460894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *                       Separators | Symbols | Others
4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29]   Letters   ::=   'L' [ultmo]?
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30]   Marks   ::=   'M' [nce]?
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [31]   Numbers   ::=   'N' [dlo]?
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [32]   Punctuation   ::=   'P' [cdseifo]?
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [33]   Separators   ::=   'Z' [slp]?
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [34]   Symbols   ::=   'S' [mcko]?
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [35]   Others   ::=   'C' [cfon]?
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [36]   IsBlock   ::=   'Is' [a-zA-Z0-9#x2D]+
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) {
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cur;
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomType type = (xmlRegAtomType) 0;
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *blockName = NULL;
462394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = CUR;
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == 'L') {
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == 'u') {
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_LETTER_UPPERCASE;
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'l') {
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_LETTER_LOWERCASE;
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 't') {
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_LETTER_TITLECASE;
4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'm') {
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_LETTER_MODIFIER;
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'o') {
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_LETTER_OTHERS;
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_LETTER;
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'M') {
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == 'n') {
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* nonspacing */
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_MARK_NONSPACING;
4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'c') {
4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* spacing combining */
4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_MARK_SPACECOMBINING;
4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'e') {
4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* enclosing */
4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_MARK_ENCLOSING;
4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* all marks */
4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_MARK;
4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'N') {
4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == 'd') {
4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* digital */
4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_NUMBER_DECIMAL;
4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'l') {
4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* letter */
4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_NUMBER_LETTER;
4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'o') {
4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* other */
4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_NUMBER_OTHERS;
4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* all numbers */
4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_NUMBER;
4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'P') {
4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == 'c') {
4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* connector */
4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT_CONNECTOR;
4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'd') {
4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* dash */
4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT_DASH;
4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 's') {
4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* open */
4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT_OPEN;
4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'e') {
4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* close */
4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT_CLOSE;
4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'i') {
4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* initial quote */
4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT_INITQUOTE;
4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'f') {
4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* final quote */
4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT_FINQUOTE;
4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'o') {
4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* other */
4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT_OTHERS;
4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* all punctuation */
4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_PUNCT;
4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'Z') {
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == 's') {
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* space */
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SEPAR_SPACE;
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'l') {
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* line */
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SEPAR_LINE;
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'p') {
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* paragraph */
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SEPAR_PARA;
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* all separators */
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SEPAR;
4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'S') {
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == 'm') {
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SYMBOL_MATH;
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* math */
4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'c') {
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SYMBOL_CURRENCY;
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* currency */
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'k') {
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SYMBOL_MODIFIER;
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* modifiers */
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'o') {
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SYMBOL_OTHERS;
4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* other */
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* all symbols */
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_SYMBOL;
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'C') {
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur == 'c') {
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* control */
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_OTHER_CONTROL;
4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'f') {
4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* format */
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_OTHER_FORMAT;
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'o') {
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* private use */
4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_OTHER_PRIVATE;
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (cur == 'n') {
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* not assigned */
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_OTHER_NA;
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* all others */
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = XML_REGEXP_OTHER;
4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'I') {
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *start;
4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur != 's') {
4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("IsXXXX expected");
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	start = ctxt->cur;
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
479594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	if (((cur >= 'a') && (cur <= 'z')) ||
479694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    ((cur >= 'A') && (cur <= 'Z')) ||
479794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    ((cur >= '0') && (cur <= '9')) ||
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur == 0x2D)) {
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = CUR;
480194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    while (((cur >= 'a') && (cur <= 'z')) ||
480294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		((cur >= 'A') && (cur <= 'Z')) ||
480394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		((cur >= '0') && (cur <= '9')) ||
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur == 0x2D)) {
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = CUR;
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = XML_REGEXP_BLOCK_NAME;
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	blockName = xmlStrndup(start, ctxt->cur - start);
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("Unknown char property");
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->atom == NULL) {
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom = xmlRegNewAtom(ctxt, type);
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom != NULL)
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom->valuep = blockName;
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->atom->type == XML_REGEXP_RANGES) {
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg,
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		           type, 0, 0, blockName);
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharClassEsc:
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
482994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc )
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E]
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [25] catEsc   ::=   '\p{' charProp '}'
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [26] complEsc ::=   '\P{' charProp '}'
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [37] MultiCharEsc ::= '.' | ('\' [sSiIcCdDwW])
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) {
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cur;
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '.') {
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom == NULL) {
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_ANYCHAR);
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ctxt->atom->type == XML_REGEXP_RANGES) {
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg,
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       XML_REGEXP_ANYCHAR, 0, 0, NULL);
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '\\') {
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("Escaped sequence: expecting \\");
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = CUR;
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == 'p') {
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != '{') {
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("Expecting '{'");
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAParseCharProp(ctxt);
4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != '}') {
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("Expecting '}'");
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (cur == 'P') {
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != '{') {
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("Expecting '{'");
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAParseCharProp(ctxt);
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom->neg = 1;
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != '}') {
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("Expecting '}'");
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((cur == 'n') || (cur == 'r') || (cur == 't') || (cur == '\\') ||
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == '|') || (cur == '.') || (cur == '?') || (cur == '*') ||
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == '+') || (cur == '(') || (cur == ')') || (cur == '{') ||
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == '}') || (cur == 0x2D) || (cur == 0x5B) || (cur == 0x5D) ||
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == 0x5E)) {
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom == NULL) {
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL);
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->atom != NULL) {
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        switch (cur) {
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case 'n':
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ctxt->atom->codepoint = '\n';
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case 'r':
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ctxt->atom->codepoint = '\r';
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case 't':
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        ctxt->atom->codepoint = '\t';
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    default:
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->atom->codepoint = cur;
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ctxt->atom->type == XML_REGEXP_RANGES) {
4905df143a5041f03a22808b59c76698770b74692815Selim Gurun            switch (cur) {
4906df143a5041f03a22808b59c76698770b74692815Selim Gurun                case 'n':
4907df143a5041f03a22808b59c76698770b74692815Selim Gurun                    cur = '\n';
4908df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
4909df143a5041f03a22808b59c76698770b74692815Selim Gurun                case 'r':
4910df143a5041f03a22808b59c76698770b74692815Selim Gurun                    cur = '\r';
4911df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
4912df143a5041f03a22808b59c76698770b74692815Selim Gurun                case 't':
4913df143a5041f03a22808b59c76698770b74692815Selim Gurun                    cur = '\t';
4914df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
4915df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg,
4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       XML_REGEXP_CHARVAL, cur, cur, NULL);
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((cur == 's') || (cur == 'S') || (cur == 'i') || (cur == 'I') ||
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == 'c') || (cur == 'C') || (cur == 'd') || (cur == 'D') ||
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur == 'w') || (cur == 'W')) {
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegAtomType type = XML_REGEXP_ANYSPACE;
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur) {
492694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 's':
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_ANYSPACE;
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
492994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'S':
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_NOTSPACE;
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
493294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'i':
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_INITNAME;
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
493594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'I':
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_NOTINITNAME;
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
493894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'c':
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_NAMECHAR;
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
494194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'C':
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_NOTNAMECHAR;
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
494494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'd':
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_DECIMAL;
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
494794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'D':
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_NOTDECIMAL;
4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
495094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'w':
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_REALCHAR;
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
495394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    case 'W':
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = XML_REGEXP_NOTREALCHAR;
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom == NULL) {
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom = xmlRegNewAtom(ctxt, type);
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ctxt->atom->type == XML_REGEXP_RANGES) {
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg,
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       type, 0, 0, NULL);
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("Wrong escape sequence, misuse of character '\\'");
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharRange:
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
497394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [17]   charRange   ::=     seRange | XmlCharRef | XmlCharIncDash
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [18]   seRange   ::=   charOrEsc '-' charOrEsc
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [20]   charOrEsc   ::=   XmlChar | SingleCharEsc
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [21]   XmlChar   ::=   [^\#x2D#x5B#x5D]
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [22]   XmlCharIncDash   ::=   [^\#x5B#x5D]
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) {
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cur, len;
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int start = -1;
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int end = -1;
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '\0') {
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ERROR("Expecting ']'");
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = CUR;
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == '\\') {
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur) {
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 'n': start = 0xA; break;
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 'r': start = 0xD; break;
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 't': start = 0x9; break;
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case '\\': case '|': case '.': case '-': case '^': case '?':
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case '*': case '+': case '{': case '}': case '(': case ')':
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case '[': case ']':
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		start = cur; break;
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ERROR("Invalid escape value");
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return;
5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end = start;
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        len = 1;
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((cur != 0x5B) && (cur != 0x5D)) {
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        end = start = CUR_SCHAR(ctxt->cur, len);
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("Expecting a char range");
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Since we are "inside" a range, we can assume ctxt->cur is past
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * the start of ctxt->string, and PREV should be safe
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((start == '-') && (NXT(1) != ']') && (PREV != '[') && (PREV != '^')) {
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXTL(len);
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXTL(len);
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = CUR;
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur != '-') || (NXT(1) == ']')) {
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg,
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		              XML_REGEXP_CHARVAL, start, end, NULL);
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXT;
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = CUR;
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == '\\') {
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = CUR;
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (cur) {
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 'n': end = 0xA; break;
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 'r': end = 0xD; break;
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case 't': end = 0x9; break;
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case '\\': case '|': case '.': case '-': case '^': case '?':
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case '*': case '+': case '{': case '}': case '(': case ')':
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case '[': case ']':
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end = cur; break;
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ERROR("Invalid escape value");
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return;
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        len = 1;
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((cur != 0x5B) && (cur != 0x5D)) {
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        end = CUR_SCHAR(ctxt->cur, len);
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("Expecting the end of a char range");
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    NEXTL(len);
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO check that the values are acceptable character ranges for XML */
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end < start) {
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("End of range is before start of range");
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg,
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		           XML_REGEXP_CHARVAL, start, end, NULL);
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParsePosCharGroup:
5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [14]   posCharGroup ::= ( charRange | charClassEsc  )+
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) {
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
507360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (CUR == '\\') {
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAParseCharClassEsc(ctxt);
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAParseCharRange(ctxt);
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while ((CUR != ']') && (CUR != '^') && (CUR != '-') &&
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             (CUR != 0) && (ctxt->error == 0));
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharGroup:
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [13]   charGroup    ::= posCharGroup | negCharGroup | charClassSub
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [15]   negCharGroup ::= '^' posCharGroup
508894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [16]   charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12]   charClassExpr ::= '[' charGroup ']'
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharGroup(xmlRegParserCtxtPtr ctxt) {
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int n = ctxt->neg;
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR != ']') && (ctxt->error == 0)) {
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '^') {
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int neg = ctxt->neg;
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->neg = !ctxt->neg;
5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAParsePosCharGroup(ctxt);
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->neg = neg;
5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((CUR == '-') && (NXT(1) == '[')) {
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int neg = ctxt->neg;
5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->neg = 2;
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;	/* eat the '-' */
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;	/* eat the '[' */
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAParseCharGroup(ctxt);
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR == ']') {
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NEXT;
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ERROR("charClassExpr: ']' expected");
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->neg = neg;
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (CUR != ']') {
5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFAParsePosCharGroup(ctxt);
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->neg = n;
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseCharClass:
5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [11]   charClass   ::=     charClassEsc | charClassExpr
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12]   charClassExpr   ::=   '[' charGroup ']'
5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseCharClass(xmlRegParserCtxtPtr ctxt) {
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '[') {
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_RANGES);
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom == NULL)
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAParseCharGroup(ctxt);
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == ']') {
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("xmlFAParseCharClass: ']' expected");
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAParseCharClassEsc(ctxt);
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseQuantExact:
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8]   QuantExact   ::=   [0-9]+
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success or -1 in case of error
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseQuantExact(xmlRegParserCtxtPtr ctxt) {
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ok = 0;
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR >= '0') && (CUR <= '9')) {
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret * 10 + (CUR - '0');
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ok = 1;
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ok != 1) {
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseQuantifier:
5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4]   quantifier   ::=   [?*+] | ( '{' quantity '}' )
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5]   quantity   ::=   quantRange | quantMin | QuantExact
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6]   quantRange   ::=   QuantExact ',' QuantExact
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [7]   quantMin   ::=   QuantExact ','
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8]   QuantExact   ::=   [0-9]+
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseQuantifier(xmlRegParserCtxtPtr ctxt) {
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int cur;
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = CUR;
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == '?') || (cur == '*') || (cur == '+')) {
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom != NULL) {
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == '?')
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->atom->quant = XML_REGEXP_QUANT_OPT;
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (cur == '*')
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->atom->quant = XML_REGEXP_QUANT_MULT;
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (cur == '+')
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->atom->quant = XML_REGEXP_QUANT_PLUS;
5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == '{') {
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int min = 0, max = 0;
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlFAParseQuantExact(ctxt);
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur >= 0)
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    min = cur;
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == ',') {
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (CUR == '}')
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        max = INT_MAX;
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else {
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        cur = xmlFAParseQuantExact(ctxt);
5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (cur >= 0)
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    max = cur;
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else {
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ERROR("Improper quantifier");
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == '}') {
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("Unterminated quantifier");
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (max == 0)
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    max = min;
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom != NULL) {
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom->quant = XML_REGEXP_QUANT_RANGE;
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom->min = min;
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom->max = max;
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseAtom:
5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [9]   atom   ::=   Char | charClass | ( '(' regExp ')' )
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseAtom(xmlRegParserCtxtPtr ctxt) {
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int codepoint, len;
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    codepoint = xmlFAIsChar(ctxt);
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (codepoint > 0) {
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL);
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom == NULL)
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	codepoint = CUR_SCHAR(ctxt->cur, len);
5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom->codepoint = codepoint;
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXTL(len);
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '|') {
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == 0) {
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == ')') {
5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '(') {
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePtr start, oldend, start0;
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * this extra Epsilon transition is needed if we count with 0 allowed
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * unfortunately this can't be known at that point
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL);
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	start0 = ctxt->state;
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL);
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	start = ctxt->state;
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	oldend = ctxt->end;
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->end = NULL;
5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom = NULL;
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAParseRegExp(ctxt, 0);
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == ')') {
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT;
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ERROR("xmlFAParseAtom: expecting ')'");
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_SUBREG);
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->atom == NULL)
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom->start = start;
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom->start0 = start0;
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom->stop = ctxt->state;
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->end = oldend;
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((CUR == '[') || (CUR == '\\') || (CUR == '.')) {
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAParseCharClass(ctxt);
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParsePiece:
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [3]   piece   ::=   atom quantifier?
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParsePiece(xmlRegParserCtxtPtr ctxt) {
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->atom = NULL;
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlFAParseAtom(ctxt);
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->atom == NULL) {
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("internal: no atom generated");
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAParseQuantifier(ctxt);
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseBranch:
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: optional target to the end of the branch
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to is used to optimize by removing duplicate path in automata
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in expressions like (a|b)(c|d)
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [2]   branch   ::=   piece*
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) {
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr previous;
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    previous = ctxt->state;
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlFAParsePiece(ctxt);
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
533694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	if (xmlFAGenerateTransitions(ctxt, previous,
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0)
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	previous = ctxt->state;
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->atom = NULL;
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((ret != 0) && (ctxt->error == 0)) {
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlFAParsePiece(ctxt);
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
534594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    if (xmlFAGenerateTransitions(ctxt, previous,
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0)
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    previous = ctxt->state;
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->atom = NULL;
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFAParseRegExp:
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a regexp parser context
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @top:  is this the top-level expression ?
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [1]   regExp   ::=     branch  ( '|' branch )*
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) {
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePtr start, end;
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* if not top start should have been generated by an epsilon trans */
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = ctxt->state;
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->end = NULL;
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAParseBranch(ctxt, NULL);
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (top) {
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_REGEXP_GRAPH
5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("State %d is final\n", ctxt->state->no);
5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state->type = XML_REGEXP_FINAL_STATE;
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != '|') {
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->end = ctxt->state;
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    end = ctxt->state;
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR == '|') && (ctxt->error == 0)) {
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
538394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	if (CUR == 0) {
538494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    ERROR("expecting a branch after |")
538594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    return;
538694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	}
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state = start;
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->end = NULL;
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAParseBranch(ctxt, end);
5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!top) {
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->state = end;
5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->end = end;
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
539894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
539994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			The basic API					*
540094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpPrint:
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file for the output debug
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp: the compiled regexp
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Print the content of the compiled regular expression
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpPrint(FILE *output, xmlRegexpPtr regexp) {
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL)
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, " regexp: ");
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp == NULL) {
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "NULL\n");
5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "'%s' ", regexp->string);
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d atoms:\n", regexp->nbAtoms);
5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < regexp->nbAtoms; i++) {
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " %02d ", i);
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegPrintAtom(output, regexp->atoms[i]);
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d states:", regexp->nbStates);
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < regexp->nbStates; i++) {
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegPrintState(output, regexp->states[i]);
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "%d counters:\n", regexp->nbCounters);
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < regexp->nbCounters; i++) {
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " %d: min %d max %d\n", i, regexp->counters[i].min,
5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                                regexp->counters[i].max);
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpCompile:
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp:  a regular expression string
5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a regular expression conforming to XML Schemas Part 2 Datatype
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Appendix F and builds an automata suitable for testing strings against
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that regular expression
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled expression or NULL in case of error
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpPtr
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpCompile(const xmlChar *regexp) {
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegexpPtr ret;
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegParserCtxtPtr ctxt;
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt = xmlRegNewParserCtxt(regexp);
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* initialize the parser */
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->end = NULL;
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->start = ctxt->state = xmlRegNewState(ctxt);
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePush(ctxt, ctxt->start);
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* parse the expression building an automata */
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAParseRegExp(ctxt, 1);
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR != 0) {
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ERROR("xmlFAParseRegExp: extra characters");
5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->error != 0) {
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegFreeParserCtxt(ctxt);
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->end = ctxt->state;
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->start->type = XML_REGEXP_START_STATE;
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->end->type = XML_REGEXP_FINAL_STATE;
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* remove the Epsilon except for counted transitions */
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAEliminateEpsilonTransitions(ctxt);
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->error != 0) {
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegFreeParserCtxt(ctxt);
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegEpxFromParse(ctxt);
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegFreeParserCtxt(ctxt);
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpExec:
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled regular expression
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content:  the value to check against the regular expression
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the regular expression generates the value
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it matches, 0 if not and a negative value in case of error
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpExec(xmlRegexpPtr comp, const xmlChar *content) {
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((comp == NULL) || (content == NULL))
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlFARegExec(comp, content));
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegexpIsDeterminist:
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the compiled regular expression
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the regular expression is determinist
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it yes, 0 if not and a negative value in case of error
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegexpIsDeterminist(xmlRegexpPtr comp) {
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataPtr am;
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp == NULL)
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp->determinist != -1)
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(comp->determinist);
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am = xmlNewAutomata();
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (am->states != NULL) {
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < am->nbStates;i++)
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeState(am->states[i]);
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(am->states);
5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->nbAtoms = comp->nbAtoms;
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->atoms = comp->atoms;
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->nbStates = comp->nbStates;
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->states = comp->states;
5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->determinist = -1;
5537df143a5041f03a22808b59c76698770b74692815Selim Gurun    am->flags = comp->flags;
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlFAComputesDeterminism(am);
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->atoms = NULL;
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->states = NULL;
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFreeAutomata(am);
5542df143a5041f03a22808b59c76698770b74692815Selim Gurun    comp->determinist = ret;
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRegFreeRegexp:
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp:  the regexp
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a regexp
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRegFreeRegexp(xmlRegexpPtr regexp) {
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp == NULL)
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp->string != NULL)
5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(regexp->string);
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp->states != NULL) {
5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < regexp->nbStates;i++)
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeState(regexp->states[i]);
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(regexp->states);
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp->atoms != NULL) {
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0;i < regexp->nbAtoms;i++)
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeAtom(regexp->atoms[i]);
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(regexp->atoms);
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp->counters != NULL)
5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(regexp->counters);
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp->compact != NULL)
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(regexp->compact);
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp->transdata != NULL)
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(regexp->transdata);
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (regexp->stringMap != NULL) {
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < regexp->nbstrings;i++)
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(regexp->stringMap[i]);
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(regexp->stringMap);
5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(regexp);
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_AUTOMATA_ENABLED
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
558794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
558894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			The Automata interface				*
558994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewAutomata:
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new automata
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object or NULL in case of failure
5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataPtr
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewAutomata(void) {
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataPtr ctxt;
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt = xmlRegNewParserCtxt(NULL);
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* initialize the parser */
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->end = NULL;
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->start = ctxt->state = xmlRegNewState(ctxt);
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->start == NULL) {
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeAutomata(ctxt);
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->start->type = XML_REGEXP_START_STATE;
5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRegStatePush(ctxt, ctxt->start) < 0) {
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeState(ctxt->start);
5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeAutomata(ctxt);
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5620df143a5041f03a22808b59c76698770b74692815Selim Gurun    ctxt->flags = 0;
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ctxt);
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeAutomata:
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an automata
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeAutomata(xmlAutomataPtr am) {
5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (am == NULL)
5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegFreeParserCtxt(am);
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5639df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlAutomataSetFlags:
5640df143a5041f03a22808b59c76698770b74692815Selim Gurun * @am: an automata
5641df143a5041f03a22808b59c76698770b74692815Selim Gurun * @flags:  a set of internal flags
5642df143a5041f03a22808b59c76698770b74692815Selim Gurun *
5643df143a5041f03a22808b59c76698770b74692815Selim Gurun * Set some flags on the automata
5644df143a5041f03a22808b59c76698770b74692815Selim Gurun */
5645df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid
5646df143a5041f03a22808b59c76698770b74692815Selim GurunxmlAutomataSetFlags(xmlAutomataPtr am, int flags) {
5647df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (am == NULL)
5648df143a5041f03a22808b59c76698770b74692815Selim Gurun	return;
5649df143a5041f03a22808b59c76698770b74692815Selim Gurun    am->flags |= flags;
5650df143a5041f03a22808b59c76698770b74692815Selim Gurun}
5651df143a5041f03a22808b59c76698770b74692815Selim Gurun
5652df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataGetInitState:
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initial state lookup
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the initial state of the automata
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataGetInitState(xmlAutomataPtr am) {
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (am == NULL)
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(am->start);
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataSetFinalState:
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a state in this automata
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes that state a final state
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or -1 in case of error
5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataSetFinalState(xmlAutomataPtr am, xmlAutomataStatePtr state) {
5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (state == NULL))
5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->type = XML_REGEXP_FINAL_STATE;
5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewTransition:
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by the value of @token
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewTransition(xmlAutomataPtr am, xmlAutomataStatePtr from,
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAutomataStatePtr to, const xmlChar *token,
5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 void *data) {
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (token == NULL))
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom = xmlRegNewAtom(am, XML_REGEXP_STRING);
5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->data = data;
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->valuep = xmlStrdup(token);
5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlFAGenerateTransitions(am, from, to, atom) < 0) {
5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeAtom(atom);
5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(am->state);
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewTransition2:
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the first input string associated to that transition
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by the value of @token
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewTransition2(xmlAutomataPtr am, xmlAutomataStatePtr from,
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlAutomataStatePtr to, const xmlChar *token,
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  const xmlChar *token2, void *data) {
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (token == NULL))
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom = xmlRegNewAtom(am, XML_REGEXP_STRING);
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->data = data;
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((token2 == NULL) || (*token2 == 0)) {
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = xmlStrdup(token);
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int lenn, lenp;
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str;
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenn = strlen((char *) token2);
5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenp = strlen((char *) token);
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2);
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (str == NULL) {
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeAtom(atom);
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[0], token, lenp);
5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenp] = '|';
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[lenp + 1], token2, lenn);
5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenn + lenp + 1] = 0;
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = str;
5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlFAGenerateTransitions(am, from, to, atom) < 0) {
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeAtom(atom);
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(am->state);
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewNegTrans:
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the first input string associated to that transition
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: data passed to the callback function if the transition is activated
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by any value except (@token,@token2)
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that if @token2 is not NULL, then (X, NULL) won't match to follow
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project # the semantic of XSD ##other
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from,
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlAutomataStatePtr to, const xmlChar *token,
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *token2, void *data) {
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar err_msg[200];
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (token == NULL))
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom = xmlRegNewAtom(am, XML_REGEXP_STRING);
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->data = data;
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->neg = 1;
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((token2 == NULL) || (*token2 == 0)) {
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = xmlStrdup(token);
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int lenn, lenp;
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str;
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenn = strlen((char *) token2);
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenp = strlen((char *) token);
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2);
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (str == NULL) {
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeAtom(atom);
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[0], token, lenp);
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenp] = '|';
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[lenp + 1], token2, lenn);
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenn + lenp + 1] = 0;
5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = str;
5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    snprintf((char *) err_msg, 199, "not %s", (const char *) atom->valuep);
5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    err_msg[199] = 0;
5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->valuep2 = xmlStrdup(err_msg);
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlFAGenerateTransitions(am, from, to, atom) < 0) {
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeAtom(atom);
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->negs++;
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(am->state);
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountTrans2:
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min:  the minimum successive occurences of token
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max:  the maximum successive occurences of token
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data associated to the transition
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state
586094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * activated by a succession of input of value @token and @token2 and
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * whose number is between @min and @max
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from,
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAutomataStatePtr to, const xmlChar *token,
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *token2,
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int min, int max, void *data) {
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int counter;
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (token == NULL))
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min < 0)
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((max < min) || (max < 1))
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom = xmlRegNewAtom(am, XML_REGEXP_STRING);
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((token2 == NULL) || (*token2 == 0)) {
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = xmlStrdup(token);
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int lenn, lenp;
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str;
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenn = strlen((char *) token2);
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenp = strlen((char *) token);
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2);
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (str == NULL) {
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeAtom(atom);
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[0], token, lenp);
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenp] = '|';
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[lenp + 1], token2, lenn);
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenn + lenp + 1] = 0;
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = str;
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->data = data;
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min == 0)
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->min = 1;
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->min = min;
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->max = max;
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * associate a counter to the transition.
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    counter = xmlRegGetCounter(am);
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].min = min;
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].max = max;
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlFAGenerateTransitions(am, from, to, atom); */
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        to = xmlRegNewState(am);
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(am, to);
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(am, from, atom, to, counter, -1);
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPush(am, atom);
5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->state = to;
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = am->state;
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min == 0)
5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAGenerateEpsilonTransition(am, from, to);
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountTrans:
5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min:  the minimum successive occurences of token
5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max:  the maximum successive occurences of token
5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data associated to the transition
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and whose number
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is between @min and @max
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountTrans(xmlAutomataPtr am, xmlAutomataStatePtr from,
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAutomataStatePtr to, const xmlChar *token,
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int min, int max, void *data) {
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int counter;
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (token == NULL))
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min < 0)
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((max < min) || (max < 1))
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom = xmlRegNewAtom(am, XML_REGEXP_STRING);
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->valuep = xmlStrdup(token);
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->data = data;
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min == 0)
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->min = 1;
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->min = min;
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->max = max;
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * associate a counter to the transition.
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    counter = xmlRegGetCounter(am);
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].min = min;
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].max = max;
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlFAGenerateTransitions(am, from, to, atom); */
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        to = xmlRegNewState(am);
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(am, to);
5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(am, from, atom, to, counter, -1);
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPush(am, atom);
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->state = to;
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = am->state;
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min == 0)
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFAGenerateEpsilonTransition(am, from, to);
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewOnceTrans2:
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token2: the second input string associated to that transition
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min:  the minimum successive occurences of token
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max:  the maximum successive occurences of token
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data associated to the transition
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state
601494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * activated by a succession of input of value @token and @token2 and whose
601594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * number is between @min and @max, moreover that transition can only be
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * crossed once.
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from,
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAutomataStatePtr to, const xmlChar *token,
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *token2,
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int min, int max, void *data) {
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int counter;
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (token == NULL))
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min < 1)
6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((max < min) || (max < 1))
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom = xmlRegNewAtom(am, XML_REGEXP_STRING);
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((token2 == NULL) || (*token2 == 0)) {
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = xmlStrdup(token);
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int lenn, lenp;
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str;
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenn = strlen((char *) token2);
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lenp = strlen((char *) token);
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2);
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (str == NULL) {
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegFreeAtom(atom);
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[0], token, lenp);
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenp] = '|';
6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy(&str[lenp + 1], token2, lenn);
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str[lenn + lenp + 1] = 0;
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	atom->valuep = str;
605794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->data = data;
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->quant = XML_REGEXP_QUANT_ONCEONLY;
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->min = min;
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->max = max;
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * associate a counter to the transition.
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    counter = xmlRegGetCounter(am);
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].min = 1;
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].max = 1;
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlFAGenerateTransitions(am, from, to, atom); */
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = xmlRegNewState(am);
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(am, to);
6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(am, from, atom, to, counter, -1);
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPush(am, atom);
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->state = to;
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
608094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewOnceTrans:
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token: the input string associated to that transition
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min:  the minimum successive occurences of token
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max:  the maximum successive occurences of token
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data associated to the transition
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a transition from the @from state to the target state
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * activated by a succession of input of value @token and whose number
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is between @min and @max, moreover that transition can only be crossed
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * once.
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewOnceTrans(xmlAutomataPtr am, xmlAutomataStatePtr from,
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAutomataStatePtr to, const xmlChar *token,
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int min, int max, void *data) {
6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPtr atom;
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int counter;
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (token == NULL))
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (min < 1)
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((max < min) || (max < 1))
6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom = xmlRegNewAtom(am, XML_REGEXP_STRING);
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (atom == NULL)
6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->valuep = xmlStrdup(token);
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->data = data;
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->quant = XML_REGEXP_QUANT_ONCEONLY;
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->min = min;
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    atom->max = max;
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * associate a counter to the transition.
6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    counter = xmlRegGetCounter(am);
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].min = 1;
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[counter].max = 1;
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlFAGenerateTransitions(am, from, to, atom); */
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL) {
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	to = xmlRegNewState(am);
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegStatePush(am, to);
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStateAddTrans(am, from, atom, to, counter, -1);
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegAtomPush(am, atom);
6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->state = to;
6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewState:
6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new disconnected state in the automata
6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new state or NULL in case of error
6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewState(xmlAutomataPtr am) {
614994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlAutomataStatePtr to;
6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (am == NULL)
6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    to = xmlRegNewState(am);
6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegStatePush(am, to);
6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewEpsilon:
6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the
6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target state
6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewEpsilon(xmlAutomataPtr am, xmlAutomataStatePtr from,
6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlAutomataStatePtr to) {
6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL))
6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAGenerateEpsilonTransition(am, from, to);
6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(am->state);
6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewAllTrans:
6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lax: allow to transition if not all all transitions have been activated
6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds a an ALL transition from the @from state to the
6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * target state. That transition is an epsilon transition allowed only when
6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * all transitions from the @from node have been activated.
6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from,
6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlAutomataStatePtr to, int lax) {
6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL))
6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAGenerateAllTransition(am, from, to, lax);
6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(am->state);
6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCounter:
6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min:  the minimal value on the counter
6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max:  the maximal value on the counter
6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new counter
6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the counter number or -1 in case of error
6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
621694442ad4107000e6d49f9b85a46a591495a57632Selim Gurunint
6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCounter(xmlAutomataPtr am, int min, int max) {
6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (am == NULL)
6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegGetCounter(am);
6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[ret].min = min;
6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    am->counters[ret].max = max;
6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCountedTrans:
6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: the counter associated to that transition
6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the target state
6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which will increment the counter provided
6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCountedTrans(xmlAutomataPtr am, xmlAutomataStatePtr from,
6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataStatePtr to, int counter) {
6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (counter < 0))
6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAGenerateCountedEpsilonTransition(am, from, to, counter);
6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(am->state);
6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataNewCounterTrans:
6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: the starting point of the transition
6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: the target point of the transition or NULL
6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @counter: the counter associated to that transition
6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If @to is NULL, this creates first a new target state in the automata
6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then adds an epsilon transition from the @from state to the target state
6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which will be allowed only if the counter is within the right range.
6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the target state or NULL in case of error
6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataStatePtr
6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataNewCounterTrans(xmlAutomataPtr am, xmlAutomataStatePtr from,
6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataStatePtr to, int counter) {
6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (from == NULL) || (counter < 0))
6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAGenerateCountedTransition(am, from, to, counter);
6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (to == NULL)
6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(am->state);
6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(to);
6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataCompile:
6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the automata into a Reg Exp ready for being executed.
6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The automata should be free after this point.
6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled regexp or NULL in case of error
6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
628894442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlRegexpPtr
6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataCompile(xmlAutomataPtr am) {
6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegexpPtr ret;
6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((am == NULL) || (am->error != 0)) return(NULL);
6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFAEliminateEpsilonTransitions(am);
6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlFAComputesDeterminism(am); */
6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegEpxFromParse(am);
6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAutomataIsDeterminist:
6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @am: an automata
6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if an automata is determinist.
6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if not, and -1 in case of error
6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
630894442ad4107000e6d49f9b85a46a591495a57632Selim Gurunint
6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAutomataIsDeterminist(xmlAutomataPtr am) {
6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (am == NULL)
6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlFAComputesDeterminism(am);
6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_AUTOMATA_ENABLED */
6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_EXPR_ENABLED
6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Formal Expression handling code				*
6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Expression handling context				*
6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlExpCtxt {
6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict;
6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr *table;
6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbElems;
6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb_nodes;
6338df143a5041f03a22808b59c76698770b74692815Selim Gurun    int maxNodes;
6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *expr;
6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *cur;
6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nb_cons;
6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tabSize;
6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewCtxt:
6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @maxNodes:  the maximum number of nodes
6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict:  optional dictionnary to use internally
6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new context for manipulating expressions
6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the context or NULL in case of error
6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtPtr
6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewCtxt(int maxNodes, xmlDictPtr dict) {
6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpCtxtPtr ret;
6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size = 256;
6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (maxNodes <= 4096)
6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        maxNodes = 4096;
636194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlExpCtxtPtr) xmlMalloc(sizeof(xmlExpCtxt));
6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlExpCtxt));
6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->size = size;
6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbElems = 0;
6368df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret->maxNodes = maxNodes;
6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->table = xmlMalloc(size * sizeof(xmlExpNodePtr));
6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->table == NULL) {
6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ret);
6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret->table, 0, size * sizeof(xmlExpNodePtr));
6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dict == NULL) {
6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->dict = xmlDictCreate();
6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->dict == NULL) {
6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret->table);
6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->dict = dict;
6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDictReference(ret->dict);
6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpFreeCtxt:
6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an expression context
6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free an expression context
6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpFreeCtxt(xmlExpCtxtPtr ctxt) {
6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictFree(ctxt->dict);
6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->table != NULL)
6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->table);
6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Structure associated to an expression node		*
6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_NODES 10000
6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_DERIV */
6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
641594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * TODO:
6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - Wildcards
6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - public API for creation
6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Started
6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - regression testing
6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Done
6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - split into module and test tool
6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - memleaks
6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_EXP_NILABLE = (1 << 0)
6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlExpNodeInfo;
6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NILLABLE(node) ((node)->info & XML_EXP_NILABLE)
6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlExpNode {
6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char type;/* xmlExpNodeType */
6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char info;/* OR of xmlExpNodeInfo */
6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned short key;	/* the hash key */
6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int ref;	/* The number of references */
6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int c_max;		/* the maximum length it can consume */
6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr exp_left;
6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr next;/* the next node in the hash table or free list */
6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    union {
6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	struct {
6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int f_min;
6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int f_max;
6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} count;
6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	struct {
6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpNodePtr f_right;
6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} children;
6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        const xmlChar *f_str;
6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } field;
6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_min field.count.f_min
6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_max field.count.f_max
6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define exp_left field.children.f_left */
6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_right field.children.f_right
6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define exp_str field.f_str
6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type);
6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNode forbiddenExpNode = {
6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_EXP_FORBID, 0, 0, 0, 0, NULL, NULL, {{ 0, 0}}
6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr forbiddenExp = &forbiddenExpNode;
6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNode emptyExpNode = {
6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_EXP_EMPTY, 1, 0, 0, 0, NULL, NULL, {{ 0, 0}}
6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr emptyExp = &emptyExpNode;
6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  The custom hash table for unicity and canonicalization		*
6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  of sub-expressions pointers						*
6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashNameComputeKey:
6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculate the hash key for a token
6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned short
6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashNameComputeKey(const xmlChar *name) {
6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned short value = 0L;
6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char ch;
648394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name != NULL) {
6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	value += 30 * (*name);
6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((ch = *name++) != 0) {
6487df143a5041f03a22808b59c76698770b74692815Selim Gurun	    value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch);
6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (value);
6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashComputeKey:
6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculate the hash key for a compound expression
6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned short
6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashComputeKey(xmlExpNodeType type, xmlExpNodePtr left,
6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlExpNodePtr right) {
6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long value;
6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned short ret;
650294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_SEQ:
6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = left->key;
6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value += right->key;
6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value *= 3;
6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (unsigned short) value;
6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_OR:
6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = left->key;
6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value += right->key;
6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value *= 7;
6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (unsigned short) value;
6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_COUNT:
6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = left->key;
6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value += right->key;
6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = (unsigned short) value;
6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr
6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type) {
6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr ret;
6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nb_nodes >= MAX_NODES)
6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlExpNodePtr) xmlMalloc(sizeof(xmlExpNode));
6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlExpNode));
6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = NULL;
6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nb_nodes++;
6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nb_cons++;
6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpHashGetEntry:
6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table
6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the unique entry from the hash table. The entry is created if
6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * needed. @left and @right are consumed, i.e. their ref count will
6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be decremented by the operation.
6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the pointer or NULL in case of error
6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr
6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type,
6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlExpNodePtr left, xmlExpNodePtr right,
6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *name, int min, int max) {
6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned short kbase, key;
6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr entry;
6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr insert;
6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check for duplicate and insertion location.
6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == XML_EXP_ATOM) {
6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	kbase = xmlExpHashNameComputeKey(name);
6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type == XML_EXP_COUNT) {
6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* COUNT reduction rule 1 */
6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* a{1} -> a */
6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (min == max) {
6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (min == 1) {
6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(left);
6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (min == 0) {
6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlExpFree(ctxt, left);
6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(emptyExp);
6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (min < 0) {
6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, left);
6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(forbiddenExp);
6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (max == -1)
6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    kbase = min + 79;
6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    kbase = max - min;
6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	kbase += left->key;
6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type == XML_EXP_OR) {
6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* Forbid reduction rules */
6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (left->type == XML_EXP_FORBID) {
6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, left);
6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(right);
6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (right->type == XML_EXP_FORBID) {
6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, right);
6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(left);
6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* OR reduction rule 1 */
6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* a | a reduced to a */
6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (left == right) {
6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    left->ref--;
6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(left);
6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* OR canonicalization rule 1 */
6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* linearize (a | b) | c into a | (b | c) */
6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((left->type == XML_EXP_OR) && (right->type != XML_EXP_OR)) {
6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpNodePtr tmp = left;
6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            left = right;
6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    right = tmp;
6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* OR reduction rule 2 */
6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* a | (a | b) and b | (a | b) are reduced to a | b */
6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (right->type == XML_EXP_OR) {
6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((left == right->exp_left) ||
6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (left == right->exp_right)) {
6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlExpFree(ctxt, left);
6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(right);
6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* OR canonicalization rule 2 */
6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* linearize (a | b) | c into a | (b | c) */
6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (left->type == XML_EXP_OR) {
6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpNodePtr tmp;
6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* OR canonicalization rule 2 */
6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((left->exp_right->type != XML_EXP_OR) &&
6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (left->exp_right->key < left->exp_left->key)) {
6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        tmp = left->exp_right;
6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		left->exp_right = left->exp_left;
6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		left->exp_left = tmp;
6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    left->exp_right->ref++;
6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_right, right,
6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                             NULL, 0, 0);
6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    left->exp_left->ref++;
6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_left, tmp,
6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                             NULL, 0, 0);
664394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, left);
6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(tmp);
6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (right->type == XML_EXP_OR) {
6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Ordering in the tree */
6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* C | (A | B) -> A | (B | C) */
6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (left->key > right->exp_right->key) {
6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlExpNodePtr tmp;
6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		right->exp_right->ref++;
6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_right,
6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                         left, NULL, 0, 0);
6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		right->exp_left->ref++;
6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left,
6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                         tmp, NULL, 0, 0);
6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlExpFree(ctxt, right);
6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(tmp);
6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Ordering in the tree */
6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* B | (A | C) -> A | (B | C) */
6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (left->key > right->exp_left->key) {
6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlExpNodePtr tmp;
6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		right->exp_right->ref++;
6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left,
6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                         right->exp_right, NULL, 0, 0);
6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		right->exp_left->ref++;
6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left,
6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                         tmp, NULL, 0, 0);
6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlExpFree(ctxt, right);
6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(tmp);
6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* we know both types are != XML_EXP_OR here */
6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (left->key > right->key) {
6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpNodePtr tmp = left;
6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            left = right;
6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    right = tmp;
6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	kbase = xmlExpHashComputeKey(type, left, right);
6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type == XML_EXP_SEQ) {
6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* Forbid reduction rules */
6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (left->type == XML_EXP_FORBID) {
6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, right);
6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(left);
6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (right->type == XML_EXP_FORBID) {
6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, left);
6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(right);
6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* Empty reduction rules */
6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (right->type == XML_EXP_EMPTY) {
6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(left);
6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (left->type == XML_EXP_EMPTY) {
6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(right);
6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	kbase = xmlExpHashComputeKey(type, left, right);
670094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    } else
6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    key = kbase % ctxt->size;
6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->table[key] != NULL) {
6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (insert = ctxt->table[key]; insert != NULL;
6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     insert = insert->next) {
6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((insert->key == kbase) &&
6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (insert->type == type)) {
6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type == XML_EXP_ATOM) {
6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (name == insert->exp_str) {
6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			insert->ref++;
6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(insert);
6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (type == XML_EXP_COUNT) {
6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((insert->exp_min == min) && (insert->exp_max == max) &&
6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        (insert->exp_left == left)) {
6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			insert->ref++;
6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			left->ref--;
6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(insert);
6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((insert->exp_left == left) &&
6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   (insert->exp_right == right)) {
6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    insert->ref++;
6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    left->ref--;
6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    right->ref--;
6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(insert);
6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    entry = xmlExpNewNode(ctxt, type);
6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (entry == NULL)
6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    entry->key = kbase;
6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == XML_EXP_ATOM) {
6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	entry->exp_str = name;
6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	entry->c_max = 1;
6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type == XML_EXP_COUNT) {
6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        entry->exp_min = min;
6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        entry->exp_max = max;
6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	entry->exp_left = left;
6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((min == 0) || (IS_NILLABLE(left)))
6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    entry->info |= XML_EXP_NILABLE;
6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (max < 0)
6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    entry->c_max = -1;
6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    entry->c_max = max * entry->exp_left->c_max;
6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	entry->exp_left = left;
6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	entry->exp_right = right;
6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_EXP_OR) {
6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((IS_NILLABLE(left)) || (IS_NILLABLE(right)))
6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		entry->info |= XML_EXP_NILABLE;
6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((entry->exp_left->c_max == -1) ||
6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (entry->exp_right->c_max == -1))
6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		entry->c_max = -1;
6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (entry->exp_left->c_max > entry->exp_right->c_max)
6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        entry->c_max = entry->exp_left->c_max;
6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        entry->c_max = entry->exp_right->c_max;
6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((IS_NILLABLE(left)) && (IS_NILLABLE(right)))
6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		entry->info |= XML_EXP_NILABLE;
6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((entry->exp_left->c_max == -1) ||
6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (entry->exp_right->c_max == -1))
6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		entry->c_max = -1;
6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        entry->c_max = entry->exp_left->c_max + entry->exp_right->c_max;
6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    entry->ref = 1;
6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->table[key] != NULL)
6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        entry->next = ctxt->table[key];
6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->table[key] = entry;
6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nbElems++;
6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(entry);
6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpFree:
6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression
6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dereference the expression
6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpFree(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp) {
6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exp == NULL) || (exp == forbiddenExp) || (exp == emptyExp))
6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exp->ref--;
6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exp->ref == 0) {
6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        unsigned short key;
6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* Unlink it first from the hash table */
6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	key = exp->key % ctxt->size;
6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->table[key] == exp) {
6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->table[key] = exp->next;
6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpNodePtr tmp;
6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = ctxt->table[key];
6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (tmp != NULL) {
6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (tmp->next == exp) {
6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp->next = exp->next;
6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        tmp = tmp->next;
6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((exp->type == XML_EXP_SEQ) || (exp->type == XML_EXP_OR)) {
6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, exp->exp_left);
6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, exp->exp_right);
6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (exp->type == XML_EXP_COUNT) {
6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, exp->exp_left);
6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(exp);
6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->nb_nodes--;
6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpRef:
6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression
6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Increase the reference count of the expression
6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpRef(xmlExpNodePtr exp) {
6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exp != NULL)
6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        exp->ref++;
6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewAtom:
6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the atom name
684194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len: the atom name length in byte (or -1);
6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to this name from that context
6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error
6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr
6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewAtom(xmlExpCtxtPtr ctxt, const xmlChar *name, int len) {
6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (name == NULL))
6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlDictLookup(ctxt->dict, name, len);
6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, name, 0, 0));
6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewOr:
6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @left: left expression
6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @right: right expression
6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the choice @left | @right
6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @left and @right are consumed in the operation, to keep
6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on them use xmlExpRef() and use xmlExpFree() to release them,
6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL).
6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error
6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr
6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewOr(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) {
6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((left == NULL) || (right == NULL)) {
6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlExpFree(ctxt, left);
6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlExpFree(ctxt, right);
6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, right, NULL, 0, 0));
6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewSeq:
6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @left: left expression
6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @right: right expression
6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the sequence @left , @right
6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @left and @right are consumed in the operation, to keep
6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on them use xmlExpRef() and use xmlExpFree() to release them,
6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL).
6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error
6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr
6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewSeq(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) {
6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((left == NULL) || (right == NULL)) {
6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlExpFree(ctxt, left);
6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlExpFree(ctxt, right);
6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, left, right, NULL, 0, 0));
6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpNewRange:
6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @subset: the expression to be repeated
6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the lower bound for the repetition
6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the upper bound for the repetition, -1 means infinite
6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the atom associated to the range (@subset){@min, @max}
6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that @subset is consumed in the operation, to keep
6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an handle on it use xmlExpRef() and use xmlExpFree() to release it,
6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is true even in case of failure (unless ctxt == NULL).
6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node or NULL in case of error
6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr
6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNewRange(xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max) {
6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((subset == NULL) || (min < 0) || (max < -1) ||
6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((max >= 0) && (min > max))) {
6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlExpFree(ctxt, subset);
6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, subset,
6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              NULL, NULL, min, max));
6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Public API for operations on expressions		*
6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
694194442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp,
6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const xmlChar**list, int len, int nb) {
6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp, tmp2;
6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttail:
6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (exp->type) {
6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_EMPTY:
6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_ATOM:
6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (tmp = 0;tmp < nb;tmp++)
6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (list[tmp] == exp->exp_str)
6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nb >= len)
6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(-2);
6954df143a5041f03a22808b59c76698770b74692815Selim Gurun	    list[nb] = exp->exp_str;
6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_COUNT:
6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exp = exp->exp_left;
6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto tail;
6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_SEQ:
6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_OR:
6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpGetLanguageInt(ctxt, exp->exp_left, list, len, nb);
6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0)
6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(tmp);
6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp2 = xmlExpGetLanguageInt(ctxt, exp->exp_right, list, len,
6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                nb + tmp);
6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp2 < 0)
6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(tmp2);
6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(tmp + tmp2);
6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpGetLanguage:
6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression
6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @langList: where to store the tokens
697894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len: the allocated length of @list
6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find all the strings used in @exp and store them in @list
6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of unique strings found, -1 in case of errors and
6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -2 if there is more than @len strings
6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
698694442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp,
6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  const xmlChar**langList, int len) {
6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (exp == NULL) || (langList == NULL) || (len <= 0))
6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpGetLanguageInt(ctxt, exp, langList, len, 0));
6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
699494442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp,
6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  const xmlChar**list, int len, int nb) {
6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp, tmp2;
6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttail:
6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (exp->type) {
6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_FORBID:
7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_EMPTY:
7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_ATOM:
7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (tmp = 0;tmp < nb;tmp++)
7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (list[tmp] == exp->exp_str)
7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nb >= len)
7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(-2);
7009df143a5041f03a22808b59c76698770b74692815Selim Gurun	    list[nb] = exp->exp_str;
7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_COUNT:
7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exp = exp->exp_left;
7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto tail;
7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_SEQ:
7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb);
7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0)
7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(tmp);
7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_NILLABLE(exp->exp_left)) {
7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len,
7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    nb + tmp);
7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp2 < 0)
7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(tmp2);
7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp += tmp2;
7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(tmp);
7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_OR:
7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb);
7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp < 0)
7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(tmp);
7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len,
7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                nb + tmp);
7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp2 < 0)
7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(tmp2);
7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(tmp + tmp2);
7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpGetStart:
7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression
7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tokList: where to store the tokens
704494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len: the allocated length of @list
7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find all the strings that appears at the start of the languages
7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * accepted by @exp and store them in @list. E.g. for (a, b) | c
7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it will return the list [a, c]
7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of unique strings found, -1 in case of errors and
7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -2 if there is more than @len strings
7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
705494442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp,
7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               const xmlChar**tokList, int len) {
7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (exp == NULL) || (tokList == NULL) || (len <= 0))
7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpGetStartInt(ctxt, exp, tokList, len, 0));
7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpIsNillable:
7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression
7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Finds if the expression is nillable, i.e. if it accepts the empty sequqnce
7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if nillable, 0 if not and -1 in case of error
7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpIsNillable(xmlExpNodePtr exp) {
7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exp == NULL)
7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(IS_NILLABLE(exp) != 0);
7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr
7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpStringDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar *str)
7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr ret;
7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (exp->type) {
7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_EXP_EMPTY:
7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(forbiddenExp);
7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_EXP_FORBID:
7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(forbiddenExp);
7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_EXP_ATOM:
7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exp->exp_str == str) {
7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("deriv atom: equal => Empty\n");
7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ret = emptyExp;
7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("deriv atom: mismatch => forbid\n");
7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        /* TODO wildcards here */
7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = forbiddenExp;
7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_EXP_OR: {
7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpNodePtr tmp;
7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("deriv or: => or(derivs)\n");
7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpStringDeriveInt(ctxt, exp->exp_left, str);
7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL) {
7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str);
7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == NULL) {
7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpFree(ctxt, tmp);
7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret,
7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     NULL, 0, 0);
7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_EXP_SEQ:
7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("deriv seq: starting with left\n");
7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str);
7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == NULL) {
7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(NULL);
7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (ret == forbiddenExp) {
7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (IS_NILLABLE(exp->exp_left)) {
7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("deriv seq: left failed but nillable\n");
7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str);
7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("deriv seq: left match => sequence\n");
7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        exp->exp_right->ref++;
7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right,
7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                         NULL, 0, 0);
7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_EXP_COUNT: {
7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int min, max;
7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpNodePtr tmp;
7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exp->exp_max == 0)
7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(forbiddenExp);
7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str);
7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == NULL)
7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(NULL);
7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == forbiddenExp) {
7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("deriv count: pattern mismatch => forbid\n");
7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(ret);
7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exp->exp_max == 1)
7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exp->exp_max < 0) /* unbounded */
7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		max = -1;
7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		max = exp->exp_max - 1;
7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exp->exp_min > 0)
7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		min = exp->exp_min - 1;
7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		min = 0;
7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exp->exp_left->ref++;
7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL,
7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     NULL, min, max);
7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == emptyExp) {
7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("deriv count: match to empty => new count\n");
7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(tmp);
7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("deriv count: match => sequence with new count\n");
7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, tmp,
7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                              NULL, 0, 0));
7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpStringDerive:
7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expression context
7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the expression
7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the string
7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the string len in bytes if available
7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do one step of Brzozowski derivation of the expression @exp with
7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * respect to the input string
7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error
7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr
7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpStringDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp,
7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   const xmlChar *str, int len) {
7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *input;
7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exp == NULL) || (ctxt == NULL) || (str == NULL)) {
7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * check the string is in the dictionnary, if yes use an interned
7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * copy, otherwise we know it's not an acceptable input
7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    input = xmlDictExists(ctxt->dict, str, len);
7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (input == NULL) {
7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(forbiddenExp);
7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpStringDeriveInt(ctxt, exp, input));
7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCheckCard(xmlExpNodePtr exp, xmlExpNodePtr sub) {
7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sub->c_max == -1) {
7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (exp->c_max != -1)
7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 0;
7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((exp->c_max >= 0) && (exp->c_max < sub->c_max)) {
7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((IS_NILLABLE(sub)) && (!IS_NILLABLE(exp)))
7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp,
7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        xmlExpNodePtr sub);
7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpDivide:
7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context
7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression
7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression
7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mult: the multiple expression
7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @remain: the remain from the derivation of the multiple
7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if exp is a multiple of sub, i.e. if there is a finite number n
7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so that sub{n} subsume exp
7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the multiple value if successful, 0 if it is not a multiple
7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         and -1 in case of internel error.
7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDivide(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub,
7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             xmlExpNodePtr *mult, xmlExpNodePtr *remain) {
7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr tmp, tmp2;
7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mult != NULL) *mult = NULL;
7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (remain != NULL) *remain = NULL;
7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exp->c_max == -1) return(0);
7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_NILLABLE(exp) && (!IS_NILLABLE(sub))) return(0);
7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1;i <= exp->c_max;i++) {
7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        sub->ref++;
7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT,
7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 sub, NULL, NULL, i, i);
7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL) {
7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!xmlExpCheckCard(tmp, exp)) {
7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, tmp);
7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp2 = xmlExpExpDeriveInt(ctxt, tmp, exp);
7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp2 == NULL) {
7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, tmp);
7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp2 != forbiddenExp) && (IS_NILLABLE(tmp2))) {
7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (remain != NULL)
7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        *remain = tmp2;
7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpFree(ctxt, tmp2);
7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (mult != NULL)
7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        *mult = tmp;
7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpFree(ctxt, tmp);
7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Divide succeeded %d\n", i);
7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(i);
7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlExpFree(ctxt, tmp);
7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlExpFree(ctxt, tmp2);
7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("Divide failed\n");
7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpExpDeriveInt:
7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context
7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression
7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression
7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to do a step of Brzozowski derivation but at a higher level
7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the input being a subexpression.
7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error
7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr
7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) {
7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr ret, tmp, tmp2, tmp3;
7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar **tab;
7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len, i;
7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * In case of equality and if the expression can only consume a finite
7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * amount, then the derivation is empty
7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exp == sub) && (exp->c_max >= 0)) {
7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        printf("Equal(exp, sub) and finite -> Empty\n");
7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(emptyExp);
7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * decompose sub sequence first
7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sub->type == XML_EXP_EMPTY) {
7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        printf("Empty(sub) -> Empty\n");
7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	exp->ref++;
7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(exp);
7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sub->type == XML_EXP_SEQ) {
7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        printf("Seq(sub) -> decompose\n");
7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left);
7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL)
7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == forbiddenExp)
7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(tmp);
7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpExpDeriveInt(ctxt, tmp, sub->exp_right);
7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlExpFree(ctxt, tmp);
7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sub->type == XML_EXP_OR) {
7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        printf("Or(sub) -> decompose\n");
7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left);
7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == forbiddenExp)
7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(tmp);
7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL)
7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpExpDeriveInt(ctxt, exp, sub->exp_right);
7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret == NULL) || (ret == forbiddenExp)) {
7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, tmp);
7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, NULL, 0, 0));
7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlExpCheckCard(exp, sub)) {
7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        printf("CheckCard(exp, sub) failed -> Forbid\n");
7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(forbiddenExp);
7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (exp->type) {
7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_EMPTY:
7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sub == emptyExp)
7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(emptyExp);
7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Empty(exp) -> Forbid\n");
7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(forbiddenExp);
7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_FORBID:
7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Forbid(exp) -> Forbid\n");
7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(forbiddenExp);
7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_ATOM:
7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sub->type == XML_EXP_ATOM) {
7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        /* TODO: handle wildcards */
7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (exp->exp_str == sub->exp_str) {
7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Atom match -> Empty\n");
7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(emptyExp);
7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Atom mismatch -> Forbid\n");
7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(forbiddenExp);
7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((sub->type == XML_EXP_COUNT) &&
7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (sub->exp_max == 1) &&
7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (sub->exp_left->type == XML_EXP_ATOM)) {
7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        /* TODO: handle wildcards */
7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        if (exp->exp_str == sub->exp_left->exp_str) {
7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Atom match -> Empty\n");
7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(emptyExp);
7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Atom mismatch -> Forbid\n");
7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(forbiddenExp);
7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Compex exp vs Atom -> Forbid\n");
7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(forbiddenExp);
7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_SEQ:
7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* try to get the sequence consumed only if possible */
7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlExpCheckCard(exp->exp_left, sub)) {
7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* See if the sequence can be consumed directly */
7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Seq trying left only\n");
7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub);
7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ret != forbiddenExp) && (ret != NULL)) {
7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Seq trying left only worked\n");
7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * TODO: assumption here that we are determinist
7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     *       i.e. we won't get to a nillable exp left
7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     *       subset which could be matched by the right
7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     *       part too.
7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * e.g.: (a | b)+,(a | c) and 'a+,a'
7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exp->exp_right->ref++;
7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret,
7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					      exp->exp_right, NULL, 0, 0));
7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Seq: left too short\n");
7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Try instead to decompose */
7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sub->type == XML_EXP_COUNT) {
7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int min, max;
7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Seq: sub is a count\n");
7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left);
7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == NULL)
7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != forbiddenExp) {
7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Seq , Count match on left\n");
7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (sub->exp_max < 0)
7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        max = -1;
7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            else
7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        max = sub->exp_max -1;
7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (sub->exp_min > 0)
7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        min = sub->exp_min -1;
7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        min = 0;
7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exp->exp_right->ref++;
7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret,
7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                             exp->exp_right, NULL, 0, 0);
7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (tmp == NULL)
7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return(NULL);
7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sub->exp_left->ref++;
7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT,
7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      sub->exp_left, NULL, NULL, min, max);
7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (tmp2 == NULL) {
7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlExpFree(ctxt, tmp);
7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(NULL);
7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlExpExpDeriveInt(ctxt, tmp, tmp2);
7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlExpFree(ctxt, tmp);
7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlExpFree(ctxt, tmp2);
7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(ret);
7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* we made no progress on structured operations */
7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_OR:
7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Or , trying both side\n");
7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub);
7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == NULL)
7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(NULL);
7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpExpDeriveInt(ctxt, exp->exp_right, sub);
7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL) {
7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlExpFree(ctxt, ret);
7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(NULL);
7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp, NULL, 0, 0));
7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_COUNT: {
7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int min, max;
7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sub->type == XML_EXP_COUNT) {
7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        /*
7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Try to see if the loop is completely subsumed
7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left);
7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp == NULL)
7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp == forbiddenExp) {
7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int mult;
7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Count, Count inner don't subsume\n");
7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    mult = xmlExpDivide(ctxt, sub->exp_left, exp->exp_left,
7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                        NULL, &tmp);
7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (mult <= 0) {
7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("Count, Count not multiple => forbidden\n");
7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return(forbiddenExp);
7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (sub->exp_max == -1) {
7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        max = -1;
7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exp->exp_max == -1) {
7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (exp->exp_min <= sub->exp_min * mult)
7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        min = 0;
7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    else
7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        min = exp->exp_min - sub->exp_min * mult;
7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("Count, Count finite can't subsume infinite\n");
7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlExpFree(ctxt, tmp);
7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(forbiddenExp);
7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (exp->exp_max == -1) {
7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("Infinite loop consume mult finite loop\n");
7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (exp->exp_min > sub->exp_min * mult) {
7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				max = -1;
7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				min = exp->exp_min - sub->exp_min * mult;
7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    } else {
7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				max = -1;
7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				min = 0;
7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (exp->exp_max < sub->exp_max * mult) {
7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				printf("loops max mult mismatch => forbidden\n");
7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlExpFree(ctxt, tmp);
7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				return(forbiddenExp);
7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (sub->exp_max * mult > exp->exp_min)
7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				min = 0;
7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    else
7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				min = exp->exp_min - sub->exp_max * mult;
7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    max = exp->exp_max - sub->exp_max * mult;
7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (!IS_NILLABLE(tmp)) {
7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * TODO: loop here to try to grow if working on finite
7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     *       blocks.
7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Count, Count remain not nillable => forbidden\n");
7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlExpFree(ctxt, tmp);
7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(forbiddenExp);
7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (sub->exp_max == -1) {
7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exp->exp_max == -1) {
7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if (exp->exp_min <= sub->exp_min) {
7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("Infinite loops Okay => COUNT(0,Inf)\n");
7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            max = -1;
7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    min = 0;
7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("Infinite loops min => Count(X,Inf)\n");
7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            max = -1;
7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    min = exp->exp_min - sub->exp_min;
7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (exp->exp_min > sub->exp_min) {
7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("loops min mismatch 1 => forbidden ???\n");
7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlExpFree(ctxt, tmp);
7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        return(forbiddenExp);
7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			max = -1;
7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			min = 0;
7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (exp->exp_max == -1) {
7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("Infinite loop consume finite loop\n");
7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if (exp->exp_min > sub->exp_min) {
7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    max = -1;
7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    min = exp->exp_min - sub->exp_min;
7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    max = -1;
7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    min = 0;
7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if (exp->exp_max < sub->exp_max) {
7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("loops max mismatch => forbidden\n");
7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlExpFree(ctxt, tmp);
7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(forbiddenExp);
7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (sub->exp_max > exp->exp_min)
7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    min = 0;
7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    min = exp->exp_min - sub->exp_max;
7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			max = exp->exp_max - sub->exp_max;
7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("loops match => SEQ(COUNT())\n");
7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exp->exp_left->ref++;
7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left,
7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                          NULL, NULL, min, max);
7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp2 == NULL) {
7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2,
7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		                         NULL, 0, 0);
7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub);
7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == NULL)
7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp == forbiddenExp) {
7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("loop mismatch => forbidden\n");
7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(forbiddenExp);
7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exp->exp_min > 0)
7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		min = exp->exp_min - 1;
7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		min = 0;
7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (exp->exp_max < 0)
7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		max = -1;
7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		max = exp->exp_max - 1;
7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("loop match => SEQ(COUNT())\n");
7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    exp->exp_left->ref++;
7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left,
7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      NULL, NULL, min, max);
7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmp2 == NULL)
7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2,
7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     NULL, 0, 0);
7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("Fallback to derivative\n");
7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_NILLABLE(sub)) {
7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!(IS_NILLABLE(exp)))
7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(forbiddenExp);
7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = emptyExp;
7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = NULL;
7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * here the structured derivation made no progress so
7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * we use the default token based derivation to force one more step
7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->tabSize == 0)
7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->tabSize = 40;
7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tab = (const xmlChar **) xmlMalloc(ctxt->tabSize *
7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                               sizeof(const xmlChar *));
7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (tab == NULL) {
7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * collect all the strings accepted by the subexpression on input
7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0);
7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (len < 0) {
7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        const xmlChar **temp;
7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	temp = (const xmlChar **) xmlRealloc((xmlChar **) tab, ctxt->tabSize * 2 *
7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                     sizeof(const xmlChar *));
7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (temp == NULL) {
7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **) tab);
7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tab = temp;
7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->tabSize *= 2;
7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0);
7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < len;i++) {
7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlExpStringDeriveInt(ctxt, exp, tab[i]);
7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp == NULL) || (tmp == forbiddenExp)) {
7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **) tab);
7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(tmp);
7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp2 = xmlExpStringDeriveInt(ctxt, sub, tab[i]);
7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp2 == NULL) || (tmp2 == forbiddenExp)) {
7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, tmp);
7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **) tab);
7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(tmp);
7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp3 = xmlExpExpDeriveInt(ctxt, tmp, tmp2);
7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlExpFree(ctxt, tmp);
7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlExpFree(ctxt, tmp2);
7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((tmp3 == NULL) || (tmp3 == forbiddenExp)) {
7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **) tab);
7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(tmp3);
7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = tmp3;
7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp3, NULL, 0, 0);
7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == NULL) {
7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar **) tab);
7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return(NULL);
7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree((xmlChar **) tab);
7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
775194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpExpDerive:
7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context
7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression
7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression
7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates the expression resulting from @exp consuming a sub expression @sub
7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Based on algebraic derivation and sometimes direct Brzozowski derivation
7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it usually tatkes less than linear time and can handle expressions generating
7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * infinite languages.
7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting expression or NULL in case of internal error, the
7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         result must be freed
7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr
7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpExpDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) {
7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exp == NULL) || (ctxt == NULL) || (sub == NULL))
7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * O(1) speedups
7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) {
7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("Sub nillable and not exp : can't subsume\n");
7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(forbiddenExp);
7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlExpCheckCard(exp, sub) == 0) {
7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("sub generate longuer sequances than exp : can't subsume\n");
7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(forbiddenExp);
7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlExpExpDeriveInt(ctxt, exp, sub));
7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpSubsume:
7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context
7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exp: the englobing expression
7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub: the subexpression
7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether @exp accepts all the languages accexpted by @sub
7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the input being a subexpression.
7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true 0 if false and -1 in case of failure.
7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) {
7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr tmp;
780394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((exp == NULL) || (ctxt == NULL) || (sub == NULL))
7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * TODO: speedup by checking the language of sub is a subset of the
7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *       language of exp
7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * O(1) speedups
7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) {
7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("Sub nillable and not exp : can't subsume\n");
7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlExpCheckCard(exp, sub) == 0) {
7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("sub generate longuer sequances than exp : can't subsume\n");
7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = xmlExpExpDeriveInt(ctxt, exp, sub);
7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_DERIV
7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("Result derivation :\n");
7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PRINT_EXP(tmp);
7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (tmp == NULL)
7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (tmp == forbiddenExp)
7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (tmp == emptyExp)
7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((tmp != NULL) && (IS_NILLABLE(tmp))) {
7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlExpFree(ctxt, tmp);
7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(1);
7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpFree(ctxt, tmp);
7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
784794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Parsing expression				*
7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr xmlExpParseExpr(xmlExpCtxtPtr ctxt);
7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef CUR
7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur)
7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef NEXT
7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ctxt->cur++;
7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef IS_BLANK
7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK(c) ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t'))
7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP_BLANKS while (IS_BLANK(*ctxt->cur)) ctxt->cur++;
7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseNumber(xmlExpCtxtPtr ctxt) {
7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS
7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '*') {
7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT
7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((CUR < '0') || (CUR > '9'))
7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR >= '0') && (CUR <= '9')) {
7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ret * 10 + (CUR - '0');
7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT
7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr
7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseOr(xmlExpCtxtPtr ctxt) {
7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *base;
7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr ret;
7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val;
7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS
7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    base = ctxt->cur;
7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*ctxt->cur == '(') {
7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpParseExpr(ctxt);
7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS
7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*ctxt->cur != ')') {
7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(stderr, "unbalanced '(' : %s\n", base);
7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS
7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto parse_quantifier;
7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((CUR != 0) && (!(IS_BLANK(CUR))) && (CUR != '(') &&
7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           (CUR != ')') && (CUR != '|') && (CUR != ',') && (CUR != '{') &&
7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (CUR != '*') && (CUR != '+') && (CUR != '?') && (CUR != '}'))
7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NEXT;
7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlDictLookup(ctxt->dict, BAD_CAST base, ctxt->cur - base);
7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, val, 0, 0);
7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS
7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectparse_quantifier:
7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (CUR == '{') {
7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int min, max;
7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	min = xmlExpParseNumber(ctxt);
7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (min < 0) {
7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS
7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR == ',') {
7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NEXT
7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    max = xmlExpParseNumber(ctxt);
7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    SKIP_BLANKS
7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    max = min;
7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (CUR != '}') {
7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL,
7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                         min, max);
7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS
7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '?') {
7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL,
7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                         0, 1);
7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS
7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '+') {
7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL,
7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                         1, -1);
7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS
7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (CUR == '*') {
7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL,
7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                         0, -1);
7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	SKIP_BLANKS
795194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    }
7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr
7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseSeq(xmlExpCtxtPtr ctxt) {
7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr ret, right;
7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlExpParseOr(ctxt);
7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS
7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == '|') {
7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	right = xmlExpParseOr(ctxt);
7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (right == NULL) {
7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, right, NULL, 0, 0);
7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlExpNodePtr
7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParseExpr(xmlExpCtxtPtr ctxt) {
7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr ret, right;
7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlExpParseSeq(ctxt);
7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS
7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (CUR == ',') {
7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        NEXT
7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	right = xmlExpParseSeq(ctxt);
7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (right == NULL) {
7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlExpFree(ctxt, ret);
7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, right, NULL, 0, 0);
7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpParse:
7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the expressions context
7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: the 0 terminated string
8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Minimal parser for regexps, it understand the following constructs
8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - string terminals
8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - choice operator |
8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - sequence operator ,
8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - subexpressions (...)
8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - usual cardinality operators + * and ?
8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - finite sequences  { min, max }
8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  - infinite sequences { min, * }
8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There is minimal checkings made especially no checking on strings values
8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new expression or NULL in case of failure
8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpNodePtr
8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpParse(xmlExpCtxtPtr ctxt, const char *expr) {
8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr ret;
8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->expr = expr;
8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->cur = expr;
8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlExpParseExpr(ctxt);
8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    SKIP_BLANKS
8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*ctxt->cur != 0) {
8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlExpFree(ctxt, ret);
8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDumpInt(xmlBufferPtr buf, xmlExpNodePtr expr, int glob) {
8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpNodePtr c;
8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (expr == NULL) return;
8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (glob) xmlBufferWriteChar(buf, "(");
8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (expr->type) {
8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_EMPTY:
8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferWriteChar(buf, "empty");
8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_FORBID:
8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferWriteChar(buf, "forbidden");
8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_ATOM:
8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferWriteCHAR(buf, expr->exp_str);
8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_SEQ:
8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    c = expr->exp_left;
8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR))
8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 1);
8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 0);
8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferWriteChar(buf, " , ");
8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    c = expr->exp_right;
8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR))
8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 1);
8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 0);
8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_OR:
8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    c = expr->exp_left;
8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR))
8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 1);
8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 0);
8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferWriteChar(buf, " | ");
8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    c = expr->exp_right;
8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR))
8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 1);
8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 0);
8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_EXP_COUNT: {
8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char rep[40];
807394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    c = expr->exp_left;
8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR))
8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 1);
8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlExpDumpInt(buf, c, 0);
8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((expr->exp_min == 0) && (expr->exp_max == 1)) {
8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rep[0] = '?';
8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rep[1] = 0;
8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((expr->exp_min == 0) && (expr->exp_max == -1)) {
8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rep[0] = '*';
8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rep[1] = 0;
8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((expr->exp_min == 1) && (expr->exp_max == -1)) {
8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rep[0] = '+';
8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		rep[1] = 0;
8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (expr->exp_max == expr->exp_min) {
8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        snprintf(rep, 39, "{%d}", expr->exp_min);
8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (expr->exp_max < 0) {
8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        snprintf(rep, 39, "{%d,inf}", expr->exp_min);
8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        snprintf(rep, 39, "{%d,%d}", expr->exp_min, expr->exp_max);
8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    rep[39] = 0;
8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlBufferWriteChar(buf, rep);
8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(stderr, "Error in tree\n");
8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (glob)
8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlBufferWriteChar(buf, ")");
8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpDump:
8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  a buffer to receive the output
8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr:  the compiled expression
8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Serialize the expression as compiled to the buffer
8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpDump(xmlBufferPtr buf, xmlExpNodePtr expr) {
8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buf == NULL) || (expr == NULL))
8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlExpDumpInt(buf, expr, 0);
8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpMaxToken:
8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @expr: a compiled expression
8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Indicate the maximum number of input a expression can accept
8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the maximum length or -1 in case of error
8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpMaxToken(xmlExpNodePtr expr) {
8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (expr == NULL)
8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(expr->c_max);
8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpCtxtNbNodes:
8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context
8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debugging facility provides the number of allocated nodes at a that point
8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes in use or -1 in case of error
8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt) {
8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ctxt->nb_nodes);
8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlExpCtxtNbCons:
8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an expression context
8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debugging facility provides the number of allocated nodes over lifetime
8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes ever allocated or -1 in case of error
8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlExpCtxtNbCons(xmlExpCtxtPtr ctxt) {
8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ctxt->nb_cons);
8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_EXPR_ENABLED */
8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlregexp
8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_REGEXP_ENABLED */
8168