summaryrefslogtreecommitdiff
path: root/swigweb/tutorial.ht
diff options
context:
space:
mode:
Diffstat (limited to 'swigweb/tutorial.ht')
-rwxr-xr-xswigweb/tutorial.ht317
1 files changed, 0 insertions, 317 deletions
diff --git a/swigweb/tutorial.ht b/swigweb/tutorial.ht
deleted file mode 100755
index 7422eb636..000000000
--- a/swigweb/tutorial.ht
+++ /dev/null
@@ -1,317 +0,0 @@
-SWIG Tutorial
-
-<p>
-<img src="images/tutorial.png" alt="Tutorial">
-
-<p>
-So you want to get going in a hurry? To illustrate the use of SWIG,
-suppose you have some C functions you want added to Tcl, Perl, Python, Java and C#.
-Specifically, let's say you have them in a file 'example.c'
-
-<blockquote><pre>
-/* File : example.c */
-
-#include &lt;time.h&gt;
-double My_variable = 3.0;
-
-int fact(int n) {
- if (n &lt;= 1) return 1;
- else return n*fact(n-1);
-}
-
-int my_mod(int x, int y) {
- return (x%y);
-}
-
-char *get_time()
-{
- time_t ltime;
- time(&amp;ltime);
- return ctime(&amp;ltime);
-}
-
-</pre></blockquote>
-
-<h3>Interface file </h3>
-
-Now, in order to add these files to your favorite language, you need to write an
-"interface file" which is the input to SWIG. An interface file for these
-C functions might look like this :
-
-<blockquote><pre>
-/* example.i */
-%module example
-%{
-/* Put header files here or function declarations like below */
-extern double My_variable;
-extern int fact(int n);
-extern int my_mod(int x, int y);
-extern char *get_time();
-%}
-
-extern double My_variable;
-extern int fact(int n);
-extern int my_mod(int x, int y);
-extern char *get_time();
-</pre></blockquote>
-
-<h3> Building a Tcl module </h3>
-
-At the UNIX prompt, type the following (shown for Linux, see the <a href="http://www.dabeaz.com/cgi-bin/wiki.pl?SwigFaq/SharedLibraries">SWIG Wiki Shared Libraries</a> page for help with other operating systems):
-
-<blockquote>
-<pre>
-unix % swig -tcl example.i
-unix % gcc -fpic -c example.c example_wrap.c \
- -I/usr/local/include
-unix % gcc -shared example.o example_wrap.o -o example.so
-unix % tclsh
-% load ./example.so example
-% puts $My_variable
-3.0
-% fact 5
-120
-% my_mod 7 3
-1
-% get_time
-Sun Feb 11 23:01:07 1996
-
-%
-</pre></blockquote>
-
-The <tt> swig </tt> command produces a file <a href = "tutorial/example_wrap.html">
-<tt> example_wrap.c </tt> </a> that should be compiled and linked with
-the rest of the program. In this case, we have built a dynamically
-loadable extension that can be loaded into the Tcl interpreter using
-the 'load' command.
-
-<h3> Building a Python module </h3>
-
-Turning C code into a Python module is also easy. Simply do the following (shown for Irix, see the <a href="http://www.dabeaz.com/cgi-bin/wiki.pl?SwigFaq/SharedLibraries">SWIG Wiki Shared Libraries</a> page for help with other operating systems):
-
-<blockquote> <pre>
-
-unix % swig -python example.i
-unix % gcc -c example.c example_wrap.c \
- -I/usr/local/include/python2.1
-unix % ld -shared example.o example_wrap.o -o _example.so
-</pre> </blockquote>
-
-We can now use the Python module as follows :
-<blockquote> <pre>
-&gt;&gt;&gt; import example
-&gt;&gt;&gt; example.fact(5)
-120
-&gt;&gt;&gt; example.my_mod(7,3)
-1
-&gt;&gt;&gt; example.get_time()
-'Sun Feb 11 23:01:07 1996'
-&gt;&gt;&gt;
-</pre>
-</blockquote>
-
-<h3> Building a Perl module </h3>
-You can also build a Perl5 module as follows (shown for Solaris, see the <a href="http://www.dabeaz.com/cgi-bin/wiki.pl?SwigFaq/SharedLibraries">SWIG Wiki Shared Libraries</a> page for help with other operating systems):
-
-<blockquote><pre>
-unix % swig -perl5 example.i
-unix % gcc -c example.c example_wrap.c \
- `perl -MExtUtils::Embed -e ccopts`
-unix % ld -G example.o example_wrap.o -o example.so
-unix % perl
-use example;
-print $example::My_variable,"\n";
-print example::fact(5),"\n";
-print example::get_time(),"\n";
-&lt;ctrl-d&gt;
-3.0
-120
-Sun Feb 11 23:01:07 1996
-unix %
-</pre></blockquote>
-
-<h3> Building a Java module </h3>
-SWIG will also generate JNI code for accessing C/C++ code from Java. Here is an example building a Java module (shown for Cygwin, see the <a href="http://www.dabeaz.com/cgi-bin/wiki.pl?SwigFaq/SharedLibraries">SWIG Wiki Shared Libraries</a> page for help with other operating systems):
-
-<blockquote><pre>
-$ swig -java example.i
-$ gcc -c example.c example_wrap.c -I/c/jdk1.3.1/include -I/c/jdk1.3.1/include/win32
-$ gcc -shared example.o example_wrap.o -mno-cygwin -Wl,--add-stdcall-alias -o example.dll
-$ cat main.java
-public class main {
- public static void main(String argv[]) {
- System.loadLibrary("example");
- System.out.println(example.getMy_variable());
- System.out.println(example.fact(5));
- System.out.println(example.get_time());
- }
-}
-$ javac main.java
-$ java main
-3.0
-120
-Mon Mar 4 18:20:31 2002
-$
-</pre></blockquote>
-
-<h3> Building a C# module </h3>
-SWIG will also generate code for accessing C/C++ code from C# using PInvoke. Here is an example building a C# module (shown for Linux, see the <a href="http://www.dabeaz.com/cgi-bin/wiki.pl?SwigFaq/SharedLibraries">SWIG Wiki Shared Libraries</a> page for help with other operating systems). It uses the open source <a href="http://www.southern-storm.com.au/portable_net.html">DotGNU Portable.NET</a> C# compiler which runs on most Unix systems, but works equally well using other C# compilers:
-
-<blockquote><pre>
-$ swig -csharp example.i
-$ gcc -c -fpic example.c example_wrap.c
-$ gcc -shared example.o example_wrap.o -o libexample.so
-$ cscc -o runme *.cs
-$ cat runme.cs
-using System;
-public class runme {
- static void Main() {
- Console.WriteLine(example.My_variable);
- Console.WriteLine(example.fact(5));
- Console.WriteLine(example.get_time());
- }
-}
-$ ilrun runme
-3
-120
-Tue May 13 10:45:45 2003
-
-$
-</pre></blockquote>
-
-<h3> SWIG for the truly lazy </h3>
-
-As it turns out, it is not always necessary to write a special interface
-file. If you have a header file, you can often just include it directly in the
-SWIG interface. For example:
-
-<blockquote>
-<pre>
-%module example
-%{
-/* Includes the header in the wrapper code */
-#include "header.h"
-%}
-
-/* Parse the header file to generate wrappers */
-%include "header.h"
-</pre>
-</blockquote>
-
-Alternatively, some people might just include SWIG directives in a header
-file with conditional compilation. For example:
-
-<blockquote>
-<pre>
-#ifdef SWIG
-%module example
-%{
-#include "header.h"
-%}
-#endif
-
-extern int fact(int n);
-...
-</pre>
-</blockquote>
-
-<h3> Running SWIG under Microsoft Windows </h3>
-
-SWIG also works perfectly well under all known 32 bit versions of
-Windows including 95/98/NT/2000/XP. SWIG is typically invoked from
-the command prompt and can be used with NMAKE. Modules are typically
-compiled in the form of a DLL that can be dynamically loaded into Tcl,
-Python, or whatever language you are using. With a little work, SWIG
-can also be used as a custom build option within MS Developer Studio.
-
-<h3>That's it (well, more or less)</h3>
-
-That's about everything you need to know to get started. Here's the short checklist :
-
-<ul>
-<li> Make sure you specify a module name.
-<li> Use ANSI C/C++ syntax
-<li> Figure out how to compile a shared library module / dynamic link library (may require reading a few man
-pages for your compiler).
-<li> Relax.
-</ul>
-
-<h3>Surely there's more to it...</h3>
-
-The above example is intentionally simple, but the general idea
-extends to more complicated C/C++ programming tasks. In fact, it is
-important to know that SWIG is a fairly complete C++ compiler with
-support for nearly every language feature. This includes
-preprocessing, pointers, classes, inheritance, and even C++ templates.
-SWIG can also be used to package structures and classes into proxy
-classes in the target language---exposing the underlying functionality in a very
-natural manner.
-
-<p>
-To illustrate, suppose you wanted to wrap the following C++ data structure:
-
-<blockquote>
-<pre>
-// pair.h. A pair like the STL
-namespace std {
- template&lt;class T1, class T2&gt; struct pair {
- T1 first;
- T2 second;
- pair() : first(T1()), second(T2()) { };
- pair(const T1 &amp;f, const T2 &amp;s) : first(f), second(s) { }
- };
-}
-</pre>
-</blockquote>
-
-To wrap with SWIG, you might specify the following interface:
-
-<blockquote>
-<pre>
-// pair.i - SWIG interface
-%module pair
-%{
-#include "pair.h"
-%}
-
-// Ignore the default constructor
-%ignore std::pair::pair();
-
-// Parse the original header file
-%include "pair.h"
-
-// Instantiate some templates
-
-%template(pairii) std::pair&lt;int,int&gt;;
-%template(pairdi) std::pair&lt;double,int&gt;;
-</pre>
-</blockquote>
-
-Now, compiling (Python):
-
-<blockquote>
-<pre>
-$ swig -python -c++ pair.i
-$ c++ -c pair_wrap.c -I/usr/local/include/python2.1
-$ c++ -shared pair_wrap.o -o _pair.so
-$ python
-Python 2.1 (#3, Aug 20 2001, 15:41:42)
-[GCC 2.95.2 19991024 (release)] on sunos5
-Type "copyright", "credits" or "license" for more information.
-&gt;&gt;&gt; import pair
-&gt;&gt;&gt; a = pair.pairii(3,4)
-&gt;&gt;&gt; a.first
-3
-&gt;&gt;&gt; a.second
-4
-&gt;&gt;&gt; a.second = 16
-&gt;&gt;&gt; a.second
-16
-&gt;&gt;&gt; b = pair.pairdi(3.5,8)
-&gt;&gt;&gt; b.first
-3.5
-&gt;&gt;&gt; b.second
-8
-</pre>
-</blockquote>
-