src/lxplib.c

changeset 19
10c30b63873a
parent 18
90da47758f85
child 26
a8caec6c5429
equal deleted inserted replaced
18:90da47758f85 19:10c30b63873a
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);

mercurial