83 lines
2.0 KiB
Tcl
83 lines
2.0 KiB
Tcl
#!/usr/bin/tclsh
|
|
#
|
|
# This script splits the sqlite3.c amalgamated source code files into
|
|
# several smaller files such that no single files is more than a fixed
|
|
# number of lines in length (32k or 64k). Each of the split out files
|
|
# is #include-ed by the master file.
|
|
#
|
|
# Splitting files up this way allows them to be used with older compilers
|
|
# that cannot handle really long source files.
|
|
#
|
|
set MAX 32768 ;# Maximum number of lines per file.
|
|
|
|
set BEGIN {^/\*+ Begin file ([a-zA-Z0-9_.]+) \*+/}
|
|
set END {^/\*+ End of %s \*+/}
|
|
|
|
set in [open sqlite3.c]
|
|
set out1 [open sqlite3-all.c w]
|
|
|
|
# Copy the header from sqlite3.c into sqlite3-all.c
|
|
#
|
|
while {[gets $in line]} {
|
|
if {[regexp $BEGIN $line]} break
|
|
puts $out1 $line
|
|
}
|
|
|
|
# Gather the complete content of a file into memory. Store the
|
|
# content in $bufout. Store the number of lines is $nout
|
|
#
|
|
proc gather_one_file {firstline bufout nout} {
|
|
regexp $::BEGIN $firstline all filename
|
|
set end [format $::END $filename]
|
|
upvar $bufout buf $nout n
|
|
set buf $firstline\n
|
|
global in
|
|
set n 0
|
|
while {[gets $in line]>=0} {
|
|
incr n
|
|
append buf $line\n
|
|
if {[regexp $end $line]} break
|
|
}
|
|
}
|
|
|
|
# Write a big chunk of text in to an auxiliary file "sqlite3-NNN.c".
|
|
# Also add an appropriate #include to sqlite3-all.c
|
|
#
|
|
set filecnt 0
|
|
proc write_one_file {content} {
|
|
global filecnt
|
|
incr filecnt
|
|
set out [open sqlite3-$filecnt.c w]
|
|
puts -nonewline $out $content
|
|
close $out
|
|
puts $::out1 "#include \"sqlite3-$filecnt.c\""
|
|
}
|
|
|
|
# Continue reading input. Store chunks in separate files and add
|
|
# the #includes to the main sqlite3-all.c file as necessary to reference
|
|
# the extra chunks.
|
|
#
|
|
set all {}
|
|
set N 0
|
|
while {[regexp $BEGIN $line]} {
|
|
set buf {}
|
|
set n 0
|
|
gather_one_file $line buf n
|
|
if {$n+$N>=$MAX} {
|
|
write_one_file $all
|
|
set all {}
|
|
set N 0
|
|
}
|
|
append all $buf
|
|
incr N $n
|
|
while {[gets $in line]>=0} {
|
|
if {[regexp $BEGIN $line]} break
|
|
puts $out1 $line
|
|
}
|
|
}
|
|
if {$N>0} {
|
|
write_one_file $all
|
|
}
|
|
close $out1
|
|
close $in
|