From 986555d41efa2b2746755fd3608e46ec7eb48564 Mon Sep 17 00:00:00 2001 From: dongzx666 Date: Wed, 20 Oct 2021 20:03:55 +0800 Subject: [PATCH 1/2] [2021-10-20]finish tutorial01 --- .../index/leptjson.c.793D9597D461A4AF.idx | Bin 0 -> 1974 bytes .../index/leptjson.h.CDC4968BBDE8B0BC.idx | Bin 0 -> 1344 bytes .../clangd/index/test.c.664A6CD92B020790.idx | Bin 0 -> 3208 bytes tutorial01/leptjson.c | 106 ++++++++++++------ tutorial01/test.c | 17 +++ 5 files changed, 90 insertions(+), 33 deletions(-) create mode 100644 tutorial01/.cache/clangd/index/leptjson.c.793D9597D461A4AF.idx create mode 100644 tutorial01/.cache/clangd/index/leptjson.h.CDC4968BBDE8B0BC.idx create mode 100644 tutorial01/.cache/clangd/index/test.c.664A6CD92B020790.idx diff --git a/tutorial01/.cache/clangd/index/leptjson.c.793D9597D461A4AF.idx b/tutorial01/.cache/clangd/index/leptjson.c.793D9597D461A4AF.idx new file mode 100644 index 0000000000000000000000000000000000000000..1dfd5ad6dae6c2d2361d458ad5db7ef64bdb7761 GIT binary patch literal 1974 zcmY*Z3vd%v6n#lHO|tuvY?7Bvn@#!+2@N#;0d3N>m_%DX#gyVGB21wlK!$2*EAo|p zWu~Y=8K6|l_$gY(b{t_^ff35!rwYXZO4Wk$F`$f6EINXWwZ25&Zph5uw ztY6wQbA$HxFFxT~GPLvirtSk5YAa?OJ9N^~I+xvb(_MVxE57aB6|HOfc1u@>=E#2f zV%&V`>|4(T{^|YjT-rzUUim=pM!s~%OXn|L-CVh)_L;@J|HbK^8pq7VFB~jCG`Fg8 z>4rJg-zZxpJ%d9wZs4i(BGk40yNioZujliL$0u{sFUPbsUWq-Ll$T{#e=_f~bCbWP zPquFN%hRThwr^dl4K>Sm1P8jm{q>b#|D-JGy^_LNuix+H{$0>H`OFWoUn{NeysWBd#TmbyDm8`9ZFU(7Vz>57g z#>PjC;I}WE$2XsSZ9W7E*l%Xc=7r!g@DI?AMG<4^|amuR1_rv$$E)V zvbkf==^y8>>xUo_?{G0LK4OFjO&#Zsmj1Q>4g?nL&!uuTMwVhVID%XXVhuRLg$tG? zf75qMG$2j}kb+g9h!G+T1h4Kn-Rk}rf+QS)hICTI2>$ymyGDB(&vro&kNrAEXO0-b zUt6`X?ikjCXr-VZY7|ijKtw0gF5wcS<8=-pBr@}6haeKNS!`nkNs-Iq8Y`ra+?1Pj zAKVbDTD*L`?(vZ#rL`wU0+ACsIda6%;;m`WZ+#a3ooUX@BxkK_&(?(Y^&OT%dkr-0?VFd~M?6~Yy5{WRyo5HmeBW1;92~?fe+LjN0R-_4EM|o&*lb`Yn zs91etN_A690;ZY>6OAPBj56;D?&eHG3`Dx|x=B$wjWVVBh+Ju|9KsNy zTy1Wg&=klQ?;A^+jI0tm(rJWP)x2dH<}163WDuDcQ>=Jrk}8Q4?;NKZCkVZ&Y?>?B zsO_d8LRu76PAg+g5sx?+M~X;uf_Xv~p-EOOWVodX6^II$0-mtnCN17}E%25HYvcny z6`@buIE`?-le7D}k1pi=p-XZK=_x%;(x4D8<&}gJg~mw7CBzL49;(;wzT04ch%qsI`I7}DF1UJQ|eF=z=5j1mpDC^XUF7Lie5 zWC(hcFhmxWMNQ~q6mLn6LfMua5hchIR0KVmC`5LZT}{%)DBhkNg|h8Y-DIC)FBW~N z@>G?G(%E!GN(WJ1Odd_dBO2g>hQA=BC=lgS`9eFA6!E6;XGGkTVa^a{Y=paex#vzl zEr*CxaDps&PUML~dU)>T&M0DDg_j{zAPQ&#dQ!&`&*-OR&YMr;Y2-AViBN#ZtMQu1 z5l~yTbU~O-U2R2OI$kAcXXp8X!0h5ynUOOABcTcaC%&4**NW=OrD_Z{46A@KG^0~$ HRci1bB8OV2 literal 0 HcmV?d00001 diff --git a/tutorial01/.cache/clangd/index/leptjson.h.CDC4968BBDE8B0BC.idx b/tutorial01/.cache/clangd/index/leptjson.h.CDC4968BBDE8B0BC.idx new file mode 100644 index 0000000000000000000000000000000000000000..3819f5652ec9970bfc6ace3b2781901886ce161b GIT binary patch literal 1344 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 literal 0 HcmV?d00001 diff --git a/tutorial01/leptjson.c b/tutorial01/leptjson.c index 5299fe1d..87e7f934 100644 --- a/tutorial01/leptjson.c +++ b/tutorial01/leptjson.c @@ -1,47 +1,87 @@ #include "leptjson.h" -#include /* assert() */ -#include /* NULL */ +#include /* assert() */ +#include /* NULL */ -#define EXPECT(c, ch) do { assert(*c->json == (ch)); c->json++; } while(0) +#define EXPECT(c, ch) \ + do { \ + assert(*c->json == (ch)); \ + c->json++; \ + } while (0) typedef struct { - const char* json; -}lept_context; - -static void lept_parse_whitespace(lept_context* c) { - const char *p = c->json; - while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') - p++; - c->json = p; + const char *json; +} lept_context; + +static void lept_parse_whitespace(lept_context *c) { + const char *p = c->json; + while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') + p++; + c->json = p; } -static int lept_parse_null(lept_context* c, lept_value* v) { - EXPECT(c, 'n'); - if (c->json[0] != 'u' || c->json[1] != 'l' || c->json[2] != 'l') - return LEPT_PARSE_INVALID_VALUE; - c->json += 3; - v->type = LEPT_NULL; - return LEPT_PARSE_OK; +static int lept_parse_null(lept_context *c, lept_value *v) { + EXPECT(c, 'n'); + if (c->json[0] != 'u' || c->json[1] != 'l' || c->json[2] != 'l') + return LEPT_PARSE_INVALID_VALUE; + c->json += 3; + v->type = LEPT_NULL; + return LEPT_PARSE_OK; } -static int lept_parse_value(lept_context* c, lept_value* v) { - switch (*c->json) { - case 'n': return lept_parse_null(c, v); - case '\0': return LEPT_PARSE_EXPECT_VALUE; - default: return LEPT_PARSE_INVALID_VALUE; - } +static int lept_parse_true(lept_context *c, lept_value *v) { + EXPECT(c, 't'); + if (c->json[0] != 'r' || c->json[1] != 'u' || c->json[2] != 'e') { + return LEPT_PARSE_INVALID_VALUE; + } + c->json += 3; + v->type = LEPT_TRUE; + return LEPT_PARSE_OK; +} + +static int lept_parse_false(lept_context *c, lept_value *v) { + EXPECT(c, 'f'); + if (c->json[0] != 'a' || c->json[1] != 'l' || c->json[2] != 's' || + c->json[3] != 'e') { + return LEPT_PARSE_INVALID_VALUE; + } + c->json += 4; + v->type = LEPT_FALSE; + return LEPT_PARSE_OK; } -int lept_parse(lept_value* v, const char* json) { - lept_context c; - assert(v != NULL); - c.json = json; - v->type = LEPT_NULL; +static int lept_parse_value(lept_context *c, lept_value *v) { + switch (*c->json) { + case 'n': + return lept_parse_null(c, v); + case '\0': + return LEPT_PARSE_EXPECT_VALUE; + case 't': + return lept_parse_true(c, v); + case 'f': + return lept_parse_false(c, v); + default: + return LEPT_PARSE_INVALID_VALUE; + } +} + +int lept_parse(lept_value *v, const char *json) { + lept_context c; + int res; + assert(v != NULL); + c.json = json; + v->type = LEPT_NULL; + lept_parse_whitespace(&c); + res = lept_parse_value(&c, v); + if (res == LEPT_PARSE_OK) { lept_parse_whitespace(&c); - return lept_parse_value(&c, v); + if (c.json[0] != '\0') { + res = LEPT_PARSE_ROOT_NOT_SINGULAR; + } + } + return res; } -lept_type lept_get_type(const lept_value* v) { - assert(v != NULL); - return v->type; +lept_type lept_get_type(const lept_value *v) { + assert(v != NULL); + return v->type; } diff --git a/tutorial01/test.c b/tutorial01/test.c index e7672181..2098ec3b 100644 --- a/tutorial01/test.c +++ b/tutorial01/test.c @@ -27,6 +27,21 @@ static void test_parse_null() { EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v)); } +static void test_parse_true() { + lept_value v; + v.type = LEPT_NULL; + EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "true")); + EXPECT_EQ_INT(LEPT_TRUE, lept_get_type(&v)); +} + +static void test_parse_false() { + lept_value v; + v.type = LEPT_NULL; + EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "false")); + EXPECT_EQ_INT(LEPT_FALSE, lept_get_type(&v)); +} + + static void test_parse_expect_value() { lept_value v; @@ -59,6 +74,8 @@ static void test_parse_root_not_singular() { static void test_parse() { test_parse_null(); + test_parse_true(); + test_parse_false(); test_parse_expect_value(); test_parse_invalid_value(); test_parse_root_not_singular(); From 1151af5bb4112bd6c3061bf43c4cb33251059ce1 Mon Sep 17 00:00:00 2001 From: dongzx666 Date: Thu, 21 Oct 2021 16:08:45 +0800 Subject: [PATCH 2/2] [2021-10-21]finish tutorial 2 --- .../index/leptjson.c.1E269D31D4DDC82F.idx | Bin 0 -> 2206 bytes .../index/leptjson.h.3484794EA4220B95.idx | Bin 0 -> 1552 bytes .../clangd/index/test.c.E013ADDE26D3B5C9.idx | Bin 0 -> 7342 bytes tutorial02/leptjson.c | 57 +++++++++++++++++- tutorial02/test.c | 13 ++-- 5 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 tutorial02/.cache/clangd/index/leptjson.c.1E269D31D4DDC82F.idx create mode 100644 tutorial02/.cache/clangd/index/leptjson.h.3484794EA4220B95.idx create mode 100644 tutorial02/.cache/clangd/index/test.c.E013ADDE26D3B5C9.idx diff --git a/tutorial02/.cache/clangd/index/leptjson.c.1E269D31D4DDC82F.idx b/tutorial02/.cache/clangd/index/leptjson.c.1E269D31D4DDC82F.idx new file mode 100644 index 0000000000000000000000000000000000000000..1de6bde9344cf7968c818015f3040e92465d5fb1 GIT binary patch literal 2206 zcmZ8h4NOy46uyO5+P-)DLtAcXOGQAi!mQ$7`Kb;mQlKDOkSK};p&)BJDG&q`=ggFu z2%8fp3W75WnL2TcF%n%+M$BXqjRYlTDz2GhW^OQ;^KU_STe+{zUeeol-nr*H=Y01& z*OHl@ewYt{u`ILRX{#-v000vFtEsK7v~d8?2Le!ktjlua{r-jU*_TiIIFiZ_OS>|& zhhzTy_U})$IS-a?%s73OlXQN&weYTXIKh#ecJ9jYyDs?4P|0VRc0;sEUAS$p=ty?Y zgzWJtbJgJ{(O}D_k^bmm#kQQULVjqgEBz?faB+6!LEFOD?on;;K*f*G@5S_W?j7md zGf5wz3SNyIxVzY1%bW=)-@SA_-xzyN)GJ&a8F%PA_l1aYXJ)edfO&rQx-*Kw+RmF7 z3tk4hO`zVXA7JdKdzQCeNEy9TAsh#qp=6COKR_&2sdp){mV5ibfvRD#@3XXPvNS*v~#caix)vfzKzHJt9?m9N*2$opk;l3Tabwmzb4X&_dM=ft)JOLy%Bwt51%*7yBQX^6D32gf$fG>c z#>vWr19yt8pW}2ksZB>hE_dsjZY8!&;m;mXk#s{@e?0j#P1=u{SpXMECl_6RrBt_;zMXvgPDFAle+XnPm&2QgNw_ z5J4&oq-QQJqOoGC*l#Ab@V974$k@QGf$vYO?Zn&}8DlWXIgO_7_f6cU@#H0N6Z{%7 z@l1Y&S$S55AVE|nE@Ml9$SHD4$uUCYQoF**F-|AF>9xj=6<{^yC*`x#4v|%4RrtZ7 zGFE7y+U6+nbW>AZT4VCOu!;m6l-e;;bn?6^i>nA#sg-~oQvgCeTi-q^@&bU;_gd;K Ua|p31VkA5mL^HvBu|Np^18l{gzyJUM literal 0 HcmV?d00001 diff --git a/tutorial02/.cache/clangd/index/leptjson.h.3484794EA4220B95.idx b/tutorial02/.cache/clangd/index/leptjson.h.3484794EA4220B95.idx new file mode 100644 index 0000000000000000000000000000000000000000..e9f5cdb57639c67a1df5dc839b56edd6422a4182 GIT binary patch literal 1552 zcmYk6drTBp6vodoQ}!{lGq8+1JcdWns#sH~rm`C7+F%3}LDonYrDa8z`e0FZsdb^W z1T2_B=mW9Fg{Xa`P@qKB>QD^^38Y7 zJ@cEfWpCW53kAs7lYPYHtlY%{Kp6UYD&6~%HRyi`z>#*>d--|wDbibywms}?JeSj5 zz2vK&(Sb9TEX_xG#`62V zwaTAED;=Be`XdFQ_4D*=Q>K>NPbZzaZO=M4@y$S8+lt>e6kaqo%ummZtxj*aGP-io zWZiSp_IPZHIm}$2N_3AePXAHoy6H=Qf3VLPKU$meVCF#MWk+ga%|zkeZ~NzW?!9Bb z=PmPp_h`{<*B704@85jL{!kLve`)ZAFkA0Vp{phLkE_QgyS&}E4)(86Y6=qC{yjfg z+f>CIeB~N?ES^$}eW|j~E zJzlU9p^-HazO+LPrelR7aLB>4d<+rQVaAT<6yAU4>n&yx^f=>LCXGl?#u{nnz?(H| z%{)Y*SbWK5t=WtmtOgcIC?m)CTb8TU7cW9M&REJM6A8-LQk-_h?9Y$jAQm}v8XZSO zbpW7@qQs>MN0I<@k|i}l)9CIE4`NOIx|HMl`(G>nd67bs)yn!X{d}bqi%{9o*A)4XQoUssEmN3+v8;|t2NSx z#LE&$dO96F37V3?6}X3zg&JV2XkUsGDr1&tnKFdOK>*QlC^)!`sG(r6S#=us&o g*o_FGZnv{+7aq#v-t9r(9>mXx=VPU3%;^C5A82QiCIA2c literal 0 HcmV?d00001 diff --git a/tutorial02/.cache/clangd/index/test.c.E013ADDE26D3B5C9.idx b/tutorial02/.cache/clangd/index/test.c.E013ADDE26D3B5C9.idx new file mode 100644 index 0000000000000000000000000000000000000000..8fb122eab090a4912d537457fb7b0fc727c4a04b GIT binary patch literal 7342 zcmeHMi&K+V7XLmtAPqP7gAf8FyiuN7&;dc9h=M%awX~3}unUAF@({&UpuCX|f{#i& zx=0@&B4T|h{6K-<*Cor4LaFQSAz}(#X z%lZB8NqTBh(tdZ2OIVRwRgzz>1&-q!#GkVA(v?b{adEy8E>5IK7BXu zzeSy{G1`Zn7yjL{q!<_Z-3-{4y7&8zJ#l_bL)9%K+W&MNcb++X-tK+gT6M`c@%pc; zghjrmYaPG%;~(aY!A0GXjbEj|{lrziwc=F#9Jd;s-Kp4<<3iouCL7tSHJ=}E?X)?0 zCuVMfQ>@kHPluyB2cMs*`+IeS=g+cD>RktlX0}TwzCCjLdFwyE(ff6O@U;9`OYysZ z%ih+zv-JM4Yn|ms_k{UF;e+xAQmc!P-zlpu(S0QDkRsnB;ojJrR)}-qI6Mo@ayJByBU>pxlx^47 zs-N}@AWkLb*P^wv48fFF9qrzpAGtJ7$~lR78+#ikLonqRes-zxihj!tDJK{6w)VEp zhG5EP^gTSVy(MK6;uK;&9i{sjf+=57k%JC_DjIQ0F&~b?Jq*E=Z~q}YtU0P@0&&h_ zz7ka`48fE?{#M8-gi+BGTd6=KhKv#JP!i7v!Qc1XKRZnSZA4 ztKHX(IFV+!02Krpf+;^FU-M9kFJXMBZ%HO>d8@pxhfD7VW#r$%#e5N6o z@)OI4Yp?GUHX=?Y<{Nov?&wxW&oYG*V9UW8 zJN10|@T!LT1(q!_b3NMO^zI|=l`nXNn|NsAC6qo?9fKrOs%YsvfGwTJXc+*rnnM9uV-`KqWiAsiqLP*5>irineNxb?b|AHuHSif{T# zl|$z~c173=yl~McZR_UsUf+VSKltO3^w}v7MlY^3HnukT7h_dNJ60JLYi5Gg{;&A* z+klB;B}wCsDqj3a2AC+8x1u29UU2bzz(lc1V#eD$d!6OIU zTLUJFrMLcZXUE;c4o2Set?7F0lUK{P0VayIJ2YbQqniV3029UX@9f_2eMfyeV4_&< z%{~sLjlU}eOcd*^_ab#;=;&Vn6UAEXzX?4_b*}(S6sw5aI-b}yvft>X?*4RW%=T>D zE~A&S_lnbXbiF79OuUrh*7F1RYra(&z0^yNedpuvU8w|2yi~~K&%cDX_K8A4ywvNr z`)l$(uMk&8ywoGDrd`|D@DpI-r91{+i*qhd6A|%Jk#|1OY|qmE0GN0w6nZ}Ut!t1A zn0TqrzU=?;?X(*sfQgqn6@0ed@0@>zkvG4(Z%li(cinf?Jc$m7xNEZms)ITebwJs^ zL4{GO&6`ACs614`)bof`^6(8dQz^(ZD1=hUB6wyOHyxdfwvekGe$0jXTWqfRAT2i6 zc-zg-Sr?|fx+7VEuu`VZcBN+bF#c3d*AFn8QqsCA|t zw??z{<+QCrw*=u#Av1v9!V%6AvKW*tWHTs7$YD^fkjo&ApkYv+kjEgcpk3w_LPl%!uPu^7dw|i0n$iFBei=^= ze^k?Hu|Ld2&SHOz_J^vm$RIMYH#4Xn>fI^LCKUHCe?59ZLZ;M1& literal 0 HcmV?d00001 diff --git a/tutorial02/leptjson.c b/tutorial02/leptjson.c index 7693e43b..6da42e1e 100644 --- a/tutorial02/leptjson.c +++ b/tutorial02/leptjson.c @@ -1,8 +1,15 @@ #include "leptjson.h" #include /* assert() */ +#include #include /* NULL, strtod() */ +#include +/* #include */ +#include +#include #define EXPECT(c, ch) do { assert(*c->json == (ch)); c->json++; } while(0) +#define ISDIGIT(ch) ((ch) >= '0' && (ch) <= '9') +#define ISDIGIT1TO9(ch) ((ch) >= '1' && (ch) <= '9') typedef struct { const char* json; @@ -15,7 +22,7 @@ static void lept_parse_whitespace(lept_context* c) { c->json = p; } -static int lept_parse_true(lept_context* c, lept_value* v) { +/*static int lept_parse_true(lept_context* c, lept_value* v) { EXPECT(c, 't'); if (c->json[0] != 'r' || c->json[1] != 'u' || c->json[2] != 'e') return LEPT_PARSE_INVALID_VALUE; @@ -40,12 +47,55 @@ static int lept_parse_null(lept_context* c, lept_value* v) { c->json += 3; v->type = LEPT_NULL; return LEPT_PARSE_OK; +}*/ + +static int lept_parse_literal(lept_context* c, lept_value* v, const char* target, int type) { + int len = strlen(target); + int i; + /* assert(strlen(c->json) == len); */ + for (i = 0; i < len; ++i) { + if (c->json[i] != target[i]) { + return LEPT_PARSE_INVALID_VALUE; + } + } + c->json += len; + v->type = type; + return LEPT_PARSE_OK; } static int lept_parse_number(lept_context* c, lept_value* v) { char* end; /* \TODO validate number */ + /* 1. start with 0-9 or - */ + int len = strlen(c->json); + if (c->json[0] != '-' && !ISDIGIT(c->json[0])) { + return LEPT_PARSE_INVALID_VALUE; + } + /* 2. 0 must be single 0, can't be like 0.0 */ + if (c->json[0] == '0' && len > 1) { + if (c->json[1] != '.') { + return LEPT_PARSE_ROOT_NOT_SINGULAR; + } + } + /* 3. there must be some numbers after . */ + if (len > 1) { + int i = 0; + for (i = 0; i < len; ++i) { + if (c->json[i] == '.') { + if (i == len - 1) { + return LEPT_PARSE_INVALID_VALUE; + } else { + break; + } + } + } + } + errno = 0; v->n = strtod(c->json, &end); + if (errno == ERANGE && (v->n == HUGE_VAL || v->n == -HUGE_VAL)) { + v->type = LEPT_NULL; + return LEPT_PARSE_NUMBER_TOO_BIG; + } if (c->json == end) return LEPT_PARSE_INVALID_VALUE; c->json = end; @@ -55,9 +105,14 @@ static int lept_parse_number(lept_context* c, lept_value* v) { static int lept_parse_value(lept_context* c, lept_value* v) { switch (*c->json) { + /* case 't': return lept_parse_true(c, v); case 'f': return lept_parse_false(c, v); case 'n': return lept_parse_null(c, v); + */ + case 't': return lept_parse_literal(c, v, "true", LEPT_TRUE); + case 'f': return lept_parse_literal(c, v, "false", LEPT_FALSE); + case 'n': return lept_parse_literal(c, v, "null", LEPT_NULL); default: return lept_parse_number(c, v); case '\0': return LEPT_PARSE_EXPECT_VALUE; } diff --git a/tutorial02/test.c b/tutorial02/test.c index eaa5db69..78a26d25 100644 --- a/tutorial02/test.c +++ b/tutorial02/test.c @@ -70,6 +70,12 @@ static void test_parse_number() { TEST_NUMBER(1.234E+10, "1.234E+10"); TEST_NUMBER(1.234E-10, "1.234E-10"); TEST_NUMBER(0.0, "1e-10000"); /* must underflow */ + + TEST_NUMBER(1.0000000000000002, "1.0000000000000002"); + TEST_NUMBER(4.9406564584124654e-324, "4.9406564584124654e-324"); + TEST_NUMBER(2.2250738585072009e-308, "2.2250738585072009e-308"); + TEST_NUMBER(2.2250738585072014e-308, "2.2250738585072014e-308"); + TEST_NUMBER(1.7976931348623157e+308, "1.7976931348623157e+308"); } #define TEST_ERROR(error, json)\ @@ -89,7 +95,6 @@ static void test_parse_invalid_value() { TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "nul"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "?"); -#if 0 /* invalid number */ TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "+0"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "+1"); @@ -99,25 +104,19 @@ static void test_parse_invalid_value() { TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "inf"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "NAN"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "nan"); -#endif } static void test_parse_root_not_singular() { TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "null x"); - -#if 0 /* invalid number */ TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0123"); /* after zero should be '.' , 'E' , 'e' or nothing */ TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0x0"); TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0x123"); -#endif } static void test_parse_number_too_big() { -#if 0 TEST_ERROR(LEPT_PARSE_NUMBER_TOO_BIG, "1e309"); TEST_ERROR(LEPT_PARSE_NUMBER_TOO_BIG, "-1e309"); -#endif } static void test_parse() {