128 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
#!/usr/bin/tclsh
 | 
						|
#
 | 
						|
# This script constructs the "sqlite3.h" header file from the following
 | 
						|
# sources:
 | 
						|
#
 | 
						|
#   1) The src/sqlite.h.in source file.  This is the template for sqlite3.h.
 | 
						|
#   2) The VERSION file containing the current SQLite version number.
 | 
						|
#   3) The manifest file from the fossil SCM.  This gives use the date.
 | 
						|
#   4) The manifest.uuid file from the fossil SCM.  This gives the SHA1 hash.
 | 
						|
#
 | 
						|
# Run this script by specifying the root directory of the source tree
 | 
						|
# on the command-line.
 | 
						|
# 
 | 
						|
# This script performs processing on src/sqlite.h.in. It:
 | 
						|
#
 | 
						|
#   1) Adds SQLITE_EXTERN in front of the declaration of global variables,
 | 
						|
#   2) Adds SQLITE_API in front of the declaration of API functions,
 | 
						|
#   3) Replaces the string --VERS-- with the current library version, 
 | 
						|
#      formatted as a string (e.g. "3.6.17"), and
 | 
						|
#   4) Replaces the string --VERSION-NUMBER-- with current library version,
 | 
						|
#      formatted as an integer (e.g. "3006017").
 | 
						|
#   5) Replaces the string --SOURCE-ID-- with the date and time and sha1 
 | 
						|
#      hash of the fossil-scm manifest for the source tree.
 | 
						|
#
 | 
						|
# This script outputs to stdout.
 | 
						|
#
 | 
						|
# Example usage:
 | 
						|
#
 | 
						|
#   tclsh mksqlite3h.tcl ../sqlite >sqlite3.h
 | 
						|
#
 | 
						|
 | 
						|
 | 
						|
# Get the source tree root directory from the command-line
 | 
						|
#
 | 
						|
set TOP [lindex $argv 0]
 | 
						|
 | 
						|
# Get the SQLite version number (ex: 3.6.18) from the $TOP/VERSION file.
 | 
						|
#
 | 
						|
set in [open $TOP/VERSION]
 | 
						|
set zVersion [string trim [read $in]]
 | 
						|
close $in
 | 
						|
set nVersion [eval format "%d%03d%03d" [split $zVersion .]]
 | 
						|
 | 
						|
# Get the fossil-scm version number from $TOP/manifest.uuid.
 | 
						|
#
 | 
						|
set in [open $TOP/manifest.uuid]
 | 
						|
set zUuid [string trim [read $in]]
 | 
						|
close $in
 | 
						|
 | 
						|
# Get the fossil-scm check-in date from the "D" card of $TOP/manifest.
 | 
						|
#
 | 
						|
set in [open $TOP/manifest]
 | 
						|
set zDate {}
 | 
						|
while {![eof $in]} {
 | 
						|
  set line [gets $in]
 | 
						|
  if {[regexp {^D (2[-0-9T:]+)} $line all date]} {
 | 
						|
    set zDate [string map {T { }} $date]
 | 
						|
    break
 | 
						|
  }
 | 
						|
}
 | 
						|
close $in
 | 
						|
 | 
						|
# Set up patterns for recognizing API declarations.
 | 
						|
#
 | 
						|
set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+sqlite3_[_a-zA-Z0-9]+(\[|;| =)}
 | 
						|
set declpattern {^ *([a-zA-Z][a-zA-Z_0-9 ]+ \**)(sqlite3_[_a-zA-Z0-9]+)(\(.*)$}
 | 
						|
 | 
						|
# Force the output to use unix line endings, even on Windows.
 | 
						|
fconfigure stdout -translation lf
 | 
						|
 | 
						|
set filelist [subst {
 | 
						|
  $TOP/src/sqlite.h.in
 | 
						|
  $TOP/ext/rtree/sqlite3rtree.h
 | 
						|
  $TOP/ext/fts5/fts5.h
 | 
						|
}]
 | 
						|
 | 
						|
# These are the functions that accept a variable number of arguments.  They
 | 
						|
# always need to use the "cdecl" calling convention even when another calling
 | 
						|
# convention (e.g. "stcall") is being used for the rest of the library.
 | 
						|
set cdecllist {
 | 
						|
  sqlite3_config
 | 
						|
  sqlite3_db_config
 | 
						|
  sqlite3_log
 | 
						|
  sqlite3_mprintf
 | 
						|
  sqlite3_snprintf
 | 
						|
  sqlite3_test_control
 | 
						|
  sqlite3_vtab_config
 | 
						|
}
 | 
						|
 | 
						|
# Process the source files.
 | 
						|
#
 | 
						|
foreach file $filelist {
 | 
						|
  set in [open $file]
 | 
						|
  while {![eof $in]} {
 | 
						|
  
 | 
						|
    set line [gets $in]
 | 
						|
 | 
						|
    # File sqlite3rtree.h contains a line "#include <sqlite3.h>". Omit this
 | 
						|
    # line when copying sqlite3rtree.h into sqlite3.h.
 | 
						|
    #
 | 
						|
    if {[string match {*#include*[<"]sqlite3.h[>"]*} $line]} continue
 | 
						|
  
 | 
						|
    regsub -- --VERS--           $line $zVersion line
 | 
						|
    regsub -- --VERSION-NUMBER-- $line $nVersion line
 | 
						|
    regsub -- --SOURCE-ID--      $line "$zDate $zUuid" line
 | 
						|
 | 
						|
    if {[regexp $varpattern $line] && ![regexp {^ *typedef} $line]} {
 | 
						|
      set line "SQLITE_API $line"
 | 
						|
    } else {
 | 
						|
      if {[regexp $declpattern $line all rettype funcname rest]} {
 | 
						|
        set line SQLITE_API
 | 
						|
        append line " " [string trim $rettype]
 | 
						|
        if {[string index $rettype end] ne "*"} {
 | 
						|
          append line " "
 | 
						|
        }
 | 
						|
        if {[lsearch -exact $cdecllist $funcname] >= 0} {
 | 
						|
          append line SQLITE_CDECL
 | 
						|
        } else {
 | 
						|
          append line SQLITE_STDCALL
 | 
						|
        }
 | 
						|
        append line " " $funcname $rest
 | 
						|
      }
 | 
						|
    }
 | 
						|
    puts $line
 | 
						|
  }
 | 
						|
  close $in
 | 
						|
}
 |