/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712:


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 74 6f 20 67 65 6e 65 72 61 74 65  ript to generate
0030: 20 74 68 65 20 22 73 68 65 6c 6c 2e 63 22 20 73   the "shell.c" s
0040: 6f 75 72 63 65 20 66 69 6c 65 20 66 72 6f 6d 20  ource file from 
0050: 0a 23 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 70  .# constituent p
0060: 61 72 74 73 2e 0a 23 0a 23 20 4e 6f 20 61 72 67  arts..#.# No arg
0070: 75 6d 65 6e 74 73 20 61 72 65 20 72 65 71 75 69  uments are requi
0080: 72 65 64 2e 20 20 54 68 69 73 20 73 63 72 69 70  red.  This scrip
0090: 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  t determines the
00a0: 20 6c 6f 63 61 74 69 6f 6e 0a 23 20 6f 66 20 69   location.# of i
00b0: 74 73 20 69 6e 70 75 74 20 66 69 6c 65 73 20 72  ts input files r
00c0: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 6c  elative to the l
00d0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ocation of the s
00e0: 63 72 69 70 74 20 69 74 73 65 6c 66 2e 0a 23 20  cript itself..# 
00f0: 54 68 69 73 20 73 63 72 69 70 74 20 73 68 6f 75  This script shou
0100: 6c 64 20 62 65 20 74 6f 6f 6c 2f 6d 6b 73 68 65  ld be tool/mkshe
0110: 6c 6c 63 2e 74 63 6c 2e 20 20 49 66 20 74 68 65  llc.tcl.  If the
0120: 20 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69   directory holdi
0130: 6e 67 0a 23 20 74 68 65 20 73 63 72 69 70 74 20  ng.# the script 
0140: 69 73 20 24 44 49 52 2c 20 74 68 65 6e 20 74 68  is $DIR, then th
0150: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 70 61 72 74  e component part
0160: 73 20 61 72 65 20 6c 6f 63 61 74 65 64 20 69 6e  s are located in
0170: 20 24 44 49 52 2f 2e 2e 2f 73 72 63 0a 23 20 61   $DIR/../src.# a
0180: 6e 64 20 24 44 49 52 2f 2e 2e 2f 65 78 74 2f 6d  nd $DIR/../ext/m
0190: 69 73 63 2e 0a 23 0a 73 65 74 20 74 6f 70 64 69  isc..#.set topdi
01a0: 72 20 5b 66 69 6c 65 20 64 69 72 20 5b 66 69 6c  r [file dir [fil
01b0: 65 20 64 69 72 20 5b 66 69 6c 65 20 6e 6f 72 6d  e dir [file norm
01c0: 61 6c 20 24 61 72 67 76 30 5d 5d 5d 0a 73 65 74  al $argv0]]].set
01d0: 20 6f 75 74 20 73 74 64 6f 75 74 0a 70 75 74 73   out stdout.puts
01e0: 20 24 6f 75 74 20 7b 2f 2a 20 44 4f 20 4e 4f 54   $out {/* DO NOT
01f0: 20 45 44 49 54 21 0a 2a 2a 20 54 68 69 73 20 66   EDIT!.** This f
0200: 69 6c 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ile is automatic
0210: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 62  ally generated b
0220: 79 20 74 68 65 20 73 63 72 69 70 74 20 69 6e 20  y the script in 
0230: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
0240: 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74   SQLite source t
0250: 72 65 65 20 61 74 20 74 6f 6f 6c 2f 6d 6b 73 68  ree at tool/mksh
0260: 65 6c 6c 63 2e 74 63 6c 2e 20 20 54 68 61 74 20  ellc.tcl.  That 
0270: 73 63 72 69 70 74 20 63 6f 6d 62 69 6e 65 73 20  script combines 
0280: 73 6f 75 72 63 65 0a 2a 2a 20 63 6f 64 65 20 66  source.** code f
0290: 72 6f 6d 20 76 61 72 69 6f 75 73 20 63 6f 6e 73  rom various cons
02a0: 74 69 74 75 65 6e 74 20 73 6f 75 72 63 65 20 66  tituent source f
02b0: 69 6c 65 73 20 6f 66 20 53 51 4c 69 74 65 20 69  iles of SQLite i
02c0: 6e 74 6f 20 74 68 69 73 20 73 69 6e 67 6c 65 0a  nto this single.
02d0: 2a 2a 20 22 73 68 65 6c 6c 2e 63 22 20 66 69 6c  ** "shell.c" fil
02e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
02f0: 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65 20 63  ent the SQLite c
0300: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c  ommand-line shel
0310: 6c 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  l..**.** Most of
0320: 20 74 68 65 20 63 6f 64 65 20 66 6f 75 6e 64 20   the code found 
0330: 62 65 6c 6f 77 20 63 6f 6d 65 73 20 66 72 6f 6d  below comes from
0340: 20 74 68 65 20 22 73 72 63 2f 73 68 65 6c 6c 2e   the "src/shell.
0350: 63 2e 69 6e 22 20 66 69 6c 65 20 69 6e 0a 2a 2a  c.in" file in.**
0360: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 53   the canonical S
0370: 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65  QLite source tre
0380: 65 2e 20 20 54 68 61 74 20 6d 61 69 6e 20 66 69  e.  That main fi
0390: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 22 49 4e 43  le contains "INC
03a0: 4c 55 44 45 22 0a 2a 2a 20 6c 69 6e 65 73 20 74  LUDE".** lines t
03b0: 68 61 74 20 73 70 65 63 69 66 79 20 6f 74 68 65  hat specify othe
03c0: 72 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 63  r files in the c
03d0: 61 6e 6f 6e 69 63 61 6c 20 73 6f 75 72 63 65 20  anonical source 
03e0: 74 72 65 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  tree that are.**
03f0: 20 69 6e 73 65 72 74 65 64 20 74 6f 20 67 65 74   inserted to get
0400: 6e 65 72 61 74 65 20 74 68 69 73 20 63 6f 6d 70  nerate this comp
0410: 6c 65 74 65 20 70 72 6f 67 72 61 6d 20 73 6f 75  lete program sou
0420: 72 63 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  rce file..**.** 
0430: 54 68 65 20 63 6f 64 65 20 66 72 6f 6d 20 6d 75  The code from mu
0440: 6c 74 69 70 6c 65 20 66 69 6c 65 73 20 69 73 20  ltiple files is 
0450: 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
0460: 69 73 20 73 69 6e 67 6c 65 20 22 73 68 65 6c 6c  is single "shell
0470: 2e 63 22 0a 2a 2a 20 73 6f 75 72 63 65 20 66 69  .c".** source fi
0480: 6c 65 20 74 6f 20 68 65 6c 70 20 6d 61 6b 65 20  le to help make 
0490: 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
04a0: 20 70 72 6f 67 72 61 6d 20 65 61 73 69 65 72 20   program easier 
04b0: 74 6f 20 63 6f 6d 70 69 6c 65 2e 0a 2a 2a 0a 2a  to compile..**.*
04c0: 2a 20 54 6f 20 6d 6f 64 69 66 79 20 74 68 69 73  * To modify this
04d0: 20 70 72 6f 67 72 61 6d 2c 20 67 65 74 20 61 20   program, get a 
04e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
04f0: 6e 69 63 61 6c 20 53 51 4c 69 74 65 20 73 6f 75  nical SQLite sou
0500: 72 63 65 20 74 72 65 65 2c 0a 2a 2a 20 65 64 69  rce tree,.** edi
0510: 74 20 74 68 65 20 73 72 63 2f 73 68 65 6c 6c 2e  t the src/shell.
0520: 63 2e 69 6e 22 20 61 6e 64 2f 6f 72 20 73 6f 6d  c.in" and/or som
0530: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 66  e of the other f
0540: 69 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  iles that are in
0550: 63 6c 75 64 65 64 0a 2a 2a 20 62 79 20 22 73 72  cluded.** by "sr
0560: 63 2f 73 68 65 6c 6c 2e 63 2e 69 6e 22 2c 20 74  c/shell.c.in", t
0570: 68 65 6e 20 72 65 72 75 6e 20 74 68 65 20 74 6f  hen rerun the to
0580: 6f 6c 2f 6d 6b 73 68 65 6c 6c 63 2e 74 63 6c 20  ol/mkshellc.tcl 
0590: 73 63 72 69 70 74 2e 0a 2a 2f 7d 0a 73 65 74 20  script..*/}.set 
05a0: 69 6e 20 5b 6f 70 65 6e 20 24 74 6f 70 64 69 72  in [open $topdir
05b0: 2f 73 72 63 2f 73 68 65 6c 6c 2e 63 2e 69 6e 20  /src/shell.c.in 
05c0: 72 62 5d 0a 70 72 6f 63 20 6f 6d 69 74 5f 72 65  rb].proc omit_re
05d0: 64 75 6e 64 61 6e 74 5f 74 79 70 65 64 65 66 73  dundant_typedefs
05e0: 20 7b 6c 69 6e 65 7d 20 7b 0a 20 20 67 6c 6f 62   {line} {.  glob
05f0: 61 6c 20 74 79 70 65 64 65 66 5f 73 65 65 6e 0a  al typedef_seen.
0600: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e    if {[regexp {^
0610: 74 79 70 65 64 65 66 20 2e 2a 3b 7d 20 24 6c 69  typedef .*;} $li
0620: 6e 65 5d 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  ne]} {.    if {[
0630: 69 6e 66 6f 20 65 78 69 73 74 73 20 74 79 70 65  info exists type
0640: 64 65 66 5f 73 65 65 6e 28 24 6c 69 6e 65 29 5d  def_seen($line)]
0650: 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  } {.      return
0660: 20 22 2f 2a 20 24 6c 69 6e 65 20 2a 2f 22 0a 20   "/* $line */". 
0670: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 74 79 70     }.    set typ
0680: 65 64 65 66 5f 73 65 65 6e 28 24 6c 69 6e 65 29  edef_seen($line)
0690: 20 31 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   1.  }.  return 
06a0: 24 6c 69 6e 65 0a 7d 0a 73 65 74 20 69 4c 69 6e  $line.}.set iLin
06b0: 65 20 30 0a 77 68 69 6c 65 20 7b 31 7d 20 7b 0a  e 0.while {1} {.
06c0: 20 20 73 65 74 20 6c 78 20 5b 6f 6d 69 74 5f 72    set lx [omit_r
06d0: 65 64 75 6e 64 61 6e 74 5f 74 79 70 65 64 65 66  edundant_typedef
06e0: 73 20 5b 67 65 74 73 20 24 69 6e 5d 5d 0a 20 20  s [gets $in]].  
06f0: 69 66 20 7b 5b 65 6f 66 20 24 69 6e 5d 7d 20 62  if {[eof $in]} b
0700: 72 65 61 6b 3b 0a 20 20 69 6e 63 72 20 69 4c 69  reak;.  incr iLi
0710: 6e 65 0a 20 20 69 66 20 7b 5b 72 65 67 65 78 70  ne.  if {[regexp
0720: 20 7b 5e 49 4e 43 4c 55 44 45 20 7d 20 24 6c 78   {^INCLUDE } $lx
0730: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 66 69  ]} {.    set cfi
0740: 6c 65 20 5b 6c 69 6e 64 65 78 20 24 6c 78 20 31  le [lindex $lx 1
0750: 5d 0a 20 20 20 20 70 75 74 73 20 24 6f 75 74 20  ].    puts $out 
0760: 22 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  "/**************
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
0780: 6e 20 24 63 66 69 6c 65 20 2a 2a 2a 2a 2a 2a 2a  n $cfile *******
0790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 22 0a 23 20  ***********/".# 
07a0: 20 20 70 75 74 73 20 24 6f 75 74 20 22 23 6c 69    puts $out "#li
07b0: 6e 65 20 31 20 5c 22 24 63 66 69 6c 65 5c 22 22  ne 1 \"$cfile\""
07c0: 0a 20 20 20 20 73 65 74 20 69 6e 32 20 5b 6f 70  .    set in2 [op
07d0: 65 6e 20 24 74 6f 70 64 69 72 2f 73 72 63 2f 24  en $topdir/src/$
07e0: 63 66 69 6c 65 20 72 62 5d 0a 20 20 20 20 77 68  cfile rb].    wh
07f0: 69 6c 65 20 7b 21 5b 65 6f 66 20 24 69 6e 32 5d  ile {![eof $in2]
0800: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6c 78  } {.      set lx
0810: 20 5b 6f 6d 69 74 5f 72 65 64 75 6e 64 61 6e 74   [omit_redundant
0820: 5f 74 79 70 65 64 65 66 73 20 5b 67 65 74 73 20  _typedefs [gets 
0830: 24 69 6e 32 5d 5d 0a 20 20 20 20 20 20 69 66 20  $in2]].      if 
0840: 7b 5b 72 65 67 65 78 70 20 7b 5e 23 69 6e 63 6c  {[regexp {^#incl
0850: 75 64 65 20 22 73 71 6c 69 74 65 7d 20 24 6c 78  ude "sqlite} $lx
0860: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ]} {.        set
0870: 20 6c 78 20 22 2f 2a 20 24 6c 78 20 2a 2f 22 0a   lx "/* $lx */".
0880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
0890: 20 7b 5b 72 65 67 65 78 70 20 7b 5e 23 20 2a 69   {[regexp {^# *i
08a0: 6e 63 6c 75 64 65 20 22 74 65 73 74 5f 77 69 6e  nclude "test_win
08b0: 64 69 72 65 6e 74 2e 68 22 7d 20 24 6c 78 5d 7d  dirent.h"} $lx]}
08c0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c   {.        set l
08d0: 78 20 22 2f 2a 20 24 6c 78 20 2a 2f 22 0a 20 20  x "/* $lx */".  
08e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 20      }.      set 
08f0: 6c 78 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  lx [string map [
0900: 6c 69 73 74 20 5f 5f 64 65 63 6c 73 70 65 63 28  list __declspec(
0910: 64 6c 6c 65 78 70 6f 72 74 29 20 7b 7d 5d 20 24  dllexport) {}] $
0920: 6c 78 5d 0a 20 20 20 20 20 20 70 75 74 73 20 24  lx].      puts $
0930: 6f 75 74 20 24 6c 78 0a 20 20 20 20 7d 0a 20 20  out $lx.    }.  
0940: 20 20 63 6c 6f 73 65 20 24 69 6e 32 0a 20 20 20    close $in2.   
0950: 20 70 75 74 73 20 24 6f 75 74 20 22 2f 2a 2a 2a   puts $out "/***
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0970: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 24 63 66 69 6c  ****** End $cfil
0980: 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e **************
0990: 2a 2a 2a 2a 2a 2a 2f 22 0a 23 20 20 20 70 75 74  ******/".#   put
09a0: 73 20 24 6f 75 74 20 22 23 6c 69 6e 65 20 5b 65  s $out "#line [e
09b0: 78 70 72 20 24 69 4c 69 6e 65 2b 31 5d 20 5c 22  xpr $iLine+1] \"
09c0: 73 68 65 6c 6c 2e 63 2e 69 6e 5c 22 22 0a 20 20  shell.c.in\"".  
09d0: 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a 20    continue.  }. 
09e0: 20 70 75 74 73 20 24 6f 75 74 20 24 6c 78 0a 7d   puts $out $lx.}
09f0: 0a 63 6c 6f 73 65 20 24 69 6e 0a 63 6c 6f 73 65  .close $in.close
0a00: 20 24 6f 75 74 0a                                 $out.