What: SWIG Where: http://www.swig.org/ Description: Tool designed to make it easier to integrate functions written in C/C++ with Tcl 7 and 8/Tk, Perl 4 and 5, Python and Guile. SWIG is a compiler that takes ANSI C/C++ declarations and builds a scripting language interface for a number of different languages. Works for Unix and Win32. Currently version 2.0.10 is available. Updated: 09/2013 As '''JPF''' says, '''Here is a way to call your C and C++ functions from Tcl and other languages.''' From http://www.purl.org/NET/Tcl-FAQ/part1.html : SWIG http://www.swig.org/ is another great resource for using C++ and Tcl. To quote the author: > SWIG is a code development tool created to solve real problems and > make C/C++ programming more enjoyable. Simply stated, SWIG > allows you to integrate common scripting languages such as Tcl, > Perl, Python, and Guile with programs containing collections of > functions written in C or C++. By using an interpreted scripting > language with a C program, you can do a number of cool things like: > Build a powerful interface. > Rapidly prototype new features. > Interactively debug and test your code. > Develop a graphical user interface. > Build C/C++ modules for scripting language applications. > Save lots of time--allowing you to work on the real problem. > Impress your friends. One user notes: > To contrast SWIG with Objectify - SWIG has you prepare a small interface > file that specifies what functions are to be wrapped, rather than adding > macros to your original header file. It also works with C, as well as > C++. From http://www.purl.org/NET/Tcl-FAQ/part2.html : 287. The Linux Gazette occasionally covers Tcl related topics, such as the article http://www.linuxgazette.com/issue49/pramode.html "Using SWIG to interface scripting languages with C/C++". SWIG: Simplified Wrapper and Interface Generator (SWIG) is an interface package which makes it easier to add C code to one's Tcl environment (as well as other languages). http://www.cs.uchicago.edu/mailman/listinfo/swig http://www.cs.uchicago.edu/mailman/options/swig/ is the location to use for subscription related info, or send mail to mailto:Swig-request@cs.uchicago.edu with the line subscribe swig An archive of the mailing list can be found at http://www.swig.org/Archive/archives.html ---- Author is [Dave Beazley]. The idea of Swig is to provide a tool that can, with hopefully little pain, allow one to create glue code between general libraries and various scripting languages, one of which is [Tcl]. Swig can be used for C++ or C libraries - making it one of the first places people are recommended to look when dealing with legacy libraries. ---- If you look around in books or places like [Cameron Laird]'s Tcl pages [http://phaseit.net/claird/comp.lang.tcl/] you can find a lot of information about integrating Tcl with C. That's all fine and dandy if you're going to write the interface code by hand. But if you want a nice example of how you ''ought'' to write your wrappers to call C or C++ from Tcl, then you can't go wrong looking at the code generated by SWIG. David Beazley did a great job of implementing both the "old fashioned" Tcl 7.x all-string interface and the "new fangled" Tcl 8.x object interface. For example, a short little function like this: double convert ( int *value, char *targetUnits ); Gets wrapped by SWIG with this code for Tcl 8.x: static int _wrap_convert(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { double _result; int * _arg0; char * _arg1; Tcl_Obj * tcl_result; char * rettype; int templength; clientData = clientData; objv = objv; tcl_result = Tcl_GetObjResult(interp); if ((objc < 3) || (objc > 3)) { Tcl_SetStringObj(tcl_result,"Wrong # args. convert value targetUnits ",-1); return TCL_ERROR; } if ((rettype = SWIG_GetPointerObj(interp,objv[1],(void **) &_arg0,"_int_p"))) { Tcl_SetStringObj(tcl_result, "Type error in argument 1 of convert. Expected _int_p, received ", -1); Tcl_AppendToObj(tcl_result, rettype, -1); return TCL_ERROR; } if ((_arg1 = Tcl_GetStringFromObj(objv[2], &templength)) == NULL) return TCL_ERROR; _result = (double )convert(_arg0,_arg1); tcl_result = Tcl_GetObjResult(interp); Tcl_SetDoubleObj(tcl_result,(double) _result); return TCL_OK; } If you're using SWIG 1.1 or earlier, it also supported the 7.x interface model: static int _wrap_convert(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { double _result; int * _arg0; char * _arg1; clientData = clientData; argv = argv; if ((argc < 3) || (argc > 3)) { Tcl_SetResult(interp, "Wrong # args. convert value targetUnits ",TCL_STATIC); return TCL_ERROR; } if (SWIG_GetPtr(argv[1],(void **) &_arg0,"_int_p")) { Tcl_SetResult(interp, "Type error in argument 1 of convert. Expected _int_p, received ", TCL_STATIC); Tcl_AppendResult(interp, argv[1], (char *) NULL); return TCL_ERROR; } _arg1 = argv[2]; _result = (double )convert(_arg0,_arg1); Tcl_PrintDouble(interp,(double) _result, interp->result); return TCL_OK; } ---- The new version SWIG 1.3a5 implements the interface in a different way and no longer supports Tcl 7.x. It also no longer has the excellent automatic documentation package in the older version. What it ''does'' have is an excellent macro facility which makes it much easier to interface complicated template classes. '''JPF''' ---- Sorry '''JPF''', but that's several years old. The latest version is 1.3.10 and it rocks, and has great docs. ---- The current version is 1.3.19. It does have great docs. What it does '''NOT''' have is the automatic documentation of a package as a web page which was a feature of the 1.1 version. The same interface file could be used to generate the documentation of the package. This is promised to come back sometime. What it does have is even better support for templates and overloaded operator member functions. '''JPF''' 26 June 2003 (back after a long break) ---- http://www.swig.org/papers/Tcl98/TclChap.html Tcl and SWIG as a C/C++ Development Tool ---- [Swig example showing access to C structures from Tcl] ---- [AMG]: I'd like the ability to [[[unload]]] a Swig extension, but the latest CVS only provides xxx_Init() and xxx_SafeInit(). Any suggestions? ---- In February, 1998 issue of Dr. Dobbs Journal, [David Beazley], creator of SWIG, writes an intro to SWIG. ---- [AM] Here is a page on a similar tool: [Generating wrappers for C and Fortran] ---- [hae] 2008/11/18 The french Tcl-Wiki has some good examples: http://wfr.tcl.tk/1693 ---- 2011/04/13: David Beazley: "... life is too short to wrap my brain around the ever-growing pile of hacks called [C++]. ... things like this are why I don't work on swig anymore." <> Application