diff options
| author | Diego Nehab <diego.nehab@gmail.com> | 2019-03-09 23:23:48 -0300 |
|---|---|---|
| committer | Diego Nehab <diego.nehab@gmail.com> | 2019-03-09 23:23:48 -0300 |
| commit | 03b72d8f7ee5e35f76f97da299ce676946023725 (patch) | |
| tree | 0152020a11181e4f01c2fcb855d58f8e36559dd9 | |
| parent | c7215bef07cb855844d1da42d2e64c5be869d5b7 (diff) | |
| download | luasocket-03b72d8f7ee5e35f76f97da299ce676946023725.tar.gz luasocket-03b72d8f7ee5e35f76f97da299ce676946023725.tar.bz2 luasocket-03b72d8f7ee5e35f76f97da299ce676946023725.zip | |
Use static initialization
This helps with multi-threaded apps.
| -rwxr-xr-x | src/makefile | 3 | ||||
| -rwxr-xr-x | src/mime.c | 152 |
2 files changed, 145 insertions, 10 deletions
diff --git a/src/makefile b/src/makefile index e6baf78..b9e2f93 100755 --- a/src/makefile +++ b/src/makefile | |||
| @@ -35,7 +35,8 @@ DEBUG?=NODEBUG | |||
| 35 | # LUAINC_macosx: | 35 | # LUAINC_macosx: |
| 36 | # /opt/local/include | 36 | # /opt/local/include |
| 37 | LUAINC_macosx_base?=/opt/local/include | 37 | LUAINC_macosx_base?=/opt/local/include |
| 38 | LUAINC_macosx?=$(LUAINC_macosx_base)/lua/$(LUAV) $(LUAINC_macosx_base)/lua$(LUAV) | 38 | LUAINC_macosx?=$(LUAINC_macosx_base)/lua/$(LUAV) $(LUAINC_macosx_base)/lua$(LUAV) $(LUAINC_macosx_base)/lua-$(LUAV) |
| 39 | |||
| 39 | # FIXME default should this default to fink or to macports? | 40 | # FIXME default should this default to fink or to macports? |
| 40 | # What happens when more than one Lua version is installed? | 41 | # What happens when more than one Lua version is installed? |
| 41 | LUAPREFIX_macosx?=/opt/local | 42 | LUAPREFIX_macosx?=/opt/local |
| @@ -3,6 +3,7 @@ | |||
| 3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
| 4 | \*=========================================================================*/ | 4 | \*=========================================================================*/ |
| 5 | #include <string.h> | 5 | #include <string.h> |
| 6 | #include <ctype.h> | ||
| 6 | 7 | ||
| 7 | #include "lua.h" | 8 | #include "lua.h" |
| 8 | #include "lauxlib.h" | 9 | #include "lauxlib.h" |
| @@ -30,12 +31,12 @@ static int mime_global_eol(lua_State *L); | |||
| 30 | static int mime_global_dot(lua_State *L); | 31 | static int mime_global_dot(lua_State *L); |
| 31 | 32 | ||
| 32 | static size_t dot(int c, size_t state, luaL_Buffer *buffer); | 33 | static size_t dot(int c, size_t state, luaL_Buffer *buffer); |
| 33 | static void b64setup(UC *base); | 34 | //static void b64setup(UC *base); |
| 34 | static size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | 35 | static size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer); |
| 35 | static size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer); | 36 | static size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer); |
| 36 | static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | 37 | static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer); |
| 37 | 38 | ||
| 38 | static void qpsetup(UC *class, UC *unbase); | 39 | //static void qpsetup(UC *class, UC *unbase); |
| 39 | static void qpquote(UC c, luaL_Buffer *buffer); | 40 | static void qpquote(UC c, luaL_Buffer *buffer); |
| 40 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | 41 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); |
| 41 | static size_t qpencode(UC c, UC *input, size_t size, | 42 | static size_t qpencode(UC c, UC *input, size_t size, |
| @@ -58,17 +59,111 @@ static luaL_Reg func[] = { | |||
| 58 | /*-------------------------------------------------------------------------*\ | 59 | /*-------------------------------------------------------------------------*\ |
| 59 | * Quoted-printable globals | 60 | * Quoted-printable globals |
| 60 | \*-------------------------------------------------------------------------*/ | 61 | \*-------------------------------------------------------------------------*/ |
| 61 | static UC qpclass[256]; | ||
| 62 | static UC qpbase[] = "0123456789ABCDEF"; | ||
| 63 | static UC qpunbase[256]; | ||
| 64 | enum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST}; | 62 | enum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST}; |
| 65 | 63 | ||
| 64 | static UC qpclass[] = { | ||
| 65 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 66 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_IF_LAST, QP_QUOTED, QP_QUOTED, | ||
| 67 | QP_QUOTED, QP_CR, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 68 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 69 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 70 | QP_QUOTED, QP_QUOTED, QP_IF_LAST, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 71 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 72 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 73 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 74 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 75 | QP_PLAIN, QP_QUOTED, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 76 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 77 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 78 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 79 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 80 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 81 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 82 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 83 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 84 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 85 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
| 86 | QP_PLAIN, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 87 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 88 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 89 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 90 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 91 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 92 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 93 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 94 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 95 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 96 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 97 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 98 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 99 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 100 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 101 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 102 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 103 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 104 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 105 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 106 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
| 107 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED | ||
| 108 | }; | ||
| 109 | |||
| 110 | static const UC qpbase[] = "0123456789ABCDEF"; | ||
| 111 | |||
| 112 | static const UC qpunbase[] = { | ||
| 113 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 114 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 115 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 116 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 117 | 255, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, | ||
| 118 | 255, 255, 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, | ||
| 119 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 120 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 121 | 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 255, 255, | ||
| 122 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 123 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 124 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 125 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 126 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 127 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 128 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 129 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 130 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 131 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 132 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 133 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 134 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 135 | 255, 255, 255, 255, 255, 255, 255, 255 | ||
| 136 | }; | ||
| 137 | |||
| 66 | /*-------------------------------------------------------------------------*\ | 138 | /*-------------------------------------------------------------------------*\ |
| 67 | * Base64 globals | 139 | * Base64 globals |
| 68 | \*-------------------------------------------------------------------------*/ | 140 | \*-------------------------------------------------------------------------*/ |
| 69 | static const UC b64base[] = | 141 | static const UC b64base[] = |
| 70 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | 142 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
| 71 | static UC b64unbase[256]; | 143 | |
| 144 | static const UC b64unbase[] = { | ||
| 145 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 146 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 147 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 148 | 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, | ||
| 149 | 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 0, | ||
| 150 | 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, | ||
| 151 | 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, | ||
| 152 | 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, | ||
| 153 | 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, | ||
| 154 | 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 155 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 156 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 157 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 158 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 159 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 160 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 161 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 162 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 163 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 164 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
| 165 | 255, 255 | ||
| 166 | }; | ||
| 72 | 167 | ||
| 73 | /*=========================================================================*\ | 168 | /*=========================================================================*\ |
| 74 | * Exported functions | 169 | * Exported functions |
| @@ -85,8 +180,8 @@ LUASOCKET_API int luaopen_mime_core(lua_State *L) | |||
| 85 | lua_pushstring(L, MIME_VERSION); | 180 | lua_pushstring(L, MIME_VERSION); |
| 86 | lua_rawset(L, -3); | 181 | lua_rawset(L, -3); |
| 87 | /* initialize lookup tables */ | 182 | /* initialize lookup tables */ |
| 88 | qpsetup(qpclass, qpunbase); | 183 | // qpsetup(qpclass, qpunbase); |
| 89 | b64setup(b64unbase); | 184 | // b64setup(b64unbase); |
| 90 | return 1; | 185 | return 1; |
| 91 | } | 186 | } |
| 92 | 187 | ||
| @@ -145,13 +240,21 @@ static int mime_global_wrp(lua_State *L) | |||
| 145 | /*-------------------------------------------------------------------------*\ | 240 | /*-------------------------------------------------------------------------*\ |
| 146 | * Fill base64 decode map. | 241 | * Fill base64 decode map. |
| 147 | \*-------------------------------------------------------------------------*/ | 242 | \*-------------------------------------------------------------------------*/ |
| 243 | #if 0 | ||
| 148 | static void b64setup(UC *unbase) | 244 | static void b64setup(UC *unbase) |
| 149 | { | 245 | { |
| 150 | int i; | 246 | int i; |
| 151 | for (i = 0; i <= 255; i++) unbase[i] = (UC) 255; | 247 | for (i = 0; i <= 255; i++) unbase[i] = (UC) 255; |
| 152 | for (i = 0; i < 64; i++) unbase[b64base[i]] = (UC) i; | 248 | for (i = 0; i < 64; i++) unbase[b64base[i]] = (UC) i; |
| 153 | unbase['='] = 0; | 249 | unbase['='] = 0; |
| 250 | |||
| 251 | printf("static const UC b64unbase[] = {\n"); | ||
| 252 | for (int i = 0; i < 256; i++) { | ||
| 253 | printf("%d, ", unbase[i]); | ||
| 254 | } | ||
| 255 | printf("\n}\n;"); | ||
| 154 | } | 256 | } |
| 257 | #endif | ||
| 155 | 258 | ||
| 156 | /*-------------------------------------------------------------------------*\ | 259 | /*-------------------------------------------------------------------------*\ |
| 157 | * Acumulates bytes in input buffer until 3 bytes are available. | 260 | * Acumulates bytes in input buffer until 3 bytes are available. |
| @@ -349,8 +452,10 @@ static int mime_global_unb64(lua_State *L) | |||
| 349 | * Split quoted-printable characters into classes | 452 | * Split quoted-printable characters into classes |
| 350 | * Precompute reverse map for encoding | 453 | * Precompute reverse map for encoding |
| 351 | \*-------------------------------------------------------------------------*/ | 454 | \*-------------------------------------------------------------------------*/ |
| 455 | #if 0 | ||
| 352 | static void qpsetup(UC *cl, UC *unbase) | 456 | static void qpsetup(UC *cl, UC *unbase) |
| 353 | { | 457 | { |
| 458 | |||
| 354 | int i; | 459 | int i; |
| 355 | for (i = 0; i < 256; i++) cl[i] = QP_QUOTED; | 460 | for (i = 0; i < 256; i++) cl[i] = QP_QUOTED; |
| 356 | for (i = 33; i <= 60; i++) cl[i] = QP_PLAIN; | 461 | for (i = 33; i <= 60; i++) cl[i] = QP_PLAIN; |
| @@ -367,7 +472,37 @@ static void qpsetup(UC *cl, UC *unbase) | |||
| 367 | unbase['c'] = 12; unbase['D'] = 13; unbase['d'] = 13; | 472 | unbase['c'] = 12; unbase['D'] = 13; unbase['d'] = 13; |
| 368 | unbase['E'] = 14; unbase['e'] = 14; unbase['F'] = 15; | 473 | unbase['E'] = 14; unbase['e'] = 14; unbase['F'] = 15; |
| 369 | unbase['f'] = 15; | 474 | unbase['f'] = 15; |
| 475 | |||
| 476 | printf("static UC qpclass[] = {"); | ||
| 477 | for (int i = 0; i < 256; i++) { | ||
| 478 | if (i % 6 == 0) { | ||
| 479 | printf("\n "); | ||
| 480 | } | ||
| 481 | switch(cl[i]) { | ||
| 482 | case QP_QUOTED: | ||
| 483 | printf("QP_QUOTED, "); | ||
| 484 | break; | ||
| 485 | case QP_PLAIN: | ||
| 486 | printf("QP_PLAIN, "); | ||
| 487 | break; | ||
| 488 | case QP_CR: | ||
| 489 | printf("QP_CR, "); | ||
| 490 | break; | ||
| 491 | case QP_IF_LAST: | ||
| 492 | printf("QP_IF_LAST, "); | ||
| 493 | break; | ||
| 494 | } | ||
| 495 | } | ||
| 496 | printf("\n};\n"); | ||
| 497 | |||
| 498 | printf("static const UC qpunbase[] = {"); | ||
| 499 | for (int i = 0; i < 256; i++) { | ||
| 500 | int c = qpunbase[i]; | ||
| 501 | printf("%d, ", c); | ||
| 502 | } | ||
| 503 | printf("\";\n"); | ||
| 370 | } | 504 | } |
| 505 | #endif | ||
| 371 | 506 | ||
| 372 | /*-------------------------------------------------------------------------*\ | 507 | /*-------------------------------------------------------------------------*\ |
| 373 | * Output one character in form =XX | 508 | * Output one character in form =XX |
| @@ -447,7 +582,6 @@ static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer) | |||
| 447 | \*-------------------------------------------------------------------------*/ | 582 | \*-------------------------------------------------------------------------*/ |
| 448 | static int mime_global_qp(lua_State *L) | 583 | static int mime_global_qp(lua_State *L) |
| 449 | { | 584 | { |
| 450 | |||
| 451 | size_t asize = 0, isize = 0; | 585 | size_t asize = 0, isize = 0; |
| 452 | UC atom[3]; | 586 | UC atom[3]; |
| 453 | const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize); | 587 | const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize); |
