Hex Artifact Content

Artifact 28dc982541266838f1de352d94ff45e4756a80b2:


0000: 23 20 6a 73 6f 6e 63 2e 74 63 6c 20 2d 2d 0a 23  # jsonc.tcl --.#
0010: 0a 23 20 20 20 20 20 20 20 49 6d 70 6c 65 6d 65  .#       Impleme
0020: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 4a 53 4f  ntation of a JSO
0030: 4e 20 70 61 72 73 65 72 20 69 6e 20 43 2e 0a 23  N parser in C..#
0040: 09 42 69 6e 64 69 6e 67 20 74 6f 20 61 20 79 61  .Binding to a ya
0050: 63 63 2f 62 69 73 6f 6e 20 70 61 72 73 65 72 20  cc/bison parser 
0060: 62 79 20 4d 69 6b 68 61 69 6c 2e 0a 23 0a 23 20  by Mikhail..#.# 
0070: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0080: 31 33 20 2d 20 63 72 69 74 63 6c 20 77 72 61 70  13 - critcl wrap
0090: 70 65 72 20 2d 20 41 6e 64 72 65 61 73 20 4b 75  per - Andreas Ku
00a0: 70 72 69 65 73 20 3c 61 6e 64 72 65 61 73 5f 6b  pries <andreas_k
00b0: 75 70 72 69 65 73 40 75 73 65 72 73 2e 73 6f 75  upries@users.sou
00c0: 72 63 65 66 6f 72 67 65 2e 6e 65 74 3e 0a 23 20  rceforge.net>.# 
00d0: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
00e0: 31 33 20 2d 20 43 20 62 69 6e 64 69 6e 67 20 20  13 - C binding  
00f0: 20 20 20 20 2d 20 6d 69 2b 74 63 6c 2e 74 6b 2d      - mi+tcl.tk-
0100: 32 30 31 33 40 61 6c 64 61 6e 2e 61 6c 67 65 62  2013@aldan.algeb
0110: 72 61 2e 63 6f 6d 0a 0a 70 61 63 6b 61 67 65 20  ra.com..package 
0120: 72 65 71 75 69 72 65 20 63 72 69 74 63 6c 0a 23  require critcl.#
0130: 20 40 73 61 6b 20 6e 6f 74 70 72 6f 76 69 64 65   @sak notprovide
0140: 64 20 6a 73 6f 6e 63 0a 70 61 63 6b 61 67 65 20  d jsonc.package 
0150: 70 72 6f 76 69 64 65 20 6a 73 6f 6e 63 20 31 2e  provide jsonc 1.
0160: 31 2e 31 0a 70 61 63 6b 61 67 65 20 72 65 71 75  1.1.package requ
0170: 69 72 65 20 54 63 6c 20 38 2e 34 0a 0a 23 63 72  ire Tcl 8.4..#cr
0180: 69 74 63 6c 3a 3a 63 68 65 61 64 65 72 73 20 2d  itcl::cheaders -
0190: 67 0a 23 63 72 69 74 63 6c 3a 3a 64 65 62 75 67  g.#critcl::debug
01a0: 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 0a   memory symbols.
01b0: 63 72 69 74 63 6c 3a 3a 63 68 65 61 64 65 72 73  critcl::cheaders
01c0: 20 2d 49 63 20 63 2f 2a 2e 68 0a 63 72 69 74 63   -Ic c/*.h.critc
01d0: 6c 3a 3a 63 73 6f 75 72 63 65 73 20 63 2f 2a 2e  l::csources c/*.
01e0: 63 0a 0a 23 20 23 20 23 23 20 23 23 23 20 49 6d  c..# # ## ### Im
01f0: 70 6f 72 74 20 62 61 73 65 20 64 65 63 6c 61 72  port base declar
0200: 61 74 69 6f 6e 73 2c 20 66 6f 72 77 61 72 64 73  ations, forwards
0210: 20 23 23 23 20 23 23 20 23 20 23 0a 0a 63 72 69   ### ## # #..cri
0220: 74 63 6c 3a 3a 63 63 6f 64 65 20 7b 0a 20 20 20  tcl::ccode {.   
0230: 20 23 69 6e 63 6c 75 64 65 20 3c 6a 73 6f 6e 5f   #include <json_
0240: 79 2e 68 3e 0a 7d 0a 0a 23 20 23 20 23 23 20 23  y.h>.}..# # ## #
0250: 23 23 20 4d 61 69 6e 20 43 6f 6e 76 65 72 73 69  ## Main Conversi
0260: 6f 6e 20 23 23 23 20 23 23 20 23 20 23 0a 0a 6e  on ### ## # #..n
0270: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a  amespace eval ::
0280: 6a 73 6f 6e 20 7b 0a 20 20 20 20 63 72 69 74 63  json {.    critc
0290: 6c 3a 3a 63 63 6f 6d 6d 61 6e 64 20 6a 73 6f 6e  l::ccommand json
02a0: 32 64 69 63 74 5f 63 72 69 74 63 6c 20 7b 64 75  2dict_critcl {du
02b0: 6d 6d 79 20 49 20 6f 62 6a 63 20 6f 62 6a 76 7d  mmy I objc objv}
02c0: 20 7b 0a 09 73 74 72 75 63 74 20 63 6f 6e 74 65   {..struct conte
02d0: 78 74 20 63 6f 6e 74 65 78 74 20 3d 20 7b 20 4e  xt context = { N
02e0: 55 4c 4c 20 7d 3b 0a 0a 09 69 66 20 28 6f 62 6a  ULL };...if (obj
02f0: 63 20 21 3d 20 32 29 20 7b 0a 09 20 20 20 20 54  c != 2) {..    T
0300: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
0310: 49 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6a 73 6f  I, 1, objv, "jso
0320: 6e 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  n");..    return
0330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
0340: 09 63 6f 6e 74 65 78 74 2e 74 65 78 74 20 20 20  .context.text   
0350: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
0360: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
0370: 26 63 6f 6e 74 65 78 74 2e 72 65 6d 61 69 6e 69  &context.remaini
0380: 6e 67 29 3b 0a 09 63 6f 6e 74 65 78 74 2e 49 20  ng);..context.I 
0390: 20 20 20 20 20 3d 20 49 3b 0a 09 63 6f 6e 74 65       = I;..conte
03a0: 78 74 2e 68 61 73 5f 65 72 72 6f 72 20 3d 20 30  xt.has_error = 0
03b0: 3b 0a 09 63 6f 6e 74 65 78 74 2e 72 65 73 75 6c  ;..context.resul
03c0: 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  t = TCL_ERROR;..
03d0: 09 6a 73 6f 6e 70 61 72 73 65 20 28 26 63 6f 6e  .jsonparse (&con
03e0: 74 65 78 74 29 3b 0a 09 72 65 74 75 72 6e 20 63  text);..return c
03f0: 6f 6e 74 65 78 74 2e 72 65 73 75 6c 74 3b 0a 20  ontext.result;. 
0400: 20 20 20 7d 0a 0a 20 20 20 20 23 20 49 73 73 75     }..    # Issu
0410: 65 20 77 69 74 68 20 63 72 69 74 63 6c 20 32 20  e with critcl 2 
0420: 75 73 65 64 20 68 65 72 65 2e 20 43 61 6e 6e 6f  used here. Canno
0430: 74 20 75 73 65 20 27 2d 27 2c 20 69 6e 63 6f 6d  t use '-', incom
0440: 70 6c 65 74 65 20 64 69 73 74 69 6e 63 74 69 6f  plete distinctio
0450: 6e 20 6f 66 20 43 20 61 6e 64 20 54 63 6c 20 6e  n of C and Tcl n
0460: 61 6d 65 73 2e 0a 20 20 20 20 23 20 54 68 65 20  ames..    # The 
0470: 6a 73 6f 6e 2e 74 63 6c 20 66 69 6c 65 20 6d 61  json.tcl file ma
0480: 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 69 73  king use of this
0490: 20 63 6f 64 65 20 68 61 73 20 61 20 77 72 61 70   code has a wrap
04a0: 70 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 69  per fixing the i
04b0: 73 73 75 65 2e 0a 20 20 20 20 63 72 69 74 63 6c  ssue..    critcl
04c0: 3a 3a 63 63 6f 6d 6d 61 6e 64 20 6d 61 6e 79 5f  ::ccommand many_
04d0: 6a 73 6f 6e 32 64 69 63 74 5f 63 72 69 74 63 6c  json2dict_critcl
04e0: 20 7b 64 75 6d 6d 79 20 49 20 6f 62 6a 63 20 6f   {dummy I objc o
04f0: 62 6a 76 7d 20 7b 0a 09 73 74 72 75 63 74 20 63  bjv} {..struct c
0500: 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 20 3d  ontext context =
0510: 20 7b 20 4e 55 4c 4c 20 7d 3b 0a 0a 09 69 6e 74   { NULL };...int
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0530: 20 20 20 20 20 20 6d 61 78 3b 0a 09 69 6e 74 20        max;..int 
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0550: 20 20 20 20 20 66 6f 75 6e 64 3b 0a 0a 09 54 63       found;...Tc
0560: 6c 5f 4f 62 6a 2a 20 72 65 73 75 6c 74 20 3d 20  l_Obj* result = 
0570: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 20 28  Tcl_NewListObj (
0580: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  0, NULL);...if (
0590: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f  (objc < 2) || (o
05a0: 62 6a 63 20 3e 20 33 29 29 20 7b 0a 09 20 20 20  bjc > 3)) {..   
05b0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
05c0: 73 28 49 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6a  s(I, 1, objv, "j
05d0: 73 6f 6e 54 65 78 74 20 3f 6d 61 78 3f 22 29 3b  sonText ?max?");
05e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
05f0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 69 66 20  _ERROR;..}...if 
0600: 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 20  (objc == 3) {.. 
0610: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
0620: 74 46 72 6f 6d 4f 62 6a 28 49 2c 20 6f 62 6a 76  tFromObj(I, objv
0630: 5b 32 5d 2c 20 26 6d 61 78 29 20 21 3d 20 54 43  [2], &max) != TC
0640: 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
0650: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
0660: 20 7d 0a 09 20 20 20 20 69 66 20 28 6d 61 78 20   }..    if (max 
0670: 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 41 70  <= 0) {...Tcl_Ap
0680: 70 65 6e 64 52 65 73 75 6c 74 20 28 49 2c 20 22  pendResult (I, "
0690: 42 61 64 20 6c 69 6d 69 74 20 22 2c 0a 09 09 09  Bad limit ",....
06a0: 09 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  .  Tcl_GetString
06b0: 20 28 6f 62 6a 76 5b 32 5d 29 2c 0a 09 09 09 09   (objv[2]),.....
06c0: 20 20 22 20 6f 66 20 6a 73 6f 6e 20 65 6e 74 69    " of json enti
06d0: 74 69 65 73 20 74 6f 20 65 78 74 72 61 63 74 2e  ties to extract.
06e0: 22 2c 0a 09 09 09 09 20 20 4e 55 4c 4c 29 3b 0a  ",.....  NULL);.
06f0: 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
0700: 64 65 20 28 49 2c 20 22 4a 53 4f 4e 22 2c 20 22  de (I, "JSON", "
0710: 42 41 44 2d 4c 49 4d 49 54 22 2c 20 4e 55 4c 4c  BAD-LIMIT", NULL
0720: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
0730: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09  ERROR;..    }...
0740: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 61  } else {..    ma
0750: 78 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 63 6f 6e  x = -1;..}...con
0760: 74 65 78 74 2e 74 65 78 74 20 20 20 3d 20 54 63  text.text   = Tc
0770: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
0780: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 63 6f 6e  bj(objv[1], &con
0790: 74 65 78 74 2e 72 65 6d 61 69 6e 69 6e 67 29 3b  text.remaining);
07a0: 0a 09 63 6f 6e 74 65 78 74 2e 49 20 20 20 20 20  ..context.I     
07b0: 20 3d 20 49 3b 0a 09 63 6f 6e 74 65 78 74 2e 68   = I;..context.h
07c0: 61 73 5f 65 72 72 6f 72 20 3d 20 30 3b 0a 09 66  as_error = 0;..f
07d0: 6f 75 6e 64 20 20 3d 20 30 3b 0a 0a 09 2f 2a 20  ound  = 0;.../* 
07e0: 49 74 65 72 61 74 65 20 6f 76 65 72 20 74 68 65  Iterate over the
07f0: 20 69 6e 70 75 74 20 75 6e 74 69 6c 0a 09 20 2a   input until.. *
0800: 20 2d 20 77 65 20 68 61 76 65 20 67 6f 74 74 65   - we have gotte
0810: 6e 20 61 6c 6c 20 72 65 71 75 65 73 74 65 64 20  n all requested 
0820: 76 61 6c 75 65 73 2e 0a 09 20 2a 20 2d 20 77 65  values... * - we
0830: 20 68 61 76 65 20 72 75 6e 20 6f 75 74 20 6f 66   have run out of
0840: 20 69 6e 70 75 74 0a 09 20 2a 20 2d 20 77 65 20   input.. * - we 
0850: 68 61 76 65 20 72 75 6e 20 69 6e 74 6f 20 61 6e  have run into an
0860: 20 65 72 72 6f 72 0a 09 20 2a 2f 0a 0a 09 77 68   error.. */...wh
0870: 69 6c 65 20 28 28 6d 61 78 20 3c 20 30 29 20 7c  ile ((max < 0) |
0880: 7c 20 6d 61 78 29 20 7b 0a 09 20 20 20 20 63 6f  | max) {..    co
0890: 6e 74 65 78 74 2e 72 65 73 75 6c 74 20 3d 20 54  ntext.result = T
08a0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 6a  CL_ERROR;..    j
08b0: 73 6f 6e 70 61 72 73 65 20 28 26 63 6f 6e 74 65  sonparse (&conte
08c0: 78 74 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 70 61  xt);...    /* pa
08d0: 72 73 65 20 65 72 72 6f 72 2c 20 61 62 6f 72 74  rse error, abort
08e0: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 63 6f 6e   */..    if (con
08f0: 74 65 78 74 2e 72 65 73 75 6c 74 20 21 3d 20 54  text.result != T
0900: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c 5f 44  CL_OK) {...Tcl_D
0910: 65 63 72 52 65 66 43 6f 75 6e 74 20 28 72 65 73  ecrRefCount (res
0920: 75 6c 74 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ult);...return T
0930: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
0940: 0a 0a 09 20 20 20 20 2f 2a 20 50 72 6f 70 65 72  ...    /* Proper
0950: 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   value extracted
0960: 2c 20 65 78 74 65 6e 64 20 72 65 73 75 6c 74 20  , extend result 
0970: 2a 2f 0a 09 20 20 20 20 66 6f 75 6e 64 20 2b 2b  */..    found ++
0980: 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
0990: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
09a0: 49 2c 20 72 65 73 75 6c 74 2c 0a 09 09 09 09 20  I, result,..... 
09b0: 20 20 20 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65      Tcl_GetObjRe
09c0: 73 75 6c 74 20 28 49 29 29 3b 0a 0a 09 20 20 20  sult (I));...   
09d0: 20 2f 2a 20 43 6f 75 6e 74 20 64 6f 77 6e 20 6f   /* Count down o
09e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
09f0: 73 74 69 6c 6c 20 6d 69 73 73 69 6e 67 0a 09 20  still missing.. 
0a00: 20 20 20 20 2a 20 76 61 6c 75 65 73 2c 20 69 66      * values, if
0a10: 20 6e 6f 74 20 61 73 6b 69 6e 67 20 66 6f 72 20   not asking for 
0a20: 61 6c 6c 20 28 2d 31 29 0a 09 20 20 20 20 20 2a  all (-1)..     *
0a30: 2f 0a 09 20 20 20 20 69 66 20 28 6d 61 78 20 3e  /..    if (max >
0a40: 20 30 29 20 6d 61 78 20 2d 2d 3b 0a 0a 09 20 20   0) max --;...  
0a50: 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
0a60: 72 61 69 6c 69 6e 67 20 77 68 69 74 65 73 70 61  railing whitespa
0a70: 63 65 20 66 6f 72 20 70 72 6f 70 65 72 20 65 6e  ce for proper en
0a80: 64 2d 64 65 74 65 63 74 69 6f 6e 20 2a 2f 0a 09  d-detection */..
0a90: 20 20 20 20 6a 73 6f 6e 73 6b 69 70 20 28 26 63      jsonskip (&c
0aa0: 6f 6e 74 65 78 74 29 3b 0a 0a 09 20 20 20 20 2f  ontext);...    /
0ab0: 2a 20 41 62 6f 72 74 20 69 66 20 77 65 20 68 61  * Abort if we ha
0ac0: 76 65 20 63 6f 6e 73 75 6d 65 64 20 61 6c 6c 20  ve consumed all 
0ad0: 69 6e 70 75 74 20 2a 2f 0a 09 20 20 20 20 69 66  input */..    if
0ae0: 20 28 21 63 6f 6e 74 65 78 74 2e 72 65 6d 61 69   (!context.remai
0af0: 6e 69 6e 67 29 20 62 72 65 61 6b 3b 0a 0a 09 20  ning) break;... 
0b00: 20 20 20 2f 2a 20 43 6c 65 61 72 20 73 63 72 61     /* Clear scra
0b10: 74 63 68 20 70 61 64 20 62 65 66 6f 72 65 20 63  tch pad before c
0b20: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 09 20 20  ontinuing */..  
0b30: 20 20 63 6f 6e 74 65 78 74 2e 6f 62 6a 20 3d 20    context.obj = 
0b40: 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 68  NULL;..}.../* Wh
0b50: 69 6c 65 20 61 6c 6c 20 70 61 72 73 65 73 20 77  ile all parses w
0b60: 65 72 65 20 6f 6b 20 77 65 20 72 65 61 63 68 65  ere ok we reache
0b70: 64 20 65 6e 64 20 6f 66 0a 09 20 2a 20 69 6e 70  d end of.. * inp
0b80: 75 74 20 77 69 74 68 6f 75 74 20 67 65 74 74 69  ut without getti
0b90: 6e 67 20 61 6c 6c 20 72 65 71 75 65 73 74 65 64  ng all requested
0ba0: 20 76 61 6c 75 65 73 2c 0a 09 20 2a 20 74 68 69   values,.. * thi
0bb0: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 0a 09 20  s is an error.. 
0bc0: 2a 2f 0a 09 69 66 20 28 6d 61 78 20 3e 20 30 29  */..if (max > 0)
0bd0: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 62 75 66   {..    char buf
0be0: 20 5b 33 30 5d 3b 0a 09 20 20 20 20 73 70 72 69   [30];..    spri
0bf0: 6e 74 66 20 28 62 75 66 2c 20 22 25 64 22 2c 20  ntf (buf, "%d", 
0c00: 66 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  found);.        
0c10: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0c20: 75 6c 74 20 28 49 29 3b 0a 09 20 20 20 20 54 63  ult (I);..    Tc
0c30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 20 28  l_AppendResult (
0c40: 49 2c 20 22 42 61 64 20 6c 69 6d 69 74 20 22 2c  I, "Bad limit ",
0c50: 0a 09 09 09 20 20 20 20 20 20 54 63 6c 5f 47 65  ....      Tcl_Ge
0c60: 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 32 5d  tString (objv[2]
0c70: 29 2c 0a 09 09 09 20 20 20 20 20 20 22 20 6f 66  ),....      " of
0c80: 20 6a 73 6f 6e 20 65 6e 74 69 74 69 65 73 20 74   json entities t
0c90: 6f 20 65 78 74 72 61 63 74 2c 20 66 6f 75 6e 64  o extract, found
0ca0: 20 6f 6e 6c 79 20 22 2c 0a 09 09 09 20 20 20 20   only ",....    
0cb0: 20 20 62 75 66 2c 0a 09 09 09 20 20 20 20 20 20    buf,....      
0cc0: 22 2e 22 2c 0a 09 09 09 20 20 20 20 20 20 4e 55  ".",....      NU
0cd0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
0ce0: 74 45 72 72 6f 72 43 6f 64 65 20 28 49 2c 20 22  tErrorCode (I, "
0cf0: 4a 53 4f 4e 22 2c 20 22 42 41 44 2d 4c 49 4d 49  JSON", "BAD-LIMI
0d00: 54 22 2c 20 22 54 4f 4f 22 2c 20 22 4c 41 52 47  T", "TOO", "LARG
0d10: 45 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  E", NULL);..    
0d20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
0d30: 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20 20 20   (result);..    
0d40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0d50: 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 65 20 61 72 65  ;..}.../* We are
0d60: 20 67 6f 6f 64 20 61 6e 64 20 64 6f 6e 65 20 2a   good and done *
0d70: 2f 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  /..Tcl_SetObjRes
0d80: 75 6c 74 28 49 2c 20 72 65 73 75 6c 74 29 3b 0a  ult(I, result);.
0d90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a  .return TCL_OK;.
0da0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 30 20      }..    if 0 
0db0: 7b 63 72 69 74 63 6c 3a 3a 63 63 6f 6d 6d 61 6e  {critcl::ccomman
0dc0: 64 20 76 61 6c 69 64 61 74 65 5f 63 72 69 74 63  d validate_critc
0dd0: 6c 20 7b 64 75 6d 6d 79 20 49 20 6f 62 6a 63 20  l {dummy I objc 
0de0: 6f 62 6a 76 7d 20 7b 0a 09 73 74 72 75 63 74 20  objv} {..struct 
0df0: 63 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 20  context context 
0e00: 3d 20 7b 20 4e 55 4c 4c 20 7d 3b 0a 0a 09 69 66  = { NULL };...if
0e10: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
0e20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
0e30: 41 72 67 73 28 49 2c 20 31 2c 20 6f 62 6a 76 2c  Args(I, 1, objv,
0e40: 20 22 6a 73 6f 6e 54 65 78 74 22 29 3b 0a 09 20   "jsonText");.. 
0e50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0e60: 52 4f 52 3b 0a 09 7d 0a 0a 09 63 6f 6e 74 65 78  ROR;..}...contex
0e70: 74 2e 74 65 78 74 20 20 20 3d 20 54 63 6c 5f 47  t.text   = Tcl_G
0e80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
0e90: 6f 62 6a 76 5b 31 5d 2c 20 26 63 6f 6e 74 65 78  objv[1], &contex
0ea0: 74 2e 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 63  t.remaining);..c
0eb0: 6f 6e 74 65 78 74 2e 49 20 20 20 20 20 20 3d 20  ontext.I      = 
0ec0: 49 3b 0a 09 63 6f 6e 74 65 78 74 2e 72 65 73 75  I;..context.resu
0ed0: 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  lt = TCL_ERROR;.
0ee0: 0a 09 2f 2a 20 49 74 65 72 61 74 65 20 6f 76 65  ../* Iterate ove
0ef0: 72 20 74 68 65 20 69 6e 70 75 74 20 75 6e 74 69  r the input unti
0f00: 6c 20 77 65 20 68 61 76 65 20 72 75 6e 0a 09 20  l we have run.. 
0f10: 2a 20 6f 75 74 20 6f 66 20 74 65 78 74 2c 20 6f  * out of text, o
0f20: 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  r encountered an
0f30: 20 65 72 72 6f 72 2e 20 57 65 0a 09 20 2a 20 75   error. We.. * u
0f40: 73 65 20 6f 6e 6c 79 20 74 68 65 20 6c 65 78 65  se only the lexe
0f50: 72 20 68 65 72 65 2c 20 61 6e 64 20 74 6f 6c 64  r here, and told
0f60: 20 69 74 20 74 6f 20 6e 6f 74 0a 09 2a 20 63 72   it to not..* cr
0f70: 65 61 74 65 20 73 75 70 65 72 66 6c 75 6f 75 73  eate superfluous
0f80: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 2e 0a 09   token values...
0f90: 20 2a 2f 0a 0a 09 77 68 69 6c 65 20 28 63 6f 6e   */...while (con
0fa0: 74 65 78 74 2e 72 65 6d 61 69 6e 69 6e 67 29 20  text.remaining) 
0fb0: 7b 0a 09 20 20 20 20 69 66 20 28 6a 73 6f 6e 6c  {..    if (jsonl
0fc0: 65 78 20 28 26 63 6f 6e 74 65 78 74 29 20 3d 3d  ex (&context) ==
0fd0: 20 2d 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74   -1) {...Tcl_Set
0fe0: 4f 62 6a 52 65 73 75 6c 74 28 49 2c 20 54 63 6c  ObjResult(I, Tcl
0ff0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 20 28  _NewBooleanObj (
1000: 30 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  0));...return TC
1010: 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  L_OK;..    }..}.
1020: 0a 09 2f 2a 20 57 65 20 61 72 65 20 67 6f 6f 64  ../* We are good
1030: 20 61 6e 64 20 64 6f 6e 65 20 2a 2f 0a 09 54 63   and done */..Tc
1040: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 49  l_SetObjResult(I
1050: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
1060: 4f 62 6a 20 28 31 29 29 3b 0a 09 72 65 74 75 72  Obj (1));..retur
1070: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 7d  n TCL_OK;.    }}
1080: 0a 7d 0a                                         .}.