diff options
Diffstat (limited to 'luxio.c')
-rw-r--r-- | luxio.c | 64 |
1 files changed, 32 insertions, 32 deletions
@@ -3813,38 +3813,38 @@ luxio_iconv(lua_State *L) { /* based on Alexandre Erwin Ittner <alexandre@ittner.com.br>'s code */ /* either returns completed string, or -1, errno, partial result */ - iconv_t *_cd = (iconv_t*)lua_touserdata(L, 1); - iconv_t cd = *_cd; - size_t ibleft; - char *inbuf = (char* )luaL_checklstring(L, 2, &ibleft); - char outbufs[ICONV_BUF_SIZE]; - char *outbuf = outbufs; - size_t obleft = ICONV_BUF_SIZE; - size_t ret = -1; - - luaL_Buffer b; - luaL_buffinit(L, &b); - - do { - ret = iconv(cd, (ICONV_IN_TYPE)&inbuf, &ibleft, &outbuf, &obleft); - if (ret == (size_t)(-1)) { - luaL_addlstring(&b, outbufs, ICONV_BUF_SIZE - obleft); - - if (errno == E2BIG) { - obleft = ICONV_BUF_SIZE; - outbuf = outbufs; - } else { - lua_pushnumber(L, -1); - lua_pushnumber(L, errno); - luaL_pushresult(&b); - return 3; - } - } - } while (ret == (size_t)-1); - - luaL_addlstring(&b, outbufs, ICONV_BUF_SIZE - obleft); - luaL_pushresult(&b); - return 1; + iconv_t *_cd = (iconv_t*)lua_touserdata(L, 1); + iconv_t cd = *_cd; + size_t ibleft; + char *inbuf = (char* )luaL_checklstring(L, 2, &ibleft); + char outbufs[ICONV_BUF_SIZE]; + char *outbuf = outbufs; + size_t obleft = ICONV_BUF_SIZE; + size_t ret = -1; + + luaL_Buffer b; + luaL_buffinit(L, &b); + + do { + ret = iconv(cd, (ICONV_IN_TYPE)&inbuf, &ibleft, &outbuf, &obleft); + if (ret == (size_t)(-1)) { + luaL_addlstring(&b, outbufs, ICONV_BUF_SIZE - obleft); + + if (errno == E2BIG) { + obleft = ICONV_BUF_SIZE; + outbuf = outbufs; + } else { + lua_pushnumber(L, -1); + lua_pushnumber(L, errno); + luaL_pushresult(&b); + return 3; + } + } + } while (ret == (size_t)-1); + + luaL_addlstring(&b, outbufs, ICONV_BUF_SIZE - obleft); + luaL_pushresult(&b); + return 1; } #undef ICONV_BUF_SIZE |