12 #if defined(WITH_SYCK) && defined(WITH_LUA)
25 LUALIB_API
int luaopen_syck(lua_State *
L)
43 #if LUA_VERSION_NUM >= 502
44 static int luaL_typerror(lua_State *
L,
int narg,
const char *tname)
46 const char *msg = lua_pushfstring(L,
"%s expected, got %s",
47 tname, luaL_typename(L, narg));
48 return luaL_argerror(L, narg, msg);
53 lua_syck_parser_handler(SyckParser *p, SyckNode *n);
55 lua_syck_parser_handler(SyckParser *p, SyckNode *n)
57 struct parser_xtra *bonus = (
struct parser_xtra *)p->bonus;
66 if (n->type_id == NULL || strcmp(n->type_id,
"str") == 0) {
67 lua_pushlstring(bonus->L, n->data.str->ptr, n->data.str->len);
68 o = lua_gettop(bonus->L);
70 else if (strcmp(n->type_id,
"null") == 0)
72 lua_pushnil(bonus->L);
73 o = lua_gettop(bonus->L);
75 else if (strcmp(n->type_id,
"bool#yes") == 0)
77 lua_pushboolean(bonus->L, 1);
78 o = lua_gettop(bonus->L);
80 else if (strcmp(n->type_id,
"bool#no") == 0)
82 lua_pushboolean(bonus->L, 0);
83 o = lua_gettop(bonus->L);
85 else if (strcmp(n->type_id,
"int#hex") == 0)
87 long intVal = strtol(n->data.str->ptr, NULL, 16);
88 lua_pushnumber(bonus->L, intVal);
89 o = lua_gettop(bonus->L);
91 else if (strcmp(n->type_id,
"int") == 0)
93 long intVal = strtol(n->data.str->ptr, NULL, 10);
94 lua_pushnumber(bonus->L, intVal);
95 o = lua_gettop(bonus->L);
99 lua_pushlstring(bonus->L, n->data.str->ptr, n->data.str->len);
100 o = lua_gettop(bonus->L);
105 lua_newtable(bonus->L);
106 o = lua_gettop(bonus->L);
107 for (
i=0;
i < n->data.list->idx;
i++ )
109 oid = syck_seq_read(n,
i);
110 syck_lookup_sym(p,
oid, (
char **)&o2);
111 lua_pushvalue(bonus->L, o2);
112 lua_rawseti(bonus->L, o,
i+1);
117 lua_newtable(bonus->L);
118 o = lua_gettop(bonus->L);
119 for (
i=0;
i < n->data.pairs->idx;
i++ )
121 oid = syck_map_read(n, map_key,
i);
122 syck_lookup_sym(p,
oid, (
char **)&o2);
123 oid = syck_map_read(n, map_value,
i);
124 syck_lookup_sym(p,
oid, (
char **)&o3);
126 lua_pushvalue(bonus->L, o2);
127 lua_pushvalue(bonus->L, o3);
128 lua_settable(bonus->L, o);
132 oid = syck_add_sym(p, (
char *)((
long)o));
136 void lua_syck_emitter_handler(SyckEmitter *e, st_data_t
data);
137 void lua_syck_emitter_handler(SyckEmitter *e, st_data_t
data)
139 struct emitter_xtra *bonus = (
struct emitter_xtra *)e->bonus;
140 int type = lua_type(bonus->L, -1);
146 if (lua_toboolean(bonus->L, -1))
149 strcpy(buf,
"false");
150 syck_emit_scalar(e, (
char *)
"boolean", scalar_none, 0, 0, 0, (
char *)buf, strlen(buf));
153 syck_emit_scalar(e, (
char *)
"string", scalar_none, 0, 0, 0, (
char *)lua_tostring(bonus->L, -1), lua_rawlen(bonus->L, -1));
157 snprintf(buf,
sizeof(buf),
"%i", (
int)lua_tonumber(bonus->L, -1));
158 syck_emit_scalar(e, (
char *)
"number", scalar_none, 0, 0, 0, buf, strlen(buf));
161 if (lua_rawlen(bonus->L, -1) > 0) {
162 syck_emit_seq(e, (
char *)
"table", seq_none);
163 lua_pushnil(bonus->L);
164 while (lua_next(bonus->L, -2) != 0) {
166 syck_emit_item(e, (st_data_t)((
long)bonus->id++));
167 lua_pop(bonus->L, 1);
172 syck_emit_map(e, (
char *)
"table", map_none);
173 lua_pushnil(bonus->L);
174 while (lua_next(bonus->L, -2) != 0) {
175 lua_pushvalue(bonus->L, -2);
176 syck_emit_item(e, (st_data_t)((
long)bonus->id++));
177 lua_pop(bonus->L, 1);
178 syck_emit_item(e, (st_data_t)((
long)bonus->id++));
179 lua_pop(bonus->L, 1);
189 static void lua_syck_mark_emitter(SyckEmitter *e,
int idx)
191 struct emitter_xtra *bonus = (
struct emitter_xtra *)e->bonus;
192 int type = lua_type(bonus->L, idx);
196 lua_pushnil(bonus->L);
197 while (lua_next(bonus->L, -2) != 0) {
200 syck_emitter_mark_node(e, (st_data_t)((
long)bonus->id++));
201 lua_syck_mark_emitter(e, -1);
202 lua_pop(bonus->L, 1);
206 syck_emitter_mark_node(e, (st_data_t)((
long)bonus->id++));
212 void lua_syck_output_handler(SyckEmitter *e,
char *
str,
long len);
213 void lua_syck_output_handler(SyckEmitter *e,
char *
str,
long len)
215 struct emitter_xtra *bonus = (
struct emitter_xtra *)e->bonus;
216 luaL_addlstring(&bonus->output, str, len);
219 static int syck_load(lua_State *L)
221 struct parser_xtra *bonus;
226 if (!luaL_checkstring(L, 1))
227 luaL_typerror(L, 1,
"string");
229 parser = syck_new_parser();
230 parser->bonus = S_ALLOC_N(
struct emitter_xtra, 1);
232 bonus = (
struct parser_xtra *)parser->bonus;
233 bonus->L = lua_newthread(L);
235 syck_parser_str(parser, (
char *)lua_tostring(L, 1), lua_rawlen(L, 1), NULL);
236 syck_parser_handler(parser, lua_syck_parser_handler);
237 v = syck_parse(parser);
238 syck_lookup_sym(parser, v, (
char **)&obj);
240 syck_free_parser(parser);
242 lua_xmove(bonus->L, L, 1);
247 static int syck_dump(lua_State *L)
249 SyckEmitter *emitter;
250 struct emitter_xtra *bonus;
252 emitter = syck_new_emitter();
253 emitter->bonus = S_ALLOC_N(
struct emitter_xtra, 1);
255 bonus = (
struct emitter_xtra *)emitter->bonus;
256 bonus->L = lua_newthread(L);
257 luaL_buffinit(L, &bonus->output);
259 syck_emitter_handler(emitter, lua_syck_emitter_handler);
260 syck_output_handler(emitter, lua_syck_output_handler);
262 lua_pushvalue(L, -2);
263 lua_xmove(L, bonus->L, 1);
266 lua_syck_mark_emitter(emitter, bonus->id);
269 syck_emit(emitter, (st_data_t)((
long)bonus->id));
270 syck_emitter_flush(emitter, 0);
272 luaL_pushresult(&bonus->output);
273 syck_free_emitter(emitter);
278 static const luaL_Reg sycklib[] = {
279 {
"load", syck_load },
280 {
"dump", syck_dump },
284 LUALIB_API
int luaopen_syck(lua_State *L)
286 luaL_newlib(L, sycklib);
const char const char size_t len
const char const bson_bool_t v
const char const bson_oid_t * oid
const char const bson * data
static void output(int indent, int *offset, const char *fmt,...)
static int snprintf(char *buf, int nb, const char *fmt,...)