blob: 287b752828f4157c6ac10b5f85d7dae9576ddd4b [file] [log] [blame]
drh1d210212011-04-01 18:12:58 +00001#!/usr/bin/tclsh
2#
3# This script splits the sqlite3.c amalgamated source code files into
4# several smaller files such that no single files is more than a fixed
5# number of lines in length (32k or 64k). Each of the split out files
6# is #include-ed by the master file.
7#
8# Splitting files up this way allows them to be used with older compilers
9# that cannot handle really long source files.
10#
11set MAX 32768 ;# Maximum number of lines per file.
12
13set BEGIN {^/\*+ Begin file ([a-zA-Z0-9_.]+) \*+/}
14set END {^/\*+ End of %s \*+/}
15
16set in [open sqlite3.c]
17set out1 [open sqlite3-all.c w]
18
19# Copy the header from sqlite3.c into sqlite3-all.c
20#
21while {[gets $in line]} {
22 if {[regexp $BEGIN $line]} break
23 puts $out1 $line
24}
25
26# Gather the complete content of a file into memory. Store the
27# content in $bufout. Store the number of lines is $nout
28#
29proc gather_one_file {firstline bufout nout} {
30 regexp $::BEGIN $firstline all filename
31 set end [format $::END $filename]
32 upvar $bufout buf $nout n
33 set buf $firstline\n
34 global in
35 set n 0
36 while {[gets $in line]>=0} {
37 incr n
38 append buf $line\n
39 if {[regexp $end $line]} break
40 }
41}
42
43# Write a big chunk of text in to an auxiliary file "sqlite3-NNN.c".
44# Also add an appropriate #include to sqlite3-all.c
45#
46set filecnt 0
47proc write_one_file {content} {
48 global filecnt
49 incr filecnt
50 set out [open sqlite3-$filecnt.c w]
51 puts -nonewline $out $content
52 close $out
53 puts $::out1 "#include \"sqlite3-$filecnt.c\""
54}
55
56# Continue reading input. Store chunks in separate files and add
57# the #includes to the main sqlite3-all.c file as necessary to reference
58# the extra chunks.
59#
60set all {}
61set N 0
62while {[regexp $BEGIN $line]} {
63 set buf {}
64 set n 0
65 gather_one_file $line buf n
66 if {$n+$N>=$MAX} {
67 write_one_file $all
68 set all {}
69 set N 0
70 }
71 append all $buf
72 incr N $n
73 while {[gets $in line]>=0} {
74 if {[regexp $BEGIN $line]} break
75 puts $out1 $line
76 }
77}
78if {$N>0} {
79 write_one_file $all
80}
81close $out1
82close $in