1#!/usr/bin/env tclsh 2 3# Usage: make-c-ext.tcl source.tcl >jim-source.c 4 5# Converts a Tcl source file into C source suitable 6# for loading as a static extension. 7 8lassign $argv source 9 10if {![string match *.tcl $source]} { 11 error "Source $source is not a .tcl file" 12} 13 14# Read the Tcl source and convert to C 15# Note that no lines are removed in order to preserve line numbering 16set sourcelines {} 17set f [open $source] 18while {[gets $f buf] >= 0} { 19 # Remove comment lines 20 regsub {^[ \t]*#.*$} $buf "" buf 21 # Escape quotes and backlashes 22 set buf [string map [list \\ \\\\ \" \\"] $buf] 23 lappend sourcelines \"$buf\\n\" 24} 25close $f 26 27lappend lines {/* autogenerated - do not edit */} 28lappend lines {#include <jim.h>} 29set basename [file tail $source] 30set pkgname [file rootname $basename] 31 32lappend lines "int Jim_${pkgname}Init(Jim_Interp *interp)" 33lappend lines "\{" 34lappend lines "\tif (Jim_PackageProvide(interp, \"$pkgname\", \"1.0\", JIM_ERRMSG)) return JIM_ERR;" 35lappend lines "\treturn Jim_EvalSource(interp, \"$basename\", 1, [join $sourcelines \n]);" 36lappend lines "\}" 37 38puts [join $lines \n] 39