libopc
textreader.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2010, Florian Reuter
3  All rights reserved.
4 
5  Redistribution and use in source and binary forms, with or without
6  modification, are permitted provided that the following conditions
7  are met:
8 
9  * Redistributions of source code must retain the above copyright
10  notice, this list of conditions and the following disclaimer.
11  * Redistributions in binary form must reproduce the above copyright
12  notice, this list of conditions and the following disclaimer in
13  the documentation and/or other materials provided with the
14  distribution.
15  * Neither the name of Florian Reuter nor the names of its contributors
16  may be used to endorse or promote products derived from this
17  software without specific prior written permission.
18 
19  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23  COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
30  OF THE POSSIBILITY OF SUCH DAMAGE.
31 
32 */
36 #ifndef MCE_TEXTREADER_H
37 #define MCE_TEXTREADER_H
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
47 
48 #ifdef __cplusplus
49 } /* extern "C" */
50 #endif
51 
52 
53 #include <mce/config.h>
54 #include <opc/opc.h>
55 #include <mce/helper.h>
56 #include <libxml/xmlwriter.h>
57 
58 
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
62 
63  struct MCE_TEXTREADER {
64  xmlTextReaderPtr reader;
65  mceCtx_t mceCtx;
66  };
67 
72  int mceTextReaderRead(mceTextReader_t *mceTextReader);
73 
78  int mceTextReaderNext(mceTextReader_t *mceTextReader);
79 
90  int mceTextReaderInit(mceTextReader_t *mceTextReader, xmlTextReaderPtr reader);
91 
97  int mceTextReaderCleanup(mceTextReader_t *mceTextReader);
98 
111  int mceTextReaderDump(mceTextReader_t *mceTextReader, xmlTextWriter *writer, pbool_t fragment);
112 
117  int mceTextReaderUnderstandsNamespace(mceTextReader_t *mceTextReader, const xmlChar *ns);
118 
123  pbool_t mceTextReaderDisableMCE(mceTextReader_t *mceTextReader, pbool_t flag);
124 
125 
129  void mceRaiseError(xmlTextReader *reader, mceCtx_t *ctx, mceError_t error, const xmlChar *str, ...);
130 
138  int mceTextReaderPostprocess(xmlTextReader *reader, mceCtx_t *ctx, int ret);
139 
143  mceError_t mceTextReaderGetError(mceTextReader_t *mceTextReader);
144 
153 #define mce_start_document(_reader_) \
154  if (NULL!=(_reader_)) { \
155  mceTextReaderRead(_reader_); \
156  if (0)
157 
162 #define mce_end_document(_reader_) \
163  } /* if (NULL!=reader) */ \
164 
165 
172 #define mce_start_choice(_reader_) \
173  if (0)
174 
179 #define mce_end_choice(_reader_)
180 
181 
187 #define mce_skip_attributes(_reader_) \
188  mce_start_attributes(_reader_) { \
189  } mce_end_attributes(_reader_);
190 
191 
197 #define mce_skip_children(_reader_) \
198  mce_start_children(_reader_) { \
199  } mce_end_children(_reader_);
200 
205 #define mce_start_children(_reader_) \
206 if (!xmlTextReaderIsEmptyElement((_reader_)->reader)) { \
207  mceTextReaderRead(_reader_); do { \
208  if (0)
209 
214 #define mce_end_children(_reader_) \
215  else { \
216  if (XML_READER_TYPE_END_ELEMENT!=xmlTextReaderNodeType((_reader_)->reader)) { \
217  mceTextReaderNext(_reader_); /*skip unhandled element */ \
218  } \
219  } \
220  } while(XML_READER_TYPE_END_ELEMENT!=xmlTextReaderNodeType((_reader_)->reader) && \
221  XML_READER_TYPE_NONE!=xmlTextReaderNodeType((_reader_)->reader)); \
222 } /* if (!xmlTextReaderIsEmptyElement(reader->reader)) */
223 
224 
252 #define mce_match_element(_reader_, ns, ln) \
253  } else if (XML_READER_TYPE_ELEMENT==xmlTextReaderNodeType((_reader_)->reader) \
254  && (NULL==ns || 0==xmlStrcmp(ns, xmlTextReaderConstNamespaceUri((_reader_)->reader))) \
255  && (NULL==ln || 0==xmlStrcmp(ln, xmlTextReaderConstLocalName((_reader_)->reader)))) {
256 
257 
285 #define mce_start_element(_reader_, ns, ln) \
286  mce_match_element(_reader_, ns, ln)
287 
292 #define mce_end_element(_reader_) \
293  mceTextReaderNext(_reader_)
294 
299 #define mce_match_text(_reader_) \
300  } else if (XML_READER_TYPE_TEXT==xmlTextReaderNodeType((_reader_)->reader) \
301  || XML_READER_TYPE_SIGNIFICANT_WHITESPACE==xmlTextReaderNodeType((_reader_)->reader)) {
302 
303 
308 #define mce_start_text(_reader_) \
309  mce_match_text(_reader_)
310 
315 #define mce_end_text(_reader_) \
316  mceTextReaderNext(_reader_)
317 
322 #define mce_start_attributes(_reader_) \
323  if (1==xmlTextReaderMoveToFirstAttribute((_reader_)->reader)) { \
324  do { \
325  if (0)
326 
331 #define mce_end_attributes(_reader_) \
332  else { /* skipped attribute */ } \
333  } while(1==xmlTextReaderMoveToNextAttribute((_reader_)->reader)); \
334  xmlTextReaderMoveToElement((_reader_)->reader); }
335 
363 #define mce_match_attribute(_reader_, ns, ln) \
364  } else if ((NULL==ns || 0==xmlStrcmp(ns, xmlTextReaderConstNamespaceUri((_reader_)->reader))) \
365  && (NULL==ln || 0==xmlStrcmp(ln, xmlTextReaderConstLocalName((_reader_)->reader)))) {
366 
371 #define mce_start_attribute(_reader_, ns, ln) \
372  mce_match_attribute(_reader_, ns, ln)
373 
378 #define mce_end_attribute(_reader_)
379 
380 
410 #define mce_error_guard_start(_reader_) if (MCE_ERROR_NONE==(_reader_)->mceCtx.error) do {
411 
416 #define mce_error_guard_end(_reader_) } while(0)
417 
422 #define mce_error(_reader_, guard, err, msg) if (guard) { (_reader_)->mceCtx.error=(err); fprintf(stderr, (NULL!=msg?msg:#err)); continue; }
423 
428 #if defined(__GNUC__)
429 #define mce_errorf(_reader_, guard, err, msg, ...) if (guard) { mceRaiseError((_reader_)->reader, &(_reader_)->mceCtx, err, _X((NULL!=msg?msg:#err)), ##__VA_ARGS__ ); continue; }
430 #else
431 #define mce_errorf(_reader_, guard, err, msg, ...) if (guard) { mceRaiseError((_reader_)->reader, &(_reader_)->mceCtx, err, _X((NULL!=msg?msg:#err)), __VA_ARGS__ ); continue; }
432 #endif
433 
438 #define mce_error_strict mce_error
439 
444 #define mce_error_strictf mce_errorf
445 
446 
451 #define mce_def
452 
457 #define mce_ref(r) (r)
458 
459 
460 #ifdef __cplusplus
461 } /* extern "C" */
462 #endif
463 
464 #endif /* MCE_TEXTREADER_H */
pbool_t mceTextReaderDisableMCE(mceTextReader_t *mceTextReader, pbool_t flag)
Definition: textreader.c:418
void mceRaiseError(xmlTextReader *reader, mceCtx_t *ctx, mceError_t error, const xmlChar *str,...)
Definition: textreader.c:80
Definition: helper.h:104
Definition: textreader.h:63
int mceTextReaderCleanup(mceTextReader_t *mceTextReader)
Definition: textreader.c:42
int mceTextReaderDump(mceTextReader_t *mceTextReader, xmlTextWriter *writer, pbool_t fragment)
Definition: textreader.c:349
int mceTextReaderUnderstandsNamespace(mceTextReader_t *mceTextReader, const xmlChar *ns)
Definition: textreader.c:414
mceError_t mceTextReaderGetError(mceTextReader_t *mceTextReader)
Definition: textreader.c:336
int mceTextReaderPostprocess(xmlTextReader *reader, mceCtx_t *ctx, int ret)
Definition: textreader.c:284
int mceTextReaderRead(mceTextReader_t *mceTextReader)
Definition: textreader.c:340
int mceTextReaderInit(mceTextReader_t *mceTextReader, xmlTextReaderPtr reader)
Definition: textreader.c:35
int mceTextReaderNext(mceTextReader_t *mceTextReader)
Definition: textreader.c:344