diff options
| author | Diego Nehab <diego@impa.br> | 2015-02-18 20:51:37 -0200 |
|---|---|---|
| committer | Diego Nehab <diego@impa.br> | 2015-02-18 20:51:37 -0200 |
| commit | ddf429282460323e24652e6beec8e750f8e4a958 (patch) | |
| tree | 071ee7879bbd4c917c92e5383c759e98a90cf78e /src | |
| parent | 5edf093643cceb329392aec9606ab3988579b821 (diff) | |
| download | luasocket-ddf429282460323e24652e6beec8e750f8e4a958.tar.gz luasocket-ddf429282460323e24652e6beec8e750f8e4a958.tar.bz2 luasocket-ddf429282460323e24652e6beec8e750f8e4a958.zip | |
Out of the box support for Lua 5.3.
Diffstat (limited to 'src')
| -rw-r--r-- | src/luasocket.c | 14 | ||||
| -rw-r--r-- | src/makefile | 8 | ||||
| -rw-r--r-- | src/mime.c | 105 |
3 files changed, 64 insertions, 63 deletions
diff --git a/src/luasocket.c b/src/luasocket.c index e6ee747..40731f1 100644 --- a/src/luasocket.c +++ b/src/luasocket.c | |||
| @@ -18,7 +18,6 @@ | |||
| 18 | #include "lua.h" | 18 | #include "lua.h" |
| 19 | #include "lauxlib.h" | 19 | #include "lauxlib.h" |
| 20 | 20 | ||
| 21 | |||
| 22 | /*=========================================================================*\ | 21 | /*=========================================================================*\ |
| 23 | * LuaSocket includes | 22 | * LuaSocket includes |
| 24 | \*=========================================================================*/ | 23 | \*=========================================================================*/ |
| @@ -32,6 +31,11 @@ | |||
| 32 | #include "udp.h" | 31 | #include "udp.h" |
| 33 | #include "select.h" | 32 | #include "select.h" |
| 34 | 33 | ||
| 34 | #if LUA_VERSION_NUM > 502 && !defined(LUA_COMPAT_APIINTCASTS) | ||
| 35 | #define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) | ||
| 36 | #define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) | ||
| 37 | #endif | ||
| 38 | |||
| 35 | /*-------------------------------------------------------------------------*\ | 39 | /*-------------------------------------------------------------------------*\ |
| 36 | * Internal function prototypes | 40 | * Internal function prototypes |
| 37 | \*-------------------------------------------------------------------------*/ | 41 | \*-------------------------------------------------------------------------*/ |
| @@ -78,14 +82,6 @@ static int global_unload(lua_State *L) { | |||
| 78 | return 0; | 82 | return 0; |
| 79 | } | 83 | } |
| 80 | 84 | ||
| 81 | #if LUA_VERSION_NUM > 501 | ||
| 82 | int luaL_typerror (lua_State *L, int narg, const char *tname) { | ||
| 83 | const char *msg = lua_pushfstring(L, "%s expected, got %s", | ||
| 84 | tname, luaL_typename(L, narg)); | ||
| 85 | return luaL_argerror(L, narg, msg); | ||
| 86 | } | ||
| 87 | #endif | ||
| 88 | |||
| 89 | /*-------------------------------------------------------------------------*\ | 85 | /*-------------------------------------------------------------------------*\ |
| 90 | * Setup basic stuff. | 86 | * Setup basic stuff. |
| 91 | \*-------------------------------------------------------------------------*/ | 87 | \*-------------------------------------------------------------------------*/ |
diff --git a/src/makefile b/src/makefile index 8d3521e..7f118a7 100644 --- a/src/makefile +++ b/src/makefile | |||
| @@ -147,7 +147,7 @@ DEF_macosx= -DLUASOCKET_$(DEBUG) -DUNIX_HAS_SUN_LEN -DLUA_$(COMPAT)_MODULE \ | |||
| 147 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ | 147 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ |
| 148 | -DUNIX_API='__attribute__((visibility("default")))' \ | 148 | -DUNIX_API='__attribute__((visibility("default")))' \ |
| 149 | -DMIME_API='__attribute__((visibility("default")))' | 149 | -DMIME_API='__attribute__((visibility("default")))' |
| 150 | CFLAGS_macosx= -I$(LUAINC) $(DEF) -pedantic -Wall -O2 -fno-common \ | 150 | CFLAGS_macosx= -I$(LUAINC) $(DEF) -Wall -O2 -fno-common \ |
| 151 | -fvisibility=hidden | 151 | -fvisibility=hidden |
| 152 | LDFLAGS_macosx= -bundle -undefined dynamic_lookup -o | 152 | LDFLAGS_macosx= -bundle -undefined dynamic_lookup -o |
| 153 | LD_macosx= export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc | 153 | LD_macosx= export MACOSX_DEPLOYMENT_TARGET="10.3"; gcc |
| @@ -163,7 +163,7 @@ DEF_linux=-DLUASOCKET_$(DEBUG) -DLUA_$(COMPAT)_MODULE \ | |||
| 163 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ | 163 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ |
| 164 | -DUNIX_API='__attribute__((visibility("default")))' \ | 164 | -DUNIX_API='__attribute__((visibility("default")))' \ |
| 165 | -DMIME_API='__attribute__((visibility("default")))' | 165 | -DMIME_API='__attribute__((visibility("default")))' |
| 166 | CFLAGS_linux= -I$(LUAINC) $(DEF) -pedantic -Wall -Wshadow -Wextra \ | 166 | CFLAGS_linux= -I$(LUAINC) $(DEF) -Wall -Wshadow -Wextra \ |
| 167 | -Wimplicit -O2 -ggdb3 -fpic -fvisibility=hidden | 167 | -Wimplicit -O2 -ggdb3 -fpic -fvisibility=hidden |
| 168 | LDFLAGS_linux=-O -shared -fpic -o | 168 | LDFLAGS_linux=-O -shared -fpic -o |
| 169 | LD_linux=gcc | 169 | LD_linux=gcc |
| @@ -179,7 +179,7 @@ DEF_freebsd=-DLUASOCKET_$(DEBUG) -DLUA_$(COMPAT)_MODULE \ | |||
| 179 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ | 179 | -DLUASOCKET_API='__attribute__((visibility("default")))' \ |
| 180 | -DUNIX_API='__attribute__((visibility("default")))' \ | 180 | -DUNIX_API='__attribute__((visibility("default")))' \ |
| 181 | -DMIME_API='__attribute__((visibility("default")))' | 181 | -DMIME_API='__attribute__((visibility("default")))' |
| 182 | CFLAGS_freebsd= -I$(LUAINC) $(DEF) -pedantic -Wall -Wshadow -Wextra \ | 182 | CFLAGS_freebsd= -I$(LUAINC) $(DEF) -Wall -Wshadow -Wextra \ |
| 183 | -Wimplicit -O2 -ggdb3 -fpic -fvisibility=hidden | 183 | -Wimplicit -O2 -ggdb3 -fpic -fvisibility=hidden |
| 184 | LDFLAGS_freebsd=-O -shared -fpic -o | 184 | LDFLAGS_freebsd=-O -shared -fpic -o |
| 185 | LD_freebsd=gcc | 185 | LD_freebsd=gcc |
| @@ -194,7 +194,7 @@ CC_mingw=gcc | |||
| 194 | DEF_mingw= -DLUASOCKET_INET_PTON -DLUASOCKET_$(DEBUG) -DLUA_$(COMPAT)_MODULE \ | 194 | DEF_mingw= -DLUASOCKET_INET_PTON -DLUASOCKET_$(DEBUG) -DLUA_$(COMPAT)_MODULE \ |
| 195 | -DWINVER=0x0501 -DLUASOCKET_API='__declspec(dllexport)' \ | 195 | -DWINVER=0x0501 -DLUASOCKET_API='__declspec(dllexport)' \ |
| 196 | -DMIME_API='__declspec(dllexport)' | 196 | -DMIME_API='__declspec(dllexport)' |
| 197 | CFLAGS_mingw= -I$(LUAINC) $(DEF) -pedantic -Wall -O2 -fno-common \ | 197 | CFLAGS_mingw= -I$(LUAINC) $(DEF) -Wall -O2 -fno-common \ |
| 198 | -fvisibility=hidden | 198 | -fvisibility=hidden |
| 199 | LDFLAGS_mingw= $(LUALIB) -shared -Wl,-s -lws2_32 -o | 199 | LDFLAGS_mingw= $(LUALIB) -shared -Wl,-s -lws2_32 -o |
| 200 | LD_mingw=gcc | 200 | LD_mingw=gcc |
| @@ -13,6 +13,11 @@ | |||
| 13 | 13 | ||
| 14 | #include "mime.h" | 14 | #include "mime.h" |
| 15 | 15 | ||
| 16 | #if LUA_VERSION_NUM > 502 && !defined(LUA_COMPAT_APIINTCASTS) | ||
| 17 | #define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) | ||
| 18 | #define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) | ||
| 19 | #endif | ||
| 20 | |||
| 16 | /*=========================================================================*\ | 21 | /*=========================================================================*\ |
| 17 | * Don't want to trust escape character constants | 22 | * Don't want to trust escape character constants |
| 18 | \*=========================================================================*/ | 23 | \*=========================================================================*/ |
| @@ -41,7 +46,7 @@ static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | |||
| 41 | static void qpsetup(UC *class, UC *unbase); | 46 | static void qpsetup(UC *class, UC *unbase); |
| 42 | static void qpquote(UC c, luaL_Buffer *buffer); | 47 | static void qpquote(UC c, luaL_Buffer *buffer); |
| 43 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | 48 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); |
| 44 | static size_t qpencode(UC c, UC *input, size_t size, | 49 | static size_t qpencode(UC c, UC *input, size_t size, |
| 45 | const char *marker, luaL_Buffer *buffer); | 50 | const char *marker, luaL_Buffer *buffer); |
| 46 | static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer); | 51 | static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer); |
| 47 | 52 | ||
| @@ -103,9 +108,9 @@ MIME_API int luaopen_mime_core(lua_State *L) | |||
| 103 | /*-------------------------------------------------------------------------*\ | 108 | /*-------------------------------------------------------------------------*\ |
| 104 | * Incrementaly breaks a string into lines. The string can have CRLF breaks. | 109 | * Incrementaly breaks a string into lines. The string can have CRLF breaks. |
| 105 | * A, n = wrp(l, B, length) | 110 | * A, n = wrp(l, B, length) |
| 106 | * A is a copy of B, broken into lines of at most 'length' bytes. | 111 | * A is a copy of B, broken into lines of at most 'length' bytes. |
| 107 | * 'l' is how many bytes are left for the first line of B. | 112 | * 'l' is how many bytes are left for the first line of B. |
| 108 | * 'n' is the number of bytes left in the last line of A. | 113 | * 'n' is the number of bytes left in the last line of A. |
| 109 | \*-------------------------------------------------------------------------*/ | 114 | \*-------------------------------------------------------------------------*/ |
| 110 | static int mime_global_wrp(lua_State *L) | 115 | static int mime_global_wrp(lua_State *L) |
| 111 | { | 116 | { |
| @@ -123,7 +128,7 @@ static int mime_global_wrp(lua_State *L) | |||
| 123 | else lua_pushnil(L); | 128 | else lua_pushnil(L); |
| 124 | lua_pushnumber(L, length); | 129 | lua_pushnumber(L, length); |
| 125 | return 2; | 130 | return 2; |
| 126 | } | 131 | } |
| 127 | luaL_buffinit(L, &buffer); | 132 | luaL_buffinit(L, &buffer); |
| 128 | while (input < last) { | 133 | while (input < last) { |
| 129 | switch (*input) { | 134 | switch (*input) { |
| @@ -150,9 +155,9 @@ static int mime_global_wrp(lua_State *L) | |||
| 150 | } | 155 | } |
| 151 | 156 | ||
| 152 | /*-------------------------------------------------------------------------*\ | 157 | /*-------------------------------------------------------------------------*\ |
| 153 | * Fill base64 decode map. | 158 | * Fill base64 decode map. |
| 154 | \*-------------------------------------------------------------------------*/ | 159 | \*-------------------------------------------------------------------------*/ |
| 155 | static void b64setup(UC *unbase) | 160 | static void b64setup(UC *unbase) |
| 156 | { | 161 | { |
| 157 | int i; | 162 | int i; |
| 158 | for (i = 0; i <= 255; i++) unbase[i] = (UC) 255; | 163 | for (i = 0; i <= 255; i++) unbase[i] = (UC) 255; |
| @@ -161,11 +166,11 @@ static void b64setup(UC *unbase) | |||
| 161 | } | 166 | } |
| 162 | 167 | ||
| 163 | /*-------------------------------------------------------------------------*\ | 168 | /*-------------------------------------------------------------------------*\ |
| 164 | * Acumulates bytes in input buffer until 3 bytes are available. | 169 | * Acumulates bytes in input buffer until 3 bytes are available. |
| 165 | * Translate the 3 bytes into Base64 form and append to buffer. | 170 | * Translate the 3 bytes into Base64 form and append to buffer. |
| 166 | * Returns new number of bytes in buffer. | 171 | * Returns new number of bytes in buffer. |
| 167 | \*-------------------------------------------------------------------------*/ | 172 | \*-------------------------------------------------------------------------*/ |
| 168 | static size_t b64encode(UC c, UC *input, size_t size, | 173 | static size_t b64encode(UC c, UC *input, size_t size, |
| 169 | luaL_Buffer *buffer) | 174 | luaL_Buffer *buffer) |
| 170 | { | 175 | { |
| 171 | input[size++] = c; | 176 | input[size++] = c; |
| @@ -174,7 +179,7 @@ static size_t b64encode(UC c, UC *input, size_t size, | |||
| 174 | unsigned long value = 0; | 179 | unsigned long value = 0; |
| 175 | value += input[0]; value <<= 8; | 180 | value += input[0]; value <<= 8; |
| 176 | value += input[1]; value <<= 8; | 181 | value += input[1]; value <<= 8; |
| 177 | value += input[2]; | 182 | value += input[2]; |
| 178 | code[3] = b64base[value & 0x3f]; value >>= 6; | 183 | code[3] = b64base[value & 0x3f]; value >>= 6; |
| 179 | code[2] = b64base[value & 0x3f]; value >>= 6; | 184 | code[2] = b64base[value & 0x3f]; value >>= 6; |
| 180 | code[1] = b64base[value & 0x3f]; value >>= 6; | 185 | code[1] = b64base[value & 0x3f]; value >>= 6; |
| @@ -186,11 +191,11 @@ static size_t b64encode(UC c, UC *input, size_t size, | |||
| 186 | } | 191 | } |
| 187 | 192 | ||
| 188 | /*-------------------------------------------------------------------------*\ | 193 | /*-------------------------------------------------------------------------*\ |
| 189 | * Encodes the Base64 last 1 or 2 bytes and adds padding '=' | 194 | * Encodes the Base64 last 1 or 2 bytes and adds padding '=' |
| 190 | * Result, if any, is appended to buffer. | 195 | * Result, if any, is appended to buffer. |
| 191 | * Returns 0. | 196 | * Returns 0. |
| 192 | \*-------------------------------------------------------------------------*/ | 197 | \*-------------------------------------------------------------------------*/ |
| 193 | static size_t b64pad(const UC *input, size_t size, | 198 | static size_t b64pad(const UC *input, size_t size, |
| 194 | luaL_Buffer *buffer) | 199 | luaL_Buffer *buffer) |
| 195 | { | 200 | { |
| 196 | unsigned long value = 0; | 201 | unsigned long value = 0; |
| @@ -203,7 +208,7 @@ static size_t b64pad(const UC *input, size_t size, | |||
| 203 | luaL_addlstring(buffer, (char *) code, 4); | 208 | luaL_addlstring(buffer, (char *) code, 4); |
| 204 | break; | 209 | break; |
| 205 | case 2: | 210 | case 2: |
| 206 | value = input[0]; value <<= 8; | 211 | value = input[0]; value <<= 8; |
| 207 | value |= input[1]; value <<= 2; | 212 | value |= input[1]; value <<= 2; |
| 208 | code[2] = b64base[value & 0x3f]; value >>= 6; | 213 | code[2] = b64base[value & 0x3f]; value >>= 6; |
| 209 | code[1] = b64base[value & 0x3f]; value >>= 6; | 214 | code[1] = b64base[value & 0x3f]; value >>= 6; |
| @@ -217,11 +222,11 @@ static size_t b64pad(const UC *input, size_t size, | |||
| 217 | } | 222 | } |
| 218 | 223 | ||
| 219 | /*-------------------------------------------------------------------------*\ | 224 | /*-------------------------------------------------------------------------*\ |
| 220 | * Acumulates bytes in input buffer until 4 bytes are available. | 225 | * Acumulates bytes in input buffer until 4 bytes are available. |
| 221 | * Translate the 4 bytes from Base64 form and append to buffer. | 226 | * Translate the 4 bytes from Base64 form and append to buffer. |
| 222 | * Returns new number of bytes in buffer. | 227 | * Returns new number of bytes in buffer. |
| 223 | \*-------------------------------------------------------------------------*/ | 228 | \*-------------------------------------------------------------------------*/ |
| 224 | static size_t b64decode(UC c, UC *input, size_t size, | 229 | static size_t b64decode(UC c, UC *input, size_t size, |
| 225 | luaL_Buffer *buffer) | 230 | luaL_Buffer *buffer) |
| 226 | { | 231 | { |
| 227 | /* ignore invalid characters */ | 232 | /* ignore invalid characters */ |
| @@ -239,7 +244,7 @@ static size_t b64decode(UC c, UC *input, size_t size, | |||
| 239 | decoded[1] = (UC) (value & 0xff); value >>= 8; | 244 | decoded[1] = (UC) (value & 0xff); value >>= 8; |
| 240 | decoded[0] = (UC) value; | 245 | decoded[0] = (UC) value; |
| 241 | /* take care of paddding */ | 246 | /* take care of paddding */ |
| 242 | valid = (input[2] == '=') ? 1 : (input[3] == '=') ? 2 : 3; | 247 | valid = (input[2] == '=') ? 1 : (input[3] == '=') ? 2 : 3; |
| 243 | luaL_addlstring(buffer, (char *) decoded, valid); | 248 | luaL_addlstring(buffer, (char *) decoded, valid); |
| 244 | return 0; | 249 | return 0; |
| 245 | /* need more data */ | 250 | /* need more data */ |
| @@ -251,7 +256,7 @@ static size_t b64decode(UC c, UC *input, size_t size, | |||
| 251 | * A, B = b64(C, D) | 256 | * A, B = b64(C, D) |
| 252 | * A is the encoded version of the largest prefix of C .. D that is | 257 | * A is the encoded version of the largest prefix of C .. D that is |
| 253 | * divisible by 3. B has the remaining bytes of C .. D, *without* encoding. | 258 | * divisible by 3. B has the remaining bytes of C .. D, *without* encoding. |
| 254 | * The easiest thing would be to concatenate the two strings and | 259 | * The easiest thing would be to concatenate the two strings and |
| 255 | * encode the result, but we can't afford that or Lua would dupplicate | 260 | * encode the result, but we can't afford that or Lua would dupplicate |
| 256 | * every chunk we received. | 261 | * every chunk we received. |
| 257 | \*-------------------------------------------------------------------------*/ | 262 | \*-------------------------------------------------------------------------*/ |
| @@ -272,7 +277,7 @@ static int mime_global_b64(lua_State *L) | |||
| 272 | lua_settop(L, 2); | 277 | lua_settop(L, 2); |
| 273 | /* process first part of the input */ | 278 | /* process first part of the input */ |
| 274 | luaL_buffinit(L, &buffer); | 279 | luaL_buffinit(L, &buffer); |
| 275 | while (input < last) | 280 | while (input < last) |
| 276 | asize = b64encode(*input++, atom, asize, &buffer); | 281 | asize = b64encode(*input++, atom, asize, &buffer); |
| 277 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); | 282 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); |
| 278 | /* if second part is nil, we are done */ | 283 | /* if second part is nil, we are done */ |
| @@ -288,7 +293,7 @@ static int mime_global_b64(lua_State *L) | |||
| 288 | } | 293 | } |
| 289 | /* otherwise process the second part */ | 294 | /* otherwise process the second part */ |
| 290 | last = input + isize; | 295 | last = input + isize; |
| 291 | while (input < last) | 296 | while (input < last) |
| 292 | asize = b64encode(*input++, atom, asize, &buffer); | 297 | asize = b64encode(*input++, atom, asize, &buffer); |
| 293 | luaL_pushresult(&buffer); | 298 | luaL_pushresult(&buffer); |
| 294 | lua_pushlstring(L, (char *) atom, asize); | 299 | lua_pushlstring(L, (char *) atom, asize); |
| @@ -318,7 +323,7 @@ static int mime_global_unb64(lua_State *L) | |||
| 318 | lua_settop(L, 2); | 323 | lua_settop(L, 2); |
| 319 | /* process first part of the input */ | 324 | /* process first part of the input */ |
| 320 | luaL_buffinit(L, &buffer); | 325 | luaL_buffinit(L, &buffer); |
| 321 | while (input < last) | 326 | while (input < last) |
| 322 | asize = b64decode(*input++, atom, asize, &buffer); | 327 | asize = b64decode(*input++, atom, asize, &buffer); |
| 323 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); | 328 | input = (UC *) luaL_optlstring(L, 2, NULL, &isize); |
| 324 | /* if second is nil, we are done */ | 329 | /* if second is nil, we are done */ |
| @@ -333,7 +338,7 @@ static int mime_global_unb64(lua_State *L) | |||
| 333 | } | 338 | } |
| 334 | /* otherwise, process the rest of the input */ | 339 | /* otherwise, process the rest of the input */ |
| 335 | last = input + isize; | 340 | last = input + isize; |
| 336 | while (input < last) | 341 | while (input < last) |
| 337 | asize = b64decode(*input++, atom, asize, &buffer); | 342 | asize = b64decode(*input++, atom, asize, &buffer); |
| 338 | luaL_pushresult(&buffer); | 343 | luaL_pushresult(&buffer); |
| 339 | lua_pushlstring(L, (char *) atom, asize); | 344 | lua_pushlstring(L, (char *) atom, asize); |
| @@ -349,7 +354,7 @@ static int mime_global_unb64(lua_State *L) | |||
| 349 | * 9 and 32 can be plain, unless in the end of a line, where must be =XX | 354 | * 9 and 32 can be plain, unless in the end of a line, where must be =XX |
| 350 | * encoded lines must be no longer than 76 not counting CRLF | 355 | * encoded lines must be no longer than 76 not counting CRLF |
| 351 | * soft line-break are =CRLF | 356 | * soft line-break are =CRLF |
| 352 | * To encode one byte, we need to see the next two. | 357 | * To encode one byte, we need to see the next two. |
| 353 | * Worst case is when we see a space, and wonder if a CRLF is comming | 358 | * Worst case is when we see a space, and wonder if a CRLF is comming |
| 354 | \*-------------------------------------------------------------------------*/ | 359 | \*-------------------------------------------------------------------------*/ |
| 355 | /*-------------------------------------------------------------------------*\ | 360 | /*-------------------------------------------------------------------------*\ |
| @@ -362,7 +367,7 @@ static void qpsetup(UC *cl, UC *unbase) | |||
| 362 | for (i = 0; i < 256; i++) cl[i] = QP_QUOTED; | 367 | for (i = 0; i < 256; i++) cl[i] = QP_QUOTED; |
| 363 | for (i = 33; i <= 60; i++) cl[i] = QP_PLAIN; | 368 | for (i = 33; i <= 60; i++) cl[i] = QP_PLAIN; |
| 364 | for (i = 62; i <= 126; i++) cl[i] = QP_PLAIN; | 369 | for (i = 62; i <= 126; i++) cl[i] = QP_PLAIN; |
| 365 | cl['\t'] = QP_IF_LAST; | 370 | cl['\t'] = QP_IF_LAST; |
| 366 | cl[' '] = QP_IF_LAST; | 371 | cl[' '] = QP_IF_LAST; |
| 367 | cl['\r'] = QP_CR; | 372 | cl['\r'] = QP_CR; |
| 368 | for (i = 0; i < 256; i++) unbase[i] = 255; | 373 | for (i = 0; i < 256; i++) unbase[i] = 255; |
| @@ -388,9 +393,9 @@ static void qpquote(UC c, luaL_Buffer *buffer) | |||
| 388 | 393 | ||
| 389 | /*-------------------------------------------------------------------------*\ | 394 | /*-------------------------------------------------------------------------*\ |
| 390 | * Accumulate characters until we are sure about how to deal with them. | 395 | * Accumulate characters until we are sure about how to deal with them. |
| 391 | * Once we are sure, output to the buffer, in the correct form. | 396 | * Once we are sure, output to the buffer, in the correct form. |
| 392 | \*-------------------------------------------------------------------------*/ | 397 | \*-------------------------------------------------------------------------*/ |
| 393 | static size_t qpencode(UC c, UC *input, size_t size, | 398 | static size_t qpencode(UC c, UC *input, size_t size, |
| 394 | const char *marker, luaL_Buffer *buffer) | 399 | const char *marker, luaL_Buffer *buffer) |
| 395 | { | 400 | { |
| 396 | input[size++] = c; | 401 | input[size++] = c; |
| @@ -431,7 +436,7 @@ static size_t qpencode(UC c, UC *input, size_t size, | |||
| 431 | } | 436 | } |
| 432 | 437 | ||
| 433 | /*-------------------------------------------------------------------------*\ | 438 | /*-------------------------------------------------------------------------*\ |
| 434 | * Deal with the final characters | 439 | * Deal with the final characters |
| 435 | \*-------------------------------------------------------------------------*/ | 440 | \*-------------------------------------------------------------------------*/ |
| 436 | static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer) | 441 | static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer) |
| 437 | { | 442 | { |
| @@ -448,8 +453,8 @@ static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer) | |||
| 448 | * Incrementally converts a string to quoted-printable | 453 | * Incrementally converts a string to quoted-printable |
| 449 | * A, B = qp(C, D, marker) | 454 | * A, B = qp(C, D, marker) |
| 450 | * Marker is the text to be used to replace CRLF sequences found in A. | 455 | * Marker is the text to be used to replace CRLF sequences found in A. |
| 451 | * A is the encoded version of the largest prefix of C .. D that | 456 | * A is the encoded version of the largest prefix of C .. D that |
| 452 | * can be encoded without doubts. | 457 | * can be encoded without doubts. |
| 453 | * B has the remaining bytes of C .. D, *without* encoding. | 458 | * B has the remaining bytes of C .. D, *without* encoding. |
| 454 | \*-------------------------------------------------------------------------*/ | 459 | \*-------------------------------------------------------------------------*/ |
| 455 | static int mime_global_qp(lua_State *L) | 460 | static int mime_global_qp(lua_State *L) |
| @@ -493,7 +498,7 @@ static int mime_global_qp(lua_State *L) | |||
| 493 | 498 | ||
| 494 | /*-------------------------------------------------------------------------*\ | 499 | /*-------------------------------------------------------------------------*\ |
| 495 | * Accumulate characters until we are sure about how to deal with them. | 500 | * Accumulate characters until we are sure about how to deal with them. |
| 496 | * Once we are sure, output the to the buffer, in the correct form. | 501 | * Once we are sure, output the to the buffer, in the correct form. |
| 497 | \*-------------------------------------------------------------------------*/ | 502 | \*-------------------------------------------------------------------------*/ |
| 498 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer) { | 503 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer) { |
| 499 | int d; | 504 | int d; |
| @@ -501,8 +506,8 @@ static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer) { | |||
| 501 | /* deal with all characters we can deal */ | 506 | /* deal with all characters we can deal */ |
| 502 | switch (input[0]) { | 507 | switch (input[0]) { |
| 503 | /* if we have an escape character */ | 508 | /* if we have an escape character */ |
| 504 | case '=': | 509 | case '=': |
| 505 | if (size < 3) return size; | 510 | if (size < 3) return size; |
| 506 | /* eliminate soft line break */ | 511 | /* eliminate soft line break */ |
| 507 | if (input[1] == '\r' && input[2] == '\n') return 0; | 512 | if (input[1] == '\r' && input[2] == '\n') return 0; |
| 508 | /* decode quoted representation */ | 513 | /* decode quoted representation */ |
| @@ -512,7 +517,7 @@ static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer) { | |||
| 512 | else luaL_addchar(buffer, (char) ((c << 4) + d)); | 517 | else luaL_addchar(buffer, (char) ((c << 4) + d)); |
| 513 | return 0; | 518 | return 0; |
| 514 | case '\r': | 519 | case '\r': |
| 515 | if (size < 2) return size; | 520 | if (size < 2) return size; |
| 516 | if (input[1] == '\n') luaL_addlstring(buffer, (char *)input, 2); | 521 | if (input[1] == '\n') luaL_addlstring(buffer, (char *)input, 2); |
| 517 | return 0; | 522 | return 0; |
| 518 | default: | 523 | default: |
| @@ -525,8 +530,8 @@ static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer) { | |||
| 525 | /*-------------------------------------------------------------------------*\ | 530 | /*-------------------------------------------------------------------------*\ |
| 526 | * Incrementally decodes a string in quoted-printable | 531 | * Incrementally decodes a string in quoted-printable |
| 527 | * A, B = qp(C, D) | 532 | * A, B = qp(C, D) |
| 528 | * A is the decoded version of the largest prefix of C .. D that | 533 | * A is the decoded version of the largest prefix of C .. D that |
| 529 | * can be decoded without doubts. | 534 | * can be decoded without doubts. |
| 530 | * B has the remaining bytes of C .. D, *without* decoding. | 535 | * B has the remaining bytes of C .. D, *without* decoding. |
| 531 | \*-------------------------------------------------------------------------*/ | 536 | \*-------------------------------------------------------------------------*/ |
| 532 | static int mime_global_unqp(lua_State *L) | 537 | static int mime_global_unqp(lua_State *L) |
| @@ -555,7 +560,7 @@ static int mime_global_unqp(lua_State *L) | |||
| 555 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); | 560 | if (!(*lua_tostring(L, -1))) lua_pushnil(L); |
| 556 | lua_pushnil(L); | 561 | lua_pushnil(L); |
| 557 | return 2; | 562 | return 2; |
| 558 | } | 563 | } |
| 559 | /* otherwise process rest of input */ | 564 | /* otherwise process rest of input */ |
| 560 | last = input + isize; | 565 | last = input + isize; |
| 561 | while (input < last) | 566 | while (input < last) |
| @@ -568,9 +573,9 @@ static int mime_global_unqp(lua_State *L) | |||
| 568 | /*-------------------------------------------------------------------------*\ | 573 | /*-------------------------------------------------------------------------*\ |
| 569 | * Incrementally breaks a quoted-printed string into lines | 574 | * Incrementally breaks a quoted-printed string into lines |
| 570 | * A, n = qpwrp(l, B, length) | 575 | * A, n = qpwrp(l, B, length) |
| 571 | * A is a copy of B, broken into lines of at most 'length' bytes. | 576 | * A is a copy of B, broken into lines of at most 'length' bytes. |
| 572 | * 'l' is how many bytes are left for the first line of B. | 577 | * 'l' is how many bytes are left for the first line of B. |
| 573 | * 'n' is the number of bytes left in the last line of A. | 578 | * 'n' is the number of bytes left in the last line of A. |
| 574 | * There are two complications: lines can't be broken in the middle | 579 | * There are two complications: lines can't be broken in the middle |
| 575 | * of an encoded =XX, and there might be line breaks already | 580 | * of an encoded =XX, and there might be line breaks already |
| 576 | \*-------------------------------------------------------------------------*/ | 581 | \*-------------------------------------------------------------------------*/ |
| @@ -603,11 +608,11 @@ static int mime_global_qpwrp(lua_State *L) | |||
| 603 | if (left <= 3) { | 608 | if (left <= 3) { |
| 604 | left = length; | 609 | left = length; |
| 605 | luaL_addstring(&buffer, EQCRLF); | 610 | luaL_addstring(&buffer, EQCRLF); |
| 606 | } | 611 | } |
| 607 | luaL_addchar(&buffer, *input); | 612 | luaL_addchar(&buffer, *input); |
| 608 | left--; | 613 | left--; |
| 609 | break; | 614 | break; |
| 610 | default: | 615 | default: |
| 611 | if (left <= 1) { | 616 | if (left <= 1) { |
| 612 | left = length; | 617 | left = length; |
| 613 | luaL_addstring(&buffer, EQCRLF); | 618 | luaL_addstring(&buffer, EQCRLF); |
| @@ -635,7 +640,7 @@ static int mime_global_qpwrp(lua_State *L) | |||
| 635 | * last is the previous character | 640 | * last is the previous character |
| 636 | \*-------------------------------------------------------------------------*/ | 641 | \*-------------------------------------------------------------------------*/ |
| 637 | #define eolcandidate(c) (c == '\r' || c == '\n') | 642 | #define eolcandidate(c) (c == '\r' || c == '\n') |
| 638 | static int eolprocess(int c, int last, const char *marker, | 643 | static int eolprocess(int c, int last, const char *marker, |
| 639 | luaL_Buffer *buffer) | 644 | luaL_Buffer *buffer) |
| 640 | { | 645 | { |
| 641 | if (eolcandidate(c)) { | 646 | if (eolcandidate(c)) { |
| @@ -653,10 +658,10 @@ static int eolprocess(int c, int last, const char *marker, | |||
| 653 | } | 658 | } |
| 654 | 659 | ||
| 655 | /*-------------------------------------------------------------------------*\ | 660 | /*-------------------------------------------------------------------------*\ |
| 656 | * Converts a string to uniform EOL convention. | 661 | * Converts a string to uniform EOL convention. |
| 657 | * A, n = eol(o, B, marker) | 662 | * A, n = eol(o, B, marker) |
| 658 | * A is the converted version of the largest prefix of B that can be | 663 | * A is the converted version of the largest prefix of B that can be |
| 659 | * converted unambiguously. 'o' is the context returned by the previous | 664 | * converted unambiguously. 'o' is the context returned by the previous |
| 660 | * call. 'n' is the new context. | 665 | * call. 'n' is the new context. |
| 661 | \*-------------------------------------------------------------------------*/ | 666 | \*-------------------------------------------------------------------------*/ |
| 662 | static int mime_global_eol(lua_State *L) | 667 | static int mime_global_eol(lua_State *L) |
| @@ -683,18 +688,18 @@ static int mime_global_eol(lua_State *L) | |||
| 683 | } | 688 | } |
| 684 | 689 | ||
| 685 | /*-------------------------------------------------------------------------*\ | 690 | /*-------------------------------------------------------------------------*\ |
| 686 | * Takes one byte and stuff it if needed. | 691 | * Takes one byte and stuff it if needed. |
| 687 | \*-------------------------------------------------------------------------*/ | 692 | \*-------------------------------------------------------------------------*/ |
| 688 | static size_t dot(int c, size_t state, luaL_Buffer *buffer) | 693 | static size_t dot(int c, size_t state, luaL_Buffer *buffer) |
| 689 | { | 694 | { |
| 690 | luaL_addchar(buffer, (char) c); | 695 | luaL_addchar(buffer, (char) c); |
| 691 | switch (c) { | 696 | switch (c) { |
| 692 | case '\r': | 697 | case '\r': |
| 693 | return 1; | 698 | return 1; |
| 694 | case '\n': | 699 | case '\n': |
| 695 | return (state == 1)? 2: 0; | 700 | return (state == 1)? 2: 0; |
| 696 | case '.': | 701 | case '.': |
| 697 | if (state == 2) | 702 | if (state == 2) |
| 698 | luaL_addchar(buffer, '.'); | 703 | luaL_addchar(buffer, '.'); |
| 699 | default: | 704 | default: |
| 700 | return 0; | 705 | return 0; |
| @@ -719,7 +724,7 @@ static int mime_global_dot(lua_State *L) | |||
| 719 | } | 724 | } |
| 720 | /* process all input */ | 725 | /* process all input */ |
| 721 | luaL_buffinit(L, &buffer); | 726 | luaL_buffinit(L, &buffer); |
| 722 | while (input < last) | 727 | while (input < last) |
| 723 | state = dot(*input++, state, &buffer); | 728 | state = dot(*input++, state, &buffer); |
| 724 | luaL_pushresult(&buffer); | 729 | luaL_pushresult(&buffer); |
| 725 | lua_pushnumber(L, (lua_Number) state); | 730 | lua_pushnumber(L, (lua_Number) state); |
