Hex Artifact Content
Not logged in

Artifact ab0965236d5b1e8d6f0dae9156f5e5eaa9618fa0:


0000: 5c 20 4a 53 4f 4e 20 70 61 72 73 65 72 20 74 6f  \ JSON parser to
0010: 20 69 6d 70 6f 72 74 20 47 6f 6f 67 6c 65 2b 0a   import Google+.
0020: 0a 5c 20 43 6f 70 79 72 69 67 68 74 20 28 43 29  .\ Copyright (C)
0030: 20 32 30 31 38 20 20 20 42 65 72 6e 64 20 50 61   2018   Bernd Pa
0040: 79 73 61 6e 0a 0a 5c 20 54 68 69 73 20 70 72 6f  ysan..\ This pro
0050: 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66  gram is free sof
0060: 74 77 61 72 65 3a 20 79 6f 75 20 63 61 6e 20 72  tware: you can r
0070: 65 64 69 73 74 72 69 62 75 74 65 20 69 74 20 61  edistribute it a
0080: 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 0a 5c 20 69  nd/or modify.\ i
0090: 74 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d  t under the term
00a0: 73 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66  s of the GNU Aff
00b0: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  ero General Publ
00c0: 69 63 20 4c 69 63 65 6e 73 65 20 61 73 20 70 75  ic License as pu
00d0: 62 6c 69 73 68 65 64 20 62 79 0a 5c 20 74 68 65  blished by.\ the
00e0: 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46   Free Software F
00f0: 6f 75 6e 64 61 74 69 6f 6e 2c 20 65 69 74 68 65  oundation, eithe
0100: 72 20 76 65 72 73 69 6f 6e 20 33 20 6f 66 20 74  r version 3 of t
0110: 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f 72 0a 5c  he License, or.\
0120: 20 28 61 74 20 79 6f 75 72 20 6f 70 74 69 6f 6e   (at your option
0130: 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65 72 73  ) any later vers
0140: 69 6f 6e 2e 0a 0a 5c 20 54 68 69 73 20 70 72 6f  ion...\ This pro
0150: 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62 75  gram is distribu
0160: 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20  ted in the hope 
0170: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
0180: 75 73 65 66 75 6c 2c 0a 5c 20 62 75 74 20 57 49  useful,.\ but WI
0190: 54 48 4f 55 54 20 41 4e 59 20 57 41 52 52 41 4e  THOUT ANY WARRAN
01a0: 54 59 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e  TY; without even
01b0: 20 74 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72   the implied war
01c0: 72 61 6e 74 79 20 6f 66 0a 5c 20 4d 45 52 43 48  ranty of.\ MERCH
01d0: 41 4e 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49  ANTABILITY or FI
01e0: 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52 54  TNESS FOR A PART
01f0: 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20  ICULAR PURPOSE. 
0200: 20 53 65 65 20 74 68 65 0a 5c 20 47 4e 55 20 41   See the.\ GNU A
0210: 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75  ffero General Pu
0220: 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f 72  blic License for
0230: 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 0a   more details...
0240: 5c 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76  \ You should hav
0250: 65 20 72 65 63 65 69 76 65 64 20 61 20 63 6f 70  e received a cop
0260: 79 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66  y of the GNU Aff
0270: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  ero General Publ
0280: 69 63 20 4c 69 63 65 6e 73 65 0a 5c 20 61 6c 6f  ic License.\ alo
0290: 6e 67 20 77 69 74 68 20 74 68 69 73 20 70 72 6f  ng with this pro
02a0: 67 72 61 6d 2e 20 20 49 66 20 6e 6f 74 2c 20 73  gram.  If not, s
02b0: 65 65 20 3c 68 74 74 70 3a 2f 2f 77 77 77 2e 67  ee <http://www.g
02c0: 6e 75 2e 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f  nu.org/licenses/
02d0: 3e 2e 0a 0a 72 65 71 75 69 72 65 20 2e 2e 2f 74  >...require ../t
02e0: 6f 6f 6c 73 2e 66 73 0a 73 63 6f 70 65 3a 20 72  ools.fs.scope: r
02f0: 65 67 65 78 70 73 0a 72 65 71 75 69 72 65 20 72  egexps.require r
0300: 65 67 65 78 70 2e 66 73 0a 7d 73 63 6f 70 65 0a  egexp.fs.}scope.
0310: 0a 61 6c 73 6f 20 72 65 67 65 78 70 73 0a 43 68  .also regexps.Ch
0320: 61 72 63 6c 61 73 73 20 5b 62 6c 54 5d 20 62 6c  arclass [blT] bl
0330: 20 2b 63 68 61 72 20 27 54 27 20 2b 63 68 61 72   +char 'T' +char
0340: 0a 3a 20 69 73 6f 2d 3f 64 61 74 65 20 28 20 61  .: iso-?date ( a
0350: 64 64 72 20 75 20 2d 2d 20 66 6c 61 67 20 29 0a  ddr u -- flag ).
0360: 20 20 20 20 28 28 20 5c 28 20 5c 64 20 5c 64 20      (( \( \d \d 
0370: 5c 64 20 5c 64 20 5c 29 20 60 20 2d 20 5c 28 20  \d \d \) ` - \( 
0380: 5c 64 20 5c 64 20 5c 29 20 60 20 2d 20 5c 28 20  \d \d \) ` - \( 
0390: 5c 64 20 5c 64 20 5c 29 0a 20 20 20 20 7b 7b 20  \d \d \).    {{ 
03a0: 5b 62 6c 54 5d 20 63 3f 0a 20 20 20 20 5c 28 20  [blT] c?.    \( 
03b0: 5c 64 20 5c 64 20 5c 29 20 60 20 3a 20 5c 28 20  \d \d \) ` : \( 
03c0: 5c 64 20 5c 64 20 5c 29 20 60 20 3a 20 5c 28 20  \d \d \) ` : \( 
03d0: 5c 64 20 5c 64 20 5c 29 0a 20 20 20 20 7b 7b 20  \d \d \).    {{ 
03e0: 60 20 2e 20 5c 28 20 7b 2b 2b 20 5c 64 20 5c 64  ` . \( {++ \d \d
03f0: 20 5c 64 20 2b 2b 7d 20 5c 29 20 7c 7c 20 5c 28   \d ++} \) || \(
0400: 20 5c 29 20 7d 7d 0a 20 20 20 20 7b 7b 20 60 20   \) }}.    {{ ` 
0410: 5a 20 5c 28 20 5c 29 20 5c 28 20 5c 29 20 7c 7c  Z \( \) \( \) ||
0420: 0a 20 20 20 20 20 20 20 7b 7b 20 60 20 2b 20 5c  .       {{ ` + \
0430: 28 20 7c 7c 20 5c 28 20 60 20 2d 20 7d 7d 20 5c  ( || \( ` - }} \
0440: 64 20 5c 64 20 60 3f 20 3a 20 5c 64 20 5c 64 20  d \d `? : \d \d 
0450: 5c 29 0a 20 20 20 20 7d 7d 20 7c 7c 20 5c 28 20  \).    }} || \( 
0460: 5c 29 20 5c 28 20 5c 29 20 5c 28 20 5c 29 20 5c  \) \( \) \( \) \
0470: 28 20 5c 29 20 5c 28 20 5c 29 20 7d 7d 20 5c 24  ( \) \( \) }} \$
0480: 20 29 29 20 3b 0a 3a 20 69 73 6f 2d 64 61 74 65   )) ;.: iso-date
0490: 3e 74 69 63 6b 73 20 28 20 2d 2d 20 74 69 63 6b  >ticks ( -- tick
04a0: 73 20 29 0a 20 20 20 20 5c 31 20 73 3e 6e 75 6d  s ).    \1 s>num
04b0: 62 65 72 20 64 72 6f 70 20 5c 32 20 73 3e 6e 75  ber drop \2 s>nu
04c0: 6d 62 65 72 20 64 72 6f 70 20 5c 33 20 73 3e 6e  mber drop \3 s>n
04d0: 75 6d 62 65 72 20 64 72 6f 70 20 79 6d 64 32 64  umber drop ymd2d
04e0: 61 79 20 75 6e 69 78 2d 64 61 79 30 20 2d 0a 20  ay unix-day0 -. 
04f0: 20 20 20 23 32 34 20 2a 0a 20 20 20 20 5c 34 20     #24 *.    \4 
0500: 73 3e 6e 75 6d 62 65 72 20 64 72 6f 70 20 2b 20  s>number drop + 
0510: 23 36 30 20 2a 20 5c 35 20 73 3e 6e 75 6d 62 65  #60 * \5 s>numbe
0520: 72 20 64 72 6f 70 20 2b 0a 20 20 20 20 5c 38 20  r drop +.    \8 
0530: 32 20 75 6d 69 6e 20 73 3e 6e 75 6d 62 65 72 20  2 umin s>number 
0540: 64 72 6f 70 20 20 20 23 36 30 20 2a 0a 20 20 20  drop   #60 *.   
0550: 20 5c 38 20 64 75 70 20 32 20 2d 20 2f 73 74 72   \8 dup 2 - /str
0560: 69 6e 67 20 73 3e 75 6e 75 6d 62 65 72 3f 20 32  ing s>unumber? 2
0570: 64 72 6f 70 20 6f 76 65 72 20 30 3c 20 49 46 20  drop over 0< IF 
0580: 2d 20 45 4c 53 45 20 2b 20 54 48 45 4e 20 2d 0a  - ELSE + THEN -.
0590: 20 20 20 20 23 36 30 20 2a 20 5c 36 20 73 3e 6e      #60 * \6 s>n
05a0: 75 6d 62 65 72 20 64 72 6f 70 20 2b 0a 20 20 20  umber drop +.   
05b0: 20 23 31 30 30 30 30 30 30 30 30 30 20 75 6d 2a   #1000000000 um*
05c0: 0a 20 20 20 20 5c 37 20 73 3e 75 6e 75 6d 62 65  .    \7 s>unumbe
05d0: 72 3f 20 32 64 72 6f 70 0a 20 20 20 20 63 61 73  r? 2drop.    cas
05e0: 65 20 5c 37 20 6e 69 70 0a 09 33 20 6f 66 20 20  e \7 nip..3 of  
05f0: 23 31 30 30 30 30 30 30 20 75 6d 2a 20 20 65 6e  #1000000 um*  en
0600: 64 6f 66 0a 09 36 20 6f 66 20 20 23 31 30 30 30  dof..6 of  #1000
0610: 20 20 20 20 75 6d 2a 20 20 65 6e 64 6f 66 0a 09      um*  endof..
0620: 30 20 73 77 61 70 0a 20 20 20 20 65 6e 64 63 61  0 swap.    endca
0630: 73 65 20 20 64 2b 0a 20 20 20 20 64 3e 36 34 20  se  d+.    d>64 
0640: 3b 0a 70 72 65 76 69 6f 75 73 0a 0a 44 65 66 65  ;.previous..Defe
0650: 72 20 3f 64 61 74 65 0a 44 65 66 65 72 20 64 61  r ?date.Defer da
0660: 74 65 3e 74 69 63 6b 73 0a 0a 3a 20 69 73 6f 2d  te>ticks..: iso-
0670: 64 61 74 65 0a 20 20 20 20 5b 27 5d 20 69 73 6f  date.    ['] iso
0680: 2d 3f 64 61 74 65 20 69 73 20 3f 64 61 74 65 0a  -?date is ?date.
0690: 20 20 20 20 5b 27 5d 20 69 73 6f 2d 64 61 74 65      ['] iso-date
06a0: 3e 74 69 63 6b 73 20 69 73 20 64 61 74 65 3e 74  >ticks is date>t
06b0: 69 63 6b 73 20 3b 0a 0a 24 56 61 72 69 61 62 6c  icks ;..$Variabl
06c0: 65 20 6b 65 79 24 20 5c 20 6b 65 79 20 73 74 72  e key$ \ key str
06d0: 69 6e 67 0a 32 35 36 20 63 65 6c 6c 73 20 62 75  ing.256 cells bu
06e0: 66 66 65 72 3a 20 6a 73 6f 6e 2d 74 6f 6b 65 6e  ffer: json-token
06f0: 73 0a 35 20 73 74 61 63 6b 3a 20 6a 73 6f 6e 73  s.5 stack: jsons
0700: 2d 72 65 63 6f 67 6e 69 7a 65 72 0a 31 20 73 74  -recognizer.1 st
0710: 61 63 6b 3a 20 6a 73 6f 6e 2d 72 65 63 6f 67 6e  ack: json-recogn
0720: 69 7a 65 72 0a 0a 27 20 6e 6f 6f 70 20 27 20 6c  izer..' noop ' l
0730: 69 74 2c 20 64 75 70 20 72 65 63 74 79 70 65 3a  it, dup rectype:
0740: 20 72 65 63 74 79 70 65 2d 62 6f 6f 6c 0a 27 20   rectype-bool.' 
0750: 6e 6f 6f 70 20 27 20 6c 69 74 2c 20 64 75 70 20  noop ' lit, dup 
0760: 72 65 63 74 79 70 65 3a 20 72 65 63 74 79 70 65  rectype: rectype
0770: 2d 6e 69 6c 0a 0a 73 22 20 4a 53 4f 4e 20 65 72  -nil..s" JSON er
0780: 72 6f 72 22 20 65 78 63 65 70 74 69 6f 6e 20 56  ror" exception V
0790: 61 6c 75 65 20 6a 73 6f 6e 2d 74 68 72 6f 77 0a  alue json-throw.
07a0: 73 22 20 4a 53 4f 4e 20 6b 65 79 20 6e 6f 74 20  s" JSON key not 
07b0: 66 6f 75 6e 64 22 20 65 78 63 65 70 74 69 6f 6e  found" exception
07c0: 20 56 61 6c 75 65 20 6a 73 6f 6e 2d 6b 65 79 2d   Value json-key-
07d0: 74 68 72 6f 77 0a 73 22 20 4a 53 4f 4e 20 63 6c  throw.s" JSON cl
07e0: 61 73 73 20 6e 6f 74 20 66 6f 75 6e 64 22 20 65  ass not found" e
07f0: 78 63 65 70 74 69 6f 6e 20 56 61 6c 75 65 20 6a  xception Value j
0800: 73 6f 6e 2d 63 6c 61 73 73 2d 74 68 72 6f 77 0a  son-class-throw.
0810: 0a 3a 20 6a 73 6f 6e 2d 65 72 72 20 20 63 72 20  .: json-err  cr 
0820: 6f 72 64 65 72 20 6a 73 6f 6e 2d 74 68 72 6f 77  order json-throw
0830: 20 74 68 72 6f 77 20 3b 0a 0a 30 20 56 61 6c 75   throw ;..0 Valu
0840: 65 20 73 63 68 65 6d 61 2d 73 63 6f 70 65 0a 30  e schema-scope.0
0850: 20 56 61 6c 75 65 20 6f 75 74 65 72 2d 63 6c 61   Value outer-cla
0860: 73 73 0a 30 20 56 61 6c 75 65 20 73 63 68 65 6d  ss.0 Value schem
0870: 61 2d 77 69 64 0a 0a 44 65 66 65 72 20 70 72 6f  a-wid..Defer pro
0880: 63 65 73 73 2d 65 6c 65 6d 65 6e 74 20 20 27 20  cess-element  ' 
0890: 6e 6f 6f 70 20 69 73 20 70 72 6f 63 65 73 73 2d  noop is process-
08a0: 65 6c 65 6d 65 6e 74 0a 44 65 66 65 72 20 70 72  element.Defer pr
08b0: 6f 63 65 73 73 2d 65 6c 65 6d 65 6e 74 73 20 27  ocess-elements '
08c0: 20 6e 6f 6f 70 20 69 73 20 70 72 6f 63 65 73 73   noop is process
08d0: 2d 65 6c 65 6d 65 6e 74 73 0a 0a 72 65 71 75 69  -elements..requi
08e0: 72 65 20 67 2b 2d 73 63 68 65 6d 61 2e 66 73 0a  re g+-schema.fs.
08f0: 72 65 71 75 69 72 65 20 66 62 2d 73 63 68 65 6d  require fb-schem
0900: 61 2e 66 73 0a 72 65 71 75 69 72 65 20 74 77 69  a.fs.require twi
0910: 74 74 65 72 2d 73 63 68 65 6d 61 2e 66 73 0a 72  tter-schema.fs.r
0920: 65 71 75 69 72 65 20 64 69 61 73 70 6f 72 61 2d  equire diaspora-
0930: 73 63 68 65 6d 61 2e 66 73 0a 0a 24 31 30 20 73  schema.fs..$10 s
0940: 74 61 63 6b 3a 20 65 6c 65 6d 65 6e 74 2d 73 74  tack: element-st
0950: 61 63 6b 0a 24 31 30 20 73 74 61 63 6b 3a 20 6b  ack.$10 stack: k
0960: 65 79 2d 73 74 61 63 6b 0a 24 31 30 20 73 74 61  ey-stack.$10 sta
0970: 63 6b 3a 20 61 72 72 61 79 2d 73 74 61 63 6b 0a  ck: array-stack.
0980: 30 20 56 61 6c 75 65 20 61 72 72 61 79 2d 69 74  0 Value array-it
0990: 65 6d 0a 30 20 56 61 6c 75 65 20 6c 61 73 74 2d  em.0 Value last-
09a0: 74 79 70 65 0a 30 20 56 61 6c 75 65 20 70 72 65  type.0 Value pre
09b0: 76 69 6f 75 73 2d 74 79 70 65 0a 0a 3a 20 73 65  vious-type..: se
09c0: 74 2d 76 61 6c 20 28 20 76 61 6c 75 65 20 2d 2d  t-val ( value --
09d0: 20 29 0a 20 20 20 20 6b 65 79 24 20 24 40 20 66   ).    key$ $@ f
09e0: 69 6e 64 2d 6e 61 6d 65 20 3f 64 75 70 2d 49 46  ind-name ?dup-IF
09f0: 20 20 28 69 6e 74 2d 74 6f 29 20 20 45 58 49 54    (int-to)  EXIT
0a00: 20 20 54 48 45 4e 0a 20 20 20 20 6a 73 6f 6e 2d    THEN.    json-
0a10: 65 72 72 20 3b 0a 0a 3a 20 73 65 74 2d 69 6e 74  err ;..: set-int
0a20: 20 28 20 76 61 6c 75 65 20 2d 2d 20 29 0a 20 20   ( value -- ).  
0a30: 20 20 6b 65 79 24 20 24 40 20 66 69 6e 64 2d 6e    key$ $@ find-n
0a40: 61 6d 65 20 3f 64 75 70 2d 49 46 20 20 28 69 6e  ame ?dup-IF  (in
0a50: 74 2d 74 6f 29 20 20 45 58 49 54 20 20 54 48 45  t-to)  EXIT  THE
0a60: 4e 0a 20 20 20 20 27 25 27 20 6b 65 79 24 20 24  N.    '%' key$ $
0a70: 40 20 2b 20 31 2d 20 63 21 20 20 6b 65 79 24 20  @ + 1- c!  key$ 
0a80: 24 40 20 66 69 6e 64 2d 6e 61 6d 65 20 3f 64 75  $@ find-name ?du
0a90: 70 2d 49 46 0a 09 3e 72 20 73 3e 66 20 72 3e 20  p-IF..>r s>f r> 
0aa0: 28 69 6e 74 2d 74 6f 29 20 45 58 49 54 20 20 54  (int-to) EXIT  T
0ab0: 48 45 4e 0a 20 20 20 20 27 21 27 20 6b 65 79 24  HEN.    '!' key$
0ac0: 20 24 40 20 2b 20 31 2d 20 63 21 20 20 6b 65 79   $@ + 1- c!  key
0ad0: 24 20 24 40 20 66 69 6e 64 2d 6e 61 6d 65 20 3f  $ $@ find-name ?
0ae0: 64 75 70 2d 49 46 0a 09 3e 72 20 23 31 30 30 30  dup-IF..>r #1000
0af0: 30 30 30 30 30 30 20 75 6d 2a 20 64 3e 36 34 20  000000 um* d>64 
0b00: 72 3e 20 28 69 6e 74 2d 74 6f 29 20 45 58 49 54  r> (int-to) EXIT
0b10: 20 20 54 48 45 4e 0a 20 20 20 20 6a 73 6f 6e 2d    THEN.    json-
0b20: 65 72 72 20 3b 0a 0a 44 65 66 65 72 20 6e 65 78  err ;..Defer nex
0b30: 74 2d 65 6c 65 6d 65 6e 74 0a 0a 3a 20 6e 65 78  t-element..: nex
0b40: 74 2d 65 6c 65 6d 65 6e 74 23 20 28 20 65 6c 65  t-element# ( ele
0b50: 6d 65 6e 74 20 2d 2d 20 29 0a 20 20 20 20 61 72  ment -- ).    ar
0b60: 72 61 79 2d 69 74 65 6d 20 3f 64 75 70 2d 49 46  ray-item ?dup-IF
0b70: 20 20 3e 72 0a 09 63 61 73 65 20 70 72 65 76 69    >r..case previ
0b80: 6f 75 73 2d 74 79 70 65 0a 09 20 20 20 20 72 65  ous-type..    re
0b90: 63 74 79 70 65 2d 6e 61 6d 65 20 20 20 6f 66 20  ctype-name   of 
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 65 6e 64 6f 66 0a 09 20 20 20 20 72 65 63    endof..    rec
0bc0: 74 79 70 65 2d 6e 75 6d 20 20 20 20 6f 66 20 20  type-num    of  
0bd0: 20 20 20 20 20 20 72 40 20 3e 73 74 61 63 6b 20        r@ >stack 
0be0: 20 65 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74   endof..    rect
0bf0: 79 70 65 2d 64 6e 75 6d 20 20 20 6f 66 20 20 64  ype-dnum   of  d
0c00: 72 6f 70 20 20 72 40 20 3e 73 74 61 63 6b 20 20  rop  r@ >stack  
0c10: 65 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79  endof..    recty
0c20: 70 65 2d 73 74 72 69 6e 67 20 6f 66 20 20 73 3e  pe-string of  s>
0c30: 6e 75 6d 62 65 72 3f 20 30 3d 20 49 46 20 6a 73  number? 0= IF js
0c40: 6f 6e 2d 65 72 72 20 54 48 45 4e 0a 09 09 64 72  on-err THEN...dr
0c50: 6f 70 20 72 40 20 3e 73 74 61 63 6b 20 20 65 6e  op r@ >stack  en
0c60: 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70 65  dof..    rectype
0c70: 2d 66 6c 6f 61 74 20 20 6f 66 20 20 66 3e 73 20  -float  of  f>s 
0c80: 20 20 72 40 20 3e 73 74 61 63 6b 20 20 65 6e 64    r@ >stack  end
0c90: 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70 65 2d  of..    rectype-
0ca0: 62 6f 6f 6c 20 20 20 6f 66 20 20 20 20 20 20 20  bool   of       
0cb0: 20 72 40 20 3e 73 74 61 63 6b 20 20 65 6e 64 6f   r@ >stack  endo
0cc0: 66 0a 09 20 20 20 20 72 65 63 74 79 70 65 2d 6e  f..    rectype-n
0cd0: 69 6c 20 20 20 20 6f 66 20 20 20 20 20 20 20 20  il    of        
0ce0: 72 40 20 3e 73 74 61 63 6b 20 20 65 6e 64 6f 66  r@ >stack  endof
0cf0: 0a 09 65 6e 64 63 61 73 65 20 20 72 64 72 6f 70  ..endcase  rdrop
0d00: 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 66  .    THEN ;..: f
0d10: 3e 73 74 61 63 6b 20 28 20 72 20 73 74 61 63 6b  >stack ( r stack
0d20: 20 2d 2d 20 29 0a 20 20 20 20 7b 20 66 5e 20 72   -- ).    { f^ r
0d30: 20 7d 20 72 20 31 20 66 6c 6f 61 74 73 20 72 6f   } r 1 floats ro
0d40: 74 20 24 2b 21 20 3b 0a 0a 3a 20 6e 65 78 74 2d  t $+! ;..: next-
0d50: 65 6c 65 6d 65 6e 74 25 20 28 20 65 6c 65 6d 65  element% ( eleme
0d60: 6e 74 20 2d 2d 20 29 0a 20 20 20 20 61 72 72 61  nt -- ).    arra
0d70: 79 2d 69 74 65 6d 20 3f 64 75 70 2d 49 46 20 20  y-item ?dup-IF  
0d80: 3e 72 0a 09 63 61 73 65 20 70 72 65 76 69 6f 75  >r..case previou
0d90: 73 2d 74 79 70 65 0a 09 20 20 20 20 72 65 63 74  s-type..    rect
0da0: 79 70 65 2d 6e 61 6d 65 20 20 20 6f 66 20 20 20  ype-name   of   
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 65 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74   endof..    rect
0dd0: 79 70 65 2d 66 6c 6f 61 74 20 20 6f 66 20 20 20  ype-float  of   
0de0: 20 20 20 20 20 72 40 20 66 3e 73 74 61 63 6b 20       r@ f>stack 
0df0: 20 65 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74   endof..    rect
0e00: 79 70 65 2d 73 74 72 69 6e 67 20 6f 66 20 20 6f  ype-string of  o
0e10: 76 65 72 20 3e 72 20 3e 66 6c 6f 61 74 20 72 3e  ver >r >float r>
0e20: 20 66 72 65 65 20 74 68 72 6f 77 0a 09 09 30 3d   free throw...0=
0e30: 20 49 46 20 6a 73 6f 6e 2d 65 72 72 20 54 48 45   IF json-err THE
0e40: 4e 20 20 72 40 20 66 3e 73 74 61 63 6b 20 20 65  N  r@ f>stack  e
0e50: 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70  ndof..    rectyp
0e60: 65 2d 6e 75 6d 20 20 20 20 6f 66 20 20 73 3e 66  e-num    of  s>f
0e70: 20 20 20 72 40 20 66 3e 73 74 61 63 6b 20 20 65     r@ f>stack  e
0e80: 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70  ndof..    rectyp
0e90: 65 2d 64 6e 75 6d 20 20 20 6f 66 20 20 64 3e 66  e-dnum   of  d>f
0ea0: 20 20 20 72 40 20 66 3e 73 74 61 63 6b 20 20 65     r@ f>stack  e
0eb0: 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70  ndof..    rectyp
0ec0: 65 2d 62 6f 6f 6c 20 20 20 6f 66 20 20 73 3e 66  e-bool   of  s>f
0ed0: 20 20 20 72 40 20 66 3e 73 74 61 63 6b 20 20 65     r@ f>stack  e
0ee0: 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70  ndof..    rectyp
0ef0: 65 2d 6e 69 6c 20 20 20 20 6f 66 20 20 73 3e 66  e-nil    of  s>f
0f00: 20 20 20 72 40 20 66 3e 73 74 61 63 6b 20 20 65     r@ f>stack  e
0f10: 6e 64 6f 66 0a 09 65 6e 64 63 61 73 65 20 20 72  ndof..endcase  r
0f20: 64 72 6f 70 0a 20 20 20 20 54 48 45 4e 20 3b 0a  drop.    THEN ;.
0f30: 0a 3a 20 6e 65 78 74 2d 65 6c 65 6d 65 6e 74 24  .: next-element$
0f40: 20 28 20 65 6c 65 6d 65 6e 74 20 2d 2d 20 29 0a   ( element -- ).
0f50: 20 20 20 20 61 72 72 61 79 2d 69 74 65 6d 20 3f      array-item ?
0f60: 64 75 70 2d 49 46 20 20 3e 72 0a 09 63 61 73 65  dup-IF  >r..case
0f70: 20 70 72 65 76 69 6f 75 73 2d 74 79 70 65 0a 09   previous-type..
0f80: 20 20 20 20 72 65 63 74 79 70 65 2d 6e 61 6d 65      rectype-name
0f90: 20 20 20 6f 66 20 20 20 20 20 20 20 20 20 20 20     of           
0fa0: 20 20 20 20 20 20 20 20 20 65 6e 64 6f 66 0a 09           endof..
0fb0: 20 20 20 20 72 65 63 74 79 70 65 2d 73 74 72 69      rectype-stri
0fc0: 6e 67 20 6f 66 20 20 6f 76 65 72 20 3e 72 20 24  ng of  over >r $
0fd0: 6d 61 6b 65 20 72 3e 20 66 72 65 65 20 74 68 72  make r> free thr
0fe0: 6f 77 20 20 72 40 20 3e 73 74 61 63 6b 20 20 65  ow  r@ >stack  e
0ff0: 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70  ndof..    rectyp
1000: 65 2d 6e 75 6d 20 20 20 20 6f 66 20 20 5b 3a 20  e-num    of  [: 
1010: 30 20 2e 72 20 3b 5d 20 24 74 6d 70 20 24 6d 61  0 .r ;] $tmp $ma
1020: 6b 65 20 72 40 20 3e 73 74 61 63 6b 20 20 65 6e  ke r@ >stack  en
1030: 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70 65  dof..    rectype
1040: 2d 64 6e 75 6d 20 20 20 6f 66 20 20 5b 3a 20 30  -dnum   of  [: 0
1050: 20 64 2e 72 20 3b 5d 20 24 74 6d 70 20 24 6d 61   d.r ;] $tmp $ma
1060: 6b 65 20 72 40 20 3e 73 74 61 63 6b 20 20 65 6e  ke r@ >stack  en
1070: 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70 65  dof..    rectype
1080: 2d 66 6c 6f 61 74 20 20 6f 66 20 20 5b 27 5d 20  -float  of  ['] 
1090: 66 2e 20 24 74 6d 70 20 2d 74 72 61 69 6c 69 6e  f. $tmp -trailin
10a0: 67 20 24 6d 61 6b 65 20 20 72 40 20 3e 73 74 61  g $make  r@ >sta
10b0: 63 6b 20 20 65 6e 64 6f 66 0a 09 20 20 20 20 72  ck  endof..    r
10c0: 65 63 74 79 70 65 2d 62 6f 6f 6c 20 20 20 6f 66  ectype-bool   of
10d0: 20 20 49 46 20 22 74 72 75 65 22 20 45 4c 53 45    IF "true" ELSE
10e0: 20 22 66 61 6c 73 65 22 20 54 48 45 4e 20 24 6d   "false" THEN $m
10f0: 61 6b 65 20 72 40 20 3e 73 74 61 63 6b 20 20 65  ake r@ >stack  e
1100: 6e 64 6f 66 0a 09 20 20 20 20 72 65 63 74 79 70  ndof..    rectyp
1110: 65 2d 6e 69 6c 20 20 20 20 6f 66 20 20 72 40 20  e-nil    of  r@ 
1120: 3e 73 74 61 63 6b 20 20 65 6e 64 6f 66 0a 09 65  >stack  endof..e
1130: 6e 64 63 61 73 65 20 20 72 64 72 6f 70 0a 20 20  ndcase  rdrop.  
1140: 20 20 54 48 45 4e 20 3b 0a 0a 27 20 6e 65 78 74    THEN ;..' next
1150: 2d 65 6c 65 6d 65 6e 74 24 20 69 73 20 6e 65 78  -element$ is nex
1160: 74 2d 65 6c 65 6d 65 6e 74 0a 0a 3a 20 62 65 67  t-element..: beg
1170: 69 6e 2d 65 6c 65 6d 65 6e 74 20 28 20 2d 2d 20  in-element ( -- 
1180: 29 0a 20 20 20 20 5c 20 27 22 27 20 65 6d 69 74  ).    \ '"' emit
1190: 20 6b 65 79 24 20 24 2e 20 2e 5c 22 20 5c 22 3a   key$ $. .\" \":
11a0: 20 7b 22 20 63 72 0a 20 20 20 20 6b 65 79 24 20   {" cr.    key$ 
11b0: 24 40 20 73 63 68 65 6d 61 2d 73 63 6f 70 65 20  $@ schema-scope 
11c0: 66 69 6e 64 2d 6e 61 6d 65 2d 69 6e 0a 20 20 20  find-name-in.   
11d0: 20 3f 64 75 70 2d 49 46 20 20 6e 61 6d 65 3e 69   ?dup-IF  name>i
11e0: 6e 74 20 3e 62 6f 64 79 20 3e 72 0a 09 5b 3a 20  nt >body >r..[: 
11f0: 6b 65 79 24 20 24 2e 20 2e 22 20 2d 63 6c 61 73  key$ $. ." -clas
1200: 73 22 20 3b 5d 20 24 74 6d 70 20 73 63 68 65 6d  s" ;] $tmp schem
1210: 61 2d 73 63 6f 70 65 20 66 69 6e 64 2d 6e 61 6d  a-scope find-nam
1220: 65 2d 69 6e 0a 09 3f 64 75 70 2d 49 46 0a 09 20  e-in..?dup-IF.. 
1230: 20 20 20 6e 61 6d 65 3e 69 6e 74 20 65 78 65 63     name>int exec
1240: 75 74 65 20 6e 65 77 0a 09 20 20 20 20 64 75 70  ute new..    dup
1250: 20 61 72 72 61 79 2d 69 74 65 6d 20 3f 64 75 70   array-item ?dup
1260: 2d 49 46 0a 09 09 3e 73 74 61 63 6b 0a 09 20 20  -IF...>stack..  
1270: 20 20 45 4c 53 45 0a 09 09 73 22 20 7b 7d 22 20    ELSE...s" {}" 
1280: 6b 65 79 24 20 24 2b 21 20 73 65 74 2d 76 61 6c  key$ $+! set-val
1290: 0a 09 20 20 20 20 54 48 45 4e 0a 09 20 20 20 20  ..    THEN..    
12a0: 3e 6f 20 72 3e 20 65 6c 65 6d 65 6e 74 2d 73 74  >o r> element-st
12b0: 61 63 6b 20 3e 73 74 61 63 6b 0a 09 20 20 20 20  ack >stack..    
12c0: 6b 65 79 24 20 40 20 6b 65 79 2d 73 74 61 63 6b  key$ @ key-stack
12d0: 20 3e 73 74 61 63 6b 20 6b 65 79 24 20 6f 66 66   >stack key$ off
12e0: 0a 09 20 20 20 20 67 65 74 2d 6f 72 64 65 72 20  ..    get-order 
12f0: 72 3e 20 73 77 61 70 20 31 2b 20 73 65 74 2d 6f  r> swap 1+ set-o
1300: 72 64 65 72 0a 09 20 20 20 20 61 72 72 61 79 2d  rder..    array-
1310: 69 74 65 6d 20 61 72 72 61 79 2d 73 74 61 63 6b  item array-stack
1320: 20 3e 73 74 61 63 6b 20 30 20 74 6f 20 61 72 72   >stack 0 to arr
1330: 61 79 2d 69 74 65 6d 0a 09 45 4c 53 45 0a 09 20  ay-item..ELSE.. 
1340: 20 20 20 63 72 20 6b 65 79 24 20 24 2e 20 6a 73     cr key$ $. js
1350: 6f 6e 2d 63 6c 61 73 73 2d 74 68 72 6f 77 20 74  on-class-throw t
1360: 68 72 6f 77 0a 09 54 48 45 4e 0a 20 20 20 20 45  hrow..THEN.    E
1370: 4c 53 45 0a 09 6b 65 79 24 20 24 40 6c 65 6e 20  LSE..key$ $@len 
1380: 49 46 0a 09 20 20 20 20 63 72 20 6b 65 79 24 20  IF..    cr key$ 
1390: 24 2e 20 6a 73 6f 6e 2d 6b 65 79 2d 74 68 72 6f  $. json-key-thro
13a0: 77 20 74 68 72 6f 77 0a 09 54 48 45 4e 0a 20 20  w throw..THEN.  
13b0: 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 65 6e 64 2d    THEN ;..: end-
13c0: 61 72 72 61 79 20 28 20 2d 2d 20 29 0a 20 20 20  array ( -- ).   
13d0: 20 6e 65 78 74 2d 65 6c 65 6d 65 6e 74 0a 20 20   next-element.  
13e0: 20 20 61 72 72 61 79 2d 73 74 61 63 6b 20 73 74    array-stack st
13f0: 61 63 6b 3e 20 74 6f 20 61 72 72 61 79 2d 69 74  ack> to array-it
1400: 65 6d 20 3b 0a 3a 20 65 6e 64 2d 65 6c 65 6d 65  em ;.: end-eleme
1410: 6e 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65  nt ( -- ).    ke
1420: 79 24 20 24 66 72 65 65 20 20 6b 65 79 2d 73 74  y$ $free  key-st
1430: 61 63 6b 20 73 74 61 63 6b 3e 20 6b 65 79 24 20  ack stack> key$ 
1440: 21 0a 20 20 20 20 70 72 65 76 69 6f 75 73 20 65  !.    previous e
1450: 6c 65 6d 65 6e 74 2d 73 74 61 63 6b 20 73 74 61  lement-stack sta
1460: 63 6b 3e 20 3e 6f 20 72 64 72 6f 70 20 20 65 6e  ck> >o rdrop  en
1470: 64 2d 61 72 72 61 79 20 3b 0a 3a 20 62 65 67 69  d-array ;.: begi
1480: 6e 2d 61 72 72 61 79 20 28 20 2d 2d 20 29 0a 20  n-array ( -- ). 
1490: 20 20 20 61 72 72 61 79 2d 69 74 65 6d 20 61 72     array-item ar
14a0: 72 61 79 2d 73 74 61 63 6b 20 3e 73 74 61 63 6b  ray-stack >stack
14b0: 0a 20 20 20 20 5b 3a 20 6b 65 79 24 20 24 2e 20  .    [: key$ $. 
14c0: 2e 22 20 5b 5d 22 20 3b 5d 20 24 74 6d 70 20 66  ." []" ;] $tmp f
14d0: 69 6e 64 2d 6e 61 6d 65 20 3f 64 75 70 2d 49 46  ind-name ?dup-IF
14e0: 0a 09 6e 61 6d 65 3e 69 6e 74 20 65 78 65 63 75  ..name>int execu
14f0: 74 65 20 74 6f 20 61 72 72 61 79 2d 69 74 65 6d  te to array-item
1500: 0a 09 5b 27 5d 20 6e 65 78 74 2d 65 6c 65 6d 65  ..['] next-eleme
1510: 6e 74 24 20 69 73 20 6e 65 78 74 2d 65 6c 65 6d  nt$ is next-elem
1520: 65 6e 74 20 20 45 58 49 54 20 20 54 48 45 4e 0a  ent  EXIT  THEN.
1530: 20 20 20 20 5b 3a 20 6b 65 79 24 20 24 2e 20 2e      [: key$ $. .
1540: 22 20 5b 5d 23 22 20 3b 5d 20 24 74 6d 70 20 66  " []#" ;] $tmp f
1550: 69 6e 64 2d 6e 61 6d 65 20 3f 64 75 70 2d 49 46  ind-name ?dup-IF
1560: 0a 09 6e 61 6d 65 3e 69 6e 74 20 65 78 65 63 75  ..name>int execu
1570: 74 65 20 74 6f 20 61 72 72 61 79 2d 69 74 65 6d  te to array-item
1580: 0a 09 5b 27 5d 20 6e 65 78 74 2d 65 6c 65 6d 65  ..['] next-eleme
1590: 6e 74 23 20 69 73 20 6e 65 78 74 2d 65 6c 65 6d  nt# is next-elem
15a0: 65 6e 74 20 20 45 58 49 54 20 20 54 48 45 4e 0a  ent  EXIT  THEN.
15b0: 20 20 20 20 5b 3a 20 6b 65 79 24 20 24 2e 20 2e      [: key$ $. .
15c0: 22 20 5b 5d 25 22 20 3b 5d 20 24 74 6d 70 20 66  " []%" ;] $tmp f
15d0: 69 6e 64 2d 6e 61 6d 65 20 3f 64 75 70 2d 49 46  ind-name ?dup-IF
15e0: 0a 09 6e 61 6d 65 3e 69 6e 74 20 65 78 65 63 75  ..name>int execu
15f0: 74 65 20 74 6f 20 61 72 72 61 79 2d 69 74 65 6d  te to array-item
1600: 0a 09 5b 27 5d 20 6e 65 78 74 2d 65 6c 65 6d 65  ..['] next-eleme
1610: 6e 74 25 20 69 73 20 6e 65 78 74 2d 65 6c 65 6d  nt% is next-elem
1620: 65 6e 74 20 20 45 58 49 54 20 20 54 48 45 4e 0a  ent  EXIT  THEN.
1630: 20 20 20 20 6a 73 6f 6e 2d 65 72 72 20 3b 0a 0a      json-err ;..
1640: 3a 20 6b 65 79 2d 66 69 6e 64 3f 20 28 20 63 68  : key-find? ( ch
1650: 61 72 20 2d 2d 20 6e 74 20 29 0a 20 20 20 20 6b  ar -- nt ).    k
1660: 65 79 24 20 24 40 20 2b 20 31 2d 20 63 21 20 6b  ey$ $@ + 1- c! k
1670: 65 79 24 20 24 40 20 66 69 6e 64 2d 6e 61 6d 65  ey$ $@ find-name
1680: 20 3b 0a 0a 3a 20 6a 73 6f 6e 2d 73 74 72 69 6e   ;..: json-strin
1690: 67 21 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29  g! ( addr u -- )
16a0: 0a 20 20 20 20 6f 76 65 72 20 3e 72 0a 20 20 20  .    over >r.   
16b0: 20 27 24 27 20 6b 65 79 24 20 63 24 2b 21 20 6b   '$' key$ c$+! k
16c0: 65 79 24 20 24 40 20 66 69 6e 64 2d 6e 61 6d 65  ey$ $@ find-name
16d0: 20 3f 64 75 70 2d 49 46 20 20 28 69 6e 74 2d 74   ?dup-IF  (int-t
16e0: 6f 29 20 72 3e 20 66 72 65 65 20 74 68 72 6f 77  o) r> free throw
16f0: 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20    EXIT  THEN.   
1700: 20 5c 20 77 6f 72 6b 61 72 6f 75 6e 64 20 69 66   \ workaround if
1710: 20 79 6f 75 20 6d 65 61 6e 20 6e 75 6d 62 65 72   you mean number
1720: 20 62 75 74 20 77 72 6f 74 65 20 73 74 72 69 6e   but wrote strin
1730: 67 0a 20 20 20 20 27 26 27 20 6b 65 79 2d 66 69  g.    '&' key-fi
1740: 6e 64 3f 20 3f 64 75 70 2d 49 46 0a 09 3e 72 20  nd? ?dup-IF..>r 
1750: 73 3e 6e 75 6d 62 65 72 3f 20 20 49 46 20 20 72  s>number?  IF  r
1760: 3e 20 28 69 6e 74 2d 74 6f 29 20 72 3e 20 66 72  > (int-to) r> fr
1770: 65 65 20 74 68 72 6f 77 20 20 45 58 49 54 20 20  ee throw  EXIT  
1780: 54 48 45 4e 20 20 6a 73 6f 6e 2d 65 72 72 20 20  THEN  json-err  
1790: 54 48 45 4e 0a 20 20 20 20 27 23 27 20 6b 65 79  THEN.    '#' key
17a0: 2d 66 69 6e 64 3f 20 3f 64 75 70 2d 49 46 0a 09  -find? ?dup-IF..
17b0: 3e 72 20 73 3e 6e 75 6d 62 65 72 3f 20 20 49 46  >r s>number?  IF
17c0: 20 20 64 72 6f 70 20 72 3e 20 28 69 6e 74 2d 74    drop r> (int-t
17d0: 6f 29 20 72 3e 20 66 72 65 65 20 74 68 72 6f 77  o) r> free throw
17e0: 20 20 45 58 49 54 20 20 54 48 45 4e 20 20 6a 73    EXIT  THEN  js
17f0: 6f 6e 2d 65 72 72 20 20 54 48 45 4e 0a 20 20 20  on-err  THEN.   
1800: 20 27 21 27 20 6b 65 79 2d 66 69 6e 64 3f 20 3f   '!' key-find? ?
1810: 64 75 70 2d 49 46 20 20 64 72 6f 70 0a 09 3f 64  dup-IF  drop..?d
1820: 61 74 65 20 49 46 20 20 64 61 74 65 3e 74 69 63  ate IF  date>tic
1830: 6b 73 20 73 65 74 2d 76 61 6c 20 72 3e 20 66 72  ks set-val r> fr
1840: 65 65 20 74 68 72 6f 77 20 20 45 58 49 54 20 20  ee throw  EXIT  
1850: 54 48 45 4e 20 20 6a 73 6f 6e 2d 65 72 72 20 20  THEN  json-err  
1860: 54 48 45 4e 0a 20 20 20 20 27 25 27 20 6b 65 79  THEN.    '%' key
1870: 2d 66 69 6e 64 3f 20 3f 64 75 70 2d 49 46 20 20  -find? ?dup-IF  
1880: 64 72 6f 70 0a 09 3e 66 6c 6f 61 74 20 49 46 20  drop..>float IF 
1890: 20 73 65 74 2d 76 61 6c 20 72 3e 20 66 72 65 65   set-val r> free
18a0: 20 74 68 72 6f 77 20 20 45 58 49 54 20 20 54 48   throw  EXIT  TH
18b0: 45 4e 20 20 6a 73 6f 6e 2d 65 72 72 20 20 54 48  EN  json-err  TH
18c0: 45 4e 0a 20 20 20 20 72 3e 20 66 72 65 65 20 74  EN.    r> free t
18d0: 68 72 6f 77 20 6a 73 6f 6e 2d 65 72 72 20 3b 0a  hrow json-err ;.
18e0: 0a 3a 20 65 76 61 6c 2d 6a 73 6f 6e 20 28 20 2e  .: eval-json ( .
18f0: 2e 20 74 61 67 20 2d 2d 20 29 0a 20 20 20 20 63  . tag -- ).    c
1900: 61 73 65 0a 09 72 65 63 74 79 70 65 2d 6e 61 6d  ase..rectype-nam
1910: 65 20 20 20 6f 66 20 20 6e 61 6d 65 3f 69 6e 74  e   of  name?int
1920: 20 65 78 65 63 75 74 65 20 20 20 20 20 20 20 65   execute       e
1930: 6e 64 6f 66 0a 09 72 65 63 74 79 70 65 2d 73 74  ndof..rectype-st
1940: 72 69 6e 67 20 6f 66 20 20 6a 73 6f 6e 2d 73 74  ring of  json-st
1950: 72 69 6e 67 21 20 20 20 20 20 20 20 20 20 20 20  ring!           
1960: 65 6e 64 6f 66 0a 09 72 65 63 74 79 70 65 2d 6e  endof..rectype-n
1970: 75 6d 20 20 20 20 6f 66 20 20 27 23 27 20 6b 65  um    of  '#' ke
1980: 79 24 20 63 24 2b 21 20 73 65 74 2d 69 6e 74 20  y$ c$+! set-int 
1990: 20 65 6e 64 6f 66 0a 09 72 65 63 74 79 70 65 2d   endof..rectype-
19a0: 64 6e 75 6d 20 20 20 6f 66 20 20 27 26 27 20 6b  dnum   of  '&' k
19b0: 65 79 24 20 63 24 2b 21 20 73 65 74 2d 76 61 6c  ey$ c$+! set-val
19c0: 20 20 65 6e 64 6f 66 0a 09 72 65 63 74 79 70 65    endof..rectype
19d0: 2d 66 6c 6f 61 74 20 20 6f 66 20 20 27 25 27 20  -float  of  '%' 
19e0: 6b 65 79 24 20 63 24 2b 21 20 73 65 74 2d 76 61  key$ c$+! set-va
19f0: 6c 20 20 65 6e 64 6f 66 0a 09 72 65 63 74 79 70  l  endof..rectyp
1a00: 65 2d 62 6f 6f 6c 20 20 20 6f 66 20 20 27 3f 27  e-bool   of  '?'
1a10: 20 6b 65 79 24 20 63 24 2b 21 20 73 65 74 2d 76   key$ c$+! set-v
1a20: 61 6c 20 20 65 6e 64 6f 66 0a 09 72 65 63 74 79  al  endof..recty
1a30: 70 65 2d 6e 69 6c 20 20 20 20 6f 66 20 20 64 72  pe-nil    of  dr
1a40: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
1a50: 20 20 20 20 20 65 6e 64 6f 66 20 5c 20 64 65 66       endof \ def
1a60: 61 75 6c 74 20 69 73 20 6e 75 6c 6c 2c 20 61 6e  ault is null, an
1a70: 79 68 6f 77 0a 09 6a 73 6f 6e 2d 65 72 72 0a 20  yhow..json-err. 
1a80: 20 20 20 65 6e 64 63 61 73 65 20 3b 0a 0a 3a 20     endcase ;..: 
1a90: 6b 65 79 2d 76 61 6c 75 65 20 28 20 61 64 64 72  key-value ( addr
1aa0: 20 75 20 2d 2d 20 29 20 6f 76 65 72 20 3e 72 20   u -- ) over >r 
1ab0: 6b 65 79 24 20 24 21 20 72 3e 20 66 72 65 65 20  key$ $! r> free 
1ac0: 74 68 72 6f 77 0a 20 20 20 20 70 61 72 73 65 2d  throw.    parse-
1ad0: 6e 61 6d 65 20 6a 73 6f 6e 73 2d 72 65 63 6f 67  name jsons-recog
1ae0: 6e 69 7a 65 72 20 72 65 63 6f 67 6e 69 7a 65 20  nizer recognize 
1af0: 65 76 61 6c 2d 6a 73 6f 6e 20 3b 0a 0a 27 20 62  eval-json ;..' b
1b00: 65 67 69 6e 2d 65 6c 65 6d 65 6e 74 20 27 7b 27  egin-element '{'
1b10: 20 63 65 6c 6c 73 20 6a 73 6f 6e 2d 74 6f 6b 65   cells json-toke
1b20: 6e 73 20 2b 20 21 0a 27 20 65 6e 64 2d 65 6c 65  ns + !.' end-ele
1b30: 6d 65 6e 74 20 20 20 27 7d 27 20 63 65 6c 6c 73  ment   '}' cells
1b40: 20 6a 73 6f 6e 2d 74 6f 6b 65 6e 73 20 2b 20 21   json-tokens + !
1b50: 0a 27 20 6e 65 78 74 2d 65 6c 65 6d 65 6e 74 20  .' next-element 
1b60: 20 27 2c 27 20 63 65 6c 6c 73 20 6a 73 6f 6e 2d   ',' cells json-
1b70: 74 6f 6b 65 6e 73 20 2b 20 21 0a 27 20 62 65 67  tokens + !.' beg
1b80: 69 6e 2d 61 72 72 61 79 20 20 20 27 5b 27 20 63  in-array   '[' c
1b90: 65 6c 6c 73 20 6a 73 6f 6e 2d 74 6f 6b 65 6e 73  ells json-tokens
1ba0: 20 2b 20 21 0a 27 20 65 6e 64 2d 61 72 72 61 79   + !.' end-array
1bb0: 20 20 20 20 20 27 5d 27 20 63 65 6c 6c 73 20 6a       ']' cells j
1bc0: 73 6f 6e 2d 74 6f 6b 65 6e 73 20 2b 20 21 0a 27  son-tokens + !.'
1bd0: 20 6b 65 79 2d 76 61 6c 75 65 20 20 20 20 20 27   key-value     '
1be0: 3a 27 20 63 65 6c 6c 73 20 6a 73 6f 6e 2d 74 6f  :' cells json-to
1bf0: 6b 65 6e 73 20 2b 20 21 0a 0a 3a 20 72 65 63 2d  kens + !..: rec-
1c00: 6a 73 6f 6e 20 28 20 61 64 64 72 20 75 20 2d 2d  json ( addr u --
1c10: 20 29 0a 20 20 20 20 31 20 3d 20 49 46 0a 09 63   ).    1 = IF..c
1c20: 40 20 63 65 6c 6c 73 20 6a 73 6f 6e 2d 74 6f 6b  @ cells json-tok
1c30: 65 6e 73 20 2b 20 40 0a 09 64 75 70 20 49 46 20  ens + @..dup IF 
1c40: 20 72 65 63 74 79 70 65 2d 6e 61 6d 65 20 20 45   rectype-name  E
1c50: 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 54 48  XIT  THEN.    TH
1c60: 45 4e 0a 20 20 20 20 64 72 6f 70 20 72 65 63 74  EN.    drop rect
1c70: 79 70 65 2d 6e 75 6c 6c 20 3b 0a 0a 32 35 36 20  ype-null ;..256 
1c80: 62 75 66 66 65 72 3a 20 73 74 6f 70 2d 63 68 61  buffer: stop-cha
1c90: 72 73 0a 62 6c 20 31 2b 20 30 20 5b 64 6f 5d 20  rs.bl 1+ 0 [do] 
1ca0: 31 20 73 74 6f 70 2d 63 68 61 72 73 20 5b 69 5d  1 stop-chars [i]
1cb0: 20 2b 20 63 21 20 5b 6c 6f 6f 70 5d 0a 22 7b 7d   + c! [loop]."{}
1cc0: 5b 5d 2c 3a 5c 22 22 20 62 6f 75 6e 64 73 20 5b  [],:\"" bounds [
1cd0: 64 6f 5d 20 31 20 73 74 6f 70 2d 63 68 61 72 73  do] 1 stop-chars
1ce0: 20 5b 69 5d 20 63 40 20 2b 20 63 21 20 5b 6c 6f   [i] c@ + c! [lo
1cf0: 6f 70 5d 0a 0a 3a 20 70 61 72 73 65 2d 6a 73 6f  op]..: parse-jso
1d00: 6e 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29 0a  n ( -- addr u ).
1d10: 20 20 20 20 73 6f 75 72 63 65 20 3e 69 6e 20 40      source >in @
1d20: 20 73 61 66 65 2f 73 74 72 69 6e 67 0a 20 20 20   safe/string.   
1d30: 20 64 75 70 20 30 20 55 2b 44 4f 20 20 6f 76 65   dup 0 U+DO  ove
1d40: 72 20 63 40 20 62 6c 20 75 3e 20 3f 4c 45 41 56  r c@ bl u> ?LEAV
1d50: 45 20 20 31 20 73 61 66 65 2f 73 74 72 69 6e 67  E  1 safe/string
1d60: 20 20 4c 4f 4f 50 0a 20 20 20 20 6f 76 65 72 20    LOOP.    over 
1d70: 63 40 20 73 74 6f 70 2d 63 68 61 72 73 20 2b 20  c@ stop-chars + 
1d80: 63 40 20 20 49 46 20 20 31 20 75 6d 69 6e 20 20  c@  IF  1 umin  
1d90: 45 4c 53 45 0a 09 64 75 70 20 31 20 55 2b 44 4f  ELSE..dup 1 U+DO
1da0: 20 20 6f 76 65 72 20 49 20 2b 20 63 40 20 73 74    over I + c@ st
1db0: 6f 70 2d 63 68 61 72 73 20 2b 20 63 40 20 20 49  op-chars + c@  I
1dc0: 46 20 20 64 72 6f 70 20 49 20 20 4c 45 41 56 45  F  drop I  LEAVE
1dd0: 20 20 54 48 45 4e 20 20 4c 4f 4f 50 0a 20 20 20    THEN  LOOP.   
1de0: 20 54 48 45 4e 0a 20 20 20 20 32 64 75 70 20 2b   THEN.    2dup +
1df0: 20 73 6f 75 72 63 65 20 64 72 6f 70 20 2d 20 3e   source drop - >
1e00: 69 6e 20 21 20 32 64 75 70 20 69 6e 70 75 74 2d  in ! 2dup input-
1e10: 6c 65 78 65 6d 65 21 20 3b 0a 0a 63 73 2d 73 63  lexeme! ;..cs-sc
1e20: 6f 70 65 3a 20 62 6f 6f 6c 73 0a 66 61 6c 73 65  ope: bools.false
1e30: 20 72 65 63 74 79 70 65 2d 62 6f 6f 6c 20 32 63   rectype-bool 2c
1e40: 6f 6e 73 74 61 6e 74 20 66 61 6c 73 65 0a 74 72  onstant false.tr
1e50: 75 65 20 20 72 65 63 74 79 70 65 2d 62 6f 6f 6c  ue  rectype-bool
1e60: 20 32 63 6f 6e 73 74 61 6e 74 20 74 72 75 65 0a   2constant true.
1e70: 30 20 20 20 20 20 72 65 63 74 79 70 65 2d 6e 69  0     rectype-ni
1e80: 6c 20 20 32 63 6f 6e 73 74 61 6e 74 20 6e 75 6c  l  2constant nul
1e90: 6c 0a 7d 73 63 6f 70 65 0a 0a 3a 20 72 65 63 2d  l.}scope..: rec-
1ea0: 62 6f 6f 6c 20 28 20 61 64 64 72 20 75 20 2d 2d  bool ( addr u --
1eb0: 20 2e 2e 2e 20 29 0a 20 20 20 20 5b 27 5d 20 62   ... ).    ['] b
1ec0: 6f 6f 6c 73 20 3e 62 6f 64 79 20 66 69 6e 64 2d  ools >body find-
1ed0: 6e 61 6d 65 2d 69 6e 20 3f 64 75 70 2d 49 46 0a  name-in ?dup-IF.
1ee0: 09 6e 61 6d 65 3e 69 6e 74 20 65 78 65 63 75 74  .name>int execut
1ef0: 65 0a 20 20 20 20 45 4c 53 45 20 20 72 65 63 74  e.    ELSE  rect
1f00: 79 70 65 2d 6e 75 6c 6c 20 20 54 48 45 4e 20 3b  ype-null  THEN ;
1f10: 0a 0a 27 20 72 65 63 2d 62 6f 6f 6c 20 27 20 72  ..' rec-bool ' r
1f20: 65 63 2d 6e 75 6d 20 27 20 72 65 63 2d 66 6c 6f  ec-num ' rec-flo
1f30: 61 74 20 27 20 72 65 63 2d 73 74 72 69 6e 67 20  at ' rec-string 
1f40: 27 20 72 65 63 2d 6a 73 6f 6e 0a 35 20 6a 73 6f  ' rec-json.5 jso
1f50: 6e 73 2d 72 65 63 6f 67 6e 69 7a 65 72 20 73 65  ns-recognizer se
1f60: 74 2d 73 74 61 63 6b 0a 0a 3a 20 72 65 63 2d 6a  t-stack..: rec-j
1f70: 73 6f 6e 73 20 28 20 61 64 64 72 20 75 20 2d 2d  sons ( addr u --
1f80: 20 2e 2e 2e 20 6a 73 6f 6e 2d 74 79 70 65 20 29   ... json-type )
1f90: 0a 20 20 20 20 6c 61 73 74 2d 74 79 70 65 20 74  .    last-type t
1fa0: 6f 20 70 72 65 76 69 6f 75 73 2d 74 79 70 65 0a  o previous-type.
1fb0: 20 20 20 20 6a 73 6f 6e 73 2d 72 65 63 6f 67 6e      jsons-recogn
1fc0: 69 7a 65 72 20 72 65 63 6f 67 6e 69 7a 65 20 64  izer recognize d
1fd0: 75 70 20 74 6f 20 6c 61 73 74 2d 74 79 70 65 20  up to last-type 
1fe0: 3b 0a 0a 27 20 72 65 63 2d 6a 73 6f 6e 73 20 31  ;..' rec-jsons 1
1ff0: 20 6a 73 6f 6e 2d 72 65 63 6f 67 6e 69 7a 65 72   json-recognizer
2000: 20 73 65 74 2d 73 74 61 63 6b 0a 0a 3a 20 6a 73   set-stack..: js
2010: 6f 6e 2d 6c 6f 61 64 20 28 20 61 64 64 72 20 75  on-load ( addr u
2020: 20 2d 2d 20 6f 20 29 0a 20 20 20 20 6f 75 74 65   -- o ).    oute
2030: 72 2d 63 6c 61 73 73 20 6e 65 77 20 3e 6f 0a 20  r-class new >o. 
2040: 20 20 20 6f 20 65 6c 65 6d 65 6e 74 2d 73 74 61     o element-sta
2050: 63 6b 20 3e 73 74 61 63 6b 20 20 30 20 6b 65 79  ck >stack  0 key
2060: 2d 73 74 61 63 6b 20 3e 73 74 61 63 6b 20 20 30  -stack >stack  0
2070: 20 61 72 72 61 79 2d 73 74 61 63 6b 20 3e 73 74   array-stack >st
2080: 61 63 6b 0a 20 20 20 20 67 65 74 2d 6f 72 64 65  ack.    get-orde
2090: 72 20 6e 3e 72 20 73 63 68 65 6d 61 2d 77 69 64  r n>r schema-wid
20a0: 20 31 20 73 65 74 2d 6f 72 64 65 72 0a 20 20 20   1 set-order.   
20b0: 20 66 6f 72 74 68 2d 72 65 63 6f 67 6e 69 7a 65   forth-recognize
20c0: 72 20 3e 72 20 20 6a 73 6f 6e 2d 72 65 63 6f 67  r >r  json-recog
20d0: 6e 69 7a 65 72 20 74 6f 20 66 6f 72 74 68 2d 72  nizer to forth-r
20e0: 65 63 6f 67 6e 69 7a 65 72 0a 20 20 20 20 61 63  ecognizer.    ac
20f0: 74 69 6f 6e 2d 6f 66 20 70 61 72 73 65 2d 6e 61  tion-of parse-na
2100: 6d 65 20 3e 72 20 5b 27 5d 20 70 61 72 73 65 2d  me >r ['] parse-
2110: 6a 73 6f 6e 20 69 73 20 70 61 72 73 65 2d 6e 61  json is parse-na
2120: 6d 65 0a 20 20 20 20 5b 27 5d 20 69 6e 63 6c 75  me.    ['] inclu
2130: 64 65 64 20 63 61 74 63 68 0a 20 20 20 20 72 3e  ded catch.    r>
2140: 20 69 73 20 70 61 72 73 65 2d 6e 61 6d 65 20 20   is parse-name  
2150: 72 3e 20 74 6f 20 66 6f 72 74 68 2d 72 65 63 6f  r> to forth-reco
2160: 67 6e 69 7a 65 72 20 20 6e 72 3e 20 73 65 74 2d  gnizer  nr> set-
2170: 6f 72 64 65 72 0a 20 20 20 20 74 68 72 6f 77 20  order.    throw 
2180: 70 72 6f 63 65 73 73 2d 65 6c 65 6d 65 6e 74 20  process-element 
2190: 6f 20 6f 3e 20 3b 0a 0a 3a 20 6a 73 6f 6e 2d 6c  o o> ;..: json-l
21a0: 6f 61 64 2d 64 69 72 20 28 20 61 64 64 72 20 75  oad-dir ( addr u
21b0: 20 2d 2d 20 29 0a 20 20 20 20 32 64 75 70 20 6f   -- ).    2dup o
21c0: 70 65 6e 2d 64 69 72 20 74 68 72 6f 77 20 7b 20  pen-dir throw { 
21d0: 64 64 20 7d 20 66 70 61 74 68 20 64 75 70 20 24  dd } fpath dup $
21e0: 40 6c 65 6e 20 3e 72 20 61 6c 73 6f 2d 70 61 74  @len >r also-pat
21f0: 68 20 64 64 0a 20 20 20 20 5b 3a 20 7b 20 64 64  h dd.    [: { dd
2200: 20 7c 20 6e 6e 20 7d 20 21 74 69 6d 65 0a 09 42   | nn } !time..B
2210: 45 47 49 4e 0a 09 20 20 20 20 70 61 64 20 24 31  EGIN..    pad $1
2220: 30 30 20 64 64 20 72 65 61 64 2d 64 69 72 20 74  00 dd read-dir t
2230: 68 72 6f 77 20 20 57 48 49 4c 45 0a 09 09 70 61  hrow  WHILE...pa
2240: 64 20 73 77 61 70 20 32 64 75 70 20 22 2a 2e 6a  d swap 2dup "*.j
2250: 73 6f 6e 22 20 66 69 6c 65 6e 61 6d 65 2d 6d 61  son" filename-ma
2260: 74 63 68 20 49 46 0a 09 09 20 20 20 20 6a 73 6f  tch IF...    jso
2270: 6e 2d 6c 6f 61 64 20 65 6e 74 72 69 65 73 5b 5d  n-load entries[]
2280: 20 3e 73 74 61 63 6b 20 20 31 20 2b 74 6f 20 6e   >stack  1 +to n
2290: 6e 0a 09 09 20 20 20 20 6e 6e 20 23 33 37 20 6d  n...    nn #37 m
22a0: 6f 64 20 30 3d 20 49 46 0a 09 09 09 6e 6e 20 5b  od 0= IF....nn [
22b0: 3a 20 2e 22 20 72 65 61 64 20 22 20 36 20 2e 72  : ." read " 6 .r
22c0: 20 2e 22 20 20 70 6f 73 74 69 6e 67 73 22 20 3b   ."  postings" ;
22d0: 5d 0a 09 09 09 77 61 72 6e 69 6e 67 2d 63 6f 6c  ]....warning-col
22e0: 6f 72 20 63 6f 6c 6f 72 2d 65 78 65 63 75 74 65  or color-execute
22f0: 0a 09 09 09 23 2d 32 30 20 30 20 61 74 2d 64 65  ....#-20 0 at-de
2300: 6c 74 61 78 79 0a 09 09 20 20 20 20 54 48 45 4e  ltaxy...    THEN
2310: 0a 09 09 45 4c 53 45 20 20 32 64 72 6f 70 20 20  ...ELSE  2drop  
2320: 54 48 45 4e 0a 09 52 45 50 45 41 54 20 20 64 72  THEN..REPEAT  dr
2330: 6f 70 0a 09 6e 6e 20 5b 3a 20 2e 22 20 72 65 61  op..nn [: ." rea
2340: 64 20 22 20 36 20 2e 72 20 2e 22 20 20 70 6f 73  d " 6 .r ."  pos
2350: 74 69 6e 67 73 20 69 6e 20 22 20 2e 74 69 6d 65  tings in " .time
2360: 20 3b 5d 0a 09 73 75 63 63 65 73 73 2d 63 6f 6c   ;]..success-col
2370: 6f 72 20 63 6f 6c 6f 72 2d 65 78 65 63 75 74 65  or color-execute
2380: 20 63 72 20 3b 5d 20 63 61 74 63 68 0a 20 20 20   cr ;] catch.   
2390: 20 72 3e 20 66 70 61 74 68 20 24 21 6c 65 6e 20   r> fpath $!len 
23a0: 20 64 64 20 63 6c 6f 73 65 2d 64 69 72 20 74 68   dd close-dir th
23b0: 72 6f 77 20 20 74 68 72 6f 77 20 3b 0a           row  throw ;.