Updated some examples

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@490 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-06-17 21:41:01 +00:00
commit b3e124ac21
22 changed files with 745 additions and 96 deletions

View file

@ -5,6 +5,10 @@ directories contain a very simple example. The "GIFPlot" contains a
more complicated example that illustrates some of SWIG's more advanced
capabilities.
The file 'index.html' is the top of a hyperlinked document that
contains information about all of the examples along with various
notes related to each example.
The Examples directory is currently quite incomplete because it
is being reorganized. A more complete set of examples can be found
in the SWIG1.1p5 distribution (most of which should work with

57
Examples/index.html Normal file
View file

@ -0,0 +1,57 @@
<html>
<head>
<title>SWIG Examples</title>
</head>
<body bgcolor="#ffffff">
<H1>SWIG Examples</H1>
<tt>$Header$</tt> <br>
<p>
Welcome to the browsable SWIG Examples directory. This directory contains a
collection of examples that illustrate various SWIG features for a variety
of target languages. First, it is important to cover a few preliminaries:
<ul>
<li>All of the examples depend on the file <tt>Examples/Makefile</tt>
found within the SWIG distribution. This file is created by
'configure' and usually requires no modifications. However, if you
have an usual installation of packages or experience compilation
problems, you may need to make a few modifications.
<p>
<li>The examples directory is a work in progress and will probably remain
somewhat incomplete. At this time, the Examples directory is somewhat sparse
since it is being rewritten and reoganized.
<p>
<li>
The SWIG user manual also contains a large variety of examples.
</ul>
<h2>Fundamentals</h2>
Follow one of these links to see some simple examples for a specific target
language:
<ul>
<li><a href="python/index.html">Python</a>
<li><a href="perl5/index.html">Perl5</a>
<li><a href="tcl/index.html">Tcl</a>
<li><a href="guile/index.html">Guile</a>
<li><a href="java/index.html">Java</a>
<li><a href="mzscheme/index.html">Mzscheme</a>
</ul>
<h2>Real Life</h2>
The the <a href="GIFPlot/index.html">GIFPlot</a> directory contains examples that illustrate the use of SWIG with
a moderately complex C library for creating GIF images. Many of these
examples illustrate more advanced SWIG features.
</body>
</html>

View file

@ -0,0 +1,18 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS =
TARGET = example
INTERFACE = example.i
all::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' python
static::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
TARGET='mypython' INTERFACE='$(INTERFACE)' python_static
clean::
rm -f *_wrap* *.o *~ *.so mypython *.pyc .~* core

View file

@ -0,0 +1,24 @@
/* File : example.i */
%module example
/* A few preprocessor macros */
#define ICONST 42
#define FCONST 2.1828
#define CCONST 'x'
#define SCONST "Hello World"
/* This should work just fine */
#define EXPR ICONST + 3*(FCONST)
/* This shouldn't do anything */
#define EXTERN extern
/* Neither should this (BAR isn't defined) */
#define FOO (ICONST + BAR)
/* The following statements also produce constants */
const int iconst = 37;
const double fconst = 3.14;

View file

@ -0,0 +1,25 @@
# file: example.py
import example
print "ICONST =", example.ICONST, "(should be 42)"
print "FCONST =", example.FCONST, "(should be 2.1828)"
print "CCONST =", example.CCONST, "(should be 'x')"
print "SCONST =", example.SCONST, "(should be 'Hello World')"
print "EXPR =", example.EXPR, "(should be 48.5484)"
print "iconst =", example.iconst, "(should be 37)"
print "fconst =", example.fconst, "(should be 3.14)"
try:
print "EXTERN = ", example.EXTERN, "(Arg! This shouldn't print anything)"
except AttributeError:
print "EXTERN isn't defined (good)"
try:
print "FOO = ", example.FOO, "(Arg! This shouldn't print anything)"
except AttributeError:
print "FOO isn't defined (good)"

View file

@ -0,0 +1,69 @@
<html>
<head>
<title>SWIG:Examples:python:constants</title>
</head>
<body bgcolor="#ffffff">
<tt>SWIG/Examples/python/constants/</tt>
<hr>
<H2>Wrapping C Constants</H2>
<tt>$Header$</tt><br>
<p>
When SWIG encounters C preprocessor macros and C declarations that look like constants,
it creates Python variables with an identical value. Click <a href="example.i">here</a>
to see a SWIG interface with some constant declarations in it.
<h2>Accessing Constants from Python</h2>
Click <a href="example.py">here</a> to see a script that prints out the values
of the constants contained in the above file.
<h2>Key points</h2>
<ul>
<li>The values of preprocessor macros are converted into Python constants.
<li>Types are inferred by syntax (e.g., "3" is an integer and "3.5" is a float).
<li>Character constants such as 'x' are converted into Python strings.
<li>C string literals such as "Hello World" are converted into Python strings.
<li>Macros that are not fully defined are simply ignored. For example:
<blockquote>
<pre>
#define EXTERN extern
</pre>
</blockquote>
is ignored because SWIG has no idea what type of variable this would be.
<p>
<li>Expressions are allowed provided that all of their components are defined. Otherwise, the constant is ignored.
<li>Certain C declarations involving 'const' are also turned into Python constants.
<li>The Python variables that SWIG creates are not protected from modification. For example,
even if you had this:
<blockquote>
<pre>
#define FOO 73
</pre>
</blockquote>
a user could come along in a script and type
<blockquote>
<pre>
example.FOO = 13
</pre>
</blockquote>
Unfortunately, there's no easy way to prevent this.
<p>
<li>The constants that appear in a SWIG interface file do not have to appear in any sort
of matching C source file since the creation of a constant does not require linkage
to a stored value (i.e., a value held in a C global variable or memory location).
</ul>
<hr>
</body>
</html>

View file

@ -0,0 +1,96 @@
<html>
<head>
<title>SWIG:Examples:python</title>
</head>
<body bgcolor="#ffffff">
<H1>SWIG Python Examples</H1>
<tt>$Header$</tt><br>
<p>
The following examples illustrate the use of SWIG with Python.
<ul>
<li><a href="simple/index.html">simple</a>. A minimal example showing how SWIG can
be used to wrap a C function, a global variable, and a constant.
<li><a href="constants/index.html">constants</a>. This shows how preprocessor macros and
certain C declarations are turned into constants.
</ul>
<h2>Compilation Issues</h2>
<ul>
<li>To create a Python extension, SWIG is run with the following options:
<blockquote>
<pre>
% swig -python interface.i
</pre>
</blockquote>
<li>The compilation of examples is done using the file <tt>Example/Makefile</tt>. This
makefile performs a manual module compilation which is platform specific. Typically,
the steps look like this (Linux):
<blockquote>
<pre>
% swig -python interface.i
% gcc -fpic -c interface_wrap.c -I/usr/local/include/python1.5
% gcc -shared interface_wrap.o $(OBJS) -o interfacemodule.so
% python
Python 1.5.2 (#3, Oct 9 1999, 22:09:34) [GCC 2.95.1 19990816 (release)] on linux2
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import interface
>>> interface.blah(...)
...
</pre>
</blockquote>
<li>The politically "correct" way to compile a Python extension is to follow the steps
described at <a href="http://www.python.org/doc/current/ext/building-on-unix.html">www.python.org</a>
or in the most excellent (and shamelessly plugged) <a href="http://islab.cs.uchicago.edu/python">Python Essential Reference</a>:
<p>
<ol>
<li>Create a file called <tt>Setup</tt> that looks like the following where $(SRCS) is filled
in with any other source files you need to build the extension:
<blockquote>
<pre>
*shared*
interface interface_wrap.c $(SRCS)
</pre>
</blockquote>
<li>Copy the file <tt>Makefile.pre.in</tt> from the Python distribution. Usually it's located
in the directory <tt>/usr/local/lib/python1.5/config</tt> on a Unix machine.
<p>
<li>Type the following to build the extension:
<blockquote>
<pre>
% make -f Makefile.pre.in boot
% make
</pre>
</blockquote>
<li> And that's it. If you are preparing an extension for distribution, you may want
to look at the <a href="http://www.python.org/sigs/distutils-sig/">distutils</a>.
</ol>
</ul>
<h2>Compatibility</h2>
The examples have been extensively tested on the following platforms:
<ul>
<li>Linux
<li>Solaris
</ul>
Your mileage may vary. If you experience a problem, please let us know by
sending a message to <a href="mailto:swig-dev@cs.uchicago.edu">swig-dev@cs.uchicago.edu</a>.
</body>
</html>

View file

@ -1 +0,0 @@
Simple example from the users manual

View file

@ -1,21 +1,18 @@
/* Simple example from documentation */
/* File : example.c */
#include <time.h>
/* A global variable */
double Foo = 3.0;
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
x = y % x;
y = g;
}
return g;
}
int mod(int n, int m) {
return (n % m);
}
char *get_time() {
long ltime;
time(&ltime);
return ctime(&ltime);
}

View file

@ -1,8 +1,5 @@
/* File : example.i */
%module example
extern double My_variable;
extern int fact(int);
extern int mod(int n, int m);
extern char *get_time();
extern int gcd(int x, int y);
extern double Foo;

View file

@ -1,24 +1,24 @@
#!/home/sci/local/bin/python
#
# Python test script. This also illustrates the use of get/set
# for C variables.
from example import *
print get_time()
print "My Variable = ", cvar.My_variable
for i in range(0,14):
n = fact(i)
print i, "factorial is ", n
for i in range(1,250):
for j in range(1,250):
n = mod(i,j)
cvar.My_variable = cvar.My_variable + n
print "My_variable = ", cvar.My_variable
# file: example.py
import example
# Call our gcd() function
x = 42
y = 105
g = example.gcd(x,y)
print "The gcd of %d and %d is %d" % (x,y,g)
# Manipulate the Foo global variable
# Output its current value
print "Foo = ", example.cvar.Foo
# Change its value
example.cvar.Foo = 3.1415926
# See if the change took effect
print "Foo = ", example.cvar.Foo

View file

@ -0,0 +1,99 @@
<html>
<head>
<title>SWIG:Examples:python:simple</title>
</head>
<body bgcolor="#ffffff">
<tt>SWIG/Examples/python/simple/</tt>
<hr>
<H2>Simple Python Example</H2>
<tt>$Header$</tt><br>
<p>
This example illustrates how you can hook Python to a very simple C program containing
a function and a global variable.
<h2>The C Code</h2>
Suppose you have the following C code:
<blockquote>
<pre>
/* File : example.c */
/* A global variable */
double Foo = 3.0;
/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
x = y % x;
y = g;
}
return g;
}
</pre>
</blockquote>
<h2>The SWIG interface</h2>
Here is a simple SWIG interface file:
<blockquote>
<pre>
/* File: example.i */
%module example
extern int gcd(int x, int y);
extern double Foo;
</pre>
</blockquote>
<h2>Compilation</h2>
<ol>
<li><tt>swig -python <a href="example.i">example.i</a></tt>
<p>
<li>Compile <tt><a href="example_wrap.c">example_wrap.c</a></tt> and <tt><a href="example.c">example.c</a></tt>
to create the extension <tt>examplemodule.so</tt>.
</ol>
<h2>Using the extension</h2>
Click <a href="example.py">here</a> to see a script that calls our C functions from Python.
<h2>Key points</h2>
<ul>
<li>Use the <tt>import</tt> statement to load your extension module from Python. For example:
<blockquote>
<pre>
import example
</pre>
</blockquote>
<li>C functions work just like Python functions. For example:
<blockquote>
<pre>
g = example.gcd(42,105)
</pre>
</blockquote>
<li>C global variables are accessed through a special variable called 'cvar'. For example:
<blockquote>
<pre>
a = example.cvar.Foo
</pre>
</blockquote>
</ul>
<hr>
</body>
</html>

View file

@ -0,0 +1,19 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS =
TARGET = my_tclsh
DLTARGET = example
INTERFACE = example.i
all::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
TARGET='$(DLTARGET)' INTERFACE='$(INTERFACE)' tcl
static::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' tclsh
clean::
rm -f *_wrap* *.o my_tclsh *~ .~* core *.so *.sl

View file

@ -0,0 +1,24 @@
/* File : example.i */
%module example
/* A few preprocessor macros */
#define ICONST 42
#define FCONST 2.1828
#define CCONST 'x'
#define SCONST "Hello World"
/* This should work just fine */
#define EXPR ICONST + 3*(FCONST)
/* This shouldn't do anything */
#define EXTERN extern
/* Neither should this (BAR isn't defined) */
#define FOO (ICONST + BAR)
/* The following statements also produce constants */
const int iconst = 37;
const double fconst = 3.14;

View file

@ -0,0 +1,25 @@
# file: example.tcl
catch { load ./example.so example}
catch { load ./example.dll example} ;# Windows
puts "ICONST = $ICONST (should be 42)"
puts "FCONST = $FCONST (should be 2.1828)"
puts "CCONST = $CCONST (should be 'x')"
puts "SCONST = $SCONST (should be 'Hello World')"
puts "EXPR = $EXPR (should be 48.5484)"
puts "iconst = $iconst (should be 37)"
puts "fconst = $fconst (should be 3.14)"
if { [catch {
puts "EXTERN = $EXTERN (Arg! This shouldn't print anything)"
}]} {
puts "EXTERN isn't defined (good)"
}
if { [catch {
puts "FOO = $FOO (Arg! This shouldn't print anything)"
}]} {
puts "FOO isn't defined (good)"
}

View file

@ -0,0 +1,63 @@
<html>
<head>
<title>SWIG:Examples:tcl:constants</title>
</head>
<body bgcolor="#ffffff">
<tt>SWIG/Examples/tcl/constants/</tt>
<hr>
<H2>Wrapping C Constants</H2>
<tt>$Header$</tt><br>
<p>
When SWIG encounters C preprocessor macros and C declarations that look like constants,
it creates Tcl variables with an identical value. Click <a href="example.i">here</a>
to see a SWIG interface with some constant declarations in it.
<h2>Accessing Constants from Tcl</h2>
Click <a href="example.tcl">here</a> to see a script that prints out the values
of the constants contained in the above file.
<h2>Key points</h2>
<ul>
<li>The values of preprocessor macros are converted into Tcl read-only variables.
<li>Types are inferred by syntax (e.g., "3" is an integer and "3.5" is a float).
<li>Character constants such as 'x' are converted into strings.
<li>C string literals such as "Hello World" are converted into strings.
<li>Macros that are not fully defined are simply ignored. For example:
<blockquote>
<pre>
#define EXTERN extern
</pre>
</blockquote>
is ignored because SWIG has no idea what type of variable this would be.
<p>
<li>Expressions are allowed provided that all of their components are defined. Otherwise, the constant is ignored.
<li>Certain C declarations involving 'const' are also turned into Tcl constants.
<li>The constants that appear in a SWIG interface file do not have to appear in any sort
of matching C source file since the creation of a constant does not require linkage
to a stored value (i.e., a value held in a C global variable or memory location).
<li>Since constants are turned into Tcl variables, you have to use the global
statement when accessing from a procedure. For example:
<blockquote>
<pre>
proc foo {} {
global ICONST # Some C constant
puts $ICONST
}
</pre>
</blockquote>
</ul>
<hr>
</body>
</html>

62
Examples/tcl/index.html Normal file
View file

@ -0,0 +1,62 @@
<html>
<head>
<title>SWIG:Examples:tcl</title>
</head>
<body bgcolor="#ffffff">
<H1>SWIG Tcl Examples</H1>
<tt>$Header$</tt><br>
<p>
The following examples illustrate the use of SWIG with Tcl.
<ul>
<li><a href="simple/index.html">simple</a>. A minimal example showing how SWIG can
be used to wrap a C function and a global variable.
<li><a href="constants/index.html">constants</a>. This shows how preprocessor macros and
certain C declarations are turned into constants.
</ul>
<h2>Compilation Issues</h2>
<ul>
<li>To create a Tcl extension, SWIG is run with the following options:
<blockquote>
<pre>
% swig -tcl interface.i
</pre>
</blockquote>
<li>The compilation of examples is done using the file <tt>Example/Makefile</tt>. This
makefile performs a manual module compilation which is platform specific. Typically,
the steps look like this (Linux):
<blockquote>
<pre>
unix % swig -tcl interface.i
unix % gcc -fpic -c interface_wrap.c -I/usr/local/include
unix % gcc -shared interface_wrap.o $(OBJS) -o interface.so
unix % tclsh8.3
% load ./interface.so
% blah ...
</pre>
</blockquote>
</ul>
<h2>Compatibility</h2>
The examples have been extensively tested on the following platforms:
<ul>
<li>Linux
<li>Solaris
</ul>
Your mileage may vary. If you experience a problem, please let us know by
sending a message to <a href="mailto:swig-dev@cs.uchicago.edu">swig-dev@cs.uchicago.edu</a>.
</body>
</html>

View file

@ -1,10 +0,0 @@
This is a simple Tcl example. Type 'make' to
compile a dynamically loadable extension.
'make tcl8' creates a dynamically loadable Tcl 8.x
extension.
'make static' creates a statically linked 'tclsh' executable.
'make static8' create a statically linked 'tclsh8.0' executable.

View file

@ -1,25 +1,18 @@
/* Simple example from documentation */
/* File : example.c */
#ifdef SWIG
%module example
#endif
/* A global variable */
double Foo = 3.0;
#include <time.h>
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
x = y % x;
y = g;
}
return g;
}
int mod(int n, int m) {
return (n % m);
}
char *get_time() {
long ltime;
time(&ltime);
return ctime(&ltime);
}

View file

@ -1,13 +1,5 @@
/* File : example.i */
%module example
%{
/* Put headers and other declarations here */
%}
extern double My_variable;
extern int fact(int);
extern int mod(int n, int m);
extern char *get_time();
extern int gcd(int x, int y);
extern double Foo;

View file

@ -1,26 +1,23 @@
#
# Tcl script for testing simple example
# file: example.tcl
# Try to load as a dynamic module. If not, we'll just assume
# that it was statically linked in.
catch { load ./example.so example}
catch { load ./example.dll example} ;# Windows
puts [get_time]
set tcl_precision 17
puts "My Variable = $My_variable"
for {set i 0} {$i < 14} {incr i 1} {
set n [fact $i];
puts "$i factorial is $n"
}
# Call our gcd() function
set x 42
set y 105
set g [gcd $x $y]
puts "The gcd of $x and $y is $g"
for {set i 1} {$i < 250} {incr i 1} {
for {set j 1} {$j < 250} {incr j 1} {
set n [mod $i $j]
set My_variable [expr {$My_variable + $n}]
}
}
# Manipulate the Foo global variable
puts "My_variable = $My_variable"
# Output its current value
puts "Foo = $Foo"
# Change its value
set Foo 3.1415926
# See if the change took effect
puts "Foo = $Foo"

View file

@ -0,0 +1,99 @@
<html>
<head>
<title>SWIG:Examples:tcl:simple</title>
</head>
<body bgcolor="#ffffff">
<tt>SWIG/Examples/tcl/simple/</tt>
<hr>
<H2>Simple Tcl Example</H2>
<tt>$Header$</tt><br>
<p>
This example illustrates how you can hook Tcl to a very simple C program containing
a function and a global variable.
<h2>The C Code</h2>
Suppose you have the following C code:
<blockquote>
<pre>
/* File : example.c */
/* A global variable */
double Foo = 3.0;
/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
x = y % x;
y = g;
}
return g;
}
</pre>
</blockquote>
<h2>The SWIG interface</h2>
Here is a simple SWIG interface file:
<blockquote>
<pre>
/* File: example.i */
%module example
extern int gcd(int x, int y);
extern double Foo;
</pre>
</blockquote>
<h2>Compilation</h2>
<ol>
<li><tt>swig -tcl <a href="example.i">example.i</a></tt>
<p>
<li>Compile <tt><a href="example_wrap.c">example_wrap.c</a></tt> and <tt><a href="example.c">example.c</a></tt>
to create the extension <tt>example.so</tt>.
</ol>
<h2>Using the extension</h2>
Click <a href="example.tcl">here</a> to see a script that calls our C functions from Tcl.
<h2>Key points</h2>
<ul>
<li>Use the <tt>load</tt> statement to load your extension module into Tcl. For example:
<blockquote>
<pre>
load ./example.so
</pre>
</blockquote>
<li>C functions work just like Tcl functions. For example:
<blockquote>
<pre>
set g [gcd 42 105]
</pre>
</blockquote>
<li>C global variables are accessed as Tcl variables. For example:
<blockquote>
<pre>
set a $Foo
set Foo $newvalue
</pre>
</blockquote>
</ul>
<hr>
</body>
</html>