Annotation of embedaddon/sqlite3/tool/split-sqlite3c.tcl, revision 1.1

1.1     ! misho       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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>