Changeset 316 for trunk/ext/lua
- Timestamp:
- 04/28/2008 02:17:36 (7 months ago)
- Location:
- trunk/ext/lua
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/ext/lua/syck.c
r306 r316 1 1 /* 2 * lsyck.c2 * syck.c 3 3 * 4 4 * $Author$ … … 6 6 * 7 7 * Copyright (C) 2005 Zachary P. Landau <kapheine@divineinvasion.net> 8 * slact touched this in 2008. blame him. 8 9 */ 9 10 … … 23 24 24 25 struct parser_xtra { 25 lua_State *L; 26 lua_State *L; //syck parser thread state 27 lua_State *orig; //original API stack state 26 28 }; 27 29 30 /* 31 static void stackDump (lua_State *L) { 32 int i; 33 int top = lua_gettop(L); 34 for (i = 1; i <= top; i++) { // repeat for each level 35 int t = lua_type(L, i); 36 printf("%i: ", (top-i+1)); 37 switch (t) { 38 39 case LUA_TSTRING: // strings 40 printf("[string]"); 41 break; 42 43 case LUA_TBOOLEAN: // booleans 44 printf(lua_toboolean(L, i) ? "true" : "false"); 45 break; 46 47 case LUA_TNUMBER: // numbers 48 printf("%g", lua_tonumber(L, i)); 49 break; 50 51 default: // other values 52 printf("%s", lua_typename(L, t)); 53 break; 54 55 } 56 printf("\n"); // put a separator 57 } 58 printf("\n----------\n"); // end the listing 59 } 60 */ 28 61 SYMID 29 62 lua_syck_parser_handler(SyckParser *p, SyckNode *n) … … 34 67 int i; 35 68 69 if(!lua_checkstack(bonus->L, 1)) 70 luaL_error(bonus->orig,"syck parser wanted too much stack space."); 71 36 72 switch (n->kind) { 37 73 case syck_str_kind: … … 55 91 o = lua_gettop(bonus->L); 56 92 } 93 else if (strcmp(n->type_id, "float") == 0 || strcmp(n->type_id, "float#fix") == 0 || strcmp(n->type_id, "float#exp") == 0) 94 { 95 double f; 96 syck_str_blow_away_commas(n); 97 f = strtod(n->data.str->ptr, NULL); 98 lua_pushnumber(bonus->L, f); 99 o = lua_gettop(bonus->L); 100 } 57 101 else if (strcmp(n->type_id, "int#hex") == 0) 58 102 { … … 65 109 long intVal = strtol(n->data.str->ptr, NULL, 10); 66 110 lua_pushnumber(bonus->L, intVal); 67 o = lua_gettop(bonus->L); 111 o = lua_gettop(bonus->L); 68 112 } 69 113 else … … 110 154 struct emitter_xtra *bonus = (struct emitter_xtra *)e->bonus; 111 155 int type = lua_type(bonus->L, -1); 112 char buf[3 0]; /* find a better way, if possible */156 char buf[32]; /* find a better way, if possible */ 113 157 114 158 switch (type) … … 125 169 break; 126 170 case LUA_TNUMBER: 127 /* should handle floats as well */ 128 snprintf(buf, sizeof(buf), "%i", (int)lua_tonumber(bonus->L, -1)); 171 ; lua_Number lnum; //is it an int or a float? 172 lnum = lua_tonumber(bonus->L, -1); 173 int asInt = lnum; 174 if(asInt == lnum) 175 snprintf(buf, sizeof(buf), "%i", asInt); 176 else 177 { 178 snprintf(buf, sizeof(buf), "%f", lnum); 179 /* Remove trailing zeroes after the decimal point */ 180 int k; 181 for (k = strlen(buf) - 1; buf[k] == '0' && buf[k - 1] != '.'; k--) 182 buf[k] = '\0'; 183 } 129 184 syck_emit_scalar(e, "number", scalar_none, 0, 0, 0, buf, strlen(buf)); 130 185 break; … … 187 242 } 188 243 244 void lua_syck_error_handler(SyckParser *p, char *msg) 245 { 246 //struct parser_xtra *bonus = (struct parser_xtra *)p->bonus; 247 luaL_error(((struct parser_xtra *)p->bonus)->orig, "Error at [Line %d, Col %d]: %s\n", p->linect, p->cursor - p->lineptr, msg ); 248 } 249 250 189 251 static int syck_load(lua_State *L) 190 252 { … … 198 260 199 261 parser = syck_new_parser(); 200 parser->bonus = S_ALLOC_N(struct emitter_xtra, 1);262 parser->bonus = S_ALLOC_N(struct parser_xtra, 1); 201 263 202 264 bonus = (struct parser_xtra *)parser->bonus; 265 bonus->orig = L; 203 266 bonus->L = lua_newthread(L); 204 267 205 268 syck_parser_str(parser, (char *)lua_tostring(L, 1), lua_strlen(L, 1), NULL); 206 269 syck_parser_handler(parser, lua_syck_parser_handler); 270 syck_parser_error_handler(parser, lua_syck_error_handler); 207 271 v = syck_parse(parser); 208 272 syck_lookup_sym(parser, v, (char **)&obj); … … 210 274 syck_free_parser(parser); 211 275 276 lua_pop(L,1); //pop the thread, we don't need it anymore. 212 277 lua_xmove(bonus->L, L, 1); 213 278 279 if ( parser->bonus != NULL ) 280 S_FREE( parser->bonus ); 281 214 282 return 1; 215 283 } 284 285 216 286 217 287 static int syck_dump(lua_State *L) … … 222 292 emitter = syck_new_emitter(); 223 293 emitter->bonus = S_ALLOC_N(struct emitter_xtra, 1); 294 224 295 225 296 bonus = (struct emitter_xtra *)emitter->bonus; … … 241 312 242 313 luaL_pushresult(&bonus->output); 314 243 315 syck_free_emitter(emitter); 316 317 if (bonus != NULL ) 318 S_FREE( bonus ); 319 244 320 245 321 return 1; … … 252 328 }; 253 329 330 331 static void set_info (lua_State *L) 332 { 333 // Assumes the table is on top of the stack. 334 lua_pushliteral (L, "_COPYRIGHT"); 335 lua_pushliteral (L, "Copyright (C) why the lucky stiff"); 336 lua_settable (L, -3); 337 lua_pushliteral (L, "_DESCRIPTION"); 338 lua_pushliteral (L, "YAML handling through the syck library"); 339 lua_settable (L, -3); 340 lua_pushliteral (L, "_VERSION"); 341 lua_pushliteral (L, "0.56"); 342 lua_settable (L, -3); 343 } 344 254 345 LUALIB_API int luaopen_syck(lua_State *L) 255 346 { 256 347 luaL_openlib(L, "syck", sycklib, 0); 348 set_info(L); 257 349 return 1; 258 350 } -
trunk/ext/lua/test.lua
r306 r316 13 13 assert_false(yaml.load("--- false")) 14 14 assert_equal(10, yaml.load("--- 10")) 15 assert_equal(10.3321, yaml.load("--- 10.3321")) 15 16 local t = yaml.load("--- \n- 5\n- 10\n- 15") 16 17 assert_equal(5, t[1]) … … 41 42 assert_equal("--- hey\n", yaml.dump("hey")) 42 43 assert_equal("--- 5\n", yaml.dump(5)) 44 assert_equal("--- 5.9991\n", yaml.dump(5.9991)) 43 45 assert_equal("--- true\n", yaml.dump(true)) 44 46 assert_equal("--- false\n", yaml.dump(false)) … … 69 71 assert_equal("hello", obj2[3]) 70 72 71 os.remove(file)72 73 73 yaml.dump_file(obj, file) 74 74 local obj2, err = yaml.load_file(file) -
trunk/ext/lua/yaml.lua
r306 r316 31 31 return ret 32 32 end 33 34 setmetatable(yaml, {__index=syck})