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