• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/tclsh
2#
3# This script constructs the "sqlite3.h" header file from the following
4# sources:
5#
6#   1) The src/sqlite.h.in source file.  This is the template for sqlite3.h.
7#   2) The VERSION file containing the current SQLite version number.
8#   3) The manifest file from the fossil SCM.  This gives use the date.
9#   4) The manifest.uuid file from the fossil SCM.  This gives the SHA1 hash.
10#
11# Run this script by specifying the root directory of the source tree
12# on the command-line.
13#
14# This script performs processing on src/sqlite.h.in. It:
15#
16#   1) Adds SQLITE_EXTERN in front of the declaration of global variables,
17#   2) Adds SQLITE_API in front of the declaration of API functions,
18#   3) Replaces the string --VERS-- with the current library version,
19#      formatted as a string (e.g. "3.6.17"), and
20#   4) Replaces the string --VERSION-NUMBER-- with current library version,
21#      formatted as an integer (e.g. "3006017").
22#   5) Replaces the string --SOURCE-ID-- with the date and time and sha1
23#      hash of the fossil-scm manifest for the source tree.
24#
25# This script outputs to stdout.
26#
27# Example usage:
28#
29#   tclsh mksqlite3h.tcl ../sqlite >sqlite3.h
30#
31
32
33# Get the source tree root directory from the command-line
34#
35set TOP [lindex $argv 0]
36
37# Get the SQLite version number (ex: 3.6.18) from the $TOP/VERSION file.
38#
39set in [open $TOP/VERSION]
40set zVersion [string trim [read $in]]
41close $in
42set nVersion [eval format "%d%03d%03d" [split $zVersion .]]
43
44# Get the fossil-scm version number from $TOP/manifest.uuid.
45#
46set in [open $TOP/manifest.uuid]
47set zUuid [string trim [read $in]]
48close $in
49
50# Get the fossil-scm check-in date from the "D" card of $TOP/manifest.
51#
52set in [open $TOP/manifest]
53set zDate {}
54while {![eof $in]} {
55  set line [gets $in]
56  if {[regexp {^D (2[-0-9T:]+)} $line all date]} {
57    set zDate [string map {T { }} $date]
58    break
59  }
60}
61close $in
62
63# Set up patterns for recognizing API declarations.
64#
65set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+sqlite3_[_a-zA-Z0-9]+(\[|;| =)}
66set declpattern {^ *[a-zA-Z][a-zA-Z_0-9 ]+ \**sqlite3_[_a-zA-Z0-9]+\(}
67
68# Process the src/sqlite.h.in ext/rtree/sqlite3rtree.h files.
69#
70foreach file [list $TOP/src/sqlite.h.in $TOP/ext/rtree/sqlite3rtree.h] {
71  set in [open $file]
72  while {![eof $in]} {
73
74    set line [gets $in]
75
76    # File sqlite3rtree.h contains a line "#include <sqlite3.h>". Omit this
77    # line when copying sqlite3rtree.h into sqlite3.h.
78    #
79    if {[string match {*#include*<sqlite3.h>*} $line]} continue
80
81    regsub -- --VERS--           $line $zVersion line
82    regsub -- --VERSION-NUMBER-- $line $nVersion line
83    regsub -- --SOURCE-ID--      $line "$zDate $zUuid" line
84
85    if {[regexp {define SQLITE_EXTERN extern} $line]} {
86      puts $line
87      puts [gets $in]
88      puts ""
89      puts "#ifndef SQLITE_API"
90      puts "# define SQLITE_API"
91      puts "#endif"
92      set line ""
93    }
94
95    if {([regexp $varpattern $line] && ![regexp {^ *typedef} $line])
96     || ([regexp $declpattern $line])
97    } {
98      set line "SQLITE_API $line"
99    }
100    puts $line
101  }
102  close $in
103}
104