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