File: schema_ecm.h

package info (click to toggle)
virtuoso-opensource 7.2.5.1%2Bdfsg1-0.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 285,240 kB
  • sloc: ansic: 641,220; sql: 490,413; xml: 269,570; java: 83,893; javascript: 79,900; cpp: 36,927; sh: 31,653; cs: 25,702; php: 12,690; yacc: 10,227; lex: 7,601; makefile: 7,129; jsp: 4,523; awk: 1,697; perl: 1,013; ruby: 1,003; python: 326
file content (227 lines) | stat: -rw-r--r-- 7,559 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*
 *
 *  This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
 *  project.
 *
 *  Copyright (C) 1998-2018 OpenLink Software
 *
 *  This project is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the
 *  Free Software Foundation; only version 2 of the License, dated June 1991.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 *
 */

#ifndef SCHEMA_ECM_H
#define SCHEMA_ECM_H
#include "xmlparser_impl.h"


/* forward declarations */
struct schema_processor_s;
struct xs_component_s;



/* schema FSM declarations */

typedef ptrlong xecm_st_idx_t;
typedef ptrlong xecm_el_idx_t;

typedef enum xs_any_attr_op_en
{
  XS_ANY_ATTR_ERROR = 0,	/*!< default is to report an error */
  XS_ANY_ATTR_SKIP,
  XS_ANY_ATTR_ERROR_WITH_OTHER,
  XS_ANY_ATTR_SKIP_WITH_OTHER
} XS_ANY_ATTR_OP;

typedef char * xs_any_attr_ns;

#define XS_ANY_ATTR_NS_NONE	(xs_any_attr_ns)(0)
#define XS_ANY_ATTR_NS_ANY	(xs_any_attr_ns)(1)
#define XS_ANY_ATTR_NS_OTHER	(xs_any_attr_ns)(2)	/* Attention! this is not used in data structures. */
#define XS_ANY_ATTR_NS_LOCAL	(xs_any_attr_ns)(3)
#define XS_ANY_ATTR_NS_TARGET	(xs_any_attr_ns)(4)

/*! schema element state */
struct xecm_st_info_s
{
  ecm_st_idx_t xsi_idx;
  struct xs_component_s *xsi_type;
  ptrlong xsi_min_counters;
  ptrlong xsi_max_counters;
  ptrlong xsi_occurence_num;
};
typedef struct xecm_st_info_s xecm_st_info_t;

#define XECM_STORAGE_RAW    1
#define XECM_STORAGE_RARE   2
/*  if number of elements more than XECM_STORAGE_MAXELS than
    sparse arrays are used */
#define XECM_STORAGE_MAXELS 70
typedef struct xecm_nexts_array_s
{
  ptrlong na_type_sel;		/* either raw array or big array type */
  union
  {
    xecm_st_info_t *raw;
    struct xecm_big_array_s *rare;
  }
  na_nexts;
  ptrlong na_max_idx;
}
xecm_nexts_array_t;

xecm_st_info_t *xecm_get_next (xecm_nexts_array_t * nexts, ptrlong el);
ptrlong xecm_get_nextidx (xecm_nexts_array_t * nexts, ptrlong el);

struct xecm_st_s
{
  xecm_nexts_array_t *xes_nexts;	/*!< \c xes_nexts[OFFSET+el_idx] is a index of resulting state */
  xecm_el_idx_t xes_conflict;	/*!< Sample of element which causes jump/jump conflict */
  xecm_st_idx_t xes_eqclass;	/*!< Index of equivalence class */
};
typedef struct xecm_st_s xecm_st_t;

typedef struct grp_tree_elem_s *grp_tree_t;

typedef union
{
  char *ptr;		/*!< Pointer to memory with default value (if NULL == values) */
  ptrlong index;		/*!< Index in values array */
}
ptrindex_t;

struct xecm_attr_s
{
  char *xa_name;		/*!< Name of attribute */
  union
  {
    ptrlong idx;
    struct xs_component_s *ref;
  }
  xa_type;			/*!< Data type for attribute's values */
  ptrlong xa_pr_typeidx;	/*!< base primitive type idx */
  ptrlong xa_is_implied;	/*!< Flags if use="implied" specified */
  ptrlong xa_is_prohibited;	/*!< Flags if use="prohibited" specified */
  ptrlong xa_value_sel;		/*!< Either XEA_FIXED or XEA_DEFAULT or XEA_ENUMERATION */
/*! Positive if use="required" specified, 0 if optional.
The positive value is 1-based number of attribute among all required attributes of a type if they are listed in the dictionary order.
This is used to quickly find an example of a missing required attribute. */
  ptrlong xa_required;		
  union
  {
    struct
    {
      char **values;	/*!< Array of \c da_values_no pointers to normalized values */
      ptrlong values_no;	/*!< Number of enumerated values, default value will come first */
    }
    _enumeration;
    ptrindex_t _fixed;
    ptrindex_t _default;
  }
  xa_value;
  ptrlong attr_component; /*mapping schema*/
};

typedef struct xecm_attr_s xecm_attr_t;

typedef struct xecm_el_s
{
  struct xs_component_s *xee_component;	/*!< component of element */
  struct xecm_attr_s *xee_attrs;	/*!< Descriptions of attributes */
  ptrlong xee_attrs_no;			/*!< Number of items in xee_attrs */
  ptrlong xee_req_atts_no;		/*!< number of required attributes */
  xecm_st_t *xee_states;		/*!< DTD like array of states */
  ecm_st_idx_t xee_st_no;		/*!< number of states in array */
#ifdef DEBUG  
  xecm_st_t *xee_raw_states;		/*!< DTD like array of states */
  ecm_st_idx_t xee_raw_st_no;		/*!< number of states in array */
#endif
  /* ptrlong xee_is_any; */
  /* ptrlong xee_is_empty; */
  ptrlong xee_pcdata_mode;
  XS_ANY_ATTR_OP	xee_any_attribute; /*!< indicates what to do with unknown attribute */
  xs_any_attr_ns	xee_any_attr_ns; /*!< which namespaces must be selected */
  xecm_el_idx_t xee_conflict;	/*!< HZ */
  ptrlong	xee_is_nillable;
}
xecm_el_t;

typedef struct xsv_astate_s
{
  xecm_el_t *xa_el;			/*!< Description of current element */
  struct xs_component_s * xa_type;	/*!< type, if applicable */
  xecm_st_idx_t xa_state;		/*!< Index of current state at this level */
  xecm_st_t *xa_states;			/*!< copy of element's fsm */
  xecm_el_idx_t xa_prev_nameidx;	/*!< Index of previous sibling element */
  ecm_st_idx_t xa_st_no;
  id_hash_t *xa_counter_hash;
}
xsv_astate_t;

#define XECM_TERM_CHAIN		(-31)	/*!< Sequence of two given subterms should present */
#define XECM_TERM_CHOICE	(-32)	/*!< One of two given subterms should present */
#define XECM_TERM_LOOP_ZERO	(-33)	/*!< Given subterm should be repeated zero or more times */
#define XECM_TERM_LOOP_ONE	(-34)	/*!< Given subterm should be repeated one or more times */


#define XECM_ST_START		0
#define XECM_ST_ERROR		(-42)
#define XECM_ST_EMPTY		(-52)
#define XECM_ST_EMPTY_OR_PCDATA	(-53)

#define XECM_EL_EOS		(-1)
#define XECM_EL_PCDATA		(-2)
#define XECM_EL_NULL_T		(-3)
#define XECM_EL_ANY_LOCAL	(-4)
#define XECM_EL_ANY_NOT_LISTED_NS	(-5)

#define XECM_EL_OFFSET		6
#define XECM_EL_UNDEF		(-21)
#define XECM_EL_ERROR		(-22)

#define XECM_EMPTY	((grp_tree_elem_t *)(-1))
#define XECM_ANY	((grp_tree_elem_t *)(-2))

#define GRP_TREE_IS_PREDEFINED(tree)  (!tree||tree == XECM_ANY||tree == XECM_EMPTY)


/* implementation definitions */

#define XECM_MEM_PREALLOCATE_ITEMS 16

void xecm_init_validation_vars (struct schema_processor_s *processor);
/* Adds type into internal unordered table */
ptrlong xecm_add_element (struct xs_component_s *elem, void **objs,
    ptrlong * obj_no, size_t sizeof_obj);
/* end of FSM declarations */

/* must be called at point when whole document is read */
int xecm_create_all_fsas (vxml_parser_t * parser);

/* FSM arrays manipullation functions */
struct xecm_nexts_array_s *xecm_nexts_allocate (ptrlong storage_type,
    ptrlong el_no, ptrlong defval);
void xecm_nexts_free (xecm_nexts_array_t * nexts);
ptrlong xecm_get_nextidx (xecm_nexts_array_t * nexts, ptrlong idx);
extern struct xecm_st_info_s *xecm_get_next (xecm_nexts_array_t * nexts, ptrlong idx);
extern void xecm_set_next (xecm_nexts_array_t * nexts, ptrlong idx, xecm_st_info_t * el);
extern void xecm_set_nextidx (xecm_nexts_array_t * nexts, ptrlong idx, ecm_st_idx_t elidx, struct xs_component_s *el_comp);
struct xecm_nexts_array_s *xecm_copy_nexts (struct xecm_nexts_array_s *nexts);

struct grp_tree_elem_s *
xecm_advance_tree (vxml_parser_t *parser, struct grp_tree_elem_s * node);

void xecm_nexts_free (xecm_nexts_array_t * nexts);

#endif /* #ifdef SCHEMA_ECM_H */