]> mj.ucw.cz Git - libucw.git/blob - ucw-xml/common.c
Released as 6.5.16.
[libucw.git] / ucw-xml / common.c
1 /*
2  *      UCW Library -- A simple XML parser
3  *
4  *      (c) 2007 Pavel Charvat <pchar@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #undef LOCAL_DEBUG
11
12 #include <ucw/lib.h>
13 #include <ucw-xml/xml.h>
14 #include <ucw-xml/dtd.h>
15 #include <ucw-xml/internals.h>
16 #include <ucw/stkstring.h>
17 #include <ucw/ff-unicode.h>
18
19 #include <setjmp.h>
20
21 /*** Error handling ***/
22
23 void NONRET
24 xml_throw(struct xml_context *ctx)
25 {
26   ASSERT(ctx->err_code && ctx->throw_buf);
27   longjmp(*(jmp_buf *)ctx->throw_buf, ctx->err_code);
28 }
29
30 void
31 xml_warn(struct xml_context *ctx, const char *format, ...)
32 {
33   if (ctx->h_warn)
34     {
35       va_list args;
36       va_start(args, format);
37       ctx->err_msg = stk_vprintf(format, args);
38       ctx->err_code = XML_ERR_WARN;
39       va_end(args);
40       ctx->h_warn(ctx);
41       ctx->err_msg = NULL;
42       ctx->err_code = XML_ERR_OK;
43     }
44 }
45
46 void
47 xml_error(struct xml_context *ctx, const char *format, ...)
48 {
49   if (ctx->h_error)
50     {
51       va_list args;
52       va_start(args, format);
53       ctx->err_msg = stk_vprintf(format, args);
54       ctx->err_code = XML_ERR_ERROR;
55       va_end(args);
56       ctx->h_error(ctx);
57       ctx->err_msg = NULL;
58       ctx->err_code = XML_ERR_OK;
59     }
60 }
61
62 void NONRET
63 xml_fatal(struct xml_context *ctx, const char *format, ...)
64 {
65   va_list args;
66   va_start(args, format);
67   ctx->err_msg = mp_vprintf(ctx->stack, format, args);
68   ctx->err_code = XML_ERR_FATAL;
69   ctx->state = XML_STATE_EOF;
70   va_end(args);
71   if (ctx->h_fatal)
72     ctx->h_fatal(ctx);
73   xml_throw(ctx);
74 }
75
76 /*** Memory management ***/
77
78 void *
79 xml_hash_new(struct mempool *pool, uint size)
80 {
81   void *tab = mp_alloc_zero(pool, size + XML_HASH_HDR_SIZE);
82   *(void **)tab = pool;
83   return tab + XML_HASH_HDR_SIZE;
84 }
85
86 /*** Initialization ***/
87
88 static struct xml_context xml_defaults = {
89   .flags = XML_SRC_EOF | XML_REPORT_ALL,
90   .state = XML_STATE_START,
91   .h_resolve_entity = xml_def_resolve_entity,
92   .chars = {
93     .name = "<xml_chars>",
94     .spout = xml_spout_chars,
95     .can_overwrite_buffer = 1,
96   },
97 };
98
99 void
100 xml_init(struct xml_context *ctx)
101 {
102   *ctx = xml_defaults;
103   ctx->pool = mp_new(65536);
104   ctx->stack = mp_new(65536);
105   TRACE(ctx, "init");
106 }
107
108 void
109 xml_cleanup(struct xml_context *ctx)
110 {
111   TRACE(ctx, "cleanup");
112   xml_dtd_cleanup(ctx);
113   xml_sources_cleanup(ctx);
114   xml_ns_cleanup(ctx);
115   mp_delete(ctx->pool);
116   mp_delete(ctx->stack);
117 }
118
119 void
120 xml_reset(struct xml_context *ctx)
121 {
122   TRACE(ctx, "reset");
123   struct mempool *pool = ctx->pool, *stack = ctx->stack, *ns_pool = ctx->ns_pool;
124   const char **ns_by_id = ctx->ns_by_id;
125   xml_dtd_cleanup(ctx);
126   xml_sources_cleanup(ctx);
127   mp_flush(pool);
128   mp_flush(stack);
129   *ctx = xml_defaults;
130   ctx->pool = pool;
131   ctx->stack = stack;
132   ctx->ns_pool = ns_pool;
133   ctx->ns_by_id = ns_by_id;
134   xml_ns_reset(ctx);
135 }