Documentation Source Text

Hex Artifact Content
Login

Artifact 2fdbb765c38a4467687ba390e07c1229d4939a3b:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 68  #!/usr/bin/tclsh
0010: 0a 23 0a 23 20 52 75 6e 20 74 68 69 73 20 73 63  .#.# Run this sc
0020: 72 69 70 74 20 72 65 64 69 72 65 63 74 69 6e 67  ript redirecting
0030: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 68 20 66   the sqlite3.h f
0040: 69 6c 65 20 61 73 20 73 74 61 6e 64 61 72 64 0a  ile as standard.
0050: 23 20 69 6e 70 75 74 73 20 61 6e 64 20 74 68 69  # inputs and thi
0060: 73 20 73 63 72 69 70 74 20 77 69 6c 6c 20 67 65  s script will ge
0070: 6e 65 72 61 74 65 20 41 50 49 20 64 6f 63 75 6d  nerate API docum
0080: 65 6e 74 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20  entation..#.set 
0090: 72 63 73 69 64 20 7b 24 49 64 3a 20 6d 6b 61 70  rcsid {$Id: mkap
00a0: 69 64 6f 63 2e 74 63 6c 2c 76 20 31 2e 32 20 32  idoc.tcl,v 1.2 2
00b0: 30 30 37 2f 30 36 2f 32 30 20 30 39 3a 30 39 3a  007/06/20 09:09:
00c0: 34 38 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  48 danielk1977 E
00d0: 78 70 20 24 7d 0a 73 6f 75 72 63 65 20 63 6f 6d  xp $}.source com
00e0: 6d 6f 6e 2e 74 63 6c 0a 68 65 61 64 65 72 20 7b  mon.tcl.header {
00f0: 43 2f 43 2b 2b 20 49 6e 74 65 72 66 61 63 65 20  C/C++ Interface 
0100: 46 6f 72 20 53 51 4c 69 74 65 20 56 65 72 73 69  For SQLite Versi
0110: 6f 6e 20 33 7d 0a 70 75 74 73 20 7b 0a 3c 68 32  on 3}.puts {.<h2
0120: 20 63 6c 61 73 73 3d 70 64 66 5f 73 65 63 74 69   class=pdf_secti
0130: 6f 6e 3e 43 2f 43 2b 2b 20 49 6e 74 65 72 66 61  on>C/C++ Interfa
0140: 63 65 20 46 6f 72 20 53 51 4c 69 74 65 20 56 65  ce For SQLite Ve
0150: 72 73 69 6f 6e 20 33 3c 2f 68 32 3e 0a 7d 0a 0a  rsion 3</h2>.}..
0160: 23 20 53 63 61 6e 20 73 74 61 6e 64 61 72 64 20  # Scan standard 
0170: 69 6e 70 75 74 20 74 6f 20 65 78 74 72 61 63 74  input to extract
0180: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
0190: 20 77 65 20 6e 65 65 64 0a 23 20 74 6f 20 62 75   we need.# to bu
01a0: 69 6c 64 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  ild the document
01b0: 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20 74 69 74  ation..#.set tit
01c0: 6c 65 20 7b 7d 0a 73 65 74 20 74 79 70 65 20 7b  le {}.set type {
01d0: 7d 0a 73 65 74 20 62 6f 64 79 20 7b 7d 0a 73 65  }.set body {}.se
01e0: 74 20 63 6f 64 65 20 7b 7d 0a 73 65 74 20 70 68  t code {}.set ph
01f0: 61 73 65 20 30 0a 73 65 74 20 63 6f 6e 74 65 6e  ase 0.set conten
0200: 74 20 7b 7d 0a 77 68 69 6c 65 20 7b 21 5b 65 6f  t {}.while {![eo
0210: 66 20 73 74 64 69 6e 5d 7d 20 7b 0a 20 20 73 65  f stdin]} {.  se
0220: 74 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64  t line [gets std
0230: 69 6e 5d 0a 20 20 69 66 20 7b 24 70 68 61 73 65  in].  if {$phase
0240: 3d 3d 30 7d 20 7b 0a 20 20 20 20 23 20 4c 6f 6f  ==0} {.    # Loo
0250: 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 43 41 50  king for the CAP
0260: 49 33 52 45 46 3a 20 6b 65 79 77 6f 72 64 0a 20  I3REF: keyword. 
0270: 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b     if {[regexp {
0280: 5e 5c 2a 5c 2a 20 43 41 50 49 33 52 45 46 3a 20  ^\*\* CAPI3REF: 
0290: 2b 28 2e 2a 29 7d 20 24 6c 69 6e 65 20 61 6c 6c  +(.*)} $line all
02a0: 20 74 78 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65   tx]} {.      se
02b0: 74 20 74 69 74 6c 65 20 24 74 78 0a 20 20 20 20  t title $tx.    
02c0: 20 20 73 65 74 20 70 68 61 73 65 20 31 0a 20 20    set phase 1.  
02d0: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 69 66 20 7b    }.  } elseif {
02e0: 24 70 68 61 73 65 3d 3d 31 7d 20 7b 0a 20 20 20  $phase==1} {.   
02f0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 72 61 6e   if {[string ran
0300: 67 65 20 24 6c 69 6e 65 20 30 20 31 5d 3d 3d 22  ge $line 0 1]=="
0310: 2a 2a 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  **"} {.      set
0320: 20 6c 78 20 5b 73 74 72 69 6e 67 20 74 72 69 6d   lx [string trim
0330: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
0340: 6c 69 6e 65 20 33 20 65 6e 64 5d 5d 0a 20 20 20  line 3 end]].   
0350: 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b     if {[regexp {
0360: 5e 43 41 54 45 47 4f 52 59 3a 20 2b 28 5b 61 2d  ^CATEGORY: +([a-
0370: 7a 5d 2a 29 7d 20 24 6c 78 20 61 6c 6c 20 63 78  z]*)} $lx all cx
0380: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ]} {.        set
0390: 20 74 79 70 65 20 24 63 78 0a 20 20 20 20 20 20   type $cx.      
03a0: 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78  } elseif {[regex
03b0: 70 20 7b 5e 4b 45 59 57 4f 52 44 53 3a 20 2b 28  p {^KEYWORDS: +(
03c0: 2e 2a 29 7d 20 24 6c 78 20 61 6c 6c 20 6b 78 5d  .*)} $lx all kx]
03d0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65  } {.        fore
03e0: 61 63 68 20 6b 20 24 6b 78 20 7b 0a 20 20 20 20  ach k $kx {.    
03f0: 20 20 20 20 20 20 73 65 74 20 6b 65 79 77 6f 72        set keywor
0400: 64 28 24 6b 29 20 31 0a 20 20 20 20 20 20 20 20  d($k) 1.        
0410: 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
0420: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
0430: 62 6f 64 79 20 24 6c 78 5c 6e 0a 20 20 20 20 20  body $lx\n.     
0440: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20   }.    } elseif 
0450: 7b 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24  {[string range $
0460: 6c 69 6e 65 20 30 20 31 5d 3d 3d 22 2a 2f 22 7d  line 0 1]=="*/"}
0470: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70 68 61   {.      set pha
0480: 73 65 20 32 0a 20 20 20 20 7d 0a 20 20 7d 20 65  se 2.    }.  } e
0490: 6c 73 65 69 66 20 7b 24 70 68 61 73 65 3d 3d 32  lseif {$phase==2
04a0: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 6c 69 6e  } {.    if {$lin
04b0: 65 3d 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 73  e==""} {.      s
04c0: 65 74 20 6b 77 6c 69 73 74 20 5b 6c 73 6f 72 74  et kwlist [lsort
04d0: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 6b 65   [array names ke
04e0: 79 77 6f 72 64 5d 5d 0a 20 20 20 20 20 20 75 6e  yword]].      un
04f0: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
0500: 6b 65 79 77 6f 72 64 0a 20 20 20 20 20 20 73 65  keyword.      se
0510: 74 20 6b 65 79 20 24 74 79 70 65 3a 24 6b 77 6c  t key $type:$kwl
0520: 69 73 74 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  ist.      lappen
0530: 64 20 63 6f 6e 74 65 6e 74 20 5b 6c 69 73 74 20  d content [list 
0540: 24 6b 65 79 20 24 74 69 74 6c 65 20 24 74 79 70  $key $title $typ
0550: 65 20 24 6b 77 6c 69 73 74 20 24 62 6f 64 79 20  e $kwlist $body 
0560: 24 63 6f 64 65 5d 0a 20 20 20 20 20 20 73 65 74  $code].      set
0570: 20 74 69 74 6c 65 20 7b 7d 0a 20 20 20 20 20 20   title {}.      
0580: 73 65 74 20 6b 65 79 77 6f 72 64 73 20 7b 7d 0a  set keywords {}.
0590: 20 20 20 20 20 20 73 65 74 20 74 79 70 65 20 7b        set type {
05a0: 7d 0a 20 20 20 20 20 20 73 65 74 20 62 6f 64 79  }.      set body
05b0: 20 7b 7d 0a 20 20 20 20 20 20 73 65 74 20 63 6f   {}.      set co
05c0: 64 65 20 7b 7d 0a 20 20 20 20 20 20 73 65 74 20  de {}.      set 
05d0: 70 68 61 73 65 20 30 0a 20 20 20 20 7d 20 65 6c  phase 0.    } el
05e0: 73 65 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b  se {.      if {[
05f0: 72 65 67 65 78 70 20 7b 5e 23 64 65 66 69 6e 65  regexp {^#define
0600: 20 28 53 51 4c 49 54 45 5f 5b 41 2d 5a 30 2d 39   (SQLITE_[A-Z0-9
0610: 5f 5d 2b 29 7d 20 24 6c 69 6e 65 20 61 6c 6c 20  _]+)} $line all 
0620: 6b 78 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  kx]} {.        s
0630: 65 74 20 74 79 70 65 20 63 6f 6e 73 74 61 6e 74  et type constant
0640: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6b 65 79  .        set key
0650: 77 6f 72 64 28 24 6b 78 29 20 31 0a 20 20 20 20  word($kx) 1.    
0660: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65 67    } elseif {[reg
0670: 65 78 70 20 7b 5e 74 79 70 65 64 65 66 20 2e 2a  exp {^typedef .*
0680: 20 28 73 71 6c 69 74 65 5b 30 2d 39 61 2d 7a 5f   (sqlite[0-9a-z_
0690: 5d 2b 29 3b 7d 20 24 6c 69 6e 65 20 61 6c 6c 20  ]+);} $line all 
06a0: 6b 78 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  kx]} {.        s
06b0: 65 74 20 74 79 70 65 20 64 61 74 61 74 79 70 65  et type datatype
06c0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6b 65 79  .        set key
06d0: 77 6f 72 64 28 24 6b 78 29 20 31 0a 20 20 20 20  word($kx) 1.    
06e0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65 67    } elseif {[reg
06f0: 65 78 70 20 7b 5e 5b 61 2d 7a 5d 2e 2a 5b 20 2a  exp {^[a-z].*[ *
0700: 5d 28 73 71 6c 69 74 65 33 5f 5b 61 2d 7a 30 2d  ](sqlite3_[a-z0-
0710: 39 5f 5d 2b 29 5c 28 7d 20 24 6c 69 6e 65 20 61  9_]+)\(} $line a
0720: 6c 6c 20 6b 78 5d 7d 20 7b 0a 20 20 20 20 20 20  ll kx]} {.      
0730: 20 20 73 65 74 20 74 79 70 65 20 66 75 6e 63 74    set type funct
0740: 69 6f 6e 0a 20 20 20 20 20 20 20 20 73 65 74 20  ion.        set 
0750: 6b 65 79 77 6f 72 64 28 24 6b 78 29 20 31 0a 20  keyword($kx) 1. 
0760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70       }.      app
0770: 65 6e 64 20 63 6f 64 65 20 24 6c 69 6e 65 5c 6e  end code $line\n
0780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 20  .    }.  }.}..# 
0790: 4f 75 74 70 75 74 20 48 54 4d 4c 20 74 68 61 74  Output HTML that
07a0: 20 64 69 73 70 6c 61 79 73 20 74 68 65 20 67 69   displays the gi
07b0: 76 65 6e 20 6c 69 73 74 20 69 6e 20 4e 20 63 6f  ven list in N co
07c0: 6c 75 6d 6e 73 0a 23 0a 70 72 6f 63 20 6f 75 74  lumns.#.proc out
07d0: 70 75 74 5f 6c 69 73 74 20 7b 4e 20 6c 78 7d 20  put_list {N lx} 
07e0: 7b 0a 20 20 70 75 74 73 20 7b 3c 74 61 62 6c 65  {.  puts {<table
07f0: 20 77 69 64 74 68 3d 22 31 30 30 25 22 20 63 65   width="100%" ce
0800: 6c 6c 70 61 64 64 69 6e 67 3d 22 35 22 3e 3c 74  llpadding="5"><t
0810: 72 3e 7d 0a 20 20 73 65 74 20 6c 65 6e 20 5b 6c  r>}.  set len [l
0820: 6c 65 6e 67 74 68 20 24 6c 78 5d 0a 20 20 73 65  length $lx].  se
0830: 74 20 6e 20 5b 65 78 70 72 20 7b 28 24 6c 65 6e  t n [expr {($len
0840: 20 2b 20 24 4e 20 2d 20 31 29 2f 24 4e 7d 5d 0a   + $N - 1)/$N}].
0850: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
0860: 7b 24 69 3c 24 4e 7d 20 7b 69 6e 63 72 20 69 7d  {$i<$N} {incr i}
0870: 20 7b 0a 20 20 20 20 73 65 74 20 73 74 61 72 74   {.    set start
0880: 20 5b 65 78 70 72 20 7b 24 69 2a 24 6e 7d 5d 0a   [expr {$i*$n}].
0890: 20 20 20 20 73 65 74 20 65 6e 64 20 5b 65 78 70      set end [exp
08a0: 72 20 7b 28 24 69 2b 31 29 2a 24 6e 7d 5d 0a 20  r {($i+1)*$n}]. 
08b0: 20 20 20 70 75 74 73 20 7b 3c 74 64 20 76 61 6c     puts {<td val
08c0: 69 67 6e 3d 22 74 6f 70 22 3e 3c 75 6c 3e 7d 0a  ign="top"><ul>}.
08d0: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 6a 20 24      for {set j $
08e0: 73 74 61 72 74 7d 20 7b 24 6a 3c 24 65 6e 64 7d  start} {$j<$end}
08f0: 20 7b 69 6e 63 72 20 6a 7d 20 7b 0a 20 20 20 20   {incr j} {.    
0900: 20 20 73 65 74 20 65 6e 74 72 79 20 5b 6c 69 6e    set entry [lin
0910: 64 65 78 20 24 6c 78 20 24 6a 5d 0a 20 20 20 20  dex $lx $j].    
0920: 20 20 69 66 20 7b 24 65 6e 74 72 79 21 3d 22 22    if {$entry!=""
0930: 7d 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65  } {.        fore
0940: 61 63 68 20 7b 6c 69 6e 6b 20 6c 61 62 65 6c 7d  ach {link label}
0950: 20 24 65 6e 74 72 79 20 62 72 65 61 6b 0a 20 20   $entry break.  
0960: 20 20 20 20 20 20 70 75 74 73 20 22 3c 6c 69 3e        puts "<li>
0970: 3c 61 20 68 72 65 66 3d 5c 22 23 24 6c 69 6e 6b  <a href=\"#$link
0980: 5c 22 3e 24 6c 61 62 65 6c 3c 2f 61 3e 3c 2f 6c  \">$label</a></l
0990: 69 3e 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i>".      }.    
09a0: 7d 0a 20 20 20 20 70 75 74 73 20 7b 3c 2f 75 6c  }.    puts {</ul
09b0: 3e 3c 2f 74 64 3e 7d 0a 20 20 7d 0a 20 20 70 75  ></td>}.  }.  pu
09c0: 74 73 20 7b 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65  ts {</tr></table
09d0: 3e 7d 0a 7d 0a 0a 23 20 44 6f 20 61 20 74 61 62  >}.}..# Do a tab
09e0: 6c 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66  le of contents f
09f0: 6f 72 20 6f 62 6a 65 63 74 73 0a 23 0a 73 65 74  or objects.#.set
0a00: 20 6f 62 6a 6c 69 73 74 20 7b 7d 0a 66 6f 72 65   objlist {}.fore
0a10: 61 63 68 20 63 20 24 63 6f 6e 74 65 6e 74 20 7b  ach c $content {
0a20: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6b 65 79 20  .  foreach {key 
0a30: 74 69 74 6c 65 20 74 79 70 65 20 6b 65 79 77 6f  title type keywo
0a40: 72 64 73 20 62 6f 64 79 20 63 6f 64 65 7d 20 24  rds body code} $
0a50: 63 20 62 72 65 61 6b 0a 20 20 69 66 20 7b 24 74  c break.  if {$t
0a60: 79 70 65 21 3d 22 64 61 74 61 74 79 70 65 22 7d  ype!="datatype"}
0a70: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 73 65 74 20   continue.  set 
0a80: 6b 65 79 77 6f 72 64 73 20 5b 6c 73 6f 72 74 20  keywords [lsort 
0a90: 24 6b 65 79 77 6f 72 64 73 5d 0a 20 20 73 65 74  $keywords].  set
0aa0: 20 6b 20 5b 6c 69 6e 64 65 78 20 24 6b 65 79 77   k [lindex $keyw
0ab0: 6f 72 64 73 20 30 5d 0a 20 20 66 6f 72 65 61 63  ords 0].  foreac
0ac0: 68 20 6b 77 20 24 6b 65 79 77 6f 72 64 73 20 7b  h kw $keywords {
0ad0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 62 6a  .    lappend obj
0ae0: 6c 69 73 74 20 5b 6c 69 73 74 20 24 6b 20 24 6b  list [list $k $k
0af0: 77 5d 0a 20 20 7d 0a 7d 0a 70 75 74 73 20 7b 3c  w].  }.}.puts {<
0b00: 68 32 3e 44 61 74 61 74 79 70 65 73 3a 3c 2f 68  h2>Datatypes:</h
0b10: 32 3e 7d 0a 6f 75 74 70 75 74 5f 6c 69 73 74 20  2>}.output_list 
0b20: 33 20 24 6f 62 6a 6c 69 73 74 0a 70 75 74 73 20  3 $objlist.puts 
0b30: 7b 3c 68 72 3e 7d 0a 0a 23 20 44 6f 20 61 20 74  {<hr>}..# Do a t
0b40: 61 62 6c 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73  able of contents
0b50: 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 0a 23   for constants.#
0b60: 0a 73 65 74 20 63 6c 69 73 74 20 7b 7d 0a 66 6f  .set clist {}.fo
0b70: 72 65 61 63 68 20 63 20 24 63 6f 6e 74 65 6e 74  reach c $content
0b80: 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 6b 65   {.  foreach {ke
0b90: 79 20 74 69 74 6c 65 20 74 79 70 65 20 6b 65 79  y title type key
0ba0: 77 6f 72 64 73 20 62 6f 64 79 20 63 6f 64 65 7d  words body code}
0bb0: 20 24 63 20 62 72 65 61 6b 0a 20 20 69 66 20 7b   $c break.  if {
0bc0: 24 74 79 70 65 21 3d 22 63 6f 6e 73 74 61 6e 74  $type!="constant
0bd0: 22 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 73 65  "} continue.  se
0be0: 74 20 6b 65 79 77 6f 72 64 73 20 5b 6c 73 6f 72  t keywords [lsor
0bf0: 74 20 24 6b 65 79 77 6f 72 64 73 5d 0a 20 20 73  t $keywords].  s
0c00: 65 74 20 6b 20 5b 6c 69 6e 64 65 78 20 24 6b 65  et k [lindex $ke
0c10: 79 77 6f 72 64 73 20 30 5d 0a 20 20 66 6f 72 65  ywords 0].  fore
0c20: 61 63 68 20 6b 77 20 24 6b 65 79 77 6f 72 64 73  ach kw $keywords
0c30: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 63   {.    lappend c
0c40: 6c 69 73 74 20 5b 6c 69 73 74 20 24 6b 20 24 6b  list [list $k $k
0c50: 77 5d 0a 20 20 7d 0a 7d 0a 70 75 74 73 20 7b 3c  w].  }.}.puts {<
0c60: 68 32 3e 43 6f 6e 73 74 61 6e 74 73 3a 3c 2f 68  h2>Constants:</h
0c70: 32 3e 7d 0a 73 65 74 20 63 6c 69 73 74 20 5b 6c  2>}.set clist [l
0c80: 73 6f 72 74 20 2d 69 6e 64 65 78 20 31 20 24 63  sort -index 1 $c
0c90: 6c 69 73 74 5d 0a 6f 75 74 70 75 74 5f 6c 69 73  list].output_lis
0ca0: 74 20 33 20 24 63 6c 69 73 74 0a 70 75 74 73 20  t 3 $clist.puts 
0cb0: 7b 3c 68 72 3e 7d 0a 0a 0a 23 20 44 6f 20 61 20  {<hr>}...# Do a 
0cc0: 74 61 62 6c 65 20 6f 66 20 63 6f 6e 74 65 6e 74  table of content
0cd0: 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 73 0a  s for functions.
0ce0: 23 0a 73 65 74 20 66 75 6e 63 6c 69 73 74 20 7b  #.set funclist {
0cf0: 7d 0a 66 6f 72 65 61 63 68 20 63 20 24 63 6f 6e  }.foreach c $con
0d00: 74 65 6e 74 20 7b 0a 20 20 66 6f 72 65 61 63 68  tent {.  foreach
0d10: 20 7b 6b 65 79 20 74 69 74 6c 65 20 74 79 70 65   {key title type
0d20: 20 6b 65 79 77 6f 72 64 73 20 62 6f 64 79 20 63   keywords body c
0d30: 6f 64 65 7d 20 24 63 20 62 72 65 61 6b 0a 20 20  ode} $c break.  
0d40: 69 66 20 7b 24 74 79 70 65 21 3d 22 66 75 6e 63  if {$type!="func
0d50: 74 69 6f 6e 22 7d 20 63 6f 6e 74 69 6e 75 65 0a  tion"} continue.
0d60: 20 20 73 65 74 20 6b 65 79 77 6f 72 64 73 20 5b    set keywords [
0d70: 6c 73 6f 72 74 20 24 6b 65 79 77 6f 72 64 73 5d  lsort $keywords]
0d80: 0a 20 20 73 65 74 20 6b 20 5b 6c 69 6e 64 65 78  .  set k [lindex
0d90: 20 24 6b 65 79 77 6f 72 64 73 20 30 5d 0a 20 20   $keywords 0].  
0da0: 66 6f 72 65 61 63 68 20 6b 77 20 24 6b 65 79 77  foreach kw $keyw
0db0: 6f 72 64 73 20 7b 0a 20 20 20 20 6c 61 70 70 65  ords {.    lappe
0dc0: 6e 64 20 66 75 6e 63 6c 69 73 74 20 5b 6c 69 73  nd funclist [lis
0dd0: 74 20 24 6b 20 24 6b 77 5d 0a 20 20 7d 0a 7d 0a  t $k $kw].  }.}.
0de0: 70 75 74 73 20 7b 3c 68 32 3e 46 75 6e 63 74 69  puts {<h2>Functi
0df0: 6f 6e 73 3a 3c 2f 68 32 3e 7d 0a 73 65 74 20 66  ons:</h2>}.set f
0e00: 75 6e 63 6c 69 73 74 20 5b 6c 73 6f 72 74 20 2d  unclist [lsort -
0e10: 69 6e 64 65 78 20 31 20 24 66 75 6e 63 6c 69 73  index 1 $funclis
0e20: 74 5d 0a 6f 75 74 70 75 74 5f 6c 69 73 74 20 33  t].output_list 3
0e30: 20 24 66 75 6e 63 6c 69 73 74 0a 70 75 74 73 20   $funclist.puts 
0e40: 7b 3c 68 72 3e 7d 0a 0a 23 20 52 65 73 6f 6c 76  {<hr>}..# Resolv
0e50: 65 20 6c 69 6e 6b 73 0a 23 0a 70 72 6f 63 20 72  e links.#.proc r
0e60: 65 73 6f 6c 76 65 5f 6c 69 6e 6b 73 20 7b 61 72  esolve_links {ar
0e70: 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 61 67 20  gs} {.  set tag 
0e80: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d  [lindex $args 0]
0e90: 0a 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b  .  regsub -all {
0ea0: 5b 5e 61 2d 7a 41 2d 5a 30 2d 39 5f 5d 7d 20 24  [^a-zA-Z0-9_]} $
0eb0: 74 61 67 20 7b 7d 20 74 61 67 0a 20 20 73 65 74  tag {} tag.  set
0ec0: 20 78 20 22 3c 61 20 68 72 65 66 3d 5c 22 23 24   x "<a href=\"#$
0ed0: 74 61 67 5c 22 3e 22 0a 20 20 69 66 20 7b 5b 6c  tag\">".  if {[l
0ee0: 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 3e 32 7d  length $args]>2}
0ef0: 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 78 20   {.    append x 
0f00: 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 20 32 20  [lrange $args 2 
0f10: 65 6e 64 5d 3c 2f 61 3e 0a 20 20 7d 20 65 6c 73  end]</a>.  } els
0f20: 65 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 78  e {.    append x
0f30: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
0f40: 5d 3c 2f 61 3e 0a 20 20 7d 0a 20 20 72 65 74 75  ]</a>.  }.  retu
0f50: 72 6e 20 24 78 0a 7d 0a 0a 23 20 4f 75 74 70 75  rn $x.}..# Outpu
0f60: 74 20 61 6c 6c 20 74 68 65 20 72 65 63 6f 72 64  t all the record
0f70: 73 0a 23 0a 66 6f 72 65 61 63 68 20 63 20 5b 6c  s.#.foreach c [l
0f80: 73 6f 72 74 20 24 63 6f 6e 74 65 6e 74 5d 20 7b  sort $content] {
0f90: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6b 65 79 20  .  foreach {key 
0fa0: 74 69 74 6c 65 20 74 79 70 65 20 6b 65 79 77 6f  title type keywo
0fb0: 72 64 73 20 62 6f 64 79 20 63 6f 64 65 7d 20 24  rds body code} $
0fc0: 63 20 62 72 65 61 6b 0a 20 20 66 6f 72 65 61 63  c break.  foreac
0fd0: 68 20 6b 20 24 6b 65 79 77 6f 72 64 73 20 7b 0a  h k $keywords {.
0fe0: 20 20 20 20 70 75 74 73 20 22 3c 61 20 6e 61 6d      puts "<a nam
0ff0: 65 3d 5c 22 24 6b 5c 22 3e 3c 2f 61 3e 22 0a 20  e=\"$k\"></a>". 
1000: 20 7d 0a 20 20 70 75 74 73 20 22 3c 68 32 3e 24   }.  puts "<h2>$
1010: 74 69 74 6c 65 3c 2f 68 32 3e 22 0a 20 20 70 75  title</h2>".  pu
1020: 74 73 20 22 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  ts "<blockquote>
1030: 3c 70 72 65 3e 22 0a 20 20 70 75 74 73 20 22 24  <pre>".  puts "$
1040: 63 6f 64 65 22 0a 20 20 70 75 74 73 20 22 3c 2f  code".  puts "</
1050: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
1060: 3e 22 0a 20 20 72 65 67 73 75 62 20 2d 61 6c 6c  >".  regsub -all
1070: 20 22 5c 6e 5c 6e 2b 22 20 24 62 6f 64 79 20 7b   "\n\n+" $body {
1080: 3c 2f 70 3e 5c 31 3c 70 3e 7d 20 62 6f 64 79 0a  </p>\1<p>} body.
1090: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c    regsub -all {\
10a0: 5b 7d 20 3c 70 3e 24 62 6f 64 79 3c 2f 70 3e 20  [} <p>$body</p> 
10b0: 7b 5b 72 65 73 6f 6c 76 65 5f 6c 69 6e 6b 73 20  {[resolve_links 
10c0: 7d 20 62 6f 64 79 0a 20 20 73 65 74 20 62 6f 64  } body.  set bod
10d0: 79 20 5b 73 75 62 73 74 20 2d 6e 6f 76 61 72 20  y [subst -novar 
10e0: 2d 6e 6f 62 61 63 6b 20 24 62 6f 64 79 5d 0a 20  -noback $body]. 
10f0: 20 70 75 74 73 20 22 24 62 6f 64 79 22 0a 20 20   puts "$body".  
1100: 70 75 74 73 20 22 3c 68 72 3e 22 0a 7d 0a        puts "<hr>".}.