sqlite/tool/mkopcodec.tcl
drh 20de9f6cb1 Minor tweaks to various TCL build scripts so that they work even for TCL 8.4,
which is obsolete, but is also all that is available for some legacy platforms.

FossilOrigin-Name: 2269ce64f707c4a198fcb9a72933648ea61a80b4251024b8058ff28ad81b4917
2021-07-29 16:49:28 +00:00

52 lines
1.5 KiB
Tcl

#!/usr/bin/tclsh
#
# This TCL script scans the opcodes.h file (which is itself generated by
# another TCL script) and uses the information gleaned to create the
# opcodes.c source file.
#
# Opcodes.c contains strings which are the symbolic names for the various
# opcodes used by the VDBE. These strings are used when disassembling a
# VDBE program during tracing or as a result of the EXPLAIN keyword.
#
puts "/* Automatically generated. Do not edit */"
puts "/* See the tool/mkopcodec.tcl script for details. */"
puts "#if !defined(SQLITE_OMIT_EXPLAIN) \\"
puts " || defined(VDBE_PROFILE) \\"
puts " || defined(SQLITE_DEBUG)"
puts "#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) || defined(SQLITE_DEBUG)"
puts "# define OpHelp(X) \"\\0\" X"
puts "#else"
puts "# define OpHelp(X)"
puts "#endif"
puts "const char *sqlite3OpcodeName(int i)\173"
puts " static const char *const azName\[\] = \173"
set mx 0
set in [open [lindex $argv 0]]
fconfigure $in -translation binary
while {![eof $in]} {
set line [gets $in]
if {[regexp {^#define OP_} $line]} {
set name [lindex $line 1]
regsub {^OP_} $name {} name
set i [lindex $line 2]
set label($i) $name
if {$mx<$i} {set mx $i}
if {[regexp {synopsis: (.*) \*/} $line all x]} {
set synopsis($i) [string trim $x]
} else {
set synopsis($i) {}
}
}
}
close $in
for {set i 0} {$i<=$mx} {incr i} {
puts [format " /* %3d */ %-18s OpHelp(\"%s\")," \
$i \"$label($i)\" $synopsis($i)]
}
puts " \175;"
puts " return azName\[i\];"
puts "\175"
puts "#endif"