| #!/usr/bin/tclsh |
| # |
| # Use this script to combine multiple source code files into a single |
| # file. Example: |
| # |
| # tclsh mkcombo.tcl file1.c file2.c file3.c -o file123.c |
| # |
| |
| set help {Usage: tclsh mkcombo.tcl [OPTIONS] [FILELIST] |
| where OPTIONS is zero or more of the following with these effects: |
| --linemacros=? => Emit #line directives into output or not. (? = 1 or 0) |
| --o FILE => write to alternative output file named FILE |
| --help => See this. |
| } |
| |
| set linemacros 0 |
| set fname {} |
| set src [list] |
| |
| |
| for {set i 0} {$i<[llength $argv]} {incr i} { |
| set x [lindex $argv $i] |
| if {[regexp {^-?-linemacros(?:=([01]))?$} $x ma ulm]} { |
| if {$ulm == ""} {set ulm 1} |
| set linemacros $ulm |
| } elseif {[regexp {^-o$} $x]} { |
| incr i |
| if {$i==[llength $argv]} { |
| error "No argument following $x" |
| } |
| set fname [lindex $argv $i] |
| } elseif {[regexp {^-?-((help)|\?)$} $x]} { |
| puts $help |
| exit 0 |
| } elseif {[regexp {^-?-} $x]} { |
| error "unknown command-line option: $x" |
| } else { |
| lappend src $x |
| } |
| } |
| |
| # Open the output file and write a header comment at the beginning |
| # of the file. |
| # |
| if {![info exists fname]} { |
| set fname sqlite3.c |
| if {$enable_recover} { set fname sqlite3r.c } |
| } |
| set out [open $fname wb] |
| |
| # Return a string consisting of N "*" characters. |
| # |
| proc star N { |
| set r {} |
| for {set i 0} {$i<$N} {incr i} {append r *} |
| return $r |
| } |
| |
| # Force the output to use unix line endings, even on Windows. |
| fconfigure $out -translation binary |
| puts $out "/[star 78]" |
| puts $out {** The following is an amalgamation of these source code files:} |
| puts $out {**} |
| foreach s $src { |
| regsub {^.*/(src|ext)/} $s {\1/} s2 |
| puts $out "** $s2" |
| } |
| puts $out {**} |
| puts $out "[star 78]/" |
| |
| # Insert a comment into the code |
| # |
| proc section_comment {text} { |
| global out s78 |
| set n [string length $text] |
| set nstar [expr {60 - $n}] |
| puts $out "/************** $text [star $nstar]/" |
| } |
| |
| # Read the source file named $filename and write it into the |
| # sqlite3.c output file. The only transformation is the trimming |
| # of EOL whitespace. |
| # |
| proc copy_file_verbatim {filename} { |
| global out |
| set in [open $filename rb] |
| set tail [file tail $filename] |
| section_comment "Begin file $tail" |
| while {![eof $in]} { |
| set line [string trimright [gets $in]] |
| puts $out $line |
| } |
| section_comment "End of $tail" |
| } |
| set taillist "" |
| foreach file $src { |
| copy_file_verbatim $file |
| append taillist ", [file tail $file]" |
| } |
| |
| set taillist "End of the amalgamation of [string range $taillist 2 end]" |
| set n [string length $taillist] |
| set ns [expr {(75-$n)/2}] |
| if {$ns<3} {set ns 3} |
| puts $out "/[star $ns] $taillist [star $ns]/" |
| close $out |