drh | 1d21021 | 2011-04-01 18:12:58 +0000 | [diff] [blame] | 1 | #!/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 | # |
| 11 | set MAX 32768 ;# Maximum number of lines per file. |
| 12 | |
| 13 | set BEGIN {^/\*+ Begin file ([a-zA-Z0-9_.]+) \*+/} |
| 14 | set END {^/\*+ End of %s \*+/} |
| 15 | |
| 16 | set in [open sqlite3.c] |
| 17 | set out1 [open sqlite3-all.c w] |
| 18 | |
| 19 | # Copy the header from sqlite3.c into sqlite3-all.c |
| 20 | # |
| 21 | while {[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 | # |
| 29 | proc 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 | # |
| 46 | set filecnt 0 |
| 47 | proc 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 | # |
| 60 | set all {} |
| 61 | set N 0 |
| 62 | while {[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 | } |
| 78 | if {$N>0} { |
| 79 | write_one_file $all |
| 80 | } |
| 81 | close $out1 |
| 82 | close $in |