mkopcodec.tcl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/tclsh
  2. #
  3. # This TCL script scans the opcodes.h file (which is itself generated by
  4. # another TCL script) and uses the information gleaned to create the
  5. # opcodes.c source file.
  6. #
  7. # Opcodes.c contains strings which are the symbolic names for the various
  8. # opcodes used by the VDBE. These strings are used when disassembling a
  9. # VDBE program during tracing or as a result of the EXPLAIN keyword.
  10. #
  11. puts "/* Automatically generated. Do not edit */"
  12. puts "/* See the tool/mkopcodec.tcl script for details. */"
  13. puts "#if !defined(SQLITE_OMIT_EXPLAIN) \\"
  14. puts " || defined(VDBE_PROFILE) \\"
  15. puts " || defined(SQLITE_DEBUG)"
  16. puts "#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) || defined(SQLITE_DEBUG)"
  17. puts "# define OpHelp(X) \"\\0\" X"
  18. puts "#else"
  19. puts "# define OpHelp(X)"
  20. puts "#endif"
  21. puts "const char *sqlite3OpcodeName(int i)\173"
  22. puts " static const char *const azName\[\] = \173"
  23. set mx 0
  24. set in [open [lindex $argv 0]]
  25. fconfigure $in -translation binary
  26. while {![eof $in]} {
  27. set line [gets $in]
  28. if {[regexp {^#define OP_} $line]} {
  29. set name [lindex $line 1]
  30. regsub {^OP_} $name {} name
  31. set i [lindex $line 2]
  32. set label($i) $name
  33. if {$mx<$i} {set mx $i}
  34. if {[regexp {synopsis: (.*) \*/} $line all x]} {
  35. set synopsis($i) [string trim $x]
  36. } else {
  37. set synopsis($i) {}
  38. }
  39. }
  40. }
  41. close $in
  42. for {set i 0} {$i<=$mx} {incr i} {
  43. puts [format " /* %3d */ %-18s OpHelp(\"%s\")," \
  44. $i \"$label($i)\" $synopsis($i)]
  45. }
  46. puts " \175;"
  47. puts " return azName\[i\];"
  48. puts "\175"
  49. puts "#endif"