static SYMID rpmsyck_parse_handler(SyckParser *p, SyckNode *n) { rpmsyck_node node = (rpmsyck_node) xcalloc(1, sizeof(*node)); switch (n->kind) { case syck_str_kind: node->type = T_STR; node->value.key = syck_strndup(n->data.str->ptr, n->data.str->len); break; case syck_seq_kind: { rpmsyck_node val; rpmsyck_node seq = (rpmsyck_node) xcalloc(n->data.list->idx + 1, sizeof(*node)); int i; node->type = T_SEQ; for (i = 0; i < n->data.list->idx; i++) { SYMID oid = syck_seq_read(n, i); syck_lookup_sym(p, oid, (char **)&val); seq[i] = val[0]; } seq[n->data.list->idx].type = T_END; node->value.seq = seq; } break; case syck_map_kind: { hashTable ht = htCreate(n->data.pairs->idx * 2, 0, 0, NULL, NULL); rpmsyck_node val; int i; node->type = T_MAP; for (i = 0; i < n->data.pairs->idx; i++) { char *key; SYMID oid = syck_map_read(n, map_key, i); syck_lookup_sym(p, oid, (char **)&val); key = val[0].value.key; oid = syck_map_read(n, map_value, i); syck_lookup_sym(p, oid, (char **)&val); htAddEntry(ht, key, val); } node->value.map = ht; } break; } node->tag = n->type_id ? syck_strndup(n->type_id, strlen(n->type_id)) : NULL; return syck_add_sym(p, (char *) node); }
static int syck_load(lua_State *L) { struct parser_xtra *bonus; SyckParser *parser; SYMID v; int obj; if (!luaL_checkstring(L, 1)) luaL_typerror(L, 1, "string"); parser = syck_new_parser(); parser->bonus = S_ALLOC_N(struct emitter_xtra, 1); bonus = (struct parser_xtra *)parser->bonus; bonus->L = lua_newthread(L); syck_parser_str(parser, (char *)lua_tostring(L, 1), lua_strlen(L, 1), NULL); syck_parser_handler(parser, lua_syck_parser_handler); v = syck_parse(parser); syck_lookup_sym(parser, v, (void *)&obj); syck_free_parser(parser); lua_xmove(bonus->L, L, 1); return 1; }
static int syck_load(lua_State *L) { struct parser_xtra *bonus; SyckParser *parser; SYMID v; int obj; if (!luaL_checkstring(L, 1)) luaL_typerror(L, 1, "string"); parser = syck_new_parser(); parser->bonus = S_ALLOC_N(struct parser_xtra, 1); bonus = (struct parser_xtra *)parser->bonus; bonus->orig = L; bonus->L = lua_newthread(L); syck_parser_str(parser, (char *)lua_tostring(L, 1), lua_strlen(L, 1), NULL); syck_parser_handler(parser, lua_syck_parser_handler); syck_parser_error_handler(parser, lua_syck_error_handler); v = syck_parse(parser); syck_lookup_sym(parser, v, (char **)&obj); syck_free_parser(parser); lua_pop(L,1); //pop the thread, we don't need it anymore. lua_xmove(bonus->L, L, 1); if ( parser->bonus != NULL ) S_FREE( parser->bonus ); return 1; }
static JSBool syck_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { SyckParser *parser = syck_new_parser(); struct parser_xtra *bonus = xcalloc(1, sizeof(*bonus)); SYMID v; int sobj; char * s = NULL; JSBool ok = JS_FALSE; if (_debug) fprintf(stderr, "==> %s(%p,%p,%p[%u],%p)\n", __FUNCTION__, cx, obj, argv, (unsigned)argc, rval); ok = JS_ConvertArguments(cx, argc, argv, "s", &s); if (!ok) goto exit; #ifdef NOTYET bonus->L = lua_newthread(L); #endif parser->bonus = bonus; syck_parser_str(parser, s, strlen(s), NULL); syck_parser_handler(parser, js_syck_parser_handler); v = syck_parse(parser); syck_lookup_sym(parser, v, (char **)&sobj); #ifdef NOTYET lua_xmove(bonus->L, L, 1); #endif ok = JS_TRUE; exit: syck_free_parser(parser); return ok; }
rpmSyck rpmSyckLoad(char *yaml) { SyckParser *parser; SYMID v; rpmSyck rs; rs = rpmSyckCreate(); parser = syck_new_parser(); syck_parser_str_auto(parser, yaml, NULL); syck_parser_handler(parser, rpmsyck_parse_handler); syck_parser_error_handler(parser, NULL); syck_parser_implicit_typing(parser, 1); syck_parser_taguri_expansion(parser, 1); if((v = syck_parse(parser))) syck_lookup_sym( parser, v, (char **)&rs->firstNode); rs->syms = parser->syms; parser->syms = NULL; syck_free_parser(parser); return rs; }
static SYMID js_syck_parser_handler(SyckParser *p, SyckNode *n) { #ifdef NOTYET struct parser_xtra *bonus = (struct parser_xtra *)p->bonus; int o2; int o3 = -1; int i; #endif int o = 0; SYMID oid; switch (n->kind) { case syck_str_kind: #ifdef NOTYET if (n->type_id == NULL || strcmp(n->type_id, "str") == 0) { lua_pushlstring(bonus->L, n->data.str->ptr, n->data.str->len); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "null") == 0) { lua_pushnil(bonus->L); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "bool#yes") == 0) { lua_pushboolean(bonus->L, 1); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "bool#no") == 0) { lua_pushboolean(bonus->L, 0); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "int#hex") == 0) { long intVal = strtol(n->data.str->ptr, NULL, 16); lua_pushnumber(bonus->L, intVal); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "int") == 0) { long intVal = strtol(n->data.str->ptr, NULL, 10); lua_pushnumber(bonus->L, intVal); o = lua_gettop(bonus->L); } else { lua_pushlstring(bonus->L, n->data.str->ptr, n->data.str->len); o = lua_gettop(bonus->L); } #endif break; case syck_seq_kind: #ifdef NOTYET lua_newtable(bonus->L); o = lua_gettop(bonus->L); for (i = 0; i < n->data.list->idx; i++) { oid = syck_seq_read(n, i); syck_lookup_sym(p, oid, (char **)&o2); lua_pushvalue(bonus->L, o2); lua_rawseti(bonus->L, o, i+1); } #endif break; case syck_map_kind: #ifdef NOTYET lua_newtable(bonus->L); o = lua_gettop(bonus->L); for (i = 0; i < n->data.pairs->idx; i++) { oid = syck_map_read(n, map_key, i); syck_lookup_sym(p, oid, (char **)&o2); oid = syck_map_read(n, map_value, i); syck_lookup_sym(p, oid, (char **)&o3); lua_pushvalue(bonus->L, o2); lua_pushvalue(bonus->L, o3); lua_settable(bonus->L, o); } #endif break; } oid = syck_add_sym(p, (char *)((long)o)); return oid; }
/* static void stackDump (lua_State *L) { int i; int top = lua_gettop(L); for (i = 1; i <= top; i++) { // repeat for each level int t = lua_type(L, i); printf("%i: ", (top-i+1)); switch (t) { case LUA_TSTRING: // strings printf("[string]"); break; case LUA_TBOOLEAN: // booleans printf(lua_toboolean(L, i) ? "true" : "false"); break; case LUA_TNUMBER: // numbers printf("%g", lua_tonumber(L, i)); break; default: // other values printf("%s", lua_typename(L, t)); break; } printf("\n"); // put a separator } printf("\n----------\n"); // end the listing } */ SYMID lua_syck_parser_handler(SyckParser *p, SyckNode *n) { struct parser_xtra *bonus = (struct parser_xtra *)p->bonus; int o, o2, o3 = -1; SYMID oid; int i; if(!lua_checkstack(bonus->L, 1)) luaL_error(bonus->orig,"syck parser wanted too much stack space."); switch (n->kind) { case syck_str_kind: if (n->type_id == NULL || strcmp(n->type_id, "str") == 0) { lua_pushlstring(bonus->L, n->data.str->ptr, n->data.str->len); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "null") == 0) { lua_pushnil(bonus->L); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "bool#yes") == 0) { lua_pushboolean(bonus->L, 1); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "bool#no") == 0) { lua_pushboolean(bonus->L, 0); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "float") == 0 || strcmp(n->type_id, "float#fix") == 0 || strcmp(n->type_id, "float#exp") == 0) { double f; syck_str_blow_away_commas(n); f = strtod(n->data.str->ptr, NULL); lua_pushnumber(bonus->L, f); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "int#hex") == 0) { long intVal = strtol(n->data.str->ptr, NULL, 16); lua_pushnumber(bonus->L, intVal); o = lua_gettop(bonus->L); } else if (strcmp(n->type_id, "int") == 0) { long intVal = strtol(n->data.str->ptr, NULL, 10); lua_pushnumber(bonus->L, intVal); o = lua_gettop(bonus->L); } else { lua_pushlstring(bonus->L, n->data.str->ptr, n->data.str->len); o = lua_gettop(bonus->L); } break; case syck_seq_kind: lua_newtable(bonus->L); o = lua_gettop(bonus->L); for ( i=0; i < n->data.list->idx; i++ ) { oid = syck_seq_read(n, i); syck_lookup_sym(p, oid, (char **)&o2); lua_pushvalue(bonus->L, o2); lua_rawseti(bonus->L, o, i+1); } break; case syck_map_kind: lua_newtable(bonus->L); o = lua_gettop(bonus->L); for ( i=0; i < n->data.pairs->idx; i++ ) { oid = syck_map_read(n, map_key, i); syck_lookup_sym(p, oid, (char **)&o2); oid = syck_map_read(n, map_value, i); syck_lookup_sym(p, oid, (char **)&o3); lua_pushvalue(bonus->L, o2); lua_pushvalue(bonus->L, o3); lua_settable(bonus->L, o); } break; } oid = syck_add_sym(p, (char *)o); return oid; }