diff options
| author | Philipp Janda <siffiejoe@gmx.net> | 2017-08-27 15:17:58 +0200 |
|---|---|---|
| committer | Philipp Janda <siffiejoe@gmx.net> | 2017-08-27 15:17:58 +0200 |
| commit | aeb072066f799c87527c81b19919dfd3b55bc373 (patch) | |
| tree | 5598c50644aa6b5b1a6f38ae77f6dc430512c22e /c-api | |
| parent | 30144ee397495503c42fec822957b396eb3ebcd9 (diff) | |
| download | lua-compat-5.3-aeb072066f799c87527c81b19919dfd3b55bc373.tar.gz lua-compat-5.3-aeb072066f799c87527c81b19919dfd3b55bc373.tar.bz2 lua-compat-5.3-aeb072066f799c87527c81b19919dfd3b55bc373.zip | |
Provide fixed luaL_tolstring for Lua 5.2 as well.
Diffstat (limited to 'c-api')
| -rw-r--r-- | c-api/compat-5.3.c | 68 | ||||
| -rw-r--r-- | c-api/compat-5.3.h | 6 |
2 files changed, 37 insertions, 37 deletions
diff --git a/c-api/compat-5.3.c b/c-api/compat-5.3.c index 96b38cc..883efb8 100644 --- a/c-api/compat-5.3.c +++ b/c-api/compat-5.3.c | |||
| @@ -236,40 +236,6 @@ COMPAT53_API void *luaL_testudata (lua_State *L, int i, const char *tname) { | |||
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | 238 | ||
| 239 | COMPAT53_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { | ||
| 240 | if (!luaL_callmeta(L, idx, "__tostring")) { | ||
| 241 | int t = lua_type(L, idx), tt = 0; | ||
| 242 | char const* name = NULL; | ||
| 243 | switch (t) { | ||
| 244 | case LUA_TNIL: | ||
| 245 | lua_pushliteral(L, "nil"); | ||
| 246 | break; | ||
| 247 | case LUA_TSTRING: | ||
| 248 | case LUA_TNUMBER: | ||
| 249 | lua_pushvalue(L, idx); | ||
| 250 | break; | ||
| 251 | case LUA_TBOOLEAN: | ||
| 252 | if (lua_toboolean(L, idx)) | ||
| 253 | lua_pushliteral(L, "true"); | ||
| 254 | else | ||
| 255 | lua_pushliteral(L, "false"); | ||
| 256 | break; | ||
| 257 | default: | ||
| 258 | tt = luaL_getmetafield(L, idx, "__name"); | ||
| 259 | name = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : lua_typename(L, t); | ||
| 260 | lua_pushfstring(L, "%s: %p", name, lua_topointer(L, idx)); | ||
| 261 | if (tt != LUA_TNIL) | ||
| 262 | lua_replace(L, -2); | ||
| 263 | break; | ||
| 264 | } | ||
| 265 | } else { | ||
| 266 | if (!lua_isstring(L, -1)) | ||
| 267 | luaL_error(L, "'__tostring' must return a string"); | ||
| 268 | } | ||
| 269 | return lua_tolstring(L, -1, len); | ||
| 270 | } | ||
| 271 | |||
| 272 | |||
| 273 | static int compat53_countlevels (lua_State *L) { | 239 | static int compat53_countlevels (lua_State *L) { |
| 274 | lua_Debug ar; | 240 | lua_Debug ar; |
| 275 | int li = 1, le = 1; | 241 | int li = 1, le = 1; |
| @@ -564,6 +530,40 @@ COMPAT53_API size_t lua_stringtonumber (lua_State *L, const char *s) { | |||
| 564 | } | 530 | } |
| 565 | 531 | ||
| 566 | 532 | ||
| 533 | COMPAT53_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { | ||
| 534 | if (!luaL_callmeta(L, idx, "__tostring")) { | ||
| 535 | int t = lua_type(L, idx), tt = 0; | ||
| 536 | char const* name = NULL; | ||
| 537 | switch (t) { | ||
| 538 | case LUA_TNIL: | ||
| 539 | lua_pushliteral(L, "nil"); | ||
| 540 | break; | ||
| 541 | case LUA_TSTRING: | ||
| 542 | case LUA_TNUMBER: | ||
| 543 | lua_pushvalue(L, idx); | ||
| 544 | break; | ||
| 545 | case LUA_TBOOLEAN: | ||
| 546 | if (lua_toboolean(L, idx)) | ||
| 547 | lua_pushliteral(L, "true"); | ||
| 548 | else | ||
| 549 | lua_pushliteral(L, "false"); | ||
| 550 | break; | ||
| 551 | default: | ||
| 552 | tt = luaL_getmetafield(L, idx, "__name"); | ||
| 553 | name = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : lua_typename(L, t); | ||
| 554 | lua_pushfstring(L, "%s: %p", name, lua_topointer(L, idx)); | ||
| 555 | if (tt != LUA_TNIL) | ||
| 556 | lua_replace(L, -2); | ||
| 557 | break; | ||
| 558 | } | ||
| 559 | } else { | ||
| 560 | if (!lua_isstring(L, -1)) | ||
| 561 | luaL_error(L, "'__tostring' must return a string"); | ||
| 562 | } | ||
| 563 | return lua_tolstring(L, -1, len); | ||
| 564 | } | ||
| 565 | |||
| 566 | |||
| 567 | COMPAT53_API void luaL_requiref (lua_State *L, const char *modname, | 567 | COMPAT53_API void luaL_requiref (lua_State *L, const char *modname, |
| 568 | lua_CFunction openf, int glb) { | 568 | lua_CFunction openf, int glb) { |
| 569 | luaL_checkstack(L, 3, "not enough stack slots available"); | 569 | luaL_checkstack(L, 3, "not enough stack slots available"); |
diff --git a/c-api/compat-5.3.h b/c-api/compat-5.3.h index ffebcd7..7bd8a56 100644 --- a/c-api/compat-5.3.h +++ b/c-api/compat-5.3.h | |||
| @@ -172,9 +172,6 @@ COMPAT53_API void luaL_setmetatable (lua_State *L, const char *tname); | |||
| 172 | #define luaL_testudata COMPAT53_CONCAT(COMPAT53_PREFIX, L_testudata) | 172 | #define luaL_testudata COMPAT53_CONCAT(COMPAT53_PREFIX, L_testudata) |
| 173 | COMPAT53_API void *luaL_testudata (lua_State *L, int i, const char *tname); | 173 | COMPAT53_API void *luaL_testudata (lua_State *L, int i, const char *tname); |
| 174 | 174 | ||
| 175 | #define luaL_tolstring COMPAT53_CONCAT(COMPAT53_PREFIX, L_tolstring) | ||
| 176 | COMPAT53_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len); | ||
| 177 | |||
| 178 | #define luaL_traceback COMPAT53_CONCAT(COMPAT53_PREFIX, L_traceback) | 175 | #define luaL_traceback COMPAT53_CONCAT(COMPAT53_PREFIX, L_traceback) |
| 179 | COMPAT53_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, int level); | 176 | COMPAT53_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, int level); |
| 180 | 177 | ||
| @@ -286,6 +283,9 @@ COMPAT53_API void lua_seti (lua_State *L, int index, lua_Integer i); | |||
| 286 | #define lua_stringtonumber COMPAT53_CONCAT(COMPAT53_PREFIX, _stringtonumber) | 283 | #define lua_stringtonumber COMPAT53_CONCAT(COMPAT53_PREFIX, _stringtonumber) |
| 287 | COMPAT53_API size_t lua_stringtonumber (lua_State *L, const char *s); | 284 | COMPAT53_API size_t lua_stringtonumber (lua_State *L, const char *s); |
| 288 | 285 | ||
| 286 | #define luaL_tolstring COMPAT53_CONCAT(COMPAT53_PREFIX, L_tolstring) | ||
| 287 | COMPAT53_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len); | ||
| 288 | |||
| 289 | #define luaL_getmetafield(L, o, e) \ | 289 | #define luaL_getmetafield(L, o, e) \ |
| 290 | (luaL_getmetafield(L, (o), (e)) ? lua_type(L, -1) : LUA_TNIL) | 290 | (luaL_getmetafield(L, (o), (e)) ? lua_type(L, -1) : LUA_TNIL) |
| 291 | 291 | ||
