aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Pulford <mark@kyne.com.au>2012-01-01 23:30:34 +1030
committerMark Pulford <mark@kyne.com.au>2012-01-01 23:30:34 +1030
commit77408a81a696472338c2f90147e41fff3e81005d (patch)
treea4972c000f94d416df20f8786f4e75e3ded5d263
parent929c814b12e3575859fa0d5a8ea9950ae2187c56 (diff)
downloadlua-cjson-77408a81a696472338c2f90147e41fff3e81005d.tar.gz
lua-cjson-77408a81a696472338c2f90147e41fff3e81005d.tar.bz2
lua-cjson-77408a81a696472338c2f90147e41fff3e81005d.zip
Add build option to disable invalid numbers
Windows MinGW doesn't convert Infinity/NaN/hexadecimal numbers. Add DISABLE_INVALID_NUMBERS build option option to disable invalid numbers.
-rw-r--r--Makefile8
-rw-r--r--lua-cjson-1.0devel-1.rockspec11
-rw-r--r--lua_cjson.c15
-rw-r--r--manual.txt21
4 files changed, 39 insertions, 16 deletions
diff --git a/Makefile b/Makefile
index 085e78a..999b877 100644
--- a/Makefile
+++ b/Makefile
@@ -2,8 +2,10 @@ LUA_VERSION = 5.1
2 2
3## Available defines for CJSON_CFLAGS 3## Available defines for CJSON_CFLAGS
4# 4#
5# USE_INTERNAL_ISINF: Workaround for Solaris platforms missing isinf(). 5# USE_INTERNAL_ISINF: Workaround for Solaris platforms missing isinf().
6# DISABLE_CJSON_GLOBAL: Do not store module is "cjson" global 6# DISABLE_CJSON_GLOBAL: Do not store module is "cjson" global.
7# DISABLE_INVALID_NUMBERS: Permanently disable invalid JSON numbers:
8# - NaN, Infinity, hex.
7 9
8## Build defaults 10## Build defaults
9TARGET = cjson.so 11TARGET = cjson.so
@@ -38,7 +40,7 @@ INSTALL_CMD = install
38## Windows (MinGW) 40## Windows (MinGW)
39#TARGET = cjson.dll 41#TARGET = cjson.dll
40#PREFIX = /home/user/opt 42#PREFIX = /home/user/opt
41#CJSON_CFLAGS = 43#CJSON_CFLAGS = -DDISABLE_INVALID_NUMBERS
42#CJSON_LDFLAGS = -shared -L$(PREFIX)/lib -llua51 44#CJSON_LDFLAGS = -shared -L$(PREFIX)/lib -llua51
43 45
44## End platform specific section 46## End platform specific section
diff --git a/lua-cjson-1.0devel-1.rockspec b/lua-cjson-1.0devel-1.rockspec
index fa20c53..9ef9f2c 100644
--- a/lua-cjson-1.0devel-1.rockspec
+++ b/lua-cjson-1.0devel-1.rockspec
@@ -25,15 +25,18 @@ build = {
25 cjson = { 25 cjson = {
26 sources = { "lua_cjson.c", "strbuf.c", "fpconv.c" }, 26 sources = { "lua_cjson.c", "strbuf.c", "fpconv.c" },
27 defines = { 27 defines = {
28-- Optional workaround:
29-- USE_INTERNAL_ISINF: Provide internal isinf() implementation. Required
30-- on some Solaris platforms.
31-- LuaRocks does not support platform specific configuration for Solaris. 28-- LuaRocks does not support platform specific configuration for Solaris.
32-- Uncomment the line below on Solaris platforms. 29-- Uncomment the line below on Solaris platforms if required.
33-- "USE_INTERNAL_ISINF" 30-- "USE_INTERNAL_ISINF"
34 } 31 }
35 } 32 }
36 }, 33 },
34 -- Override default build options (per platform)
35 platforms = {
36 win32 = { modules = { cjson = { defines = {
37 "DISABLE_INVALID_NUMBERS"
38 } } } }
39 },
37 copy_directories = { "tests" } 40 copy_directories = { "tests" }
38} 41}
39 42
diff --git a/lua_cjson.c b/lua_cjson.c
index 175433a..ca85156 100644
--- a/lua_cjson.c
+++ b/lua_cjson.c
@@ -67,6 +67,11 @@
67#define DEFAULT_ENCODE_KEEP_BUFFER 1 67#define DEFAULT_ENCODE_KEEP_BUFFER 1
68#define DEFAULT_ENCODE_NUMBER_PRECISION 14 68#define DEFAULT_ENCODE_NUMBER_PRECISION 14
69 69
70#ifdef DISABLE_INVALID_NUMBERS
71#undef DEFAULT_DECODE_REFUSE_BADNUM
72#define DEFAULT_DECODE_REFUSE_BADNUM 1
73#endif
74
70typedef enum { 75typedef enum {
71 T_OBJ_BEGIN, 76 T_OBJ_BEGIN,
72 T_OBJ_END, 77 T_OBJ_END,
@@ -341,6 +346,16 @@ static int json_cfg_refuse_invalid_numbers(lua_State *l)
341 &cfg->encode_refuse_badnum, 346 &cfg->encode_refuse_badnum,
342 &cfg->decode_refuse_badnum); 347 &cfg->decode_refuse_badnum);
343 348
349#if DISABLE_INVALID_NUMBERS
350 /* Some non-POSIX platforms don't handle double <-> string translations
351 * for Infinity/NaN/hexadecimal properly. Throw an error if the
352 * user attempts to enable them. */
353 if (!cfg->encode_refuse_badnum || !cfg->decode_refuse_badnum) {
354 cfg->encode_refuse_badnum = cfg->decode_refuse_badnum = 1;
355 luaL_error(l, "Infinity, NaN, and/or hexadecimal numbers are not supported.");
356 }
357#endif
358
344 return 1; 359 return 1;
345} 360}
346 361
diff --git a/manual.txt b/manual.txt
index 3ccbce3..33fcc56 100644
--- a/manual.txt
+++ b/manual.txt
@@ -42,15 +42,6 @@ RPM:: Linux
42LuaRocks:: Unix, Windows 42LuaRocks:: Unix, Windows
43 43
44 44
45Build Options (#define)
46~~~~~~~~~~~~~~~~~~~~~~~
47
48[horizontal]
49USE_INTERNAL_ISINF:: Workaround for Solaris platforms missing isinf().
50DISABLE_CJSON_GLOBAL:: Do not store module table in global "cjson"
51 variable. Redundant from Lua 5.2 onwards.
52
53
54Make 45Make
55~~~~ 46~~~~
56 47
@@ -117,6 +108,18 @@ Review the http://luarocks.org/en/Documentation[LuaRocks documentation]
117for further details. 108for further details.
118 109
119 110
111Build Options (#define)
112~~~~~~~~~~~~~~~~~~~~~~~
113
114[horizontal]
115USE_INTERNAL_ISINF:: Workaround for Solaris platforms missing ++isinf++(3).
116DISABLE_CJSON_GLOBAL:: Do not store module table in global "cjson"
117 variable. Redundant from Lua 5.2 onwards.
118DISABLE_INVALID_NUMBERS:: Recommended on platforms where ++strtod++(3) /
119 ++sprintf++(3) are not POSIX compliant (Eg, Windows MinGW). Restricts
120 the +cjson.refuse_invalid_numbers+ runtime configuration to +true+.
121
122
120API (Functions) 123API (Functions)
121--------------- 124---------------
122 125