sqlcipher/tool/mkpragmatab.tcl

650 lines
16 KiB
Tcl
Raw Normal View History

2014-04-04 10:16:20 -05:00
#!/usr/bin/tclsh
#
# Run this script to generate the pragma name lookup table C code.
#
# To add new pragmas, first add the name and other relevant attributes
# of the pragma to the "pragma_def" object below. Then run this script
2015-07-10 14:14:29 -05:00
# to generate the ../src/pragma.h header file that contains macros and
# the lookup table needed for pragma name lookup in the pragma.c module.
2014-04-04 10:16:20 -05:00
# Then add the extra "case PragTyp_XXXXX:" and subsequent code for the
2015-07-10 14:14:29 -05:00
# new pragma in ../src/pragma.c.
2014-04-04 10:16:20 -05:00
#
2017-09-27 16:07:03 -05:00
# Flag meanings:
set flagMeaning(NeedSchema) {Force schema load before running}
set flagMeaning(ReadOnly) {Read-only HEADER_VALUE}
set flagMeaning(Result0) {Acts as query when no argument}
set flagMeaning(Result1) {Acts as query when has one argument}
set flagMeaning(SchemaReq) {Schema required - "main" is default}
set flagMeaning(SchemaOpt) {Schema restricts name search if present}
set flagMeaning(NoColumns) {OP_ResultRow called with zero columns}
set flagMeaning(NoColumns1) {zero columns if RHS argument is present}
2014-04-04 10:16:20 -05:00
set pragma_def {
NAME: full_column_names
TYPE: FLAG
ARG: SQLITE_FullColNames
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: short_column_names
TYPE: FLAG
ARG: SQLITE_ShortColNames
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: count_changes
TYPE: FLAG
ARG: SQLITE_CountRows
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: empty_result_callbacks
TYPE: FLAG
ARG: SQLITE_NullCallback
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: fullfsync
TYPE: FLAG
ARG: SQLITE_FullFSync
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: checkpoint_fullfsync
TYPE: FLAG
ARG: SQLITE_CkptFullFSync
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: cache_spill
2017-09-27 16:07:03 -05:00
FLAG: Result0 SchemaReq NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: reverse_unordered_selects
TYPE: FLAG
ARG: SQLITE_ReverseOrder
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: query_only
TYPE: FLAG
ARG: SQLITE_QueryOnly
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: automatic_index
TYPE: FLAG
ARG: SQLITE_AutoIndex
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
NAME: sql_trace
TYPE: FLAG
ARG: SQLITE_SqlTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG)
NAME: vdbe_listing
TYPE: FLAG
ARG: SQLITE_VdbeListing
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG)
NAME: vdbe_trace
TYPE: FLAG
ARG: SQLITE_VdbeTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG)
NAME: vdbe_addoptrace
TYPE: FLAG
ARG: SQLITE_VdbeAddopTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG)
NAME: vdbe_debug
TYPE: FLAG
ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG)
NAME: vdbe_eqp
TYPE: FLAG
ARG: SQLITE_VdbeEQP
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG)
NAME: ignore_check_constraints
TYPE: FLAG
ARG: SQLITE_IgnoreChecks
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_CHECK)
NAME: writable_schema
TYPE: FLAG
2018-12-12 19:43:10 -05:00
ARG: SQLITE_WriteSchema|SQLITE_NoSchemaError
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: read_uncommitted
TYPE: FLAG
2017-09-27 16:07:03 -05:00
ARG: SQLITE_ReadUncommit
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: recursive_triggers
TYPE: FLAG
ARG: SQLITE_RecTriggers
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
2020-04-22 11:11:26 -04:00
NAME: trusted_schema
TYPE: FLAG
ARG: SQLITE_TrustedSchema
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
2014-04-04 10:16:20 -05:00
NAME: foreign_keys
TYPE: FLAG
ARG: SQLITE_ForeignKeys
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
NAME: defer_foreign_keys
TYPE: FLAG
ARG: SQLITE_DeferFKs
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
2016-02-23 09:07:39 -06:00
NAME: cell_size_check
TYPE: FLAG
ARG: SQLITE_CellSizeCk
2014-04-04 10:16:20 -05:00
NAME: default_cache_size
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq NoColumns1
COLS: cache_size
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
NAME: page_size
2017-09-27 16:07:03 -05:00
FLAG: Result0 SchemaReq NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: secure_delete
2017-09-27 16:07:03 -05:00
FLAG: Result0
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: page_count
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: max_page_count
TYPE: PAGE_COUNT
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: locking_mode
2017-09-27 16:07:03 -05:00
FLAG: Result0 SchemaReq
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: journal_mode
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: journal_size_limit
2017-09-27 16:07:03 -05:00
FLAG: Result0 SchemaReq
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: cache_size
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: mmap_size
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: auto_vacuum
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_AUTOVACUUM)
NAME: incremental_vacuum
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema NoColumns
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_AUTOVACUUM)
NAME: temp_store
2017-09-27 16:07:03 -05:00
FLAG: Result0 NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: temp_store_directory
2017-09-27 16:07:03 -05:00
FLAG: NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: data_store_directory
2017-09-27 16:07:03 -05:00
FLAG: NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN
NAME: lock_proxy_file
2017-09-27 16:07:03 -05:00
FLAG: NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE
NAME: synchronous
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
NAME: table_info
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result1 SchemaOpt
2018-12-12 19:43:10 -05:00
ARG: 0
2017-09-27 16:07:03 -05:00
COLS: cid name type notnull dflt_value pk
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
2018-12-12 19:43:10 -05:00
NAME: table_xinfo
TYPE: TABLE_INFO
FLAG: NeedSchema Result1 SchemaOpt
ARG: 1
COLS: cid name type notnull dflt_value pk hidden
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
2014-04-04 10:16:20 -05:00
NAME: stats
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 SchemaReq
COLS: tbl idx wdth hght flgs
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG)
2014-04-04 10:16:20 -05:00
NAME: index_info
2015-07-10 14:14:29 -05:00
TYPE: INDEX_INFO
ARG: 0
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result1 SchemaOpt
COLS: seqno cid name
2015-07-10 14:14:29 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
NAME: index_xinfo
TYPE: INDEX_INFO
ARG: 1
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result1 SchemaOpt
COLS: seqno cid name desc coll key
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
NAME: index_list
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result1 SchemaOpt
COLS: seq name unique origin partial
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
NAME: database_list
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0
COLS: seq name file
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
NAME: function_list
FLAG: Result0
2020-04-22 11:11:26 -04:00
COLS: name builtin type enc narg flags
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
2019-10-27 18:21:41 -04:00
IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
2017-09-27 16:07:03 -05:00
NAME: module_list
FLAG: Result0
COLS: name
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
IF: !defined(SQLITE_OMIT_VIRTUALTABLE)
2019-10-27 18:21:41 -04:00
IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
2017-09-27 16:07:03 -05:00
NAME: pragma_list
FLAG: Result0
COLS: name
2019-10-27 18:21:41 -04:00
IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
2014-04-04 10:16:20 -05:00
NAME: collation_list
2017-09-27 16:07:03 -05:00
FLAG: Result0
COLS: seq name
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
NAME: foreign_key_list
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result1 SchemaOpt
COLS: id seq table from to on_update on_delete match
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_FOREIGN_KEY)
NAME: foreign_key_check
2020-08-17 13:03:40 -04:00
FLAG: NeedSchema Result0 Result1 SchemaOpt
2017-09-27 16:07:03 -05:00
COLS: table rowid parent fkid
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
NAME: parser_trace
2019-02-10 10:35:42 -05:00
TYPE: FLAG
ARG: SQLITE_ParserTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG)
2014-04-04 10:16:20 -05:00
NAME: case_sensitive_like
2017-09-27 16:07:03 -05:00
FLAG: NoColumns
2019-09-25 10:27:57 -04:00
IF: !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA)
2014-04-04 10:16:20 -05:00
NAME: integrity_check
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 Result1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
NAME: quick_check
TYPE: INTEGRITY_CHECK
2017-09-27 16:07:03 -05:00
FLAG: NeedSchema Result0 Result1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
NAME: encoding
2017-09-27 16:07:03 -05:00
FLAG: Result0 NoColumns1
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_UTF16)
NAME: schema_version
TYPE: HEADER_VALUE
2015-03-20 09:04:26 -05:00
ARG: BTREE_SCHEMA_VERSION
2017-09-27 16:07:03 -05:00
FLAG: NoColumns1 Result0
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
NAME: user_version
TYPE: HEADER_VALUE
2015-03-20 09:04:26 -05:00
ARG: BTREE_USER_VERSION
2017-09-27 16:07:03 -05:00
FLAG: NoColumns1 Result0
2015-03-20 09:04:26 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
NAME: data_version
TYPE: HEADER_VALUE
ARG: BTREE_DATA_VERSION
2017-09-27 16:07:03 -05:00
FLAG: ReadOnly Result0
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
NAME: freelist_count
TYPE: HEADER_VALUE
2015-03-20 09:04:26 -05:00
ARG: BTREE_FREE_PAGE_COUNT
2017-09-27 16:07:03 -05:00
FLAG: ReadOnly Result0
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
NAME: application_id
TYPE: HEADER_VALUE
2015-03-20 09:04:26 -05:00
ARG: BTREE_APPLICATION_ID
2017-09-27 16:07:03 -05:00
FLAG: NoColumns1 Result0
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
NAME: compile_options
2017-09-27 16:07:03 -05:00
FLAG: Result0
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
NAME: wal_checkpoint
FLAG: NeedSchema
2017-09-27 16:07:03 -05:00
COLS: busy log checkpointed
2014-04-04 10:16:20 -05:00
IF: !defined(SQLITE_OMIT_WAL)
NAME: wal_autocheckpoint
IF: !defined(SQLITE_OMIT_WAL)
NAME: shrink_memory
2017-09-27 16:07:03 -05:00
FLAG: NoColumns
2014-04-04 10:16:20 -05:00
NAME: busy_timeout
2017-09-27 16:07:03 -05:00
FLAG: Result0
COLS: timeout
2014-04-04 10:16:20 -05:00
NAME: lock_status
2017-09-27 16:07:03 -05:00
FLAG: Result0
COLS: database status
2014-04-04 10:16:20 -05:00
IF: defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
2020-05-13 16:33:13 -04:00
NAME: key
TYPE: KEY
ARG: 0
IF: defined(SQLITE_HAS_CODEC)
NAME: rekey
TYPE: KEY
ARG: 1
IF: defined(SQLITE_HAS_CODEC)
NAME: hexkey
TYPE: KEY
ARG: 2
IF: defined(SQLITE_HAS_CODEC)
NAME: hexrekey
TYPE: KEY
ARG: 3
IF: defined(SQLITE_HAS_CODEC)
NAME: textkey
TYPE: KEY
ARG: 4
IF: defined(SQLITE_HAS_CODEC)
NAME: textrekey
TYPE: KEY
ARG: 5
IF: defined(SQLITE_HAS_CODEC)
2014-04-04 10:16:20 -05:00
NAME: activate_extensions
2020-05-27 17:15:26 -04:00
IF: defined(SQLITE_ENABLE_CEROD)
2014-04-04 10:16:20 -05:00
NAME: soft_heap_limit
2017-09-27 16:07:03 -05:00
FLAG: Result0
2015-03-20 09:04:26 -05:00
2020-04-22 11:11:26 -04:00
NAME: hard_heap_limit
FLAG: Result0
2015-03-20 09:04:26 -05:00
NAME: threads
2017-09-27 16:07:03 -05:00
FLAG: Result0
2020-05-24 07:23:38 -04:00
NAME: analysis_limit
FLAG: Result0
2017-09-27 16:07:03 -05:00
NAME: optimize
FLAG: Result1 NeedSchema
2018-09-28 14:35:21 -04:00
NAME: legacy_alter_table
TYPE: FLAG
ARG: SQLITE_LegacyAlter
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
2014-04-04 10:16:20 -05:00
}
2015-07-10 14:14:29 -05:00
# Open the output file
#
set destfile "[file dir [file dir [file normal $argv0]]]/src/pragma.h"
puts "Overwriting $destfile with new pragma table..."
set fd [open $destfile wb]
puts $fd {/* DO NOT EDIT!
** This file is automatically generated by the script at
** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit
** that script and rerun it.
*/}
# Parse the PRAGMA table above.
#
2014-04-04 10:16:20 -05:00
set name {}
set type {}
set if {}
set flags {}
2017-09-27 16:07:03 -05:00
set cols {}
set cols_list {}
2014-04-04 10:16:20 -05:00
set arg 0
proc record_one {} {
2018-12-12 19:43:10 -05:00
global name type if arg allbyname typebyif flags cols all_cols
2017-09-27 16:07:03 -05:00
global cols_list colUsedBy
2014-04-04 10:16:20 -05:00
if {$name==""} return
2017-09-27 16:07:03 -05:00
if {$cols!=""} {
2018-12-12 19:43:10 -05:00
if {![info exists all_cols($cols)]} {
set all_cols($cols) 1
2017-09-27 16:07:03 -05:00
lappend cols_list $cols
}
2018-12-12 19:43:10 -05:00
set cx $cols
2017-09-27 16:07:03 -05:00
lappend colUsedBy($cols) $name
} else {
set cx 0
}
2018-12-12 19:43:10 -05:00
set allbyname($name) [list $type $arg $if $flags $cols]
2014-04-04 10:16:20 -05:00
set name {}
set type {}
set if {}
set flags {}
2017-09-27 16:07:03 -05:00
set cols {}
2014-04-04 10:16:20 -05:00
set arg 0
}
foreach line [split $pragma_def \n] {
set line [string trim $line]
if {$line==""} continue
foreach {id val} [split $line :] break
set val [string trim $val]
if {$id=="NAME"} {
record_one
set name $val
set type [string toupper $val]
} elseif {$id=="TYPE"} {
set type $val
2017-09-27 16:07:03 -05:00
if {$type=="FLAG"} {
lappend flags Result0 NoColumns1
}
2014-04-04 10:16:20 -05:00
} elseif {$id=="ARG"} {
set arg $val
2017-09-27 16:07:03 -05:00
} elseif {$id=="COLS"} {
set cols $val
2014-04-04 10:16:20 -05:00
} elseif {$id=="IF"} {
lappend if $val
} elseif {$id=="FLAG"} {
foreach term [split $val] {
lappend flags $term
set allflags($term) 1
}
} else {
error "bad pragma_def line: $line"
}
}
record_one
set allnames [lsort [array names allbyname]]
# Generate #defines for all pragma type names. Group the pragmas that are
2020-05-27 17:15:26 -04:00
# omit in default builds (ex: defined(SQLITE_DEBUG))
2014-04-04 10:16:20 -05:00
# at the end.
#
2017-09-27 16:07:03 -05:00
puts $fd "\n/* The various pragma types */"
2014-04-04 10:16:20 -05:00
set pnum 0
foreach name $allnames {
set type [lindex $allbyname($name) 0]
if {[info exists seentype($type)]} continue
set if [lindex $allbyname($name) 2]
if {[regexp SQLITE_DEBUG $if] || [regexp SQLITE_HAS_CODEC $if]} continue
set seentype($type) 1
2015-07-10 14:14:29 -05:00
puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
2014-04-04 10:16:20 -05:00
incr pnum
}
foreach name $allnames {
set type [lindex $allbyname($name) 0]
if {[info exists seentype($type)]} continue
set if [lindex $allbyname($name) 2]
if {[regexp SQLITE_DEBUG $if]} continue
set seentype($type) 1
2015-07-10 14:14:29 -05:00
puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
2014-04-04 10:16:20 -05:00
incr pnum
}
foreach name $allnames {
set type [lindex $allbyname($name) 0]
if {[info exists seentype($type)]} continue
set seentype($type) 1
2015-07-10 14:14:29 -05:00
puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
2014-04-04 10:16:20 -05:00
incr pnum
}
# Generate #defines for flags
#
2017-09-27 16:07:03 -05:00
puts $fd "\n/* Property flags associated with various pragma. */"
2014-04-04 10:16:20 -05:00
set fv 1
foreach f [lsort [array names allflags]] {
2017-09-27 16:07:03 -05:00
puts $fd [format {#define PragFlg_%-10s 0x%02x /* %s */} \
$f $fv $flagMeaning($f)]
2014-04-04 10:16:20 -05:00
set fv [expr {$fv*2}]
}
2018-12-12 19:43:10 -05:00
# Sort the column lists so that longer column lists occur first
#
proc colscmp {a b} {
return [expr {[llength $b] - [llength $a]}]
}
set cols_list [lsort -command colscmp $cols_list]
2017-09-27 16:07:03 -05:00
# Generate the array of column names used by pragmas that act like
# queries.
#
puts $fd "\n/* Names of columns for pragmas that return multi-column result"
puts $fd "** or that return single-column results where the name of the"
puts $fd "** result column is different from the name of the pragma\n*/"
puts $fd "static const char *const pragCName\[\] = {"
set offset 0
2018-12-12 19:43:10 -05:00
set allcollist {}
2017-09-27 16:07:03 -05:00
foreach cols $cols_list {
2018-12-12 19:43:10 -05:00
set n [llength $cols]
set limit [expr {[llength $allcollist] - $n}]
for {set i 0} {$i<$limit} {incr i} {
set sublist [lrange $allcollist $i [expr {$i+$n-1}]]
if {$sublist==$cols} {
puts $fd [format "%27s/* $colUsedBy($cols) reuses $i */" ""]
set cols_offset($cols) $i
break
}
}
if {$i<$limit} continue
set cols_offset($cols) $offset
2017-09-27 16:07:03 -05:00
set ub " /* Used by: $colUsedBy($cols) */"
foreach c $cols {
2018-12-12 19:43:10 -05:00
lappend allcollist $c
2017-09-27 16:07:03 -05:00
puts $fd [format " /* %3d */ %-14s%s" $offset \"$c\", $ub]
set ub ""
incr offset
}
}
puts $fd "\175;"
2014-04-04 10:16:20 -05:00
# Generate the lookup table
#
2017-09-27 16:07:03 -05:00
puts $fd "\n/* Definitions of all built-in pragmas */"
puts $fd "typedef struct PragmaName \173"
puts $fd " const char *const zName; /* Name of pragma */"
puts $fd " u8 ePragTyp; /* PragTyp_XXX value */"
puts $fd " u8 mPragFlg; /* Zero or more PragFlg_XXX values */"
puts $fd { u8 iPragCName; /* Start of column names in pragCName[] */}
puts $fd " u8 nPragCName; \
/* Num of col names. 0 means use pragma name */"
2018-12-12 19:43:10 -05:00
puts $fd " u64 iArg; /* Extra argument */"
2017-09-27 16:07:03 -05:00
puts $fd "\175 PragmaName;"
puts $fd "static const PragmaName aPragmaName\[\] = \173"
2014-04-04 10:16:20 -05:00
set current_if {}
set spacer [format { %26s } {}]
foreach name $allnames {
2017-09-27 16:07:03 -05:00
foreach {type arg if flag cx} $allbyname($name) break
2018-12-12 19:43:10 -05:00
if {$cx==0 || $cx==""} {
2017-09-27 16:07:03 -05:00
set cy 0
set nx 0
} else {
set cy $cols_offset($cx)
2018-12-12 19:43:10 -05:00
set nx [llength $cx]
2017-09-27 16:07:03 -05:00
}
2014-04-04 10:16:20 -05:00
if {$if!=$current_if} {
if {$current_if!=""} {
foreach this_if $current_if {
2015-07-10 14:14:29 -05:00
puts $fd "#endif"
2014-04-04 10:16:20 -05:00
}
}
set current_if $if
if {$current_if!=""} {
foreach this_if $current_if {
2015-07-10 14:14:29 -05:00
puts $fd "#if $this_if"
2014-04-04 10:16:20 -05:00
}
}
}
set typex [format PragTyp_%-23s $type,]
if {$flag==""} {
set flagx "0"
} else {
2017-09-27 16:07:03 -05:00
set flagx PragFlg_[join $flag {|PragFlg_}]
2014-04-04 10:16:20 -05:00
}
2017-09-27 16:07:03 -05:00
puts $fd " \173/* zName: */ \"$name\","
puts $fd " /* ePragTyp: */ PragTyp_$type,"
puts $fd " /* ePragFlg: */ $flagx,"
puts $fd " /* ColNames: */ $cy, $nx,"
puts $fd " /* iArg: */ $arg \175,"
2014-04-04 10:16:20 -05:00
}
if {$current_if!=""} {
foreach this_if $current_if {
2015-07-10 14:14:29 -05:00
puts $fd "#endif"
2014-04-04 10:16:20 -05:00
}
}
2015-07-10 14:14:29 -05:00
puts $fd "\175;"
2014-04-04 10:16:20 -05:00
# count the number of pragmas, for information purposes
#
set allcnt 0
set dfltcnt 0
foreach name $allnames {
incr allcnt
set if [lindex $allbyname($name) 2]
if {[regexp {^defined} $if] || [regexp {[^!]defined} $if]} continue
incr dfltcnt
}
2015-07-10 14:14:29 -05:00
puts $fd "/* Number of pragmas: $dfltcnt on by default, $allcnt total. */"