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 /src | |
parent | c7215bef07cb855844d1da42d2e64c5be869d5b7 (diff) | |
download | luasocket-03b72d8f7ee5e35f76f97da299ce676946023725.tar.gz luasocket-03b72d8f7ee5e35f76f97da299ce676946023725.tar.bz2 luasocket-03b72d8f7ee5e35f76f97da299ce676946023725.zip |
Use static initialization
This helps with multi-threaded apps.
Diffstat (limited to 'src')
-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); |