36 lua_State *L; |
36 lua_State *L; |
37 XML_Parser parser; /* associated expat parser */ |
37 XML_Parser parser; /* associated expat parser */ |
38 int tableref; /* table with callbacks for this parser */ |
38 int tableref; /* table with callbacks for this parser */ |
39 enum XPState state; |
39 enum XPState state; |
40 luaL_Buffer *b; /* to concatenate sequences of cdata pieces */ |
40 luaL_Buffer *b; /* to concatenate sequences of cdata pieces */ |
|
41 int bufferCharData; /* whether to buffer cdata pieces */ |
41 }; |
42 }; |
42 |
43 |
43 typedef struct lxp_userdata lxp_userdata; |
44 typedef struct lxp_userdata lxp_userdata; |
44 |
45 |
45 |
46 |
150 |
151 |
151 static void f_CharData (void *ud, const char *s, int len) { |
152 static void f_CharData (void *ud, const char *s, int len) { |
152 lxp_userdata *xpu = (lxp_userdata *)ud; |
153 lxp_userdata *xpu = (lxp_userdata *)ud; |
153 if (xpu->state == XPSok) { |
154 if (xpu->state == XPSok) { |
154 if (getHandle(xpu, CharDataKey) == 0) return; /* no handle */ |
155 if (getHandle(xpu, CharDataKey) == 0) return; /* no handle */ |
155 xpu->state = XPSstring; |
156 if(xpu->bufferCharData != 0) { |
156 luaL_buffinit(xpu->L, xpu->b); |
157 xpu->state = XPSstring; |
|
158 luaL_buffinit(xpu->L, xpu->b); |
|
159 } else { |
|
160 lua_pushlstring(xpu->L, s, len); |
|
161 docall(xpu, 1, 0); |
|
162 } |
157 } |
163 } |
158 if (xpu->state == XPSstring) |
164 if (xpu->state == XPSstring) |
159 luaL_addlstring(xpu->b, s, len); |
165 luaL_addlstring(xpu->b, s, len); |
160 } |
166 } |
161 |
167 |
372 } |
378 } |
373 |
379 |
374 |
380 |
375 static int lxp_make_parser (lua_State *L) { |
381 static int lxp_make_parser (lua_State *L) { |
376 XML_Parser p; |
382 XML_Parser p; |
|
383 int bufferCharData = (lua_type(L, 3) != LUA_TBOOLEAN) || (lua_toboolean(L, 3) != 0); |
377 char sep = *luaL_optstring(L, 2, ""); |
384 char sep = *luaL_optstring(L, 2, ""); |
378 lxp_userdata *xpu = createlxp(L); |
385 lxp_userdata *xpu = createlxp(L); |
|
386 xpu->bufferCharData = bufferCharData; |
379 p = xpu->parser = (sep == '\0') ? XML_ParserCreate(NULL) : |
387 p = xpu->parser = (sep == '\0') ? XML_ParserCreate(NULL) : |
380 XML_ParserCreateNS(NULL, sep); |
388 XML_ParserCreateNS(NULL, sep); |
381 if (!p) |
389 if (!p) |
382 luaL_error(L, "XML_ParserCreate failed"); |
390 luaL_error(L, "XML_ParserCreate failed"); |
383 luaL_checktype(L, 1, LUA_TTABLE); |
391 luaL_checktype(L, 1, LUA_TTABLE); |