/ Hex Artifact Content
Login

Artifact a36e54ec777172ddd3f9a88daf593b00848368e0:


0000: 23 0a 23 20 32 30 31 34 20 41 75 67 75 73 74 20  #.# 2014 August 
0010: 32 34 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  24.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20  -----------.#.# 
0170: 54 68 69 73 20 73 63 72 69 70 74 20 65 78 74 72  This script extr
0180: 61 63 74 73 20 74 68 65 20 64 6f 63 75 6d 65 6e  acts the documen
0190: 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 41  tation for the A
01a0: 50 49 20 75 73 65 64 20 62 79 20 66 74 73 35 20  PI used by fts5 
01b0: 61 75 78 69 6c 69 61 72 79 20 0a 23 20 66 75 6e  auxiliary .# fun
01c0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 68 65 61 64  ctions from head
01d0: 65 72 20 66 69 6c 65 20 66 74 73 35 2e 68 2e 20  er file fts5.h. 
01e0: 49 74 20 6f 75 74 70 75 74 73 20 68 74 6d 6c 20  It outputs html 
01f0: 74 65 78 74 20 6f 6e 20 73 74 64 6f 75 74 20 74  text on stdout t
0200: 68 61 74 0a 23 20 69 73 20 69 6e 63 6c 75 64 65  hat.# is include
0210: 64 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  d in the documen
0220: 74 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 77 65  tation on the we
0230: 62 2e 0a 23 20 0a 0a 73 65 74 20 3a 3a 66 74 73  b..# ..set ::fts
0240: 35 5f 64 6f 63 73 5f 6f 75 74 70 75 74 20 22 22  5_docs_output ""
0250: 0a 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61  .if {[info comma
0260: 6e 64 73 20 68 64 5f 70 75 74 73 6e 6c 5d 3d 3d  nds hd_putsnl]==
0270: 22 22 7d 20 7b 0a 20 20 69 66 20 7b 5b 6c 6c 65  ""} {.  if {[lle
0280: 6e 67 74 68 20 24 61 72 67 76 5d 3e 30 7d 20 7b  ngth $argv]>0} {
0290: 20 73 65 74 20 3a 3a 65 78 74 72 61 63 74 5f 61   set ::extract_a
02a0: 70 69 5f 64 6f 63 73 5f 6d 6f 64 65 20 5b 6c 69  pi_docs_mode [li
02b0: 6e 64 65 78 20 24 61 72 67 76 20 30 5d 20 7d 0a  ndex $argv 0] }.
02c0: 20 20 70 72 6f 63 20 6f 75 74 70 75 74 20 7b 74    proc output {t
02d0: 65 78 74 7d 20 7b 0a 20 20 20 20 70 75 74 73 20  ext} {.    puts 
02e0: 24 74 65 78 74 0a 20 20 7d 0a 7d 20 65 6c 73 65  $text.  }.} else
02f0: 20 7b 0a 20 20 70 72 6f 63 20 6f 75 74 70 75 74   {.  proc output
0300: 20 7b 74 65 78 74 7d 20 7b 0a 20 20 20 20 61 70   {text} {.    ap
0310: 70 65 6e 64 20 3a 3a 66 74 73 35 5f 64 6f 63 73  pend ::fts5_docs
0320: 5f 6f 75 74 70 75 74 20 22 24 74 65 78 74 5c 6e  _output "$text\n
0330: 22 0a 20 20 7d 0a 7d 0a 69 66 20 7b 5b 69 6e 66  ".  }.}.if {[inf
0340: 6f 20 65 78 69 73 74 73 20 3a 3a 65 78 74 72 61  o exists ::extra
0350: 63 74 5f 61 70 69 5f 64 6f 63 73 5f 6d 6f 64 65  ct_api_docs_mode
0360: 5d 3d 3d 30 7d 20 7b 73 65 74 20 3a 3a 65 78 74  ]==0} {set ::ext
0370: 72 61 63 74 5f 61 70 69 5f 64 6f 63 73 5f 6d 6f  ract_api_docs_mo
0380: 64 65 20 61 70 69 7d 0a 0a 0a 73 65 74 20 69 6e  de api}...set in
0390: 70 75 74 5f 66 69 6c 65 20 5b 66 69 6c 65 20 6a  put_file [file j
03a0: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 20 5b 69  oin [file dir [i
03b0: 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 66 74 73  nfo script]] fts
03c0: 35 2e 68 5d 0a 73 65 74 20 66 64 20 5b 6f 70 65  5.h].set fd [ope
03d0: 6e 20 24 69 6e 70 75 74 5f 66 69 6c 65 5d 0a 73  n $input_file].s
03e0: 65 74 20 64 61 74 61 20 5b 72 65 61 64 20 24 66  et data [read $f
03f0: 64 5d 0a 63 6c 6f 73 65 20 24 66 64 0a 0a 0a 23  d].close $fd...#
0400: 20 41 72 67 75 6d 65 6e 74 20 24 64 61 74 61 20   Argument $data 
0410: 69 73 20 74 68 65 20 65 6e 74 69 72 65 20 74 65  is the entire te
0420: 78 74 20 6f 66 20 74 68 65 20 66 74 73 35 2e 68  xt of the fts5.h
0430: 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63   file. This func
0440: 74 69 6f 6e 20 0a 23 20 65 78 74 72 61 63 74 73  tion .# extracts
0450: 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
0460: 6f 66 20 74 68 65 20 46 74 73 35 45 78 74 65 6e  of the Fts5Exten
0470: 73 69 6f 6e 41 70 69 20 73 74 72 75 63 74 75 72  sionApi structur
0480: 65 20 66 72 6f 6d 20 69 74 20 61 6e 64 0a 23 20  e from it and.# 
0490: 72 65 74 75 72 6e 73 20 61 20 6b 65 79 2f 76 61  returns a key/va
04a0: 6c 75 65 20 6c 69 73 74 20 6f 66 20 73 74 72 75  lue list of stru
04b0: 63 74 75 72 65 20 6d 65 6d 62 65 72 20 6e 61 6d  cture member nam
04c0: 65 73 20 61 6e 64 20 64 65 66 69 6e 69 74 69 6f  es and definitio
04d0: 6e 73 2e 20 69 2e 65 2e 0a 23 0a 23 20 20 20 69  ns. i.e..#.#   i
04e0: 56 65 72 73 69 6f 6e 20 7b 69 6e 74 20 69 56 65  Version {int iVe
04f0: 72 73 69 6f 6e 7d 20 78 55 73 65 72 44 61 74 61  rsion} xUserData
0500: 20 7b 76 6f 69 64 20 2a 28 2a 78 55 73 65 72 44   {void *(*xUserD
0510: 61 74 61 29 28 46 74 73 35 43 6f 6e 74 65 78 74  ata)(Fts5Context
0520: 2a 29 7d 20 2e 2e 2e 0a 23 0a 70 72 6f 63 20 67  *)} ....#.proc g
0530: 65 74 5f 73 74 72 75 63 74 5f 6d 65 6d 62 65 72  et_struct_member
0540: 73 20 7b 64 61 74 61 7d 20 7b 0a 0a 20 20 23 20  s {data} {..  # 
0550: 45 78 74 72 61 63 74 20 74 68 65 20 73 74 72 75  Extract the stru
0560: 63 74 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e  cture definition
0570: 20 66 72 6f 6d 20 74 68 65 20 66 74 73 35 2e 68   from the fts5.h
0580: 20 66 69 6c 65 2e 0a 20 20 72 65 67 65 78 70 20   file..  regexp 
0590: 22 73 74 72 75 63 74 20 46 74 73 35 45 78 74 65  "struct Fts5Exte
05a0: 6e 73 69 6f 6e 41 70 69 20 7b 28 2e 2a 3f 29 7d  nsionApi {(.*?)}
05b0: 3b 22 20 24 64 61 74 61 20 2d 3e 20 64 65 66 6e  ;" $data -> defn
05c0: 0a 0a 20 20 23 20 52 65 6d 6f 76 65 20 61 6c 6c  ..  # Remove all
05d0: 20 63 6f 6d 6d 65 6e 74 73 20 66 72 6f 6d 20 74   comments from t
05e0: 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 66  he structure def
05f0: 69 6e 69 74 69 6f 6e 0a 20 20 72 65 67 73 75 62  inition.  regsub
0600: 20 2d 61 6c 6c 20 7b 2f 5b 2a 5d 2e 2a 3f 5b 2a   -all {/[*].*?[*
0610: 5d 2f 7d 20 24 64 65 66 6e 20 7b 7d 20 64 65 66  ]/} $defn {} def
0620: 6e 32 0a 0a 20 20 73 65 74 20 72 65 73 20 5b 6c  n2..  set res [l
0630: 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 6d  ist].  foreach m
0640: 65 6d 62 65 72 20 5b 73 70 6c 69 74 20 24 64 65  ember [split $de
0650: 66 6e 32 20 7b 3b 7d 5d 20 7b 0a 0a 20 20 20 20  fn2 {;}] {..    
0660: 73 65 74 20 6d 65 6d 62 65 72 20 5b 73 74 72 69  set member [stri
0670: 6e 67 20 74 72 69 6d 20 24 6d 65 6d 62 65 72 5d  ng trim $member]
0680: 0a 20 20 20 20 69 66 20 7b 24 6d 65 6d 62 65 72  .    if {$member
0690: 21 3d 22 22 7d 20 7b 20 0a 20 20 20 20 20 20 63  !=""} { .      c
06a0: 61 74 63 68 20 7b 20 73 65 74 20 6e 61 6d 65 20  atch { set name 
06b0: 5b 6c 69 6e 64 65 78 20 24 6d 65 6d 62 65 72 20  [lindex $member 
06c0: 65 6e 64 5d 20 7d 0a 20 20 20 20 20 20 72 65 67  end] }.      reg
06d0: 65 78 70 20 7b 2e 2a 3f 5b 28 5d 5b 2a 5d 28 5b  exp {.*?[(][*]([
06e0: 5e 29 5d 2a 29 5b 29 5d 7d 20 24 6d 65 6d 62 65  ^)]*)[)]} $membe
06f0: 72 20 2d 3e 20 6e 61 6d 65 0a 20 20 20 20 20 20  r -> name.      
0700: 6c 61 70 70 65 6e 64 20 72 65 73 20 24 6e 61 6d  lappend res $nam
0710: 65 20 24 6d 65 6d 62 65 72 0a 20 20 20 20 7d 0a  e $member.    }.
0720: 20 20 7d 0a 0a 20 20 73 65 74 20 72 65 73 0a 7d    }..  set res.}
0730: 0a 0a 70 72 6f 63 20 67 65 74 5f 73 74 72 75 63  ..proc get_struc
0740: 74 5f 64 6f 63 73 20 7b 64 61 74 61 20 6e 61 6d  t_docs {data nam
0750: 65 73 7d 20 7b 0a 20 20 23 20 45 78 74 72 61 63  es} {.  # Extrac
0760: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
0770: 64 65 66 69 6e 69 74 69 6f 6e 20 66 72 6f 6d 20  definition from 
0780: 74 68 65 20 66 74 73 35 2e 68 20 66 69 6c 65 2e  the fts5.h file.
0790: 0a 20 20 72 65 67 65 78 70 20 7b 45 58 54 45 4e  .  regexp {EXTEN
07a0: 53 49 4f 4e 20 41 50 49 20 46 55 4e 43 54 49 4f  SION API FUNCTIO
07b0: 4e 53 28 2e 2a 3f 29 5b 2a 5d 2f 7d 20 24 64 61  NS(.*?)[*]/} $da
07c0: 74 61 20 2d 3e 20 64 6f 63 73 0a 0a 20 20 73 65  ta -> docs..  se
07d0: 74 20 63 75 72 72 65 6e 74 5f 64 6f 63 20 20 20  t current_doc   
07e0: 20 22 22 0a 20 20 73 65 74 20 63 75 72 72 65 6e   "".  set curren
07f0: 74 5f 68 65 61 64 65 72 20 22 22 0a 0a 20 20 66  t_header ""..  f
0800: 6f 72 65 61 63 68 20 6c 69 6e 65 20 5b 73 70 6c  oreach line [spl
0810: 69 74 20 24 64 6f 63 73 20 22 5c 6e 22 5d 20 7b  it $docs "\n"] {
0820: 0a 20 20 20 20 72 65 67 73 75 62 20 7b 5b 2a 5d  .    regsub {[*]
0830: 2a 7d 20 24 6c 69 6e 65 20 7b 7d 20 6c 69 6e 65  *} $line {} line
0840: 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70  .    if {[regexp
0850: 20 7b 5e 20 20 7d 20 24 6c 69 6e 65 5d 7d 20 7b   {^  } $line]} {
0860: 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 75  .      append cu
0870: 72 72 65 6e 74 5f 64 6f 63 20 22 24 6c 69 6e 65  rrent_doc "$line
0880: 5c 6e 22 0a 20 20 20 20 7d 20 65 6c 73 65 69 66  \n".    } elseif
0890: 20 7b 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24   {[string trim $
08a0: 6c 69 6e 65 5d 3d 3d 22 22 7d 20 7b 0a 20 20 20  line]==""} {.   
08b0: 20 20 20 69 66 20 7b 24 63 75 72 72 65 6e 74 5f     if {$current_
08c0: 68 65 61 64 65 72 21 3d 22 22 7d 20 7b 20 61 70  header!=""} { ap
08d0: 70 65 6e 64 20 63 75 72 72 65 6e 74 5f 64 6f 63  pend current_doc
08e0: 20 22 5c 6e 22 20 7d 0a 20 20 20 20 7d 20 65 6c   "\n" }.    } el
08f0: 73 65 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24  se {.      if {$
0900: 63 75 72 72 65 6e 74 5f 64 6f 63 20 21 3d 20 22  current_doc != "
0910: 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70  "} {.        lap
0920: 70 65 6e 64 20 72 65 73 20 24 63 75 72 72 65 6e  pend res $curren
0930: 74 5f 68 65 61 64 65 72 20 24 63 75 72 72 65 6e  t_header $curren
0940: 74 5f 64 6f 63 0a 20 20 20 20 20 20 20 20 73 65  t_doc.        se
0950: 74 20 63 75 72 72 65 6e 74 5f 64 6f 63 20 22 22  t current_doc ""
0960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
0970: 65 74 20 73 75 62 6a 65 63 74 20 6e 2f 61 0a 20  et subject n/a. 
0980: 20 20 20 20 20 72 65 67 65 78 70 20 7b 5e 20 2a       regexp {^ *
0990: 28 5b 5b 3a 61 6c 70 68 61 3a 5d 5d 2a 29 7d 20  ([[:alpha:]]*)} 
09a0: 24 6c 69 6e 65 20 2d 3e 20 73 75 62 6a 65 63 74  $line -> subject
09b0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61  .      if {[lsea
09c0: 72 63 68 20 24 6e 61 6d 65 73 20 24 73 75 62 6a  rch $names $subj
09d0: 65 63 74 5d 3e 3d 30 7d 20 7b 0a 20 20 20 20 20  ect]>=0} {.     
09e0: 20 20 20 73 65 74 20 63 75 72 72 65 6e 74 5f 68     set current_h
09f0: 65 61 64 65 72 20 24 73 75 62 6a 65 63 74 0a 20  eader $subject. 
0a00: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
0a10: 20 20 20 20 20 20 73 65 74 20 63 75 72 72 65 6e        set curren
0a20: 74 5f 68 65 61 64 65 72 20 5b 73 74 72 69 6e 67  t_header [string
0a30: 20 74 72 69 6d 20 24 6c 69 6e 65 5d 0a 20 20 20   trim $line].   
0a40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
0a50: 20 20 69 66 20 7b 24 63 75 72 72 65 6e 74 5f 64    if {$current_d
0a60: 6f 63 20 21 3d 20 22 22 7d 20 7b 0a 20 20 20 20  oc != ""} {.    
0a70: 6c 61 70 70 65 6e 64 20 72 65 73 20 24 63 75 72  lappend res $cur
0a80: 72 65 6e 74 5f 68 65 61 64 65 72 20 24 63 75 72  rent_header $cur
0a90: 72 65 6e 74 5f 64 6f 63 0a 20 20 7d 0a 0a 20 20  rent_doc.  }..  
0aa0: 73 65 74 20 72 65 73 0a 7d 0a 0a 70 72 6f 63 20  set res.}..proc 
0ab0: 67 65 74 5f 74 6f 6b 65 6e 69 7a 65 72 5f 64 6f  get_tokenizer_do
0ac0: 63 73 20 7b 64 61 74 61 7d 20 7b 0a 20 20 72 65  cs {data} {.  re
0ad0: 67 65 78 70 20 7b 28 78 43 72 65 61 74 65 3a 2e  gexp {(xCreate:.
0ae0: 2a 3f 29 5b 2a 5d 2f 7d 20 24 64 61 74 61 20 2d  *?)[*]/} $data -
0af0: 3e 20 64 6f 63 73 0a 0a 20 20 73 65 74 20 72 65  > docs..  set re
0b00: 73 20 22 3c 64 6c 3e 5c 6e 22 0a 20 20 66 6f 72  s "<dl>\n".  for
0b10: 65 61 63 68 20 6c 69 6e 65 20 5b 73 70 6c 69 74  each line [split
0b20: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 64   [string trim $d
0b30: 6f 63 73 5d 20 22 5c 6e 22 5d 20 7b 0a 20 20 20  ocs] "\n"] {.   
0b40: 20 72 65 67 65 78 70 20 7b 5b 2a 5d 5b 2a 5d 28   regexp {[*][*](
0b50: 2e 2a 29 7d 20 24 6c 69 6e 65 20 2d 3e 20 6c 69  .*)} $line -> li
0b60: 6e 65 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65  ne.    if {[rege
0b70: 78 70 20 7b 5e 20 3f 78 2e 2a 3a 7d 20 24 6c 69  xp {^ ?x.*:} $li
0b80: 6e 65 5d 7d 20 7b 0a 20 20 20 20 20 20 61 70 70  ne]} {.      app
0b90: 65 6e 64 20 72 65 73 20 22 3c 64 74 3e 3c 62 3e  end res "<dt><b>
0ba0: 24 6c 69 6e 65 3c 2f 62 3e 3c 2f 64 74 3e 3c 64  $line</b></dt><d
0bb0: 64 3e 3c 70 20 73 74 79 6c 65 3d 6d 61 72 67 69  d><p style=margi
0bc0: 6e 2d 74 6f 70 3a 30 3e 5c 6e 22 0a 20 20 20 20  n-top:0>\n".    
0bd0: 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 7d    continue.    }
0be0: 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70  .    if {[regexp
0bf0: 20 7b 53 59 4e 4f 4e 59 4d 20 53 55 50 50 4f 52   {SYNONYM SUPPOR
0c00: 54 7d 20 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20 20  T} $line]} {.   
0c10: 20 20 20 73 65 74 20 6c 69 6e 65 20 22 3c 2f 64     set line "</d
0c20: 6c 3e 3c 68 33 3e 53 79 6e 6f 6e 79 6d 20 53 75  l><h3>Synonym Su
0c30: 70 70 6f 72 74 3c 2f 68 33 3e 22 0a 20 20 20 20  pport</h3>".    
0c40: 7d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  }.    if {[strin
0c50: 67 20 74 72 69 6d 20 24 6c 69 6e 65 5d 20 3d 3d  g trim $line] ==
0c60: 20 22 22 7d 20 7b 0a 20 20 20 20 20 20 61 70 70   ""} {.      app
0c70: 65 6e 64 20 72 65 73 20 22 3c 70 3e 5c 6e 22 0a  end res "<p>\n".
0c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
0c90: 20 20 20 61 70 70 65 6e 64 20 72 65 73 20 22 24     append res "$
0ca0: 6c 69 6e 65 5c 6e 22 0a 20 20 20 20 7d 0a 20 20  line\n".    }.  
0cb0: 7d 0a 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a  }..  set res.}..
0cc0: 70 72 6f 63 20 67 65 74 5f 61 70 69 5f 64 6f 63  proc get_api_doc
0cd0: 73 20 7b 64 61 74 61 7d 20 7b 0a 20 20 23 20 49  s {data} {.  # I
0ce0: 6e 69 74 69 61 6c 69 7a 65 20 67 6c 6f 62 61 6c  nitialize global
0cf0: 20 61 72 72 61 79 20 4d 20 61 73 20 61 20 6d 61   array M as a ma
0d00: 70 20 66 72 6f 6d 20 46 74 73 35 53 74 72 75 63  p from Fts5Struc
0d10: 74 75 72 65 41 70 69 20 6d 65 6d 62 65 72 20 6e  tureApi member n
0d20: 61 6d 65 0a 20 20 23 20 74 6f 20 6d 65 6d 62 65  ame.  # to membe
0d30: 72 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 69 2e  r definition. i.
0d40: 65 2e 0a 20 20 23 0a 20 20 23 20 20 20 69 56 65  e..  #.  #   iVe
0d50: 72 73 69 6f 6e 20 20 2d 3e 20 7b 69 6e 74 20 69  rsion  -> {int i
0d60: 56 65 72 73 69 6f 6e 7d 0a 20 20 23 20 20 20 78  Version}.  #   x
0d70: 55 73 65 72 44 61 74 61 20 2d 3e 20 7b 76 6f 69  UserData -> {voi
0d80: 64 20 2a 28 2a 78 55 73 65 72 44 61 74 61 29 28  d *(*xUserData)(
0d90: 46 74 73 35 43 6f 6e 74 65 78 74 2a 29 7d 0a 20  Fts5Context*)}. 
0da0: 20 23 20 20 20 2e 2e 2e 0a 20 20 23 0a 20 20 61   #   ....  #.  a
0db0: 72 72 61 79 20 73 65 74 20 4d 20 5b 67 65 74 5f  rray set M [get_
0dc0: 73 74 72 75 63 74 5f 6d 65 6d 62 65 72 73 20 24  struct_members $
0dd0: 64 61 74 61 5d 0a 20 20 0a 20 20 23 20 49 6e 69  data].  .  # Ini
0de0: 74 69 61 6c 69 7a 65 20 67 6c 6f 62 61 6c 20 6c  tialize global l
0df0: 69 73 74 20 44 20 61 73 20 61 20 6d 61 70 20 66  ist D as a map f
0e00: 72 6f 6d 20 73 65 63 74 69 6f 6e 20 6e 61 6d 65  rom section name
0e10: 20 74 6f 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f   to documentatio
0e20: 6e 0a 20 20 23 20 74 65 78 74 2e 20 4d 6f 73 74  n.  # text. Most
0e30: 20 28 61 6c 6c 3f 29 20 73 65 63 74 69 6f 6e 20   (all?) section 
0e40: 6e 61 6d 65 73 20 61 72 65 20 73 74 72 75 63 74  names are struct
0e50: 75 72 65 20 6d 65 6d 62 65 72 20 6e 61 6d 65 73  ure member names
0e60: 2e 0a 20 20 23 0a 20 20 73 65 74 20 44 20 5b 67  ..  #.  set D [g
0e70: 65 74 5f 73 74 72 75 63 74 5f 64 6f 63 73 20 24  et_struct_docs $
0e80: 64 61 74 61 20 5b 61 72 72 61 79 20 6e 61 6d 65  data [array name
0e90: 73 20 4d 5d 5d 0a 20 20 0a 20 20 6f 75 74 70 75  s M]].  .  outpu
0ea0: 74 20 22 3c 64 6c 3e 22 0a 20 20 66 6f 72 65 61  t "<dl>".  forea
0eb0: 63 68 20 7b 73 75 62 20 64 6f 63 73 7d 20 24 44  ch {sub docs} $D
0ec0: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f   {.    if {[info
0ed0: 20 65 78 69 73 74 73 20 4d 28 24 73 75 62 29 5d   exists M($sub)]
0ee0: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 68 64  } {.      set hd
0ef0: 72 20 24 4d 28 24 73 75 62 29 0a 20 20 20 20 20  r $M($sub).     
0f00: 20 73 65 74 20 6c 69 6e 6b 20 22 20 69 64 3d 24   set link " id=$
0f10: 73 75 62 22 0a 20 20 20 20 7d 20 65 6c 73 65 20  sub".    } else 
0f20: 7b 0a 20 20 20 20 20 20 73 65 74 20 6c 69 6e 6b  {.      set link
0f30: 20 22 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23   "".    }..    #
0f40: 6f 75 74 70 75 74 20 22 3c 68 72 20 63 6f 6c 6f  output "<hr colo
0f50: 72 3d 23 65 65 65 65 65 20 73 74 79 6c 65 3d 5c  r=#eeeee style=\
0f60: 22 6d 61 72 67 69 6e 3a 31 65 6d 20 38 2e 34 65  "margin:1em 8.4e
0f70: 78 20 30 20 38 2e 34 65 78 3b 5c 22 24 6c 69 6e  x 0 8.4ex;\"$lin
0f80: 6b 3e 22 0a 20 20 20 20 23 73 65 74 20 73 74 79  k>".    #set sty
0f90: 6c 65 20 22 70 61 64 64 69 6e 67 2d 6c 65 66 74  le "padding-left
0fa0: 3a 36 65 78 3b 66 6f 6e 74 2d 73 69 7a 65 3a 31  :6ex;font-size:1
0fb0: 2e 34 65 6d 3b 64 69 73 70 6c 61 79 3a 62 6c 6f  .4em;display:blo
0fc0: 63 6b 22 0a 20 20 20 20 23 6f 75 74 70 75 74 20  ck".    #output 
0fd0: 22 3c 68 20 73 74 79 6c 65 3d 5c 22 24 73 74 79  "<h style=\"$sty
0fe0: 6c 65 5c 22 3e 3c 70 72 65 3e 24 68 64 72 3c 2f  le\"><pre>$hdr</
0ff0: 70 72 65 3e 3c 2f 68 3e 22 0a 0a 20 20 20 20 72  pre></h>"..    r
1000: 65 67 73 75 62 20 2d 6c 69 6e 65 20 7b 5e 20 20  egsub -line {^  
1010: 2a 5b 29 5d 7d 20 24 68 64 72 20 22 29 22 20 68  *[)]} $hdr ")" h
1020: 64 72 0a 20 20 20 20 6f 75 74 70 75 74 20 22 3c  dr.    output "<
1030: 64 74 20 73 74 79 6c 65 3d 5c 22 77 68 69 74 65  dt style=\"white
1040: 2d 73 70 61 63 65 3a 70 72 65 3b 66 6f 6e 74 2d  -space:pre;font-
1050: 66 61 6d 69 6c 79 3a 6d 6f 6e 6f 73 70 61 63 65  family:monospace
1060: 3b 66 6f 6e 74 2d 73 69 7a 65 3a 31 32 30 25 5c  ;font-size:120%\
1070: 22 22 0a 20 20 20 20 6f 75 74 70 75 74 20 22 24  "".    output "$
1080: 6c 69 6e 6b 3e 22 0a 20 20 20 20 6f 75 74 70 75  link>".    outpu
1090: 74 20 22 3c 62 3e 24 68 64 72 3c 2f 62 3e 3c 2f  t "<b>$hdr</b></
10a0: 64 74 3e 3c 64 64 3e 22 0a 20 20 0a 20 20 20 20  dt><dd>".  .    
10b0: 73 65 74 20 6d 6f 64 65 20 22 22 0a 20 20 20 20  set mode "".    
10c0: 73 65 74 20 6d 61 72 67 69 6e 20 22 20 73 74 79  set margin " sty
10d0: 6c 65 3d 6d 61 72 67 69 6e 2d 74 6f 70 3a 30 2e  le=margin-top:0.
10e0: 31 65 6d 22 0a 20 20 20 20 66 6f 72 65 61 63 68  1em".    foreach
10f0: 20 6c 69 6e 65 20 5b 73 70 6c 69 74 20 5b 73 74   line [split [st
1100: 72 69 6e 67 20 74 72 69 6d 20 24 64 6f 63 73 5d  ring trim $docs]
1110: 20 22 5c 6e 22 5d 20 7b 0a 20 20 20 20 20 20 69   "\n"] {.      i
1120: 66 20 7b 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  f {[string trim 
1130: 24 6c 69 6e 65 5d 3d 3d 22 22 7d 20 7b 0a 20 20  $line]==""} {.  
1140: 20 20 20 20 20 20 69 66 20 7b 24 6d 6f 64 65 20        if {$mode 
1150: 21 3d 20 22 22 7d 20 7b 6f 75 74 70 75 74 20 22  != ""} {output "
1160: 3c 2f 24 6d 6f 64 65 3e 22 7d 0a 20 20 20 20 20  </$mode>"}.     
1170: 20 20 20 73 65 74 20 6d 6f 64 65 20 22 22 0a 20     set mode "". 
1180: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
1190: 6d 6f 64 65 20 3d 3d 20 22 22 7d 20 7b 0a 20 20  mode == ""} {.  
11a0: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
11b0: 70 20 7b 5e 20 20 20 20 20 7d 20 24 6c 69 6e 65  p {^     } $line
11c0: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ]} {.          s
11d0: 65 74 20 6d 6f 64 65 20 63 6f 64 65 62 6c 6f 63  et mode codebloc
11e0: 6b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  k.        } else
11f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
1200: 20 6d 6f 64 65 20 70 0a 20 20 20 20 20 20 20 20   mode p.        
1210: 7d 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  }.        output
1220: 20 22 3c 24 6d 6f 64 65 24 6d 61 72 67 69 6e 3e   "<$mode$margin>
1230: 22 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  ".        set ma
1240: 72 67 69 6e 20 22 22 0a 20 20 20 20 20 20 7d 0a  rgin "".      }.
1250: 20 20 20 20 20 20 6f 75 74 70 75 74 20 24 6c 69        output $li
1260: 6e 65 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  ne.    }.    if 
1270: 7b 24 6d 6f 64 65 20 21 3d 20 22 22 7d 20 7b 6f  {$mode != ""} {o
1280: 75 74 70 75 74 20 22 3c 2f 24 6d 6f 64 65 3e 22  utput "</$mode>"
1290: 7d 0a 20 20 20 20 6f 75 74 70 75 74 20 22 3c 2f  }.    output "</
12a0: 64 64 3e 22 0a 20 20 7d 0a 20 20 6f 75 74 70 75  dd>".  }.  outpu
12b0: 74 20 22 3c 2f 64 6c 3e 22 0a 7d 0a 0a 70 72 6f  t "</dl>".}..pro
12c0: 63 20 67 65 74 5f 66 74 73 35 5f 73 74 72 75 63  c get_fts5_struc
12d0: 74 20 7b 64 61 74 61 20 73 74 61 72 74 20 65 6e  t {data start en
12e0: 64 7d 20 7b 0a 20 20 73 65 74 20 72 65 73 20 22  d} {.  set res "
12f0: 22 0a 20 20 73 65 74 20 62 4f 75 74 20 30 0a 20  ".  set bOut 0. 
1300: 20 66 6f 72 65 61 63 68 20 6c 69 6e 65 20 5b 73   foreach line [s
1310: 70 6c 69 74 20 24 64 61 74 61 20 22 5c 6e 22 5d  plit $data "\n"]
1320: 20 7b 0a 20 20 20 20 69 66 20 7b 24 62 4f 75 74   {.    if {$bOut
1330: 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 69 66 20  ==0} {.      if 
1340: 7b 5b 72 65 67 65 78 70 20 24 73 74 61 72 74 20  {[regexp $start 
1350: 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20 20 20 20 20  $line]} {.      
1360: 20 20 73 65 74 20 62 4f 75 74 20 31 0a 20 20 20    set bOut 1.   
1370: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1380: 69 66 20 7b 24 62 4f 75 74 7d 20 7b 0a 20 20 20  if {$bOut} {.   
1390: 20 20 20 61 70 70 65 6e 64 20 72 65 73 20 22 24     append res "$
13a0: 6c 69 6e 65 5c 6e 22 0a 20 20 20 20 7d 0a 0a 20  line\n".    }.. 
13b0: 20 20 20 69 66 20 7b 24 62 4f 75 74 7d 20 7b 0a     if {$bOut} {.
13c0: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
13d0: 70 20 24 65 6e 64 20 24 6c 69 6e 65 5d 7d 20 7b  p $end $line]} {
13e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 62 4f 75  .        set bOu
13f0: 74 20 30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t 0.      }.    
1400: 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 6d 61 70  }.  }..  set map
1410: 20 5b 6c 69 73 74 20 2f 2a 20 3c 69 3e 2f 2a 20   [list /* <i>/* 
1420: 2a 2f 20 2a 2f 3c 2f 69 3e 5d 0a 20 20 73 74 72  */ */</i>].  str
1430: 69 6e 67 20 6d 61 70 20 24 6d 61 70 20 24 72 65  ing map $map $re
1440: 73 0a 7d 0a 0a 70 72 6f 63 20 6d 61 69 6e 20 7b  s.}..proc main {
1450: 64 61 74 61 7d 20 7b 0a 20 20 73 77 69 74 63 68  data} {.  switch
1460: 20 24 3a 3a 65 78 74 72 61 63 74 5f 61 70 69 5f   $::extract_api_
1470: 64 6f 63 73 5f 6d 6f 64 65 20 7b 0a 20 20 20 20  docs_mode {.    
1480: 66 74 73 35 5f 61 70 69 20 7b 0a 20 20 20 20 20  fts5_api {.     
1490: 20 6f 75 74 70 75 74 20 5b 67 65 74 5f 66 74 73   output [get_fts
14a0: 35 5f 73 74 72 75 63 74 20 24 64 61 74 61 20 22  5_struct $data "
14b0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 66  typedef struct f
14c0: 74 73 35 5f 61 70 69 22 20 22 5e 5c 7d 3b 22 5d  ts5_api" "^\};"]
14d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
14e0: 5f 74 6f 6b 65 6e 69 7a 65 72 20 7b 0a 20 20 20  _tokenizer {.   
14f0: 20 20 20 6f 75 74 70 75 74 20 5b 67 65 74 5f 66     output [get_f
1500: 74 73 35 5f 73 74 72 75 63 74 20 24 64 61 74 61  ts5_struct $data
1510: 20 22 74 79 70 65 64 65 66 20 73 74 72 75 63 74   "typedef struct
1520: 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 22 20   Fts5Tokenizer" 
1530: 22 5e 5c 7d 3b 22 5d 0a 20 20 20 20 20 20 6f 75  "^\};"].      ou
1540: 74 70 75 74 20 5b 67 65 74 5f 66 74 73 35 5f 73  tput [get_fts5_s
1550: 74 72 75 63 74 20 24 64 61 74 61 20 5c 0a 20 20  truct $data \.  
1560: 20 20 20 20 20 20 22 46 6c 61 67 73 20 74 68 61        "Flags tha
1570: 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  t may be passed 
1580: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
1590: 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b 65 6e 69  ument to xTokeni
15a0: 7a 65 28 29 22 20 5c 0a 20 20 20 20 20 20 20 20  ze()" \.        
15b0: 22 23 64 65 66 69 6e 65 20 46 54 53 35 5f 54 4f  "#define FTS5_TO
15c0: 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 22 0a 20  KEN_COLOCATED". 
15d0: 20 20 20 20 20 5d 0a 20 20 20 20 7d 0a 0a 20 20       ].    }..  
15e0: 20 20 66 74 73 35 5f 65 78 74 65 6e 73 69 6f 6e    fts5_extension
15f0: 20 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 20   {.      output 
1600: 5b 67 65 74 5f 66 74 73 35 5f 73 74 72 75 63 74  [get_fts5_struct
1610: 20 24 64 61 74 61 20 22 74 79 70 65 64 65 66 2e   $data "typedef.
1620: 2a 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70  *Fts5ExtensionAp
1630: 69 22 20 22 5e 2e 3b 22 5d 0a 20 20 20 20 7d 0a  i" "^.;"].    }.
1640: 0a 20 20 20 20 46 74 73 35 45 78 74 65 6e 73 69  .    Fts5Extensi
1650: 6f 6e 41 70 69 20 7b 0a 20 20 20 20 20 20 73 65  onApi {.      se
1660: 74 20 73 74 72 75 63 74 20 5b 67 65 74 5f 66 74  t struct [get_ft
1670: 73 35 5f 73 74 72 75 63 74 20 24 64 61 74 61 20  s5_struct $data 
1680: 22 5e 73 74 72 75 63 74 20 46 74 73 35 45 78 74  "^struct Fts5Ext
1690: 65 6e 73 69 6f 6e 41 70 69 22 20 22 5e 2e 3b 22  ensionApi" "^.;"
16a0: 5d 0a 20 20 20 20 20 20 73 65 74 20 6d 61 70 20  ].      set map 
16b0: 5b 6c 69 73 74 5d 0a 20 20 20 20 20 20 66 6f 72  [list].      for
16c0: 65 61 63 68 20 7b 6b 20 76 7d 20 5b 67 65 74 5f  each {k v} [get_
16d0: 73 74 72 75 63 74 5f 6d 65 6d 62 65 72 73 20 24  struct_members $
16e0: 64 61 74 61 5d 20 7b 0a 20 20 20 20 20 20 20 20  data] {.        
16f0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
1700: 68 20 78 2a 20 24 6b 5d 3d 3d 30 7d 20 63 6f 6e  h x* $k]==0} con
1710: 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20 6c 61  tinue.        la
1720: 70 70 65 6e 64 20 6d 61 70 20 24 6b 20 22 3c 61  ppend map $k "<a
1730: 20 68 72 65 66 3d 23 24 6b 3e 24 6b 3c 2f 61 3e   href=#$k>$k</a>
1740: 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ".      }.      
1750: 6f 75 74 70 75 74 20 5b 73 74 72 69 6e 67 20 6d  output [string m
1760: 61 70 20 24 6d 61 70 20 24 73 74 72 75 63 74 5d  ap $map $struct]
1770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 70 69 20  .    }..    api 
1780: 7b 0a 20 20 20 20 20 20 67 65 74 5f 61 70 69 5f  {.      get_api_
1790: 64 6f 63 73 20 24 64 61 74 61 0a 20 20 20 20 7d  docs $data.    }
17a0: 0a 0a 20 20 20 20 74 6f 6b 65 6e 69 7a 65 72 5f  ..    tokenizer_
17b0: 61 70 69 20 7b 0a 20 20 20 20 20 20 6f 75 74 70  api {.      outp
17c0: 75 74 20 5b 67 65 74 5f 74 6f 6b 65 6e 69 7a 65  ut [get_tokenize
17d0: 72 5f 64 6f 63 73 20 24 64 61 74 61 5d 0a 20 20  r_docs $data].  
17e0: 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74    }..    default
17f0: 20 7b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 6d   {.    }.  }.}.m
1800: 61 69 6e 20 24 64 61 74 61 0a 0a 73 65 74 20 3a  ain $data..set :
1810: 3a 66 74 73 35 5f 64 6f 63 73 5f 6f 75 74 70 75  :fts5_docs_outpu
1820: 74 0a 0a 0a 0a 0a 0a                             t......