15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/tclsh
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This script builds a single C code file holding all of FTS2 code.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The name of the output file is fts2amal.c.  To build this file,
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# first do:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      make target_source
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The make target above moves all of the source code files into
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# a subdirectory named "tsrc".  (This script expects to find the files
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# there and will not work if they are not found.)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# After the "tsrc" directory has been created and populated, run
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this script:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      tclsh mkfts2amal.tcl
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The amalgamated FTS2 code will be written into fts2amal.c
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Open the output file and write a header comment at the beginning
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# of the file.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set out [open fts2amal.c w]
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1]
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)puts $out [subst \
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){/******************************************************************************
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file is an amalgamation of separate C source files from the SQLite
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Full Text Search extension 2 (fts2).  By combining all the individual C
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code  files into this single large file, the entire code can be compiled
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as a one translation unit.  This allows many compilers to do optimizations
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that would not be possible if the files were compiled separately.  It also
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** makes the code easier to import into other projects.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This amalgamation was generated on $today.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/}]
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# These are the header files used by FTS2.  The first time any of these
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# files are seen in a #include statement in the C code, include the complete
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# text of the file in-line.  The file only needs to be included once.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)foreach hdr {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2.h
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2_hash.h
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2_tokenizer.h
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   sqlite3.h
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   sqlite3ext.h
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set available_hdr($hdr) 1
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 78 stars used for comment formatting.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set s78 \
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){*****************************************************************************}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Insert a comment into the code
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc section_comment {text} {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global out s78
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set n [string length $text]
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set nstar [expr {60 - $n}]
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set stars [string range $s78 0 $nstar]
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  puts $out "/************** $text $stars/"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Read the source file named $filename and write it into the
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# sqlite3.c output file.  If any #include statements are seen,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# process them approprately.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc copy_file {filename} {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global seen_hdr available_hdr out
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set tail [file tail $filename]
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  section_comment "Begin file $tail"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set in [open $filename r]
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while {![eof $in]} {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set line [gets $in]
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {[regexp {^#\s*include\s+["<]([^">]+)[">]} $line all hdr]} {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if {[info exists available_hdr($hdr)]} {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if {$available_hdr($hdr)} {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          section_comment "Include $hdr in the middle of $tail"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          copy_file tsrc/$hdr
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          section_comment "Continuing where we left off in $tail"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } elseif {![info exists seen_hdr($hdr)]} {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        set seen_hdr($hdr) 1
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        puts $out $line
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {[regexp {^#ifdef __cplusplus} $line]} {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      puts $out "#if 0"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } elseif {[regexp {^#line} $line]} {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Skip #line directives.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      puts $out $line
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close $in
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  section_comment "End of $tail"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Process the source files.  Process files containing commonly
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# used subroutines first in order to help the compiler find
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# inlining opportunities.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)foreach file {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2.c
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2_hash.c
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2_porter.c
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2_tokenizer.c
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2_tokenizer1.c
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fts2_icu.c
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy_file tsrc/$file
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)close $out
117