|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set topdir [file dir [file dir [file normal $argv0]]] |
|
|
set out stdout |
|
|
fconfigure stdout -translation binary |
|
|
if {[lindex $argv 0]!=""} { |
|
|
set output_file [lindex $argv 0] |
|
|
file delete -force $output_file |
|
|
set out [open $output_file wb] |
|
|
} else { |
|
|
set output_file {} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set in [open $topdir/src/shell.c.in] |
|
|
fconfigure $in -translation binary |
|
|
set allSource(src/shell.c.in) 1 |
|
|
set inUsage 0 |
|
|
set dotcmd {} |
|
|
while {1} { |
|
|
set lx [gets $in] |
|
|
if {[eof $in]} break; |
|
|
if {[regexp {^INCLUDE } $lx]} { |
|
|
set cfile [lindex $lx 1] |
|
|
if {[string match ../* $cfile]} { |
|
|
set xfile [string range $cfile 3 end] |
|
|
} else { |
|
|
set xfile "src/$cfile" |
|
|
} |
|
|
set allSource($xfile) 1 |
|
|
} elseif {[regexp {^\*\* USAGE:\s+([^\s]+)} $lx all dotcmd]} { |
|
|
set inUsage 1 |
|
|
set details [string trim [string range $lx 2 end]] |
|
|
} elseif {$inUsage} { |
|
|
if {![regexp {^\*\*} $lx] || [regexp { DOT-COMMAND: } $lx]} { |
|
|
set inUsage 0 |
|
|
set Usage($dotcmd) [string trim $details] |
|
|
} else { |
|
|
append details \n |
|
|
append details [string range [string trimright $lx] 3 end] |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc generate_usage {out} { |
|
|
global Usage |
|
|
puts $out "/**************************************************************" |
|
|
puts $out "** \"Usage\" help text automatically generated from comments */" |
|
|
puts $out "static const struct \173" |
|
|
puts $out " const char *zCmd; /* Name of the dot-command */" |
|
|
puts $out " const char *zUsage; /* Documentation */" |
|
|
puts $out "\175 aUsage\[\] = \173" |
|
|
foreach dotcmd [array names Usage] { |
|
|
puts $out " \173 \"$dotcmd\"," |
|
|
foreach line [split $Usage($dotcmd) \n] { |
|
|
set x [string map [list \\ \\\\ \" \\\"] $line] |
|
|
puts $out "\"$x\\n\"" |
|
|
} |
|
|
puts $out " \175," |
|
|
} |
|
|
puts $out "\175;" |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
puts $out {/* |
|
|
** This is the amalgamated source code to the "sqlite3" or "sqlite3.exe" |
|
|
** command-line shell (CLI) for SQLite. This file is automatically |
|
|
** generated by the tool/mkshellc.tcl script from the following sources: |
|
|
**} |
|
|
foreach fn [lsort [array names allSource]] { |
|
|
puts $out "** $fn" |
|
|
} |
|
|
puts $out {** |
|
|
** To modify this program, get a copy of the canonical SQLite source tree, |
|
|
** edit the src/shell.c.in file and/or some of the other files that are |
|
|
** listed above, then rerun the rerun "make shell.c". |
|
|
*/} |
|
|
seek $in 0 start |
|
|
puts $out "/************************* Begin src/shell.c.in ******************/" |
|
|
proc omit_redundant_typedefs {line} { |
|
|
global typedef_seen |
|
|
if {[regexp {^typedef .* ([a-zA-Z0-9_]+);} $line all typename]} { |
|
|
|
|
|
if {[info exists typedef_seen($typename)]} { |
|
|
return "/* [string map {/* // */ //} $line] */" |
|
|
} |
|
|
set typedef_seen($typename) 1 |
|
|
} |
|
|
return $line |
|
|
} |
|
|
set iLine 0 |
|
|
while {1} { |
|
|
set lx [omit_redundant_typedefs [gets $in]] |
|
|
if {[eof $in]} break; |
|
|
incr iLine |
|
|
if {[regexp {^INCLUDE } $lx]} { |
|
|
set cfile [lindex $lx 1] |
|
|
if {[string match ../* $cfile]} { |
|
|
set xfile [string range $cfile 3 end] |
|
|
} else { |
|
|
set xfile "src/$cfile" |
|
|
} |
|
|
puts $out "/************************* Begin $xfile ******************/" |
|
|
|
|
|
set in2 [open $topdir/$xfile] |
|
|
fconfigure $in2 -translation binary |
|
|
while {![eof $in2]} { |
|
|
set lx [omit_redundant_typedefs [gets $in2]] |
|
|
if {[regexp {^# *include "sqlite} $lx]} { |
|
|
set lx "/* $lx */" |
|
|
} |
|
|
if {[regexp {^# *include "windirent.h"} $lx]} { |
|
|
set lx "/* $lx */" |
|
|
} |
|
|
set lx [string map [list __declspec(dllexport) {}] $lx] |
|
|
puts $out $lx |
|
|
} |
|
|
close $in2 |
|
|
puts $out "/************************* End $xfile ********************/" |
|
|
# puts $out "#line [expr $iLine+1] \"shell.c.in\"" |
|
|
} elseif {[regexp {^INSERT-USAGE-TEXT-HERE} $lx]} { |
|
|
generate_usage $out |
|
|
} else { |
|
|
puts $out $lx |
|
|
} |
|
|
} |
|
|
puts $out "/************************* End src/shell.c.in ******************/" |
|
|
close $in |
|
|
close $out |
|
|
|