1 extern{ func f_endtagname }
2 //*****************************************************************************
3
4 //1-начало сущности & ;
5 func f_begent
6 {
7 if !X_curtext->xtext.txtype &&
8 X_curtext->xtext.txaddr_code != X_ia
9 { //Сохраняем текст
10 X_curtext->xtext.txlen = X_ia - X_curtext->xtext.txaddr_code
11 X_curtext->xtext.txtype = $TX_TEXT
12 }
13 if X_curtext->xtext.txtype
14 {
15 //Заготовка текста
16 if ++X_ncurtext == X_maxtext
17 {
18 X_maxtext += (X_n = X_maxtext * 3 / 10)
19 X_x->xml.texts.expand(X_n)
20 }
21 X_curtext = &X_x->xml.texts[X_ncurtext]
22 }
23 X_curnameoff = X_ia + 1
24 }
25
26 //2-конец сущ
27 func f_endent
28 {
29 //Сохраняем текст-сущность
30 X_sname.clear()
31 X_curtext->xtext.txaddr_code = &X_x->xml.hentities[ X_sname.append( X_curnameoff, X_ia - X_curnameoff )]
32 X_curtext->xtext.txtype = $TX_ENTITY
33 //Заготовка текста
34 if ++X_ncurtext == X_maxtext
35 {
36 X_maxtext += (X_n = X_maxtext * 3 / 10)
37 X_x->xml.texts.expand(X_n)
38 }
39 X_curtext = &X_x->xml.texts[X_ncurtext]
40 X_curtext->xtext.txaddr_code = X_ia + 1
41 }
42
43 //3-конец числ сущ
44 func f_endentnum
45 {
46 //Сохраняем текст-код
47 X_sname.clear()
48 X_curtext->xtext.txaddr_code = X_sname.append( ++X_curnameoff, X_ia - X_curnameoff ).int()
49 X_curtext->xtext.txtype = $TX_SYMBOL
50 //Заготовка текста
51 if ++X_ncurtext == X_maxtext
52 {
53 X_maxtext += (X_n = X_maxtext * 3 / 10)
54 X_x->xml.texts.expand(X_n)
55 }
56 X_curtext = &X_x->xml.texts[X_ncurtext]
57 X_curtext->xtext.txaddr_code = X_ia + 1
58 }
59
60 //4-конец шест сущ
61 func f_endenthex
62 {
63 //Сохраняем текст-код
64 X_sname.clear()
65 X_sname.appendch( '0' )
66 X_curtext->xtext.txaddr_code = X_sname.append( ++X_curnameoff, X_ia - X_curnameoff ).int()
67 X_curtext->xtext.txtype = $TX_SYMBOL
68 //Заготовка текста
69 if ++X_ncurtext == X_maxtext
70 {
71 X_maxtext += (X_n = X_maxtext * 3 / 10)
72 X_x->xml.texts.expand(X_n)
73 }
74 X_curtext = &X_x->xml.texts[X_ncurtext]
75 X_curtext->xtext.txaddr_code = X_ia + 1
76 }
77
78 //*****************************************************************************
79
80 //5-начало значения атрибута
81 func f_begatrval
82 {
83 //Запоминаем начало текста
84 X_curtext->xtext.txtype = 0
85 X_curtext->xtext.txaddr_code = X_ia + 1
86 }
87
88 //6-конец значения атрибута
89 func f_endatrval
90 {
91 if !X_curtext->xtext.txtype &&
92 X_curtext->xtext.txaddr_code != X_ia
93 { //Сохраняем текст
94 X_curtext->xtext.txlen = X_ia - X_curtext->xtext.txaddr_code
95 X_curtext->xtext.txtype = $TX_TEXT
96 }
97 if X_curtext->xtext.txtype
98 {
99 //Заготовка текста
100 if ++X_ncurtext == X_maxtext
101 {
102 X_maxtext += (X_n = X_maxtext * 3 / 10)
103 X_x->xml.texts.expand(X_n)
104 }
105 X_curtext = &X_x->xml.texts[X_ncurtext]
106 }
107
108 X_x->xml.attribs[X_ncurattrib-1].attend = X_ncurtext
109 }
110
111 //*****************************************************************************
112
113 //7-начало <? ?>, начало наименования
114 func f_begquest
115 {
116 if !X_curtext->xtext.txtype &&
117 X_curtext->xtext.txaddr_code != X_ia - 1
118 { //Сохраняем текст
119 X_curtext->xtext.txlen = X_ia - X_curtext->xtext.txaddr_code - 1
120 X_curtext->xtext.txtype = $TX_TEXT
121 }
122 if X_curtext->xtext.txtype
123 { //Заготовка текста
124 if ++X_ncurtext == X_maxtext
125 {
126 X_maxtext += (X_n = X_maxtext * 3 / 10)
127 X_x->xml.texts.expand(X_n)
128 }
129 X_curtext = &X_x->xml.texts[X_ncurtext]
130 }
131 if X_curtag->xmlitem.tgstart != X_ncurtext
132 { //Сохраняем элемент-текст
133 X_curtag->xmlitem.tgtype = $TG_TEXT
134 X_curtag->xmlitem.tgend = X_ncurtext
135 X_curtag->xmlitem.nnext = ++X_ncurtag
136 X_curtag->xmlitem.nparent = X_nparenttag
137 //Заготовка нового элемента
138 if X_ncurtag == X_maxtag
139 {
140 X_maxtag += (X_n = X_maxtag * 3 / 10)
141 X_x->xml.tags.expand(X_n)
142 }
143 X_curtag = &X_x->xml.tags[X_ncurtag]
144 }
145 //Предварительное описание элемента <?
146 X_curtag->xmlitem.tgtype = $TG_QUEST
147 X_curtag->xmlitem.tgstart = X_ncurattrib
148 X_curtag->xmlitem.nchild = 0
149 X_curtag->xmlitem.nparent = X_nparenttag
150 X_curnameoff = X_ia + 1
151 }
152
153 //8-конец <? ?>
154 func f_endquest
155 {
156 if !X_curtag->xmlitem.tgid
157 {
158 f_endtagname()
159 }
160 //Сохранение элемента <?
161 X_curtag->xmlitem.tgend = X_ncurattrib
162 X_curtag->xmlitem.nnext = ++X_ncurtag
163
164 //Заготовка элемента
165 if X_ncurtag == X_maxtag
166 {
167 X_maxtag += (X_n = X_maxtag * 3 / 10)
168 X_x->xml.tags.expand(X_n)
169 }
170 //Предварительное описание элемента-текста
171 X_curtag = &X_x->xml.tags[X_ncurtag]
172 X_curtag->xmlitem.tgtype = 0
173 X_curtag->xmlitem.tgstart = X_ncurtext
174 X_curtag->xmlitem.nparent = X_nparenttag
175 X_curtext->xtext.txaddr_code = X_ia + 1
176
177 }
178
179 //*****************************************************************************
180
181 //9-конец наименования
182 func f_endtagname
183 {
184 X_sname.clear()
185 //Сохранение имени
186 X_n = &X_x->xml.hnames[ X_sname.append( X_curnameoff, X_ia - X_curnameoff ) ]
187 if !X_n->uint
188 {
189 X_n->uint = *X_x->xml.names
190 X_x->xml.names.expand(1)
191 X_x->xml.names[X_n->uint] = X_sname
192 }
193 X_curtag->xmlitem.tgid = X_n->uint
194 }
195
196 //*****************************************************************************
197
198 //10-начало имени атрибута
199 func f_begatr
200 {
201 X_curnameoff = X_ia
202 }
203
204 //11-конец имени атрибута
205 func f_endatr
206 {
207 X_sname.clear()
208 //Сохранение имени
209 X_n = &X_x->xml.hnames[ X_sname.append( X_curnameoff, X_ia - X_curnameoff ) ]
210 if !X_n->uint
211 {
212 X_n->uint = *X_x->xml.names
213 X_x->xml.names.expand(1)
214 X_x->xml.names[X_n->uint] = X_sname
215 }
216 //Сохранение атрибута
217 X_curattrib->xattrib.attid = X_n->uint
218 X_curattrib->xattrib.attstart = X_ncurtext
219 //Заготовка атрибута
220 if ++X_ncurattrib == X_maxattrib
221 {
222 X_maxattrib += (X_n = X_maxattrib * 3 / 10)
223 X_x->xml.attribs.expand(X_n)
224 }
225 X_curattrib = &X_x->xml.attribs[X_ncurattrib]
226 }
227
228 //*****************************************************************************
229
230 //12-начало <
231 func f_begtag
232 {
233 if !X_curtext->xtext.txtype &&
234 X_curtext->xtext.txaddr_code != X_ia - 1
235 { //Сохраняем текст
236 X_curtext->xtext.txlen = X_ia - X_curtext->xtext.txaddr_code - 1
237 X_curtext->xtext.txtype = $TX_TEXT
238 }
239 if X_curtext->xtext.txtype
240 {
241 //Заготовка текста
242 if ++X_ncurtext == X_maxtext
243 {
244 X_maxtext += (X_n = X_maxtext * 3 / 10)
245 X_x->xml.texts.expand(X_n)
246 }
247 X_curtext = &X_x->xml.texts[X_ncurtext]
248 }
249 if X_curtag->xmlitem.tgstart != X_ncurtext
250 { //Сохраняем элемент текст
251 X_curtag->xmlitem.tgtype = $TG_TEXT
252 X_curtag->xmlitem.tgend = X_ncurtext
253 X_curtag->xmlitem.nnext = ++X_ncurtag
254 //Заготовка элемента
255 if X_ncurtag == X_maxtag
256 {
257 X_maxtag += (X_n = X_maxtag * 3 / 10)
258 X_x->xml.tags.expand(X_n)
259 }
260 X_curtag = &X_x->xml.tags[X_ncurtag]
261 }
262 //Предварительное описание элемента-тэга
263 X_curtag->xmlitem.tgtype = $TG_TAG
264 X_curtag->xmlitem.tgstart = X_ncurattrib
265 X_curtag->xmlitem.nparent = X_nparenttag
266 X_curnameoff = X_ia
267 //print( "< 2\n" )
268 }
269
270 //13-конец >, конец наименования если не было
271 func f_endtag
272 {
273 if !X_curtag->xmlitem.tgid : f_endtagname()
274
275 X_curtag->xmlitem.tgend = X_ncurattrib
276 //Запоминаем текущий тэг в стэке
277 if X_nstack == X_maxstack
278 {
279 X_stacktags.expand( 100 )
280 }
281 X_stacktags[X_nstack++] = X_ncurtag
282 X_stacktags[X_nstack++] = X_nparenttag
283 X_nparenttag = X_ncurtag++
284
285 //Заготовка элемента
286 if X_ncurtag == X_maxtag
287 {
288 X_maxtag += (X_n = X_maxtag * 3 / 10)
289 X_x->xml.tags.expand(X_n)
290 }
291 X_curtag = &X_x->xml.tags[X_ncurtag]
292 //Предварительное описание элемента текста
293 X_curtag->xmlitem.tgtype = 0
294 X_curtag->xmlitem.tgstart = X_ncurtext
295 X_curtag->xmlitem.nparent = X_nparenttag
296 X_curtext->xtext.txaddr_code = X_ia + 1
297 }
298
299 //14-конец /> конец наименования если не было)
300 func f_endtagend
301 {
302 if !X_curtag->xmlitem.tgid: f_endtagname()
303
304 //Сохранение элемента тэга
305 X_curtag->xmlitem.tgtype = $TG_NOCHILD
306 X_curtag->xmlitem.tgend = X_ncurattrib
307 X_curtag->xmlitem.nnext = ++X_ncurtag
308 //Заготовка элемента
309 if X_ncurtag == X_maxtag
310 {
311 X_maxtag += (X_n = X_maxtag * 3 / 10)
312 X_x->xml.tags.expand(X_n)
313 }
314 X_curtag = &X_x->xml.tags[X_ncurtag]
315 //Предвариельное описание элемента текста
316 X_curtag->xmlitem.tgtype = 0
317 X_curtag->xmlitem.tgstart = X_ncurtext
318 X_curtag->xmlitem.nparent = X_nparenttag
319 X_curtext->xtext.txaddr_code = X_ia + 1
320 }
321
322 //*****************************************************************************
323
324 //15-начало </ начало наименования
325 func f_begendtag
326 {
327 if !X_curtext->xtext.txtype &&
328 X_curtext->xtext.txaddr_code != X_ia - 1
329 { //Сохраняем текст
330 X_curtext->xtext.txlen = X_ia - X_curtext->xtext.txaddr_code - 1
331 X_curtext->xtext.txtype = $TX_TEXT
332 }
333 if X_curtext->xtext.txtype
334 { //Заготовка текста
335 if ++X_ncurtext == X_maxtext
336 {
337 X_maxtext += (X_n = X_maxtext * 3 / 10)
338 X_x->xml.texts.expand(X_n)
339 }
340 X_curtext = &X_x->xml.texts[X_ncurtext]
341 }
342 if X_curtag->xmlitem.tgstart != X_ncurtext
343 { //Сохраняем элемент текст
344 X_curtag->xmlitem.tgtype = $TG_TEXT
345 X_curtag->xmlitem.tgend = X_ncurtext
346 X_curtag->xmlitem.nnext = ++X_ncurtag
347 //Заготовка элемента
348 if X_ncurtag == X_maxtag
349 {
350 X_maxtag += (X_n = X_maxtag * 3 / 10)
351 X_x->xml.tags.expand(X_n)
352 }
353 X_curtag = &X_x->xml.tags[X_ncurtag]
354 }
355 if X_nstack
356 { //Вытаскиваем последний элемент из стэка
357 X_nparenttag = X_stacktags[--X_nstack]
358 X_tparenttag = &X_x->xml.tags[X_n = X_stacktags[--X_nstack]]
359 if X_n != X_ncurtag - 1
360 {
361 X_tparenttag->xmlitem.nchild = X_n + 1
362 X_x->xml.tags[X_ncurtag-1].nnext = 0
363 if X_n != X_curtag - 2 : X_x->xml.tags[X_ncurtag-2].nnext = 0
364 //print( "next4=\(0) \(X_ncurtag-1) \(X_n)\n" )
365 }
366 X_tparenttag->xmlitem.nnext = X_ncurtag
367 }
368 else
369 {
370 X_x->xml.err = 2
371 }
372 }
373
374 //16-конец </ >
375 func f_begendtagend
376 {
377 //Предварительное описание элемента текста
378 X_curtag->xmlitem.tgtype = 0
379 X_curtag->xmlitem.tgstart = X_ncurtext
380 X_curtag->xmlitem.nparent = X_nparenttag
381 X_curtext->xtext.txaddr_code = X_ia + 1
382 }
383
384 //*****************************************************************************
385
386 //17-начало <![CDATA[ ]]>
387 func f_begcdata
388 {
389 if !X_curtext->xtext.txtype &&
390 X_curtext->xtext.txaddr_code != X_ia - 8
391 { //Заканчиваем текст
392 X_curtext->xtext.txlen = X_ia - X_curtext->xtext.txaddr_code - 8
393 X_curtext->xtext.txtype = $TX_TEXT
394 }
395 if X_curtext->xtext.txtype
396 {
397 //Добавляем заготовку элемента
398 if ++X_ncurtext == X_maxtext
399 {
400 X_maxtext += (X_n = X_maxtext * 3 / 10)
401 X_x->xml.texts.expand(X_n)
402 }
403 X_curtext = &X_x->xml.texts[X_ncurtext]
404 }
405 X_curtext->xtext.txaddr_code = X_ia + 1
406 }
407
408 //18-конец <![CDATA[ ]]>
409 func f_endcdata
410 {
411 //Заканчиваем текущий текст
412 X_curtext->xtext.txlen = X_ia - X_curtext->xtext.txaddr_code
413 X_curtext->xtext.txtype = $TX_TEXT
414 //Добавляем заготовку текста
415 if ++X_ncurtext == X_maxtext
416 {
417 X_maxtext += (X_n = X_maxtext * 3 / 10)
418 X_x->xml.texts.expand(X_n)
419 }
420 X_curtext = &X_x->xml.texts[X_ncurtext]
421 X_curtext->xtext.txaddr_code = X_ia + 1
422 }
423
424 //*****************************************************************************
425
426 func f_error
427 {
428 X_x->xml.err = 1
429 //print( "ERROR \X_n" )
430 }
431