15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/tclsh 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This script constructs the "sqlite3.h" header file from the following 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# sources: 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1) The src/sqlite.h.in source file. This is the template for sqlite3.h. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 2) The VERSION file containing the current SQLite version number. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 3) The manifest file from the fossil SCM. This gives use the date. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 4) The manifest.uuid file from the fossil SCM. This gives the SHA1 hash. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Run this script by specifying the root directory of the source tree 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# on the command-line. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This script performs processing on src/sqlite.h.in. It: 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1) Adds SQLITE_EXTERN in front of the declaration of global variables, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 2) Adds SQLITE_API in front of the declaration of API functions, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 3) Replaces the string --VERS-- with the current library version, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# formatted as a string (e.g. "3.6.17"), and 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 4) Replaces the string --VERSION-NUMBER-- with current library version, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# formatted as an integer (e.g. "3006017"). 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 5) Replaces the string --SOURCE-ID-- with the date and time and sha1 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# hash of the fossil-scm manifest for the source tree. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This script outputs to stdout. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Example usage: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# tclsh mksqlite3h.tcl ../sqlite >sqlite3.h 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Get the source tree root directory from the command-line 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set TOP [lindex $argv 0] 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Get the SQLite version number (ex: 3.6.18) from the $TOP/VERSION file. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set in [open $TOP/VERSION] 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set zVersion [string trim [read $in]] 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)close $in 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set nVersion [eval format "%d%03d%03d" [split $zVersion .]] 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Get the fossil-scm version number from $TOP/manifest.uuid. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set in [open $TOP/manifest.uuid] 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set zUuid [string trim [read $in]] 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)close $in 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Get the fossil-scm check-in date from the "D" card of $TOP/manifest. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set in [open $TOP/manifest] 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set zDate {} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)while {![eof $in]} { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set line [gets $in] 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if {[regexp {^D (2[-0-9T:]+)} $line all date]} { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set zDate [string map {T { }} $date] 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)close $in 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Set up patterns for recognizing API declarations. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+sqlite3_[_a-zA-Z0-9]+(\[|;| =)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set declpattern {^ *[a-zA-Z][a-zA-Z_0-9 ]+ \**sqlite3_[_a-zA-Z0-9]+\(} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Process the src/sqlite.h.in ext/rtree/sqlite3rtree.h files. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)foreach file [list $TOP/src/sqlite.h.in $TOP/ext/rtree/sqlite3rtree.h] { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set in [open $file] 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while {![eof $in]} { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set line [gets $in] 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # File sqlite3rtree.h contains a line "#include <sqlite3.h>". Omit this 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # line when copying sqlite3rtree.h into sqlite3.h. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if {[string match {*#include*<sqlite3.h>*} $line]} continue 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regsub -- --VERS-- $line $zVersion line 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regsub -- --VERSION-NUMBER-- $line $nVersion line 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regsub -- --SOURCE-ID-- $line "$zDate $zUuid" line 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if {[regexp {define SQLITE_EXTERN extern} $line]} { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) puts $line 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) puts [gets $in] 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) puts "" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) puts "#ifndef SQLITE_API" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) puts "# define SQLITE_API" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) puts "#endif" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set line "" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if {([regexp $varpattern $line] && ![regexp {^ *typedef} $line]) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || ([regexp $declpattern $line]) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set line "SQLITE_API $line" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) puts $line 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close $in 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 104