From 2adfefefaaadb0939088840f8a1962066bcc4d27 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Tue, 14 Apr 2015 05:41:34 +0000 Subject: [PATCH] jsmn FossilOrigin-Name: ecb1f35226e9937aaa2f255e3d3dcb4662c0902821cfdb87e9645a3277aee6ec --- src/contrib/jsmn/.hg/00changelog.i | Bin 0 -> 57 bytes src/contrib/jsmn/.hg/branch | 1 + src/contrib/jsmn/.hg/cache/branchheads-served | 5 + src/contrib/jsmn/.hg/dirstate | Bin 0 -> 257 bytes src/contrib/jsmn/.hg/hgrc | 2 + src/contrib/jsmn/.hg/requires | 4 + src/contrib/jsmn/.hg/store/00changelog.i | Bin 0 -> 18398 bytes src/contrib/jsmn/.hg/store/00manifest.i | Bin 0 -> 15706 bytes .../jsmn/.hg/store/data/_l_i_c_e_n_s_e.i | Bin 0 -> 693 bytes src/contrib/jsmn/.hg/store/data/_makefile.i | Bin 0 -> 2014 bytes .../jsmn/.hg/store/data/_r_e_a_d_m_e.i | Bin 0 -> 4776 bytes .../jsmn/.hg/store/data/_r_e_a_d_m_e.md.i | Bin 0 -> 3801 bytes src/contrib/jsmn/.hg/store/data/demo.c.i | Bin 0 -> 5011 bytes .../jsmn/.hg/store/data/example/jsondump.c.i | Bin 0 -> 970 bytes .../jsmn/.hg/store/data/example/simple.c.i | Bin 0 -> 992 bytes src/contrib/jsmn/.hg/store/data/jsmn.c.i | Bin 0 -> 16870 bytes src/contrib/jsmn/.hg/store/data/jsmn.h.i | Bin 0 -> 5615 bytes .../jsmn/.hg/store/data/jsmn__test.c.i | Bin 0 -> 9439 bytes src/contrib/jsmn/.hg/store/data/test.sh.i | Bin 0 -> 1520 bytes src/contrib/jsmn/.hg/store/fncache | 11 + src/contrib/jsmn/.hg/store/phaseroots | 0 src/contrib/jsmn/.hg/store/undo | Bin 0 -> 241 bytes src/contrib/jsmn/.hg/store/undo.phaseroots | 0 src/contrib/jsmn/.hg/undo.bookmarks | 0 src/contrib/jsmn/.hg/undo.branch | 1 + src/contrib/jsmn/.hg/undo.desc | 3 + src/contrib/jsmn/.hg/undo.dirstate | 0 src/contrib/jsmn/LICENSE | 20 + src/contrib/jsmn/Makefile | 35 + src/contrib/jsmn/README.md | 167 +++++ src/contrib/jsmn/example/.simple.c.swp | Bin 0 -> 12288 bytes src/contrib/jsmn/example/jsondump.c | 112 ++++ src/contrib/jsmn/example/simple.c | 75 +++ src/contrib/jsmn/jsmn.c | 311 +++++++++ src/contrib/jsmn/jsmn.h | 75 +++ src/contrib/jsmn/jsmn_test.c | 608 ++++++++++++++++++ 36 files changed, 1430 insertions(+) create mode 100644 src/contrib/jsmn/.hg/00changelog.i create mode 100644 src/contrib/jsmn/.hg/branch create mode 100644 src/contrib/jsmn/.hg/cache/branchheads-served create mode 100644 src/contrib/jsmn/.hg/dirstate create mode 100644 src/contrib/jsmn/.hg/hgrc create mode 100644 src/contrib/jsmn/.hg/requires create mode 100644 src/contrib/jsmn/.hg/store/00changelog.i create mode 100644 src/contrib/jsmn/.hg/store/00manifest.i create mode 100644 src/contrib/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i create mode 100644 src/contrib/jsmn/.hg/store/data/_makefile.i create mode 100644 src/contrib/jsmn/.hg/store/data/_r_e_a_d_m_e.i create mode 100644 src/contrib/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i create mode 100644 src/contrib/jsmn/.hg/store/data/demo.c.i create mode 100644 src/contrib/jsmn/.hg/store/data/example/jsondump.c.i create mode 100644 src/contrib/jsmn/.hg/store/data/example/simple.c.i create mode 100644 src/contrib/jsmn/.hg/store/data/jsmn.c.i create mode 100644 src/contrib/jsmn/.hg/store/data/jsmn.h.i create mode 100644 src/contrib/jsmn/.hg/store/data/jsmn__test.c.i create mode 100644 src/contrib/jsmn/.hg/store/data/test.sh.i create mode 100644 src/contrib/jsmn/.hg/store/fncache create mode 100644 src/contrib/jsmn/.hg/store/phaseroots create mode 100644 src/contrib/jsmn/.hg/store/undo create mode 100644 src/contrib/jsmn/.hg/store/undo.phaseroots create mode 100644 src/contrib/jsmn/.hg/undo.bookmarks create mode 100644 src/contrib/jsmn/.hg/undo.branch create mode 100644 src/contrib/jsmn/.hg/undo.desc create mode 100644 src/contrib/jsmn/.hg/undo.dirstate create mode 100644 src/contrib/jsmn/LICENSE create mode 100644 src/contrib/jsmn/Makefile create mode 100644 src/contrib/jsmn/README.md create mode 100644 src/contrib/jsmn/example/.simple.c.swp create mode 100644 src/contrib/jsmn/example/jsondump.c create mode 100644 src/contrib/jsmn/example/simple.c create mode 100644 src/contrib/jsmn/jsmn.c create mode 100644 src/contrib/jsmn/jsmn.h create mode 100644 src/contrib/jsmn/jsmn_test.c diff --git a/src/contrib/jsmn/.hg/00changelog.i b/src/contrib/jsmn/.hg/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..d3a8311050e54c57c5be7cfe169e60a95768812c GIT binary patch literal 57 zcmWN_K?=Yi3KA8%D7|E;0{bUW1>9N1xq0y=sl_F5Ikp0* y92-bZF9WJYbUsv=GsxA^#n)9YHw7xgX$F-Mg4vc;oS&Ccnp*%jQ%(fM%wzz=by>Lp literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/hgrc b/src/contrib/jsmn/.hg/hgrc new file mode 100644 index 00000000..2290de18 --- /dev/null +++ b/src/contrib/jsmn/.hg/hgrc @@ -0,0 +1,2 @@ +[paths] +default = https://bitbucket.org/zserge/jsmn diff --git a/src/contrib/jsmn/.hg/requires b/src/contrib/jsmn/.hg/requires new file mode 100644 index 00000000..f634f664 --- /dev/null +++ b/src/contrib/jsmn/.hg/requires @@ -0,0 +1,4 @@ +dotencode +fncache +revlogv1 +store diff --git a/src/contrib/jsmn/.hg/store/00changelog.i b/src/contrib/jsmn/.hg/store/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..2e012d4dda695a0e911aa0ca8fc38269e9698b42 GIT binary patch literal 18398 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 GasMBm>7xq( literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i b/src/contrib/jsmn/.hg/store/data/_l_i_c_e_n_s_e.i new file mode 100644 index 0000000000000000000000000000000000000000..fba581bda412eff57d951e3bffd50ee97e228ef4 GIT binary patch literal 693 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
    G@vd!7 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 literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i b/src/contrib/jsmn/.hg/store/data/_r_e_a_d_m_e.md.i new file mode 100644 index 0000000000000000000000000000000000000000..af43bd6f830c06d7423b9c2449f097f21d204bbc GIT binary patch literal 3801 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 literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/demo.c.i b/src/contrib/jsmn/.hg/store/data/demo.c.i new file mode 100644 index 0000000000000000000000000000000000000000..0165bea62dad084f29bf21a12bf0009b0f441b55 GIT binary patch literal 5011 zcmZ`+2Q-`izYY;2R*;~m9mUUxks?&>lG>YEtx~&Mo2sp5Ye&*3Dpu8|sL|N7w5VC7 zMoX7crBv&mkqaJ;#IfJTbFSRH{`X=#r>$1tM^oW*{QbnF7G z97W;+O8pXZL%}mau#?DH25Fk=2!lHhws$V5cO5*Y%7)Kotk_fkNl+Aoa2OKxlOW-R z>PoI{@8T0L{j;ZeS-AT><})@mr{;3{s+V8-fd_qB)&w{Yok%ve~JT>f8rvEJ=J-P|%)?w2rE zroYFmGhDY%5geX)Nd~Pkc)#z0`oSGcFh%*V-KiE+$E@b7VBNu6 zUc8f6%`q=OB|DpNj?tlt=1a{-zRZZT*RD+`0i21_Tl}rH5wFyWLifiS@L}%+U+-}! z?cB!r)obZUvmkqxLY3(gvuppDJuJd4m9iV+;F2@-rUb;DFP6K*IS)l*hh|?#ajy+; zF0MT55&si~xpjfZ@#HB)tF-51$d7wUA%ETx!jr{&=Pb`G0(*;VV&2N|)tBu+9lURG z*_Udo@*>abdFf`|bZEIVd%HJo%5Y+TM)uC{GAFa|&H9cO435_-wE|Or2G?Gb;T9sK zYT4d%XnocWrs8~`)445uG-*1v@7N~p^n1C}Jz|4?PoFm8sx{NYM#~Wu?_RuaF;3wG zCiD3GnEEe_`W=Uk_km`qFCg6&d|y$_HasooV|=l>*XYFO;?W{T@h_%63#4T_E-!Q4 zUGxl5sq_hocK&K1j#B-{xd`Q2-u^j29<_M5ISs`*FreZMj~Tt^jCjeGBKwe(8vp=W zXL3af8ge2Va=-s&s_^AHxWJ|6-hcb?0l?J0e&C(bhV1{u5b=* z)TV)LdM*$HT6f{b4E>1F6GDt#S$;1Z4fg4N1Dgx^BG{}V2hTy*oHO^~+6*ezxa6P# zb9eh309&LlmuE*^@As4NzpS~f&$ZOX6k@&U!z=A9*HxU?o?{-FdHcFd!wuutu@@0{ zWn-(E9G>5MFBSWh@2P8t9Zg8UcfPeX;n0k@LWH_VXp}pF0Fcht`6q0PQD~Gme<#H~ zz{<9^3EC~{=5u$2MeV-T!9c_W2!A$f%uIk`-TH%64qn0SiWEj}zph`zFs`19!JS`C z<@*wzw{YTl=NBzZiPVr-wGs|#%bYn5jeng~wb?1xns8|fNu0GVpKmI-mR4xH(A@5V zBKAtE4cA;43z9tRFX1R2oTId2a@AE~WsOEMF-pW*)uTtb=-829_cds(Zu#4n?b!w2 z!5XG#zjTMdD_{JkAno@IMnH|6Bg#3Cn>O?SkFl*M^c4|v@_>Tq;yT**t%UnuxdVDY z53vy6 zY_&>Jf6$u@Vud{GJiX&sBPFWL*Wx=nz@VEoZp`axLxhPdCyT$k&gsNnaS2s>+08M0 z9T6|*l+cmyM8*8a?6LAF^lt={HGkgWR)S~yd5-m1Brf^6nO(DpeD6aM*`n_H&GJWm z!1HX9JoFvdO6N6>lcZMSvh_#ZlkY2G)o+3o;@p2&C)#DG&VLwm|H&8y*zeX0Bs&-M zuYEg6j(`1cN%@J2?D(tL{Dc{Qi&5Gl;UiY+$d|6#dFH1a3WVZaU0n9B0$gd$#>YC? z6NJ5G5C!&@mKn}IFZ+qaN$S2%CKqBjBV3 zt71FlP#_dL0(0wg|Xi5<&9A!6CD!$F3swb;<-(WTKQIcxaQhC zeV7WShdE;SU&BM?6dWaR-kM?K8xDIy(X3lWcKy<&n8B zYU`V4U%DCXDkl$}z1`ax$YNC*x66I58~O{VJ?F}WgRX5;bozEw+5txMF4U(tdl&J&Ocgv~!P#>V4WBe9mCDA_jwuxYz(PV0xdGf}x!(TtJ?pd! z1qCH#>bi@shbg<;DGxwtplg6gWbY#q>o5umMw%t91aXxX4Uu~BPN@Zi^(9RM8v~2( z8S8Ehi(*`Awt`W&b#bdGTwwy2+Gs6=ELVof;Pad_aQ6uH`UV^o^gbRuLo_c;1q70W z@SY%DY#7{AW7OO{H6_|>iCrOpG|SPuFpWfU0#z88;YmLOd8UF*MY_vw{og5?K$@bX zyyxx6!=k60E58k@L5SnOZiS~!8ww%U}n*e)!J8j7FfX{vB{?#3XnEr^QHUj za?qNnhfGT9u{Q>vE>dyMZ^96wi7v64vO4S>vl-uBT^*5^_GGO3yvsfC3)~eQq8^{z zm2lt`j_L;;W7iEAr?&Aw3Tp2`c9TQB-@)Xu(gS? zqs9Jmi;np#kFoH6gZ#>4+}HGfqN3{UrxDD&@V@UUJM{Cl?x1}A7*6Wmjg9jsoYS+& z6CpPfnRzCpY@N)foX@m;`H|2@uDXm z28|1wsUPO;_=0olQNtgNhc^BZ*x@ehek_oK zZr(#~hvB@&c|&;MlQ z^Z3*f^-$7lBmF{)Q8)mgt`)ysYLJaiCU|C+>Cn}ZL^dJt zh4aW|yHLS1mnKd*6d0iE@I6z7vQP#3nr6tg0WJHSVcVmj@8+EYSz<>=A=+VNbx02jz;l3p% z`u)M+t{@Lb>4V8FE(10@myL^&2QC==Z=F=@Vt?Q0off*^UO6qDI@AMqTJUjeam)$_ zahe4I)%vyzujC0fO&tvj(`Z9Nb7`rkv7M3CmjCmT%0;Y!;ha7O$R+o31+`~Tbu`l| zNl(xGc>}lSZp-&v{L_~O%fmy<(v7aoIBB(;RoU(b1%hSASJNIKwm^e!p}?pZ>nYA1c+~lAvnOO?iP(9YC8mdM zdf%I70H4sZE-=S>rzOJL{2J`d-k%Ra3`iTzPU}GxX7rN-Oo}bvczMHHwaTq;u~1ff z+dSi~v&BDUa~*+v6X|`E4h!wkWHioD)P=+Da4Dn^=mlGw5waq zWTG-wK2uHJEnI^MSiUO5yCKAtrd^*=xQ)grg~(noQN1hN)Rw+C7jAWAYrTvX3gsfJ z$n=GrsYo?gnOu>AgLE;FISAVe=2nJfT~w^c971nn>rJ4Cl)v`TIqF zZL?gA?poq>tJJd%5)Ay-eUAZFsMAe%mEhYz>#aJetoxB}SK(;Y_n+1ac#Ye458i5X zFTQoDo>R{!{eiXI`q6Y=06fUeGM-q%e@I8*y*B<{S}8$m+@j&eh*iK~X+bIVmIM7> z02e${fMzp&N0I4!_CQNw!JHC+&|p1ha%A>ErtX>X^AUeEp~7W)K~KbHCJ!cqsd^)G z>y?fY{bpO~DsEOrBuBDuLyJ@FbEwZR`UhUym3yF?(ztM?`zHKrzqfu`-TCdWbg0l( zvA1t>?t>=oa_Zo4RoQ*nh9cX)%Ww~Mj~kdk&F@0daP$?pf-wiRcD=bnkzbhdR^NWK z>6?tbzl<*Y*Sg8-umC94oTIQ$ z6J;xQ7$Oowu`w~-8I48a3bmp}+7k9}ly&KnTw#iq*+^JUAapmoA@FO;W%g8b(U<8C z=vf(B+Oh*Crm-=Nm$&f4XOeZn_MjODyeH{E%mV^H1NYAeQYBFP`clrzt%pyBHAI@D zC4FGiuDjE)FRV$c8(c&eE0%N&}z^IyXWd7E3l|aHJyx`0nX2xk<=K z?netHToH)m9y{11`dzhpu|4AG)PKr31t5xad^9B8urm1H_Vf#M7Z-N$6P8c~lb^HH zP*`vO$E(RF6DIPj=T6QaJ>3m$3v)YT*7b26YdDsoPhp=Xid4UbiA0YPBGJXdAVLKQdpQ%O0}B1eq#_L?m^Xt0uLXC^~1sc3S`%h1HW<5P`E3H zKp0Ws6jC|pvp7;MU>&iMe^!C9YLOST)p{MOp;<7JPCuusVOc5W9F5g&rZC!jG+{?= z+E%bN^9^q3IyZyWdeY_07ulGq0D8;Zi&`)sFjWrH4s?|0NnV!_%*EL-W!+E$t}+#M zu$|L^cxd@uGd8~4py%Z2r)Ft*xmdYT5_yrC4S~bWH~_@7?HkE0vZhcPH6Us8;Iw7( zQI(mjjf8wx%kE$1w)h5T1^$eb?Q<3UeWx4>{I`vgNj6IUUp9gT!YtECYtjE>rhE@~ Ot0yd6fCX`A@_zv3EKw~0 literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/example/jsondump.c.i b/src/contrib/jsmn/.hg/store/data/example/jsondump.c.i new file mode 100644 index 0000000000000000000000000000000000000000..9359140b7a55658f263f8b94b5cbeeaa5d2e6a75 GIT binary patch literal 970 zcmV;*12y~r0RRC20000000W8u00}k#00000002?{|NsC0|NsAo*UrCzKZ}S5RT*!6 zxL6K>l~aNM00000000000001ZoV8YMPuoBY{@nZuuZWR0p{48_rATEeQxR=Zfl2H| zRY)#0ZE_b~E)s0wzt6r)niRw)u}uOIU+l-e$B!L$BJRg|z~DGjK_oiM6Kkh_6i0W@ z&t$~!x6hcAd^@z+>2z0F!aK{RWp&#Yv|-4BJ$OkPGY}z2<^_lY=U1~Sgi<6x`8jwz zfD|(*dKswEd!eo{X=@pGPJ@vk}_O-A+4ex`5scIohWOEL@g6u{z4Gw>qK)%AQl z{j{B9kCN>D%Ph0g^U=ra?JVDTQzNWkpm}J7LV_J>3nDnyNs(nV9LIzjm$h+Oql@7j zpUI;H1~9;g>lXor;3=B^9O2%^ZD@BTyMj~ zbG$b*v)_A-o9Y1D`(LhX)kOYeSu_)g7jb(tA+m4&G7&D=L&|)`f`Wl^>d>6tTwLHu zF>k9ZX1wlnmxo_ZZ_cj9U%vM(t3gA$NIjV`32EQh<0p@Z5YSG_Y{LnB#dwv&%nbU&_ki)@Dza)k6dlaC_vh(bg%*qf zuC}5+*pkD$>Ro+jHp+=IZ(c7b=NqWe?5q^)2J6sZ>2hcQNpSl6fP9;sPjYiW;%{%m z1-aEb_A-Bo@p{kdP16P77nS?zBY`_6FMY$XFVbwuLin4CP>$X`&eKuR$x8VsR;t`B zQBYy-mh4_MbkhgDkw)|RY`&PzCZkD7eQjJekL`lJLha?1b++GVzDV~%_HU$dn@B@t sqj4|r9|cWM)!>?7svSqgrXBo)I>E2ofdPHCkxIRiM(R857fN5DzYH|b$N&HU literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/example/simple.c.i b/src/contrib/jsmn/.hg/store/data/example/simple.c.i new file mode 100644 index 0000000000000000000000000000000000000000..e3c61371ccd641b3607bc2b9939f6d4fb0817af0 GIT binary patch literal 992 zcmV<610VbV0RRC20000000W=^00@2n00000002?{|NsC0|NsBWGCzZ&zdK#JqKAXs zw|H(h-wtB{00000000000001ZoW)h!Zrer>eI~zR%Akhsmpm0#6hOTN37Qyi5)_3c z7&N((Rwj3u-KAZ}(ZBc1uBcFLjXdT-+S}~xoO5P|&!ozVIv4c9x?Jkf_GSF6wPmE* zoa`l|(RgP|HQFX|JnqHRqXpSAEeaBUr)5-QfnU%z`r z^EgT#mq~4fStjSSOm=#!axIq00E;v)rQ-c{T3Eq5waj@volGW!r6Njjf0=BIt}Dw2 zSHYJJ_YuD+4z6l&6sC7F7nrX0$t;eoOP$O}DhKFViBFw&sJu1soB-UlqaKCfj12ytx2}!!Si4#=$m@q6mg6E2|Da zPyN>Ufb8J^Z+f2-A53Hflu|UA#nC=)R>SEm-p4TmEmNsFA#SYXEQ|&tBfVzzA!>D4 z2juQ*`uwNWjK)3sQy^g~kvUSDN{yUw+f)(Gn-pNhgDzq|x_%bx7ul}()pjIXf z8g^QHU0}t&{4DgkPz!78l9Ax2t6?GT1nQy?rC^FIvYqtJjzI(5@#QIf`9d7e$P53&LHLWG z-~9H=htsGo!tKDE;9#DJGdSguPB%xLY}QLME=W`Wk}j3lBl82bJ2 zEJt`q=o6OD+?8An$X7|yPMRnvTc!_$Ggd?8b%itmk89zwErp&!cWF@z|Nd8SL;47R zAbHfYo@Tt#pRPv8(&1qm@|Q0~QM&{5scqmniGYH~Jp@1~--6=1#8X((JeN*t1uh>@ zvLd@>f6QjU0cnNA(oljHClUguiElT_e=siiq3;9|jqfRl_bE~oD&?9ba=L(M0K|z* z8{xP~3xgi_gmABa{Z5cV*FHt%`|#{E!dKqzys4PbY{T0pRkygjT>N$L6QM^tscP}B zjuqZyW^M%6bZQJ3M16(iwg-Cl{O8MShw_@tXovD@@S+Q0qbang)g*fxSTnr-uK#@H zgFWIPd?AlCZ<+?aIX3oFZkzpp*oPyjKX1nXt7(hv$2MsnRnup1lRQDU&ww2wt Oza$g>ko*Jd3Vhx!yzE>6 literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/jsmn.c.i b/src/contrib/jsmn/.hg/store/data/jsmn.c.i new file mode 100644 index 0000000000000000000000000000000000000000..d037ee40979f55e1a84d64d105e08e4246787b63 GIT binary patch literal 16870 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 O6i@I*spxY6js8Ej@pC=^ literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/jsmn__test.c.i b/src/contrib/jsmn/.hg/store/data/jsmn__test.c.i new file mode 100644 index 0000000000000000000000000000000000000000..4a165463c165c3f90c26823c8b44c8bfa68a6930 GIT binary patch literal 9439 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 literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/data/test.sh.i b/src/contrib/jsmn/.hg/store/data/test.sh.i new file mode 100644 index 0000000000000000000000000000000000000000..7b9031c6238e3994a75727dfbf3563a226271bed GIT binary patch literal 1520 zcmZQzWME_f17-mR2KLJkHiPJYD0mlZTU6cmY1;~ysk+sg)j~d5dL~dcV5(wHZK$vR zV*>%(>-&=orrye$J>}EJc0HMhz$LM7nSunxyCzKDapl3Ssc$!I(D`3`yim%~!=iMO z`TMhHq>tadC#CAtE0i|9C1-N(jwja|eS0IU1;n=OO!oToRMO+)frGlOa}&fG*uJ|T zRyJ-@ofQ2dUgmt-W#I&^=F5-e_b*dtj>wv+$eMY}kdu|);pyrY=?mNu#@Ur-Q3jpA z__%Ke&9Yxx`RW&Q#1pMjC+&#h%@@*A8yiJm`F&EdZwpS`a6f3~%-uCdr+&V*FX!kn z$3LH!MF->@tzE8qK6%=5sp#WA%TE2eaYcEuWxwJXGp^#POPCJj99E1^Ka;-s&P&l^ zrPLrh@w|W6Zp0c&daRY_5>{V&VE@_tNIs2kCwcoH?>O}8K?B(v>p1SMo4=?8@ z3453WnRc_sD?0tPK73t3_OQgR@(I5Dmb5A@3J;xt*XAc`GGT+e#9->x+iHFyKQ>Wz3S)YybG2XF!oR4 z%3Sa`aNC~i4(9XX7Vy?Aj9JiM{{0(&)>GyeFIjIn#Cx38YW%VI5F5W#;pUE0sg}+C zSzM|wSZi)LY(K~HZIbuO>@N&eX1WQ#+#dYhm6quIbf3`N)jczxn@j(Gano;gy!HG@ z*{z=!sVy?Un6sjA?jA>G+dQEaGP73ioT*;S{`pS+mbYi`iCud4O>**$;t#*h zZa>g-eYYHcd3*KYzYh=k`brh9|E;!g;d(EY4|{kU-(5~DENVNdens!*oO^K#d|xgr zeewCpJ?<;Zubs4gwKu>`-DKf<(@2+>OPHi@9c&3cnA#?FG_v-5y`t={3%erRo3bSz zeQpcfqhm2;Pw=tZ{Vm!b7X6rgMB5-{(v&NC#|qe|t>^s7Kby_650oiDISB|V85lU? z!7K&_F%S*PQaks~I`r|C$w6<<<2tDooTgD{-?c;4fT@Z($q5PbPcj_iv0W+3y7Htd z*Q?B*KVNaZ^6Yed#bsv36?gDo-N$uxdNEgH=6E@1sKinO(xvIgYNX$vw@+Q=w|W6xiWH zNeKyEsR;=mp6Yn%ZVbJ6;qrN{b7#B#JCT3>xTXX)H-+{{&W_$j8ONnd z{`{G<;fNB@=dF_#T?)}-2=JD10J(vM1MHFzpz~wFECvQ?Ak74Fe%8(pVg@gkdst0O zG*oN2D0f(J@?@wQD8(cMR0@hO56+_05?d7wJ^hr_+GbCBU3X4U4f^HsAphh9Nv_wHSS;5d$SCb25FiQ;Bcw{%p0!5fX qZu%PYz|OuGJ>C4k(gVMld7LpoS&Ccnp=QPt~e8<1X(7lI5!W2 VpMfwHBp+V_az2t(V16+~6#(p}O3VNN literal 0 HcmV?d00001 diff --git a/src/contrib/jsmn/.hg/store/undo.phaseroots b/src/contrib/jsmn/.hg/store/undo.phaseroots new file mode 100644 index 00000000..e69de29b diff --git a/src/contrib/jsmn/.hg/undo.bookmarks b/src/contrib/jsmn/.hg/undo.bookmarks new file mode 100644 index 00000000..e69de29b diff --git a/src/contrib/jsmn/.hg/undo.branch b/src/contrib/jsmn/.hg/undo.branch new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/src/contrib/jsmn/.hg/undo.branch @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/src/contrib/jsmn/.hg/undo.desc b/src/contrib/jsmn/.hg/undo.desc new file mode 100644 index 00000000..561861e0 --- /dev/null +++ b/src/contrib/jsmn/.hg/undo.desc @@ -0,0 +1,3 @@ +0 +pull +https://bitbucket.org/zserge/jsmn diff --git a/src/contrib/jsmn/.hg/undo.dirstate b/src/contrib/jsmn/.hg/undo.dirstate new file mode 100644 index 00000000..e69de29b diff --git a/src/contrib/jsmn/LICENSE b/src/contrib/jsmn/LICENSE new file mode 100644 index 00000000..c84fb2e9 --- /dev/null +++ b/src/contrib/jsmn/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2010 Serge A. Zaitsev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/src/contrib/jsmn/Makefile b/src/contrib/jsmn/Makefile new file mode 100644 index 00000000..5e3e2a97 --- /dev/null +++ b/src/contrib/jsmn/Makefile @@ -0,0 +1,35 @@ +# You can put your build options here +-include config.mk + +all: libjsmn.a + +libjsmn.a: jsmn.o + $(AR) rc $@ $^ + +%.o: %.c jsmn.h + $(CC) -c $(CFLAGS) $< -o $@ + +test: jsmn_test + ./jsmn_test + +jsmn_test: jsmn_test.o + $(CC) $(LDFLAGS) -L. -ljsmn $< -o $@ + +jsmn_test.o: jsmn_test.c libjsmn.a + +simple_example: example/simple.o libjsmn.a + $(CC) $(LDFLAGS) $^ -o $@ + +jsondump: example/jsondump.o libjsmn.a + $(CC) $(LDFLAGS) $^ -o $@ + +clean: + rm -f jsmn.o jsmn_test.o example/simple.o + rm -f jsmn_test + rm -f jsmn_test.exe + rm -f libjsmn.a + rm -f simple_example + rm -f jsondump + +.PHONY: all clean test + diff --git a/src/contrib/jsmn/README.md b/src/contrib/jsmn/README.md new file mode 100644 index 00000000..353af94a --- /dev/null +++ b/src/contrib/jsmn/README.md @@ -0,0 +1,167 @@ + +JSMN +==== + +jsmn (pronounced like 'jasmine') is a minimalistic JSON parser in C. It can be +easily integrated into resource-limited or embedded projects. + +You can find more information about JSON format at [json.org][1] + +Library sources are available at [bitbucket.org/zserge/jsmn][2] + +The web page with some information about jsmn can be found at +[http://zserge.com/jsmn.html][3] + +Philosophy +---------- + +Most JSON parsers offer you a bunch of functions to load JSON data, parse it +and extract any value by its name. jsmn proves that checking the correctness of +every JSON packet or allocating temporary objects to store parsed JSON fields +often is an overkill. + +JSON format itself is extremely simple, so why should we complicate it? + +jsmn is designed to be **robust** (it should work fine even with erroneous +data), **fast** (it should parse data on the fly), **portable** (no superfluous +dependencies or non-standard C extensions). An of course, **simplicity** is a +key feature - simple code style, simple algorithm, simple integration into +other projects. + +Features +-------- + +* compatible with C89 +* no dependencies (even libc!) +* highly portable (tested on x86/amd64, ARM, AVR) +* about 200 lines of code +* extremely small code footprint +* API contains only 2 functions +* no dynamic memory allocation +* incremental single-pass parsing +* library code is covered with unit-tests + +Design +------ + +The rudimentary jsmn object is a **token**. Let's consider a JSON string: + + '{ "name" : "Jack", "age" : 27 }' + +It holds the following tokens: + +* Object: `{ "name" : "Jack", "age" : 27}` (the whole object) +* Strings: `"name"`, `"Jack"`, `"age"` (keys and some values) +* Number: `27` + +In jsmn, tokens do not hold any data, but point to token boundaries in JSON +string instead. In the example above jsmn will create tokens like: Object +[0..31], String [3..7], String [12..16], String [20..23], Number [27..29]. + +Every jsmn token has a type, which indicates the type of corresponding JSON +token. jsmn supports the following token types: + +* Object - a container of key-value pairs, e.g.: + `{ "foo":"bar", "x":0.3 }` +* Array - a sequence of values, e.g.: + `[ 1, 2, 3 ]` +* String - a quoted sequence of chars, e.g.: `"foo"` +* Primitive - a number, a boolean (`true`, `false`) or `null` + +Besides start/end positions, jsmn tokens for complex types (like arrays +or objects) also contain a number of child items, so you can easily follow +object hierarchy. + +This approach provides enough information for parsing any JSON data and makes +it possible to use zero-copy techniques. + +Install +------- + +To clone the repository you should have mercurial installed. Just run: + + $ hg clone http://bitbucket.org/zserge/jsmn jsmn + +Repository layout is simple: jsmn.c and jsmn.h are library files, tests are in +the jsmn\_test.c, you will also find README, LICENSE and Makefile files inside. + +To build the library, run `make`. It is also recommended to run `make test`. +Let me know, if some tests fail. + +If build was successful, you should get a `libjsmn.a` library. +The header file you should include is called `"jsmn.h"`. + +API +--- + +Token types are described by `jsmntype_t`: + + typedef enum { + JSMN_PRIMITIVE = 0, + JSMN_OBJECT = 1, + JSMN_ARRAY = 2, + JSMN_STRING = 3 + } jsmntype_t; + +**Note:** Unlike JSON data types, primitive tokens are not divided into +numbers, booleans and null, because one can easily tell the type using the +first character: + +* 't', 'f' - boolean +* 'n' - null +* '-', '0'..'9' - number + +Token is an object of `jsmntok_t` type: + + typedef struct { + jsmntype_t type; // Token type + int start; // Token start position + int end; // Token end position + int size; // Number of child (nested) tokens + } jsmntok_t; + +**Note:** string tokens point to the first character after +the opening quote and the previous symbol before final quote. This was made +to simplify string extraction from JSON data. + +All job is done by `jsmn_parser` object. You can initialize a new parser using: + + jsmn_parser parser; + jsmntok_t tokens[10]; + + jsmn_init(&parser); + + // js - pointer to JSON string + // tokens - an array of tokens available + // 10 - number of tokens available + jsmn_parse(&parser, js, tokens, 10); + +This will create a parser, and then it tries to parse up to 10 JSON tokens from +the `js` string. + +A non-negative reutrn value of `jsmn_parse` is the number of tokens actually +used by the parser. +Passing NULL instead of the tokens array would not store parsing results, but +instead the function will return the value of tokens needed to parse the given +string. This can be useful if you don't know yet how many tokens to allocate. + +If something goes wrong, you will get an error. Error will be one of these: + +* `JSMN_ERROR_INVAL` - bad token, JSON string is corrupted +* `JSMN_ERROR_NOMEM` - not enough tokens, JSON string is too large +* `JSMN_ERROR_PART` - JSON string is too short, expecting more JSON data + +If you get `JSON_ERROR_NOMEM`, you can re-allocate more tokens and call +`jsmn_parse` once more. If you read json data from the stream, you can +periodically call `jsmn_parse` and check if return value is `JSON_ERROR_PART`. +You will get this error until you reach the end of JSON data. + +Other info +---------- + +This software is distributed under [MIT license](http://www.opensource.org/licenses/mit-license.php), + so feel free to integrate it in your commercial products. + +[1]: http://www.json.org/ +[2]: https://bitbucket.org/zserge/jsmn/wiki/Home +[3]: http://zserge.com/jsmn.html diff --git a/src/contrib/jsmn/example/.simple.c.swp b/src/contrib/jsmn/example/.simple.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..5b6aa972568ee3bae361134638b3f7ed24f0c263 GIT binary patch literal 12288 zcmeI2&yN&E6vqog#6eLb7mtrtH}m@k7=c}uWJM*Qu#si`k)3hVGhMS&vol?7b@jr! zAkpaAgo793#fv9TMocg!CK3)3{{Rw?M!gv0Q7`zd>Khr-PK*M-}}CL zud>;0*WWmHg7#ORXZStI*!FsP@$im!wq46Jwm&(r&kWz~r;|3XoLH#r-}l17J3afp zF<4ux`5iN(7OPIJBSWo3yVj3~VU3^lhtU8xggI0@ce3T~IR%^oTUB5e+qbt-H?yAc z_R#L97Po4^J?|873OEIv0!{&^fK$LJ;1qBQJirR*XdAl#{~yX?cr`n2yXBZ&x`R`| zDc}@v3OEIv0!{&^fK$LJ;1qBQI0c*n51;~mz}WP|jD5HR&g1|8qrd)^&?jQtI+ zg3I7ra0z@2mcSuU2Nh5THy&l|SMW8s0FHw^An^N6#y$fa904<6JGh!->>`Lj4^+Xk zU?=$P5yrj*Uw{qJ0#Ae8;9qF-7q|pI1sB05;3Hsk`vAC~Q@|dE%he2gLvuunLAH-wd=E&HCXRFv;yxIRODIyC7E21=zu z>SyYX`BqSb37?@_k>2E##!V|qCQ(dUQk#<>lCPA%PO?iezAOw^Vk*{btX;}yq3ZRB z)1F!Qed6Tu+^JJ@Z)firX#a<|m>r+wfXt@=~X~ z0?i_}%(^I*Y|yvKtWCiGb6cUsV=rw^sd+L>>di?et+`Z_Awoan!&%4?NF#xkgM5K{ zTyZnD!Zn4-kSo!lHGh!sRGoW_DiOi`hcp)qMY!dl{2&lo$j~1Q)~VCuomD~(bdP6Y zh?uy*r6NzOgnNXQ<#l~5b#F@{`o_Ea4{|Z)YRfSus7qul43Y>bL$ zRv!$h$rx;z36xo5h6Kt?;gA&o~EWK4`&J^xneuh*fL84`JH(w~VffM)SG zC~5^;Cfqi8#M+G%4@5`%ZG6>k?#xj +#include +#include +#include +#include "../jsmn.h" + +/* + * An example of reading JSON from stdin and printing its content to stdout. + * The output looks like YAML, but I'm not sure if it's really compatible. + */ + +static int dump(const char *js, jsmntok_t *t, size_t count, int indent) { + int i, j, k; + if (count == 0) { + return 0; + } + if (t->type == JSMN_PRIMITIVE) { + printf("%.*s", t->end - t->start, js+t->start); + return 1; + } else if (t->type == JSMN_STRING) { + printf("'%.*s'", t->end - t->start, js+t->start); + return 1; + } else if (t->type == JSMN_OBJECT) { + printf("\n"); + j = 0; + for (i = 0; i < t->size; i++) { + for (k = 0; k < indent; k++) printf(" "); + j += dump(js, t+1+j, count-j, indent+1); + printf(": "); + j += dump(js, t+1+j, count-j, indent+1); + printf("\n"); + } + return j+1; + } else if (t->type == JSMN_ARRAY) { + j = 0; + printf("\n"); + for (i = 0; i < t->size; i++) { + for (k = 0; k < indent-1; k++) printf(" "); + printf(" - "); + j += dump(js, t+1+j, count-j, indent+1); + printf("\n"); + } + return j+1; + } + return 0; +} + +int main() { + int r; + int eof_expected = 0; + char *js = NULL; + size_t jslen = 0; + char buf[BUFSIZ]; + + jsmn_parser p; + jsmntok_t *tok; + size_t tokcount = 2; + + /* Prepare parser */ + jsmn_init(&p); + + /* Allocate some tokens as a start */ + tok = malloc(sizeof(*tok) * tokcount); + if (tok == NULL) { + fprintf(stderr, "malloc(): errno=%d\n", errno); + return 3; + } + + for (;;) { + /* Read another chunk */ + r = fread(buf, 1, sizeof(buf), stdin); + if (r < 0) { + fprintf(stderr, "fread(): %d, errno=%d\n", r, errno); + return 1; + } + if (r == 0) { + if (eof_expected != 0) { + return 0; + } else { + fprintf(stderr, "fread(): unexpected EOF\n"); + return 2; + } + } + + js = realloc(js, jslen + r + 1); + if (js == NULL) { + fprintf(stderr, "realloc(): errno=%d\n", errno); + return 3; + } + strncpy(js + jslen, buf, r); + jslen = jslen + r; + +again: + r = jsmn_parse(&p, js, jslen, tok, tokcount); + if (r < 0) { + if (r == JSMN_ERROR_NOMEM) { + tokcount = tokcount * 2; + tok = realloc(tok, sizeof(*tok) * tokcount); + if (tok == NULL) { + fprintf(stderr, "realloc(): errno=%d\n", errno); + return 3; + } + goto again; + } + } else { + dump(js, tok, p.toknext, 0); + eof_expected = 1; + } + } + + return 0; +} diff --git a/src/contrib/jsmn/example/simple.c b/src/contrib/jsmn/example/simple.c new file mode 100644 index 00000000..a6f8e6a9 --- /dev/null +++ b/src/contrib/jsmn/example/simple.c @@ -0,0 +1,75 @@ +#include +#include +#include "../jsmn.h" + +/* + * A small example of jsmn parsing when JSON structure is known and number of + * tokens is predictable. + */ + +const char *JSON_STRING = + "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " + "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}"; + +static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { + if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && + strncmp(json + tok->start, s, tok->end - tok->start) == 0) { + return 0; + } + return -1; +} + +int main() { + int i; + int r; + jsmn_parser p; + jsmntok_t t[128]; /* We expect no more than 128 tokens */ + + jsmn_init(&p); + r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0])); + if (r < 0) { + printf("Failed to parse JSON: %d\n", r); + return 1; + } + + /* Assume the top-level element is an object */ + if (r < 1 || t[0].type != JSMN_OBJECT) { + printf("Object expected\n"); + return 1; + } + + /* Loop over all keys of the root object */ + for (i = 1; i < r; i++) { + if (jsoneq(JSON_STRING, &t[i], "user") == 0) { + /* We may use strndup() to fetch string value */ + printf("- User: %.*s\n", t[i+1].end-t[i+1].start, + JSON_STRING + t[i+1].start); + i++; + } else if (jsoneq(JSON_STRING, &t[i], "admin") == 0) { + /* We may additionally check if the value is either "true" or "false" */ + printf("- Admin: %.*s\n", t[i+1].end-t[i+1].start, + JSON_STRING + t[i+1].start); + i++; + } else if (jsoneq(JSON_STRING, &t[i], "uid") == 0) { + /* We may want to do strtol() here to get numeric value */ + printf("- UID: %.*s\n", t[i+1].end-t[i+1].start, + JSON_STRING + t[i+1].start); + i++; + } else if (jsoneq(JSON_STRING, &t[i], "groups") == 0) { + int j; + printf("- Groups:\n"); + if (t[i+1].type != JSMN_ARRAY) { + continue; /* We expect groups to be an array of strings */ + } + for (j = 0; j < t[i+1].size; j++) { + jsmntok_t *g = &t[i+j+2]; + printf(" * %.*s\n", g->end - g->start, JSON_STRING + g->start); + } + i += t[i+1].size + 1; + } else { + printf("Unexpected key: %.*s\n", t[i].end-t[i].start, + JSON_STRING + t[i].start); + } + } + return 0; +} diff --git a/src/contrib/jsmn/jsmn.c b/src/contrib/jsmn/jsmn.c new file mode 100644 index 00000000..a0f4f69c --- /dev/null +++ b/src/contrib/jsmn/jsmn.c @@ -0,0 +1,311 @@ +#include + +#include "jsmn.h" + +/** + * Allocates a fresh unused token from the token pull. + */ +static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, + jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *tok; + if (parser->toknext >= num_tokens) { + return NULL; + } + tok = &tokens[parser->toknext++]; + tok->start = tok->end = -1; + tok->size = 0; +#ifdef JSMN_PARENT_LINKS + tok->parent = -1; +#endif + return tok; +} + +/** + * Fills token type and boundaries. + */ +static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, + int start, int end) { + token->type = type; + token->start = start; + token->end = end; + token->size = 0; +} + +/** + * Fills next available token with JSON primitive. + */ +static jsmnerr_t jsmn_parse_primitive(jsmn_parser *parser, const char *js, + size_t len, jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *token; + int start; + + start = parser->pos; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + switch (js[parser->pos]) { +#ifndef JSMN_STRICT + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': +#endif + case '\t' : case '\r' : case '\n' : case ' ' : + case ',' : case ']' : case '}' : + goto found; + } + if (js[parser->pos] < 32 || js[parser->pos] >= 127) { + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } +#ifdef JSMN_STRICT + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; +#endif + +found: + if (tokens == NULL) { + parser->pos--; + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + parser->pos--; + return 0; +} + +/** + * Filsl next token with JSON string. + */ +static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js, + size_t len, jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *token; + + int start = parser->pos; + + parser->pos++; + + /* Skip starting quote */ + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c = js[parser->pos]; + + /* Quote: end of string */ + if (c == '\"') { + if (tokens == NULL) { + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + return 0; + } + + /* Backslash: Quoted symbol expected */ + if (c == '\\' && parser->pos + 1 < len) { + int i; + parser->pos++; + switch (js[parser->pos]) { + /* Allowed escaped symbols */ + case '\"': case '/' : case '\\' : case 'b' : + case 'f' : case 'r' : case 'n' : case 't' : + break; + /* Allows escaped symbol \uXXXX */ + case 'u': + parser->pos++; + for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) { + /* If it isn't a hex character we have an error */ + if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ + (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ + (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ + parser->pos = start; + return JSMN_ERROR_INVAL; + } + parser->pos++; + } + parser->pos--; + break; + /* Unexpected symbol */ + default: + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } + } + parser->pos = start; + return JSMN_ERROR_PART; +} + +/** + * Parse JSON string and fill tokens. + */ +jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens) { + jsmnerr_t r; + int i; + jsmntok_t *token; + int count = 0; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c; + jsmntype_t type; + + c = js[parser->pos]; + switch (c) { + case '{': case '[': + count++; + if (tokens == NULL) { + break; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) + return JSMN_ERROR_NOMEM; + if (parser->toksuper != -1) { + tokens[parser->toksuper].size++; +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + } + token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); + token->start = parser->pos; + parser->toksuper = parser->toknext - 1; + break; + case '}': case ']': + if (tokens == NULL) + break; + type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); +#ifdef JSMN_PARENT_LINKS + if (parser->toknext < 1) { + return JSMN_ERROR_INVAL; + } + token = &tokens[parser->toknext - 1]; + for (;;) { + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + token->end = parser->pos + 1; + parser->toksuper = token->parent; + break; + } + if (token->parent == -1) { + break; + } + token = &tokens[token->parent]; + } +#else + for (i = parser->toknext - 1; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + parser->toksuper = -1; + token->end = parser->pos + 1; + break; + } + } + /* Error if unmatched closing bracket */ + if (i == -1) return JSMN_ERROR_INVAL; + for (; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + parser->toksuper = i; + break; + } + } +#endif + break; + case '\"': + r = jsmn_parse_string(parser, js, len, tokens, num_tokens); + if (r < 0) return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; + case '\t' : case '\r' : case '\n' : case ' ': + break; + case ':': + parser->toksuper = parser->toknext - 1; + break; + case ',': + if (tokens != NULL && + tokens[parser->toksuper].type != JSMN_ARRAY && + tokens[parser->toksuper].type != JSMN_OBJECT) { +#ifdef JSMN_PARENT_LINKS + parser->toksuper = tokens[parser->toksuper].parent; +#else + for (i = parser->toknext - 1; i >= 0; i--) { + if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { + if (tokens[i].start != -1 && tokens[i].end == -1) { + parser->toksuper = i; + break; + } + } + } +#endif + } + break; +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': case '0': case '1' : case '2': case '3' : case '4': + case '5': case '6': case '7' : case '8': case '9': + case 't': case 'f': case 'n' : + /* And they must not be keys of the object */ + if (tokens != NULL) { + jsmntok_t *t = &tokens[parser->toksuper]; + if (t->type == JSMN_OBJECT || + (t->type == JSMN_STRING && t->size != 0)) { + return JSMN_ERROR_INVAL; + } + } +#else + /* In non-strict mode every unquoted value is a primitive */ + default: +#endif + r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); + if (r < 0) return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; + +#ifdef JSMN_STRICT + /* Unexpected char in strict mode */ + default: + return JSMN_ERROR_INVAL; +#endif + } + } + + for (i = parser->toknext - 1; i >= 0; i--) { + /* Unmatched opened object or array */ + if (tokens[i].start != -1 && tokens[i].end == -1) { + return JSMN_ERROR_PART; + } + } + + return count; +} + +/** + * Creates a new parser based over a given buffer with an array of tokens + * available. + */ +void jsmn_init(jsmn_parser *parser) { + parser->pos = 0; + parser->toknext = 0; + parser->toksuper = -1; +} + diff --git a/src/contrib/jsmn/jsmn.h b/src/contrib/jsmn/jsmn.h new file mode 100644 index 00000000..95fb2cab --- /dev/null +++ b/src/contrib/jsmn/jsmn.h @@ -0,0 +1,75 @@ +#ifndef __JSMN_H_ +#define __JSMN_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * JSON type identifier. Basic types are: + * o Object + * o Array + * o String + * o Other primitive: number, boolean (true/false) or null + */ +typedef enum { + JSMN_PRIMITIVE = 0, + JSMN_OBJECT = 1, + JSMN_ARRAY = 2, + JSMN_STRING = 3 +} jsmntype_t; + +typedef enum { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 +} jsmnerr_t; + +/** + * JSON token description. + * @param type type (object, array, string etc.) + * @param start start position in JSON data string + * @param end end position in JSON data string + */ +typedef struct { + jsmntype_t type; + int start; + int end; + int size; +#ifdef JSMN_PARENT_LINKS + int parent; +#endif +} jsmntok_t; + +/** + * JSON parser. Contains an array of token blocks available. Also stores + * the string being parsed now and current position in that string + */ +typedef struct { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g parent object or array */ +} jsmn_parser; + +/** + * Create JSON parser over an array of tokens + */ +void jsmn_init(jsmn_parser *parser); + +/** + * Run JSON parser. It parses a JSON data string into and array of tokens, each describing + * a single JSON object. + */ +jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens); + +#ifdef __cplusplus +} +#endif + +#endif /* __JSMN_H_ */ diff --git a/src/contrib/jsmn/jsmn_test.c b/src/contrib/jsmn/jsmn_test.c new file mode 100644 index 00000000..39688592 --- /dev/null +++ b/src/contrib/jsmn/jsmn_test.c @@ -0,0 +1,608 @@ +#include +#include +#include + +static int test_passed = 0; +static int test_failed = 0; + +/* Terminate current test with error */ +#define fail() return __LINE__ + +/* Successfull end of the test case */ +#define done() return 0 + +/* Check single condition */ +#define check(cond) do { if (!(cond)) fail(); } while (0) + +/* Test runner */ +static void test(int (*func)(void), const char *name) { + int r = func(); + if (r == 0) { + test_passed++; + } else { + test_failed++; + printf("FAILED: %s (at line %d)\n", name, r); + } +} + +#define TOKEN_EQ(t, tok_start, tok_end, tok_type) \ + ((t).start == tok_start \ + && (t).end == tok_end \ + && (t).type == (tok_type)) + +#define TOKEN_STRING(js, t, s) \ + (strncmp(js+(t).start, s, (t).end - (t).start) == 0 \ + && strlen(s) == (t).end - (t).start) + +#define TOKEN_PRINT(t) \ + printf("start: %d, end: %d, type: %d, size: %d\n", \ + (t).start, (t).end, (t).type, (t).size) + +#define JSMN_STRICT +#include "jsmn.c" + +int test_empty() { + const char *js; + int r; + jsmn_parser p; + jsmntok_t t[10]; + + js = "{}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), t, 10); + check(r >= 0); + check(t[0].type == JSMN_OBJECT); + check(t[0].start == 0 && t[0].end == 2); + + js = "[]"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), t, 10); + check(r >= 0); + check(t[0].type == JSMN_ARRAY); + check(t[0].start == 0 && t[0].end == 2); + + js = "{\"a\":[]}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), t, 10); + check(r >= 0); + check(t[0].type == JSMN_OBJECT && t[0].start == 0 && t[0].end == 8); + check(t[1].type == JSMN_STRING && t[1].start == 2 && t[1].end == 3); + check(t[2].type == JSMN_ARRAY && t[2].start == 5 && t[2].end == 7); + + js = "[{},{}]"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), t, 10); + check(r >= 0); + check(t[0].type == JSMN_ARRAY && t[0].start == 0 && t[0].end == 7); + check(t[1].type == JSMN_OBJECT && t[1].start == 1 && t[1].end == 3); + check(t[2].type == JSMN_OBJECT && t[2].start == 4 && t[2].end == 6); + return 0; +} + +int test_simple() { + const char *js; + int r; + jsmn_parser p; + jsmntok_t tokens[10]; + + js = "{\"a\": 0}"; + + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + check(TOKEN_EQ(tokens[0], 0, 8, JSMN_OBJECT)); + check(TOKEN_EQ(tokens[1], 2, 3, JSMN_STRING)); + check(TOKEN_EQ(tokens[2], 6, 7, JSMN_PRIMITIVE)); + + check(TOKEN_STRING(js, tokens[0], js)); + check(TOKEN_STRING(js, tokens[1], "a")); + check(TOKEN_STRING(js, tokens[2], "0")); + + jsmn_init(&p); + js = "[\"a\":{},\"b\":{}]"; + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + jsmn_init(&p); + js = "{\n \"Day\": 26,\n \"Month\": 9,\n \"Year\": 12\n }"; + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + return 0; +} + +int test_primitive() { +#ifndef JSMN_STRICT + int r; + jsmn_parser p; + jsmntok_t tok[10]; + const char *js; + js = "\"boolVar\" : true"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_PRIMITIVE); + check(TOKEN_STRING(js, tok[0], "boolVar")); + check(TOKEN_STRING(js, tok[1], "true")); + + js = "\"boolVar\" : false"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_PRIMITIVE); + check(TOKEN_STRING(js, tok[0], "boolVar")); + check(TOKEN_STRING(js, tok[1], "false")); + + js = "\"intVar\" : 12345"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_PRIMITIVE); + check(TOKEN_STRING(js, tok[0], "intVar")); + check(TOKEN_STRING(js, tok[1], "12345")); + + js = "\"floatVar\" : 12.345"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_PRIMITIVE); + check(TOKEN_STRING(js, tok[0], "floatVar")); + check(TOKEN_STRING(js, tok[1], "12.345")); + + js = "\"nullVar\" : null"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_PRIMITIVE); + check(TOKEN_STRING(js, tok[0], "nullVar")); + check(TOKEN_STRING(js, tok[1], "null")); +#endif + return 0; +} + +int test_string() { + int r; + jsmn_parser p; + jsmntok_t tok[10]; + const char *js; + + js = "\"strVar\" : \"hello world\""; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_STRING); + check(TOKEN_STRING(js, tok[0], "strVar")); + check(TOKEN_STRING(js, tok[1], "hello world")); + + js = "\"strVar\" : \"escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\\""; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_STRING); + check(TOKEN_STRING(js, tok[0], "strVar")); + check(TOKEN_STRING(js, tok[1], "escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\")); + + js = "\"strVar\" : \"\""; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_STRING); + check(TOKEN_STRING(js, tok[0], "strVar")); + check(TOKEN_STRING(js, tok[1], "")); + + return 0; +} + +int test_partial_string() { + int r; + jsmn_parser p; + jsmntok_t tok[10]; + const char *js; + + jsmn_init(&p); + js = "\"x\": \"va"; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r == JSMN_ERROR_PART && tok[0].type == JSMN_STRING); + check(TOKEN_STRING(js, tok[0], "x")); + check(p.toknext == 1); + + jsmn_init(&p); + char js_slash[9] = "\"x\": \"va\\"; + r = jsmn_parse(&p, js_slash, sizeof(js_slash), tok, 10); + check(r == JSMN_ERROR_PART); + + jsmn_init(&p); + char js_unicode[10] = "\"x\": \"va\\u"; + r = jsmn_parse(&p, js_unicode, sizeof(js_unicode), tok, 10); + check(r == JSMN_ERROR_PART); + + js = "\"x\": \"valu"; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r == JSMN_ERROR_PART && tok[0].type == JSMN_STRING); + check(TOKEN_STRING(js, tok[0], "x")); + check(p.toknext == 1); + + js = "\"x\": \"value\""; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_STRING); + check(TOKEN_STRING(js, tok[0], "x")); + check(TOKEN_STRING(js, tok[1], "value")); + + js = "\"x\": \"value\", \"y\": \"value y\""; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_STRING + && tok[1].type == JSMN_STRING && tok[2].type == JSMN_STRING + && tok[3].type == JSMN_STRING); + check(TOKEN_STRING(js, tok[0], "x")); + check(TOKEN_STRING(js, tok[1], "value")); + check(TOKEN_STRING(js, tok[2], "y")); + check(TOKEN_STRING(js, tok[3], "value y")); + + return 0; +} + +int test_unquoted_keys() { +#ifndef JSMN_STRICT + int r; + jsmn_parser p; + jsmntok_t tok[10]; + const char *js; + + jsmn_init(&p); + js = "key1: \"value\"\nkey2 : 123"; + + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_PRIMITIVE + && tok[1].type == JSMN_STRING && tok[2].type == JSMN_PRIMITIVE + && tok[3].type == JSMN_PRIMITIVE); + check(TOKEN_STRING(js, tok[0], "key1")); + check(TOKEN_STRING(js, tok[1], "value")); + check(TOKEN_STRING(js, tok[2], "key2")); + check(TOKEN_STRING(js, tok[3], "123")); +#endif + return 0; +} + +int test_partial_array() { + int r; + jsmn_parser p; + jsmntok_t tok[10]; + const char *js; + + jsmn_init(&p); + js = " [ 1, true, "; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r == JSMN_ERROR_PART && tok[0].type == JSMN_ARRAY + && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE); + + js = " [ 1, true, [123, \"hello"; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r == JSMN_ERROR_PART && tok[0].type == JSMN_ARRAY + && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE + && tok[3].type == JSMN_ARRAY && tok[4].type == JSMN_PRIMITIVE); + + js = " [ 1, true, [123, \"hello\"]"; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r == JSMN_ERROR_PART && tok[0].type == JSMN_ARRAY + && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE + && tok[3].type == JSMN_ARRAY && tok[4].type == JSMN_PRIMITIVE + && tok[5].type == JSMN_STRING); + /* check child nodes of the 2nd array */ + check(tok[3].size == 2); + + js = " [ 1, true, [123, \"hello\"]]"; + r = jsmn_parse(&p, js, strlen(js), tok, 10); + check(r >= 0 && tok[0].type == JSMN_ARRAY + && tok[1].type == JSMN_PRIMITIVE && tok[2].type == JSMN_PRIMITIVE + && tok[3].type == JSMN_ARRAY && tok[4].type == JSMN_PRIMITIVE + && tok[5].type == JSMN_STRING); + check(tok[3].size == 2); + check(tok[0].size == 3); + return 0; +} + +int test_array_nomem() { + int i; + int r; + jsmn_parser p; + jsmntok_t toksmall[10], toklarge[10]; + const char *js; + + js = " [ 1, true, [123, \"hello\"]]"; + + for (i = 0; i < 6; i++) { + jsmn_init(&p); + memset(toksmall, 0, sizeof(toksmall)); + memset(toklarge, 0, sizeof(toklarge)); + r = jsmn_parse(&p, js, strlen(js), toksmall, i); + check(r == JSMN_ERROR_NOMEM); + + memcpy(toklarge, toksmall, sizeof(toksmall)); + + r = jsmn_parse(&p, js, strlen(js), toklarge, 10); + check(r >= 0); + + check(toklarge[0].type == JSMN_ARRAY && toklarge[0].size == 3); + check(toklarge[3].type == JSMN_ARRAY && toklarge[3].size == 2); + } + return 0; +} + +int test_objects_arrays() { + int r; + jsmn_parser p; + jsmntok_t tokens[10]; + const char *js; + + js = "[10}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "[10]"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + js = "{\"a\": 1]"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "{\"a\": 1}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + return 0; +} + +int test_issue_22() { + int r; + jsmn_parser p; + jsmntok_t tokens[128]; + const char *js; + + js = "{ \"height\":10, \"layers\":[ { \"data\":[6,6], \"height\":10, " + "\"name\":\"Calque de Tile 1\", \"opacity\":1, \"type\":\"tilelayer\", " + "\"visible\":true, \"width\":10, \"x\":0, \"y\":0 }], " + "\"orientation\":\"orthogonal\", \"properties\": { }, \"tileheight\":32, " + "\"tilesets\":[ { \"firstgid\":1, \"image\":\"..\\/images\\/tiles.png\", " + "\"imageheight\":64, \"imagewidth\":160, \"margin\":0, \"name\":\"Tiles\", " + "\"properties\":{}, \"spacing\":0, \"tileheight\":32, \"tilewidth\":32 }], " + "\"tilewidth\":32, \"version\":1, \"width\":10 }"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 128); + check(r >= 0); +#if 0 + for (i = 1; tokens[i].end < tokens[0].end; i++) { + if (tokens[i].type == JSMN_STRING || tokens[i].type == JSMN_PRIMITIVE) { + printf("%.*s\n", tokens[i].end - tokens[i].start, js + tokens[i].start); + } else if (tokens[i].type == JSMN_ARRAY) { + printf("[%d elems]\n", tokens[i].size); + } else if (tokens[i].type == JSMN_OBJECT) { + printf("{%d elems}\n", tokens[i].size); + } else { + TOKEN_PRINT(tokens[i]); + } + } +#endif + return 0; +} + +int test_unicode_characters() { + jsmn_parser p; + jsmntok_t tokens[10]; + const char *js; + + int r; + js = "{\"a\":\"\\uAbcD\"}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + js = "{\"a\":\"str\\u0000\"}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + js = "{\"a\":\"\\uFFFFstr\"}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + js = "{\"a\":\"str\\uFFGFstr\"}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "{\"a\":\"str\\u@FfF\"}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "{\"a\":[\"\\u028\"]}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "{\"a\":[\"\\u0280\"]}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r >= 0); + + return 0; +} + +int test_input_length() { + const char *js; + int r; + jsmn_parser p; + jsmntok_t tokens[10]; + + js = "{\"a\": 0}garbage"; + + jsmn_init(&p); + r = jsmn_parse(&p, js, 8, tokens, 10); + check(r == 3); + check(TOKEN_STRING(js, tokens[0], "{\"a\": 0}")); + check(TOKEN_STRING(js, tokens[1], "a")); + check(TOKEN_STRING(js, tokens[2], "0")); + + return 0; +} + +int test_count() { + jsmn_parser p; + const char *js; + + js = "{}"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1); + + js = "[]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1); + + js = "[[]]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 2); + + js = "[[], []]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3); + + js = "[[], []]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3); + + js = "[[], [[]], [[], []]]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7); + + js = "[\"a\", [[], []]]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5); + + js = "[[], \"[], [[]]\", [[]]]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5); + + js = "[1, 2, 3]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 4); + + js = "[1, 2, [3, \"a\"], null]"; + jsmn_init(&p); + check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7); + + return 0; +} + +int test_keyvalue() { + const char *js; + int r; + jsmn_parser p; + jsmntok_t tokens[10]; + + js = "{\"a\": 0, \"b\": \"c\"}"; + + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == 5); + check(tokens[0].size == 2); /* two keys */ + check(tokens[1].size == 1 && tokens[3].size == 1); /* one value per key */ + check(tokens[2].size == 0 && tokens[4].size == 0); /* values have zero size */ + + js = "{\"a\"\n0}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "{\"a\", 0}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "{\"a\": {2}}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + js = "{\"a\": {2: 3}}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + + + js = "{\"a\": {\"a\": 2 3}}"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == JSMN_ERROR_INVAL); + return 0; +} + +/** A huge redefinition of everything to include jsmn in non-script mode */ +#define jsmn_init jsmn_init_nonstrict +#define jsmn_parse jsmn_parse_nonstrict +#define jsmn_parser jsmn_parser_nonstrict +#define jsmn_alloc_token jsmn_alloc_token_nonstrict +#define jsmn_fill_token jsmn_fill_token_nonstrict +#define jsmn_parse_primitive jsmn_parse_primitive_nonstrict +#define jsmn_parse_string jsmn_parse_string_nonstrict +#define jsmntype_t jsmntype_nonstrict_t +#define jsmnerr_t jsmnerr_nonstrict_t +#define jsmntok_t jsmntok_nonstrict_t +#define JSMN_PRIMITIVE JSMN_PRIMITIVE_NONSTRICT +#define JSMN_OBJECT JSMN_OBJECT_NONSTRICT +#define JSMN_ARRAY JSMN_ARRAY_NONSTRICT +#define JSMN_STRING JSMN_STRING_NONSTRICT +#define JSMN_ERROR_NOMEM JSMN_ERROR_NOMEM_NONSTRICT +#define JSMN_ERROR_INVAL JSMN_ERROR_INVAL_NONSTRICT +#define JSMN_ERROR_PART JSMN_ERROR_PART_NONSTRICT +#undef __JSMN_H_ +#undef JSMN_STRICT +#include "jsmn.c" + +int test_nonstrict() { + const char *js; + int r; + jsmn_parser p; + jsmntok_t tokens[10]; + + js = "a: 0garbage"; + + jsmn_init(&p); + r = jsmn_parse(&p, js, 4, tokens, 10); + check(r == 2); + check(TOKEN_STRING(js, tokens[0], "a")); + check(TOKEN_STRING(js, tokens[1], "0")); + + js = "Day : 26\nMonth : Sep\n\nYear: 12"; + jsmn_init(&p); + r = jsmn_parse(&p, js, strlen(js), tokens, 10); + check(r == 6); + return 0; +} + +int main() { + test(test_empty, "general test for a empty JSON objects/arrays"); + test(test_simple, "general test for a simple JSON string"); + test(test_primitive, "test primitive JSON data types"); + test(test_string, "test string JSON data types"); + test(test_partial_string, "test partial JSON string parsing"); + test(test_partial_array, "test partial array reading"); + test(test_array_nomem, "test array reading with a smaller number of tokens"); + test(test_unquoted_keys, "test unquoted keys (like in JavaScript)"); + test(test_objects_arrays, "test objects and arrays"); + test(test_unicode_characters, "test unicode characters"); + test(test_input_length, "test strings that are not null-terminated"); + test(test_issue_22, "test issue #22"); + test(test_count, "test tokens count estimation"); + test(test_nonstrict, "test for non-strict mode"); + test(test_keyvalue, "test for keys/values"); + printf("\nPASSED: %d\nFAILED: %d\n", test_passed, test_failed); + return 0; +} +