added basic Modula-3 support

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5776 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Henning Thielemann 2004-03-19 11:45:29 +00:00
commit 39d92e49b2
57 changed files with 6645 additions and 380 deletions

View file

@ -7,7 +7,7 @@
<body bgcolor="#ffffff">
<a name="n1"></a><H1>24 SWIG and Chicken</H1>
<a name="n1"></a><H1>25 SWIG and Chicken</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Preliminaries</a>
@ -58,7 +58,7 @@
</p>
<a name="n2"></a><H2>24.1 Preliminaries</H2>
<a name="n2"></a><H2>25.1 Preliminaries</H2>
<p>
@ -79,7 +79,7 @@
</p>
<a name="n3"></a><H3>24.1.1 Running SWIG in C mode</H3>
<a name="n3"></a><H3>25.1.1 Running SWIG in C mode</H3>
<p>
@ -101,7 +101,7 @@
object files and linked into your project.
</p>
<a name="n4"></a><H3>24.1.2 Running SWIG in C++ mode</H3>
<a name="n4"></a><H3>25.1.2 Running SWIG in C++ mode</H3>
<p>
@ -123,10 +123,10 @@
</p>
<a name="n5"></a><H2>24.2 Code Generation</H2>
<a name="n5"></a><H2>25.2 Code Generation</H2>
<a name="n6"></a><H3>24.2.1 Naming Conventions</H3>
<a name="n6"></a><H3>25.2.1 Naming Conventions</H3>
<p>
@ -153,7 +153,7 @@
<tt>%rename</tt> SWIG directive in the SWIG interface file.
</p>
<a name="n7"></a><H3>24.2.2 Modules and Prefixes</H3>
<a name="n7"></a><H3>25.2.2 Modules and Prefixes</H3>
<p>
@ -187,7 +187,7 @@
</p>
<a name="n8"></a><H3>24.2.3 Constants and Variables</H3>
<a name="n8"></a><H3>25.2.3 Constants and Variables</H3>
<p>
@ -212,7 +212,7 @@
use <tt>(my-variable)</tt>.
</p>
<a name="n9"></a><H3>24.2.4 Functions</H3>
<a name="n9"></a><H3>25.2.4 Functions</H3>
<p>
@ -231,7 +231,7 @@
parameters).
</p>
<a name="n10"></a><H2>24.3 TinyCLOS</H2>
<a name="n10"></a><H2>25.3 TinyCLOS</H2>
<p>
@ -269,7 +269,7 @@
</p>
<a name="n11"></a><H2>24.4 Compilation</H2>
<a name="n11"></a><H2>25.4 Compilation</H2>
<p>
@ -283,7 +283,7 @@
much simpler <tt>csc</tt> or <tt>csc.bat</tt>.
</p>
<a name="n12"></a><H2>24.5 Linkage</H2>
<a name="n12"></a><H2>25.5 Linkage</H2>
<p>
@ -307,7 +307,7 @@ CHICKEN_HOME=/usr/local/share/chicken</pre>
your platform.
</p>
<a name="n13"></a><H3>24.5.1 Customized Interpreter</H3>
<a name="n13"></a><H3>25.5.1 Customized Interpreter</H3>
<p>
@ -348,7 +348,7 @@ CHICKEN_HOME=/usr/local/share/chicken</pre>
</p>
<a name="n14"></a><H2>24.6 Typemaps</H2>
<a name="n14"></a><H2>25.6 Typemaps</H2>
<p>
@ -488,7 +488,7 @@ CHICKEN_HOME=/usr/local/share/chicken</pre>
</p>
<a name="n15"></a><H2>24.7 Pointers</H2>
<a name="n15"></a><H2>25.7 Pointers</H2>
<p>
@ -523,7 +523,7 @@ CHICKEN_HOME=/usr/local/share/chicken</pre>
to be broken (Bug #782468), so that type errors may not be
reported.
<a name="n16"></a><H2>24.8 Unsupported features</H2>
<a name="n16"></a><H2>25.8 Unsupported features</H2>
<ul>

View file

@ -38,11 +38,11 @@
<li><a href="Introduction.html#n7">Building a Perl5 module</a>
<li><a href="Introduction.html#n8">Building a Python module</a>
<li><a href="Introduction.html#n9">Shortcuts</a>
<li><a href="Introduction.html#n10">Building libraries and modules</a>
</ul>
<li><a href="Introduction.html#n11">Supported C/C++ language features</a>
<li><a href="Introduction.html#n12">Non-intrusive interface building</a>
<li><a href="Introduction.html#n13">Hands off code generation</a>
<li><a href="Introduction.html#n10">Supported C/C++ language features</a>
<li><a href="Introduction.html#n11">Non-intrusive interface building</a>
<li><a href="Introduction.html#n12">Hands off code generation</a>
<li><a href="Introduction.html#n13">SWIG and freedom</a>
</ul>
<!-- INDEX -->
@ -57,25 +57,26 @@
</ul>
<li><a href="Windows.html#n5">SWIG Windows Examples</a>
<ul>
<li><a href="Windows.html#n6">Instructions for using the Examples with Visual C++</a>
<li><a href="Windows.html#n6">Instructions for using the Examples with Visual Studio</a>
<ul>
<li><a href="Windows.html#n7">Python</a>
<li><a href="Windows.html#n8">TCL</a>
<li><a href="Windows.html#n9">Perl</a>
<li><a href="Windows.html#n10">Java</a>
<li><a href="Windows.html#n11">Ruby</a>
<li><a href="Windows.html#n12">C#</a>
</ul>
<li><a href="Windows.html#n12">Instructions for using the Examples with other compilers</a>
<li><a href="Windows.html#n13">Instructions for using the Examples with other compilers</a>
</ul>
<li><a href="Windows.html#n13">SWIG on Cygwin and MinGW</a>
<li><a href="Windows.html#n14">SWIG on Cygwin and MinGW</a>
<ul>
<li><a href="Windows.html#n14">Building swig.exe on Windows</a>
<li><a href="Windows.html#n15">Building swig.exe on Windows</a>
<ul>
<li><a href="Windows.html#n15">Building swig.exe using MinGW and MSYS</a>
<li><a href="Windows.html#n16">Building swig.exe using Cygwin</a>
<li><a href="Windows.html#n17">Building swig.exe alternatives</a>
<li><a href="Windows.html#n16">Building swig.exe using MinGW and MSYS</a>
<li><a href="Windows.html#n17">Building swig.exe using Cygwin</a>
<li><a href="Windows.html#n18">Building swig.exe alternatives</a>
</ul>
<li><a href="Windows.html#n18">Running the examples on Windows using Cygwin</a>
<li><a href="Windows.html#n19">Running the examples on Windows using Cygwin</a>
</ul>
</ul>
<!-- INDEX -->
@ -380,17 +381,18 @@
<li><a href="Warnings.html#n4">Enabling additional warnings</a>
<li><a href="Warnings.html#n5">Issuing a warning message</a>
<li><a href="Warnings.html#n6">Commentary</a>
<li><a href="Warnings.html#n7">Warning number reference</a>
<li><a href="Warnings.html#n7">Message output format</a>
<li><a href="Warnings.html#n8">Warning number reference</a>
<ul>
<li><a href="Warnings.html#n8">Deprecated features (100-199)</a>
<li><a href="Warnings.html#n9">Preprocessor (200-299)</a>
<li><a href="Warnings.html#n10">C/C++ Parser (300-399)</a>
<li><a href="Warnings.html#n11">Types and typemaps (400-499) </a>
<li><a href="Warnings.html#n12">Code generation (500-599)</a>
<li><a href="Warnings.html#n13">Language module specific (800-899) </a>
<li><a href="Warnings.html#n14">User defined (900-999)</a>
<li><a href="Warnings.html#n9">Deprecated features (100-199)</a>
<li><a href="Warnings.html#n10">Preprocessor (200-299)</a>
<li><a href="Warnings.html#n11">C/C++ Parser (300-399)</a>
<li><a href="Warnings.html#n12">Types and typemaps (400-499) </a>
<li><a href="Warnings.html#n13">Code generation (500-599)</a>
<li><a href="Warnings.html#n14">Language module specific (800-899) </a>
<li><a href="Warnings.html#n15">User defined (900-999)</a>
</ul>
<li><a href="Warnings.html#n15">History</a>
<li><a href="Warnings.html#n16">History</a>
</ul>
<!-- INDEX -->
@ -603,7 +605,28 @@
</ul>
<!-- INDEX -->
<h3><a href="Ocaml.html">18 SWIG and Ocaml</a></h3>
<h3><a href="Modula3.html">18 SWIG and Modula-3</a></h3>
<!-- INDEX -->
<ul>
<li><a href="Modula3.html#n2">Overview</a>
<li><a href="Modula3.html#n3">Preliminaries</a>
<ul>
<li><a href="Modula3.html#n4">Compilers</a>
<li><a href="Modula3.html#n5">Additional Commandline Options</a>
</ul>
<li><a href="Modula3.html#n6">Modula-3 typemaps</a>
<ul>
<li><a href="Modula3.html#n7">Inputs and outputs</a>
<li><a href="Modula3.html#n8">Exceptions</a>
<li><a href="Modula3.html#n9">Subranges, Enumerations, Sets</a>
<li><a href="Modula3.html#n10">Objects</a>
<li><a href="Modula3.html#n11">Example</a>
</ul>
</ul>
<!-- INDEX -->
<h3><a href="Ocaml.html">19 SWIG and Ocaml</a></h3>
<!-- INDEX -->
<ul>
@ -649,7 +672,7 @@
</ul>
<!-- INDEX -->
<h3><a href="Perl5.html">19 SWIG and Perl5</a></h3>
<h3><a href="Perl5.html">20 SWIG and Perl5</a></h3>
<!-- INDEX -->
<ul>
@ -711,7 +734,7 @@
</ul>
<!-- INDEX -->
<h3><a href="Php.html">20 SWIG and PHP4</a></h3>
<h3><a href="Php.html">21 SWIG and PHP4</a></h3>
<!-- INDEX -->
<ul>
@ -735,7 +758,7 @@
</ul>
<!-- INDEX -->
<h3><a href="Python.html">21 SWIG and Python</a></h3>
<h3><a href="Python.html">22 SWIG and Python</a></h3>
<!-- INDEX -->
<ul>
@ -821,7 +844,7 @@
</ul>
<!-- INDEX -->
<h3><a href="Ruby.html">22 SWIG and Ruby</a></h3>
<h3><a href="Ruby.html">23 SWIG and Ruby</a></h3>
<!-- INDEX -->
<ul>
@ -896,7 +919,7 @@
</ul>
<!-- INDEX -->
<h3><a href="Tcl.html">23 SWIG and Tcl</a></h3>
<h3><a href="Tcl.html">24 SWIG and Tcl</a></h3>
<!-- INDEX -->
<ul>
@ -959,7 +982,7 @@
</ul>
<!-- INDEX -->
<h3><a href="Chicken.html">24 SWIG and Chicken</a></h3>
<h3><a href="Chicken.html">25 SWIG and Chicken</a></h3>
<!-- INDEX -->
<ul>
@ -987,7 +1010,7 @@
</ul>
<!-- INDEX -->
<h3><a href="Extending.html">25 Extending SWIG</a></h3>
<h3><a href="Extending.html">26 Extending SWIG</a></h3>
<!-- INDEX -->
<ul>

View file

@ -155,6 +155,7 @@ this means that both the arguments to <tt>Spam::bar</tt> must be positive.
<a name="n4"></a><H2>10.3 Constant aggregation and %aggregate_check</H2>
Consider an interface file that contains the following code:
<blockquote>
@ -238,4 +239,4 @@ in SWIG-1.3.20.
<address>SWIG 1.3 - Last Modified : November 12, 2003</address>
</body>
</html>
</html>

View file

@ -5,7 +5,7 @@
</head>
<body bgcolor="#ffffff">
<a name="n1"></a><H1>25 Extending SWIG</H1>
<a name="n1"></a><H1>26 Extending SWIG</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Introduction</a>
@ -70,7 +70,7 @@
<b>Caution: This chapter is being rewritten! (11/25/01)</b>
<a name="n2"></a><H2>25.1 Introduction</H2>
<a name="n2"></a><H2>26.1 Introduction</H2>
This chapter describes SWIG's internal organization and the process by which
@ -83,7 +83,7 @@ date, but changes are ongoing. Expect a few inconsistencies.
Also, this chapter is not meant to be a hand-holding tutorial. As a starting point,
you should probably look at one of SWIG's existing modules.
<a name="n3"></a><H2>25.2 Prerequisites</H2>
<a name="n3"></a><H2>26.2 Prerequisites</H2>
In order to extend SWIG, it is useful to have the following background:
@ -109,7 +109,7 @@ extension of the C++ <em>type</em> system. At first glance, this might not be
obvious, but almost all SWIG directives as well as the low-level generation of
wrapper code are driven by C++ datatypes.
<a name="n4"></a><H2>25.3 The Big Picture</H2>
<a name="n4"></a><H2>26.3 The Big Picture</H2>
SWIG is a special purpose compiler that parses C++ declarations to
@ -142,7 +142,7 @@ fundamental concepts. The type system and pattern matching rules also play a cr
role in making the system work. For example, both typemaps and declaration annotation are
based on pattern matching and interact heavily with the underlying type system.
<a name="n5"></a><H2>25.4 Execution Model</H2>
<a name="n5"></a><H2>26.4 Execution Model</H2>
When you run SWIG on an interface, processing is handled in stages by a series of system components:
@ -182,7 +182,7 @@ stage of compilation.
The next few sections briefly describe some of these stages.
<a name="n6"></a><H3>25.4.1 Preprocessing</H3>
<a name="n6"></a><H3>26.4.1 Preprocessing</H3>
The preprocessor plays a critical role in the SWIG implementation. This is because a lot
@ -254,7 +254,7 @@ probably isn't too useful in general, but it will show how macros have
been expanded as well as everything else that goes into the low-level
construction of the wrapper code.
<a name="n7"></a><H3>25.4.2 Parsing</H3>
<a name="n7"></a><H3>26.4.2 Parsing</H3>
The current C++ parser handles a subset of C++. Most incompatibilities with C are due to
@ -339,7 +339,7 @@ interprets the above code as an abstract declarator for a function
returning a <tt>foo</tt> and taking types <tt>a</tt> and <tt>b</tt> as
arguments).
<a name="n8"></a><H3>25.4.3 Parse Trees</H3>
<a name="n8"></a><H3>26.4.3 Parse Trees</H3>
The SWIG parser produces a complete parse tree of the input file before any wrapper code
@ -588,7 +588,7 @@ $ swig -c++ -python -dump_tree example.i
</pre>
</blockquote>
<a name="n9"></a><H3>25.4.4 Attribute namespaces</H3>
<a name="n9"></a><H3>26.4.4 Attribute namespaces</H3>
Attributes of parse tree nodes are often prepended with a namespace qualifier.
@ -604,7 +604,7 @@ of wrapper code. The convention for doing this is to place these attributes in
that matches the name of the target language. For example, <tt>python:foo</tt> or
<tt>perl:foo</tt>.
<a name="n10"></a><H3>25.4.5 Symbol Tables</H3>
<a name="n10"></a><H3>26.4.5 Symbol Tables</H3>
During parsing, all symbols are managed in the space of the target
@ -684,7 +684,7 @@ example.i:5. Previous declaration is foo_i(int )
</pre>
</blockquote>
<a name="n11"></a><H3>25.4.6 The %feature directive</H3>
<a name="n11"></a><H3>26.4.6 The %feature directive</H3>
A number of SWIG directives such as <tt>%exception</tt> are implemented using the
@ -734,7 +734,7 @@ data stored in a feature attribute is usually just a raw unparsed string.
For example, the exception code above is simply
stored without any modifications.
<a name="n12"></a><H3>25.4.7 Code Generation</H3>
<a name="n12"></a><H3>26.4.7 Code Generation</H3>
Language modules work by defining handler functions that know how to respond to
@ -842,7 +842,7 @@ public :
The role of these functions is described shortly.
<a name="n13"></a><H3>25.4.8 SWIG and XML</H3>
<a name="n13"></a><H3>26.4.8 SWIG and XML</H3>
Much of SWIG's current parser design was originally motivated by
@ -853,7 +853,7 @@ by aspects of XML parsing. Therefore, in trying to understand SWIG's
internal data structures, it may be useful keep XML in the back of
your mind as a model.
<a name="n14"></a><H2>25.5 Primitive Data Structures</H2>
<a name="n14"></a><H2>26.5 Primitive Data Structures</H2>
Most of SWIG is constructed using three basic data structures:
@ -893,7 +893,7 @@ typedef Hash Typetab;
</pre>
</blockquote>
<a name="n15"></a><H3>25.5.1 Strings</H3>
<a name="n15"></a><H3>26.5.1 Strings</H3>
<p>
@ -1001,7 +1001,7 @@ DOH_REPLACE_FIRST - Replace first occurrence only.
Returns the number of replacements made (if any).
</blockquote>
<a name="n16"></a><H3>25.5.2 Hashes</H3>
<a name="n16"></a><H3>26.5.2 Hashes</H3>
<p>
@ -1062,7 +1062,7 @@ Returns the list of hash table keys.
</blockquote>
<a name="n17"></a><H3>25.5.3 Lists</H3>
<a name="n17"></a><H3>26.5.3 Lists</H3>
<p>
@ -1133,7 +1133,7 @@ If <tt>t</tt> is not a standard object, it is assumed to be a <tt>char *</tt>
and is used to create a String object.
</blockquote>
<a name="n18"></a><H3>25.5.4 Common operations</H3>
<a name="n18"></a><H3>26.5.4 Common operations</H3>
The following operations are applicable to all datatypes.
@ -1176,7 +1176,7 @@ objects and report errors.
Gets the line number associated with <tt>x</tt>.
</blockquote>
<a name="n19"></a><H3>25.5.5 Iterating over Lists and Hashes</H3>
<a name="n19"></a><H3>26.5.5 Iterating over Lists and Hashes</H3>
To iterate over the elements of a list or a hash table, the following functions are used:
@ -1216,7 +1216,7 @@ for (j = First(j); j.item; j= Next(j)) {
</pre>
</blockquote>
<a name="n20"></a><H3>25.5.6 I/O</H3>
<a name="n20"></a><H3>26.5.6 I/O</H3>
Special I/O functions are used for all internal I/O. These operations
@ -1323,7 +1323,7 @@ Printf(f, "%s\n", s);
Similarly, the preprocessor and parser all operate on string-files.
<a name="n21"></a><H2>25.6 Navigating and manipulating parse trees</H2>
<a name="n21"></a><H2>26.6 Navigating and manipulating parse trees</H2>
Parse trees are built as collections of hash tables. Each node is a hash table in which
@ -1425,7 +1425,7 @@ Deletes a node from the parse tree. Deletion reconnects siblings and properly u
the parent so that sibling nodes are unaffected.
</blockquote>
<a name="n22"></a><H2>25.7 Working with attributes</H2>
<a name="n22"></a><H2>26.7 Working with attributes</H2>
Since parse tree nodes are just hash tables, attributes are accessed using the <tt>Getattr()</tt>,
@ -1524,14 +1524,14 @@ the attribute is optional. <tt>Swig_restore()</tt> must always be called after
function.
</blockquote>
<a name="n23"></a><H2>25.8 Type system</H2>
<a name="n23"></a><H2>26.8 Type system</H2>
SWIG implements the complete C++ type system including typedef, inheritance,
pointers, references, and pointers to members. A detailed discussion of
type theory is impossible here. However, let's cover the highlights.
<a name="n24"></a><H3>25.8.1 String encoding of types</H3>
<a name="n24"></a><H3>26.8.1 String encoding of types</H3>
<p>
@ -1619,7 +1619,7 @@ is processed in a few pieces. In this case, you have the base type
make the final type, the two parts are just joined together using
string concatenation.
<a name="n25"></a><H3>25.8.2 Type construction</H3>
<a name="n25"></a><H3>26.8.2 Type construction</H3>
The following functions are used to construct types. You should use
@ -1726,7 +1726,7 @@ Returns the prefix of a type. For example, if <tt>ty</tt> is
<tt>ty</tt> is unmodified.
</blockquote>
<a name="n26"></a><H3>25.8.3 Type tests</H3>
<a name="n26"></a><H3>26.8.3 Type tests</H3>
The following functions can be used to test properties of a datatype.
@ -1791,7 +1791,7 @@ Checks if <tt>ty</tt> is a varargs type.
Checks if <tt>ty</tt> is a templatized type.
</blockquote>
<a name="n27"></a><H3>25.8.4 Typedef and inheritance</H3>
<a name="n27"></a><H3>26.8.4 Typedef and inheritance</H3>
The behavior of <tt>typedef</tt> declaration is to introduce a type alias.
@ -1876,7 +1876,7 @@ Fully reduces <tt>ty</tt> according to typedef rules. Resulting datatype
will consist only of primitive typenames.
</blockquote>
<a name="n28"></a><H3>25.8.5 Lvalues</H3>
<a name="n28"></a><H3>26.8.5 Lvalues</H3>
When generating wrapper code, it is necessary to emit datatypes that can
@ -1907,7 +1907,7 @@ Literal y; // type = 'Literal', ltype='p.char'
</pre>
</blockquote>
<a name="n29"></a><H3>25.8.6 Output functions</H3>
<a name="n29"></a><H3>26.8.6 Output functions</H3>
The following functions produce strings that are suitable for output.
@ -1957,7 +1957,7 @@ SWIG, but is most commonly associated with type-descriptor objects
that appear in wrappers (e.g., <tt>SWIGTYPE_p_double</tt>).
</blockquote>
<a name="n30"></a><H2>25.9 Parameters</H2>
<a name="n30"></a><H2>26.9 Parameters</H2>
Several type-related functions involve parameter lists. These include
@ -2036,7 +2036,7 @@ included. Used to emit prototypes.
Returns the number of required (non-optional) arguments in <tt>p</tt>.
</blockquote>
<a name="n31"></a><H2>25.10 Writing a Language Module</H2>
<a name="n31"></a><H2>26.10 Writing a Language Module</H2>
This section briefly outlines the steps needed to create a bare-bones
@ -2045,7 +2045,7 @@ of existing modules. Since the code is relatively easy to read, this section
describes the creation of a minimal Python module. You should be able to extrapolate
this to other languages.
<a name="n32"></a><H3>25.10.1 Execution model</H3>
<a name="n32"></a><H3>26.10.1 Execution model</H3>
Code generation modules are defined by inheriting from the <tt>Language</tt> class,
@ -2053,7 +2053,7 @@ currently defined in the <tt>Source/Modules1.1</tt> directory of SWIG. Starting
the parsing of command line options, all aspects of code generation are controlled by
different methods of the <tt>Language</tt> that must be defined by your module.
<a name="n33"></a><H3>25.10.2 Starting out</H3>
<a name="n33"></a><H3>26.10.2 Starting out</H3>
To define a new language module, first create a minimal implementation using
@ -2145,7 +2145,7 @@ Once it finishes compiling, try running SWIG with the command-line option
that activates your module. For example, <tt>swig -python foo.i</tt>. The
messages from your new module should appear.
<a name="n34"></a><H3>25.10.3 Command line options</H3>
<a name="n34"></a><H3>26.10.3 Command line options</H3>
When SWIG starts, the command line options are passed to your language module. This occurs
@ -2199,7 +2199,7 @@ If a module recognizes an option, it should always call <tt>Swig_mark_arg()</tt>
to mark the option as valid. If you forget to do this, SWIG will terminate with an
unrecognized command line option error.
<a name="n35"></a><H3>25.10.4 Configuration and preprocessing</H3>
<a name="n35"></a><H3>26.10.4 Configuration and preprocessing</H3>
In addition to looking at command line options, the <tt>main()</tt> method is responsible
@ -2242,7 +2242,7 @@ Just to review, your language module should now consist of two files--
an implementation file <tt>python.cxx</tt> and a configuration file
<tt>python.swg</tt>.
<a name="n36"></a><H3>25.10.5 Entry point to code generation</H3>
<a name="n36"></a><H3>26.10.5 Entry point to code generation</H3>
SWIG is a multi-pass compiler. Once the <tt>main()</tt> method has
@ -2296,13 +2296,13 @@ int Python::top(Node *n) {
</blockquote>
</pre>
<a name="n37"></a><H3>25.10.6 Module I/O and wrapper skeleton</H3>
<a name="n37"></a><H3>26.10.6 Module I/O and wrapper skeleton</H3>
<a name="n38"></a><H3>25.10.7 Low-level code generators</H3>
<a name="n38"></a><H3>26.10.7 Low-level code generators</H3>
<a name="n39"></a><H3>25.10.8 Configuration files</H3>
<a name="n39"></a><H3>26.10.8 Configuration files</H3>
<!-- please report bugs in this section to ttn -->
@ -2428,14 +2428,14 @@ to handle some of these configuration tasks, but that point is now
long past. If you are interested in working on that, feel free to
raise the issue in the context of a next-generation clean-slate SWIG.<p>
<a name="n40"></a><H3>25.10.9 Runtime support</H3>
<a name="n40"></a><H3>26.10.9 Runtime support</H3>
Discuss the kinds of functions typically needed for SWIG runtime support (e.g.
<tt>SWIG_ConvertPtr()</tt> and <tt>SWIG_NewPointerObj()</tt>) and the names of
the SWIG files that implement those functions.
<a name="n41"></a><H3>25.10.10 Standard library files</H3>
<a name="n41"></a><H3>26.10.10 Standard library files</H3>
Discuss the standard library files that most language modules provide, e.g.
@ -2446,7 +2446,7 @@ Discuss the standard library files that most language modules provide, e.g.
<li> stl.i </li>
</ul>
<a name="n42"></a><H3>25.10.11 Examples and test cases</H3>
<a name="n42"></a><H3>26.10.11 Examples and test cases</H3>
Each of the language modules provides one or more examples. These examples
@ -2467,7 +2467,7 @@ By default, all of the examples are built and run when the user types
during this process, see the section on <a href="#n37a">configuration
files</a>.
<a name="n43"></a><H3>25.10.12 Documentation</H3>
<a name="n43"></a><H3>26.10.12 Documentation</H3>
Don't forget to write end-user documentation for your language module. Currently,
@ -2494,13 +2494,13 @@ Some topics that you'll want to be sure to address include:
if available.
</ul>
<a name="n44"></a><H2>25.11 Typemaps</H2>
<a name="n44"></a><H2>26.11 Typemaps</H2>
<a name="n45"></a><H3>25.11.1 Proxy classes</H3>
<a name="n45"></a><H3>26.11.1 Proxy classes</H3>
<a name="n46"></a><H2>25.12 Guide to parse tree nodes</H2>
<a name="n46"></a><H2>26.12 Guide to parse tree nodes</H2>
This section describes the different parse tree nodes and their attributes.
@ -2817,4 +2817,4 @@ extern "X" { ... } declaration.
<address>SWIG 1.3 - Last Modified : January 22, 2002</address>
</body>
</html>
</html>

View file

@ -17,11 +17,11 @@
<li><a href="#n7">Building a Perl5 module</a>
<li><a href="#n8">Building a Python module</a>
<li><a href="#n9">Shortcuts</a>
<li><a href="#n10">Building libraries and modules</a>
</ul>
<li><a href="#n11">Supported C/C++ language features</a>
<li><a href="#n12">Non-intrusive interface building</a>
<li><a href="#n13">Hands off code generation</a>
<li><a href="#n10">Supported C/C++ language features</a>
<li><a href="#n11">Non-intrusive interface building</a>
<li><a href="#n12">Hands off code generation</a>
<li><a href="#n13">SWIG and freedom</a>
</ul>
<!-- INDEX -->
@ -67,6 +67,7 @@ in scientific and engineering projects.
<a name="n3"></a><H2>1.2 Why use SWIG?</H2>
As stated in the previous section, the primary purpose of SWIG is to simplify
the task of integrating C/C++ with other programming languages. However, why would
anyone want to do that? To answer that question, it is useful to list a few strengths
@ -286,7 +287,8 @@ print $example::My_variable + 4.5, "\n";
7.5
</pre></blockquote>
<a name="n11"></a><H2>1.4 Supported C/C++ language features</H2>
<a name="n10"></a><H2>1.4 Supported C/C++ language features</H2>
A primary goal of the SWIG project is to make the language binding
process extremely easy. Although a few simple examples have been shown,
@ -321,7 +323,8 @@ wrapping simple C++ code. In fact, SWIG is able handle C++ code that
stresses the very limits of many C++ compilers.
<a name="n12"></a><H2>1.5 Non-intrusive interface building</H2>
<a name="n11"></a><H2>1.5 Non-intrusive interface building</H2>
When used as intended, SWIG requires minimal (if any) modification to
existing C code. This makes SWIG extremely easy to use with existing
@ -330,7 +333,7 @@ the C code independent of the high level interface, you can change the
interface and reuse the code in other applications. It is also
possible to support different types of interfaces depending on the application.
<a name="n13"></a><H2>1.6 Hands off code generation</H2>
<a name="n12"></a><H2>1.6 Hands off code generation</H2>
SWIG is designed to produce working code that needs no
@ -343,7 +346,8 @@ file. While this approach may limit flexibility for hard-core hackers,
it allows others to forget about the low-level implementation
details.
<H2>SWIG and freedom</h2>
<a name="n13"></a><H2>1.7 SWIG and freedom</H2>
No, this isn't a special section on the sorry state of world politics.
However, it may be useful to know that SWIG was written with a
@ -371,4 +375,4 @@ non-portable or unreliable programming features.
<address>SWIG 1.3 - Last Modified : August 10, 2002</address>
</body>
</html>
</html>

View file

@ -4789,4 +4789,4 @@ If your SWIG installation went well Unix users should be able to type <tt>make</
For the benefit of Windows users, there are also Visual C++ project files in a couple of the <a href="Windows.html#examples">Windows Examples</a>.
</body>
</html>
</html>

360
Doc/Manual/Modula3.html Normal file
View file

@ -0,0 +1,360 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>SWIG and Modula-3</title>
</head>
<body bgcolor="#FFFFFF">
<a name="n1"></a><H1>18 SWIG and Modula-3</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Overview</a>
<li><a href="#n3">Preliminaries</a>
<ul>
<li><a href="#n4">Compilers</a>
<li><a href="#n5">Additional Commandline Options</a>
</ul>
<li><a href="#n6">Modula-3 typemaps</a>
<ul>
<li><a href="#n7">Inputs and outputs</a>
<li><a href="#n8">Exceptions</a>
<li><a href="#n9">Subranges, Enumerations, Sets</a>
<li><a href="#n10">Objects</a>
<li><a href="#n11">Example</a>
</ul>
</ul>
<!-- INDEX -->
This chapter describes SWIG's support of
<a href="http://www.m3.org/">Modula-3</a>.
You should be familiar with the
<a href="SWIG.html">basics</a>
of SWIG,
especially typemaps.
<a name="overview"></a>
<a name="n2"></a><H2>18.1 Overview</H2>
<p>
The Modula-3 support is very basic and highly experimental!
Many features are still not designed satisfyingly
and I need more discussion about the odds and ends.
The Modula-3 generator was already useful for interfacing
to the
<a href="http://www.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/plplot/">
PLPlot
</a>
library.
<!--
<p>
The following introduction may help you
when you are uncertain about using
the Modula-3 support or SWIG at all.
<a name="whycxx"></a>
<a name="n3"></a><DISABLED>18.1.1 Why not scripting ?</DISABLED>
<p>
SWIG started as wrapper from the fast compiled languages C and C++
to high level scripting languages like Python.
Although scripting languages are designed
to make programming life easier
by hiding machine internals from the programmer
there are several aspects of todays scripting languages
that are unfavourable in my opinion.
<p>
Besides C, C++, Cluster (a Modula derivate for Amiga computers)
I evaluated several scripting like languages in the past:
Different dialects of BASIC,
Perl, ARexx (a variant of Rexx for Amiga computers),
shell scripts.
I found them too inconsistent,
too weak in distinguishing types,
too weak in encapsulating pieces of code.
Eventually I have started several projects in Python
because of the fine syntax.
But when projects became larger
I lost the track.
I got convinced that one can not have
maintainable code in a language
that is not statically typed.
In fact the main advantages of scripting languages
e.g. matching regular expressions,
complex built-in datatypes like lists, dictionaries,
are not advantages of the language itself
but can be provided by function libraries.
<a name="whymodula3"></a>
<a name="n4"></a><DISABLED>18.1.2 Why Modula-3 ?</DISABLED>
<p>
Modula-3 is a compiler language
in the tradition of Niklas Wirth's Modula 2,
which is in turn a successor of the popular Pascal.
I have chosen Modula-3
because of its
logical syntax,
strong modularization,
the type system which is very detailed
for machine types compared to other languages.
Of course it supports all of the modern games
like exceptions, objects, garbage collection, threads.
While C++ programmers must
control three languages,
namely the preprocessor, C and ++,
Modula-3 is made in one go
and the language definition is really compact.
On the one hand Modula-3 can be safe
(but probably less efficient) in normal modules
while providing much static and dynamic safety.
On the other hand you can write efficient
but less safe code in the style of C
within UNSAFE modules.
<p>
Unfortunately Modula's safety and strength
requires more writing than scripting languages do.
Today if I want to safe characters
I prefer Haskell (similar to OCAML) -
it's statically typed, too.
<a name="whycxx"></a>
<a name="n5"></a><DISABLED>18.1.3 Why C / C++ ?</DISABLED>
<p>
Although it is no problem to write Modula-3 programs
that performs as fast as C
most libraries are not written in Modula-3 but in C.
Fortunately the binary interface of most function libraries
can be addressed by Modula-3.
Even more fortunately even non-C libraries may provide C header files.
This is where SWIG becomes helpful.
<a name="whycxx"></a>
<a name="n6"></a><DISABLED>18.1.4 Why SWIG ?</DISABLED>
<p>
The C headers and the possibility to interface to C libraries
still leaves the work for you
to write Modula-3 interfaces to them.
To make things comfortable you will also need
wrappers that convert between high-level features of Modula-3
(garbage collecting, exceptions)
and the low level of the C libraries.
<p>
SWIG converts C headers to Modula-3 interfaces for you.
You could call the C functions without loss
of efficiency but it won't be joy
because you could not pass TEXTs
or open arrays and
you would have to process error return codes
rather then exceptions.
But using some typemaps SWIG will also generate
wrappers that bring the whole Modula-3 comfort to you.
If the library API is ill designed
writing appropriate typemaps can be still time-consuming.
E.g. C programmers are very creative to work-around
missing data types like (real) enumerations and sets.
You should turn such work-arounds back to the Modula-3 way
otherwise you lose static safety and consistency.
<p>
But you have still a problem:
C library interfaces are often ill.
They lack for certain information
because C compilers wouldn't care about.
You should integrate detailed type information
by adding <tt>typedef</tt>s and <tt>const</tt>s
and you should persuade the C library programmer
to add this information to his interface.
Only this way other language users can benefit from your work
and only this way you can easily update your interfaces
when a new library version is released.
You will realise that writing <b>good</b> SWIG interfaces
is very costly and it will only amortise
when considering evolving libraries.
<p>
Without SWIG you would probably never consider
to call C++ libraries from Modula-3.
But with SWIG this is worth a consideration.
SWIG can write C wrappers to C++ functions and object methods
that may throw exceptions.
In fact it breaks down C++ libraries to C interfaces
which can be in turn called from Modula-3.
To make it complete you can hide the C interface
with Modula-3 classes and exceptions.
<p>
Although SWIG does the best it can do
it can only serve as a one-way strategy.
That means you can use C++ libraries
with Modula-3 (even with call back functions),
but it's certainly not possible to smoothly
integrate Modula-3 code into a C / C++ project.
-->
<a name="preliminaries"></a>
<a name="n3"></a><H2>18.2 Preliminaries</H2>
<a name="compilers"></a>
<a name="n4"></a><H3>18.2.1 Compilers</H3>
There are different Modula-3 compilers around:
cm3, pm3, ezm3, Klagenfurth Modula-3, Cambridge Modula-3.
SWIG itself does not contain compiler specific code
but the library file
<a href="../../Lib/modula3/modula3.swg"><tt>modula3.swg</tt></a>
may do so.
For testing examples I used Critical Mass' cm3.
<a name="commandline"></a>
<a name="n5"></a><H3>18.2.2 Additional Commandline Options</H3>
There some experimental command line options
that prevent SWIG from generating interface files.
Instead files are emitted that may assist
writing SWIG interface files.
<table>
<tr>
<th>Modula-3 specific options</th>
</tr>
<tr>
<td>-generateconst &lt;file&gt;</td>
<td>
Disable generation of interfaces and wrappers.
Instead generate code for computing numeric values of constants.
</td>
</tr>
<tr>
<td>-generaterename &lt;file&gt;</td>
<td>
Disable generation of interfaces and wrappers.
Instead generate suggestions for %rename.
</td>
</tr>
<tr>
<td>-generatetypemap &lt;file&gt;</td>
<td>
Disable generation of interfaces and wrappers.
Instead generate templates for some basic typemaps.
</td>
</tr>
</table>
<a name="typemaps"></a>
<a name="n6"></a><H2>18.3 Modula-3 typemaps</H2>
<a name="inoutparam"></a>
<a name="n7"></a><H3>18.3.1 Inputs and outputs</H3>
Each C procedure has a bunch of inputs and outputs.
Aside from global variables
inputs are passed as call arguments,
outputs are updated reference arguments and
the function value.
Each C type can have several typemaps
that apply only in case the types are used
as input argument, as output argument,
or as return value.
A further typemap may specify
the direction that is used for certain parameters.
<a name="exceptions"></a>
<a name="n8"></a><H3>18.3.2 Exceptions</H3>
Modula-3 provides another possibility
of an output of a function: exceptions.
Any piecec of Modula-3 code that SWIG inserts
due to a typemap can raise an exception.
This way you can also convert an error code
from a C function into an Modula-3 exception.
The <tt>RAISES</tt> clause is controlled
by typemaps with the <tt>except</tt> extension.
<a name="ordinals"></a>
<a name="n9"></a><H3>18.3.3 Subranges, Enumerations, Sets</H3>
<a name="class"></a>
<a name="n10"></a><H3>18.3.4 Objects</H3>
<a name="typemap_examlpe"></a>
<a name="n11"></a><H3>18.3.5 Example</H3>
The generation of wrappers in Modula-3 needs very fine control
to take advantage of the language features.
Here is an example of a generated wrapper
where almost everything is generated by a typemap:
<blockquote><pre>
<I> (* %relabel m3wrapinmode m3wrapinname m3wrapintype m3wrapindefault *)</I>
PROCEDURE Name (READONLY str : TEXT := "" )
<I> (* m3wrapoutcheck:throws *)</I>
: NameResult RAISES {E} =
VAR
arg0 : C.char_star; <I>(* m3wrapretvar *)</I>
arg1 : C.char_star; <I>(* m3wrapargvar *)</I>
arg2 : C.int;
result : RECORD
<I> (*m3wrapretname m3wraprettype*)</I>
unixPath : TEXT;
<I> (*m3wrapoutname m3wrapouttype*)</I>
checksum : CARDINAL;
END;
BEGIN
TRY
arg1 := M3toC.SharedTtoS(str); <I>(* m3wrapinconv *)</I>
IF Text.Length(arg1) > 10 THEN <I>(* m3wrapincheck *)</I>
RAISE E("str too long");
END;
<I> (* m3wrapretraw m3wrapargraw *)</I>
arg0 := MessyToUnix (arg1, arg2);
result.unixPath := M3toC.CopyStoT(arg0); <I>(* m3wrapretconv *)</I>
result.checksum := arg2; <I>(* m3wrapoutconv *)</I>
IF result.checksum = 0 THEN <I>(* m3wrapoutcheck *)</I>
RAISE E("invalid checksum");
END;
FINALLY
M3toC.FreeSharedS(str,arg1); <I>(* m3wrapfreearg *)</I>
END;
END Name;
</pre></blockquote>
</body>
</html>

View file

@ -6,7 +6,7 @@
</head>
<body bgcolor="#ffffff">
<a name="n1"></a>
<a name="n1"></a><H1>18 SWIG and Ocaml</H1>
<a name="n1"></a><H1>19 SWIG and Ocaml</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Preliminaries</a>
@ -73,7 +73,7 @@ If you're not familiar with the Objective Caml language, you can visit
<a href="http://www.ocaml.org/">The Ocaml Website</a>.
</p>
<a name="n2"></a><H2>18.1 Preliminaries</H2>
<a name="n2"></a><H2>19.1 Preliminaries</H2>
SWIG 1.3 works with Ocaml 3.04 and above. Given the choice,
@ -90,7 +90,7 @@ usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's
file Examples/Makefile illustrate how to compile and link SWIG modules that
will be loaded dynamically. This has only been tested on Linux so far.
<a name="n3"></a><H3>18.1.1 Running SWIG</H3>
<a name="n3"></a><H3>19.1.1 Running SWIG</H3>
The basics of getting a SWIG Ocaml module up and running
@ -109,7 +109,7 @@ you will compile the file <tt>example_wrap.c</tt> with <tt>ocamlc</tt> or
the resulting .ml and .mli files as well, and do the final link with -custom
(not needed for native link). </p>
<a name="n4"></a><H3>18.1.2 Compiling the code</H3>
<a name="n4"></a><H3>19.1.2 Compiling the code</H3>
The O'Caml SWIG module now requires you to compile a module (<tt>Swig</tt>)
@ -141,7 +141,7 @@ the user more freedom with respect to custom typing.
<pre>% cp example_wrap.cxx example_wrap.cxx.c<br>% ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c<br>% ...<br></pre>
</blockquote>
<a name="n5"></a><H3>18.1.3 The camlp4 module</H3>
<a name="n5"></a><H3>19.1.3 The camlp4 module</H3>
The camlp4 module (swigp4.ml -&gt; swigp4.cmo) contains a simple rewriter which
@ -211,7 +211,7 @@ let b = C_string (getenv "PATH")
</td></tr>
</table>
<a name="n6"></a><H3>18.1.4 Using your module</H3>
<a name="n6"></a><H3>19.1.4 Using your module</H3>
You can test-drive your module by building a
@ -221,7 +221,7 @@ toplevel ocaml interpreter. Consult the ocaml manual for details.
option to build your functions into the primitive list. This
option is not needed when you build native code.
<a name="n7"></a><H3>18.1.5 Compilation problems and compiling with C++</H3>
<a name="n7"></a><H3>19.1.5 Compilation problems and compiling with C++</H3>
As mentioned above, .cxx files need special
@ -230,7 +230,7 @@ that uses <tt>class</tt> as a non-keyword, and C code that is too
liberal with pointer types may not compile under the C++ compiler.
Most code meant to be compiled as C++ will not have problems.
<a name="n8"></a><H2>18.2 The low-level Ocaml/C interface</H2>
<a name="n8"></a><H2>19.2 The low-level Ocaml/C interface</H2>
In order to provide access to overloaded functions, and
@ -317,7 +317,7 @@ is that you must append them to the return list with swig_result = caml_list_a
value items pass through directly, but you must make your own type
signature for a function that uses value in this way.
<a name="n9"></a><H3>18.2.1 The generated module</H3>
<a name="n9"></a><H3>19.2.1 The generated module</H3>
The SWIG <tt>%module</tt> directive specifies the name of the Ocaml
@ -347,7 +347,7 @@ which should run when the module is loaded may be inserted here.
it describes the output SWIG will generate for class definitions.
</table>
<a name="n10"></a><H3>18.2.2 Enums</H3>
<a name="n10"></a><H3>19.2.2 Enums</H3>
SWIG will wrap enumerations as polymorphic variants in the output
@ -403,10 +403,10 @@ val x : Enum_test.c_obj = C_enum `a
<p> </p>
<a name="n11"></a><H3>18.2.3 Arrays</H3>
<a name="n11"></a><H3>19.2.3 Arrays</H3>
<a name="n12"></a><H4>18.2.3.1 Simple types of bounded arrays</H4>
<a name="n12"></a><H4>19.2.3.1 Simple types of bounded arrays</H4>
<p>
@ -426,7 +426,7 @@ arrays of simple types with known bounds in your code, but this only works
for arrays whose bounds are completely specified.
</p>
<a name="n13"></a><H4>18.2.3.2 Complex and unbounded arrays</H4>
<a name="n13"></a><H4>19.2.3.2 Complex and unbounded arrays</H4>
<p>
@ -439,7 +439,7 @@ SWIG can't predict which of these methods will be used in the array,
so you have to specify it for yourself in the form of a typemap.
</p>
<a name="n14"></a><H4>18.2.3.3 Using an object</H4>
<a name="n14"></a><H4>19.2.3.3 Using an object</H4>
<p>
@ -453,7 +453,7 @@ Consider writing an object when the ending condition of your array is complex,
such as using a required centinel, etc.
</p>
<a name="n15"></a><H4>18.2.3.4 Example typemap for a function taking float * and int</H4>
<a name="n15"></a><H4>19.2.3.4 Example typemap for a function taking float * and int</H4>
<p>
@ -503,7 +503,7 @@ void printfloats( float *tab, int len );
</pre></td></tr></table>
<a name="n16"></a><H3>18.2.4 C++ Classes</H3>
<a name="n16"></a><H3>19.2.4 C++ Classes</H3>
C++ classes, along with structs and unions are represented by C_obj
@ -541,7 +541,7 @@ the underlying pointer, so using create_[x]_from_ptr alters the
returned value for the same object.
<p>
<a name="n17"></a><H4>18.2.4.1 STL vector and string Example</H4>
<a name="n17"></a><H4>19.2.4.1 STL vector and string Example</H4>
Standard typemaps are now provided for STL vector and string. More are in
@ -613,7 +613,7 @@ baz
#
</pre></blockquote>
<a name="n18"></a><H4>18.2.4.2 C++ Class Example</H4>
<a name="n18"></a><H4>19.2.4.2 C++ Class Example</H4>
Here's a simple example using Trolltech's Qt Library:
@ -640,7 +640,7 @@ public:
};
</pre></td></tr></table><p>
<a name="n19"></a><H4>18.2.4.3 Compiling the example</H4>
<a name="n19"></a><H4>19.2.4.3 Compiling the example</H4>
<blockquote><pre>
@ -658,7 +658,7 @@ bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
-L$QTPATH/lib -cclib -lqt
</pre></blockquote>
<a name="n20"></a><H4>18.2.4.4 Sample Session</H4>
<a name="n20"></a><H4>19.2.4.4 Sample Session</H4>
<blockquote><pre>
@ -683,10 +683,10 @@ val hello : Qt.c_obj = C_obj <fun>
Assuming you have a working installation of QT, you will see a window
containing the string "hi" in a button.
<a name="n21"></a><H3>18.2.5 Director Classes</H3>
<a name="n21"></a><H3>19.2.5 Director Classes</H3>
<a name="n22"></a><H4>18.2.5.1 Director Introduction</H4>
<a name="n22"></a><H4>19.2.5.1 Director Introduction</H4>
Director classes are classes which allow Ocaml code to override the public
@ -708,7 +708,7 @@ class foo {
};
</p></blockquote></pre>
<a name="n23"></a><H4>18.2.5.2 Overriding Methods in Ocaml</H4>
<a name="n23"></a><H4>19.2.5.2 Overriding Methods in Ocaml</H4>
<p>
@ -732,7 +732,7 @@ In this example, I'll examine the objective caml code involved in providing
an overloaded class. This example is contained in Examples/ocaml/shapes.
<p>
<a name="n24"></a><H4>18.2.5.3 Director Usage Example</H4>
<a name="n24"></a><H4>19.2.5.3 Director Usage Example</H4>
<table border="1" bgcolor="#dddddd"><tr><th><center>example_prog.ml</center>
@ -786,7 +786,7 @@ a tricky shape implementation, such as a boolean combination, to be expressed
in a more effortless style in ocaml, while leaving the "engine" part of the
program in C++.
<p>
<a name="n25"></a><H4>18.2.5.4 Creating director objects</H4>
<a name="n25"></a><H4>19.2.5.4 Creating director objects</H4>
The definition of the actual object triangle can be described this way:
@ -820,7 +820,7 @@ new_derived_object, and throws NotObject). This prevents a deleted C++
object from causing a core dump, as long as the object is destroyed
properly.
<a name="n26"></a><H4>18.2.5.5 Typemaps for directors, <tt>directorin, directorout, directorargout</tt></H4>
<a name="n26"></a><H4>19.2.5.5 Typemaps for directors, <tt>directorin, directorout, directorargout</tt></H4>
<p>
@ -830,7 +830,7 @@ direction is reversed. They provide for you to provide argout values, as
well as a function return value in the same way you provide function arguments,
and to receive arguments the same way you normally receive function returns.
</P>
<a name="n27"></a><H4>18.2.5.6 <tt>directorin</tt> typemap</H4>
<a name="n27"></a><H4>19.2.5.6 <tt>directorin</tt> typemap</H4>
<p>
@ -841,7 +841,7 @@ code receives when you are called. In general, a simple <tt>directorin</tt> typ
can use the same body as a simple <tt>out</tt> typemap.
</p>
<a name="n28"></a><H4>18.2.5.7 <tt>directorout</tt> typemap</H4>
<a name="n28"></a><H4>19.2.5.7 <tt>directorout</tt> typemap</H4>
<p>
@ -852,7 +852,7 @@ for the same type, except when there are special requirements for object
ownership, etc.
</p>
<a name="n29"></a><H4>18.2.5.8 <tt>directorargout</tt> typemap</H4>
<a name="n29"></a><H4>19.2.5.8 <tt>directorargout</tt> typemap</H4>
<p>
@ -869,7 +869,7 @@ In the event that you don't specify all of the necessary values, integral
values will read zero, and struct or object returns have undefined results.
</p>
<a name="n30"></a><H3>18.2.6 Exceptions</H3>
<a name="n30"></a><H3>19.2.6 Exceptions</H3>
Catching exceptions is now supported using SWIG's %exception feature. A simple

View file

@ -5,7 +5,7 @@
</head>
<body bgcolor="#ffffff">
<a name="n1"></a><H1>19 SWIG and Perl5</H1>
<a name="n1"></a><H1>20 SWIG and Perl5</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Overview</a>
@ -78,7 +78,7 @@ best results, it is recommended that SWIG be used with Perl5.003 or
later. Earlier versions are problematic and SWIG generated extensions
may not compile or run correctly.<p>
<a name="n2"></a><H2>19.1 Overview</H2>
<a name="n2"></a><H2>20.1 Overview</H2>
To build Perl extension modules, SWIG uses a layered approach. At
@ -96,7 +96,7 @@ procedural interface is presented. Finally, proxy classes are
described. Advanced customization features, typemaps, and other
options are found near the end of the chapter.
<a name="n3"></a><H2>19.2 Preliminaries</H2>
<a name="n3"></a><H2>20.2 Preliminaries</H2>
To build a Perl5 module, run Swig using the <tt>-perl</tt> option as
@ -116,7 +116,7 @@ properly load the module.
To build the module, you will need to compile the file
<tt>example_wrap.c</tt> and link it with the rest of your program.
<a name="n4"></a><H3>19.2.1 Getting the right header files</H3>
<a name="n4"></a><H3>20.2.1 Getting the right header files</H3>
In order to compile, SWIG extensions need the following Perl5 header files :<p>
@ -145,7 +145,7 @@ loaded, an easy way to find out is to run Perl itself.
</pre>
</blockquote>
<a name="n5"></a><H3>19.2.2 Compiling a dynamic module</H3>
<a name="n5"></a><H3>20.2.2 Compiling a dynamic module</H3>
The preferred approach to building an extension module is to compile it into
@ -172,7 +172,7 @@ the SWIG interface file. If you used `<tt>%module example</tt>', then
the target should be named `<tt>example.so</tt>',
`<tt>example.sl</tt>', or the appropriate dynamic module name on your system.
<a name="n6"></a><H3>19.2.3 Building a dynamic module with MakeMaker</H3>
<a name="n6"></a><H3>20.2.3 Building a dynamic module with MakeMaker</H3>
It is also possible to use Perl to build dynamically loadable modules
@ -204,7 +204,7 @@ the preferred approach to compilation. More information about MakeMaker can be
found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen,
and Randal Schwartz.<p>
<a name="n7"></a><H3>19.2.4 Building a static version of Perl</H3>
<a name="n7"></a><H3>20.2.4 Building a static version of Perl</H3>
If you machine does not support dynamic loading or if you've tried to
@ -267,7 +267,7 @@ should be functionality identical to Perl with your C/C++ extension
added to it. Depending on your machine, you may need to link with
additional libraries such as <tt>-lsocket, -lnsl, -ldl</tt>, etc.
<a name="n8"></a><H3>19.2.5 Using the module</H3>
<a name="n8"></a><H3>20.2.5 Using the module</H3>
To use the module, simply use the Perl <tt>use</tt> statement. If
@ -398,7 +398,7 @@ Finally, you can use a command such as <tt>ldconfig</tt> (Linux) or
system configuration (this requires root access and you will need to
read the man pages).
<a name="n9"></a><H3>19.2.6 Compilation problems and compiling with C++</H3>
<a name="n9"></a><H3>20.2.6 Compilation problems and compiling with C++</H3>
Compilation of C++ extensions has traditionally been a tricky problem.
@ -520,7 +520,7 @@ in Lib/perl5/noembed.h while compiling the wrapper, you will
have to find the macro that conflicts and add an #undef into the .i file. Please report
any conflicting macros you find to <a href="mailto:swig@cs.uchicago.edu">swig@cs.uchicago.edu</a>.
<a name="n10"></a><H3>19.2.7 Compiling for 64-bit platforms</H3>
<a name="n10"></a><H3>20.2.7 Compiling for 64-bit platforms</H3>
On platforms that support 64-bit applications (Solaris, Irix, etc.),
@ -543,7 +543,7 @@ that software. This may prevent the use of 64-bit extensions. It may
also introduce problems on platforms that support more than one
linking standard (e.g., -o32 and -n32 on Irix).
<a name="n11"></a><H2>19.3 Building Perl Extensions under Windows</H2>
<a name="n11"></a><H2>20.3 Building Perl Extensions under Windows</H2>
Building a SWIG extension to Perl under Windows is roughly
@ -552,7 +552,7 @@ produce a DLL that can be loaded into the Perl interpreter. This
section assumes you are using SWIG with Microsoft Visual C++
although the procedure may be similar with other compilers.
<a name="n12"></a><H3>19.3.1 Running SWIG from Developer Studio</H3>
<a name="n12"></a><H3>20.3.1 Running SWIG from Developer Studio</H3>
If you are developing your application within Microsoft developer
@ -613,13 +613,13 @@ print "$a\n";
</pre></blockquote>
<a name="n13"></a><H3>19.3.2 Using other compilers</H3>
<a name="n13"></a><H3>20.3.2 Using other compilers</H3>
SWIG is known to work with Cygwin and may work with other compilers on Windows.
For general hints and suggestions refer to the <a href="Windows.html">Windows</a> chapter.
<a name="n14"></a><H2>19.4 The low-level interface</H2>
<a name="n14"></a><H2>20.4 The low-level interface</H2>
At its core, the Perl module uses a simple low-level interface
@ -627,7 +627,7 @@ to C function, variables, constants, and classes. This low-level interface
can be used to control your application. However, it is also used to
construct more user-friendly proxy classes as described in the next section.
<a name="n15"></a><H3>19.4.1 Functions</H3>
<a name="n15"></a><H3>20.4.1 Functions</H3>
C functions are converted into new Perl built-in commands (or
@ -645,7 +645,7 @@ Now, in Perl:
$a = &amp;example::fact(2);
</pre></blockquote>
<a name="n16"></a><H3>19.4.2 Global variables</H3>
<a name="n16"></a><H3>20.4.2 Global variables</H3>
Global variables are handled using Perl's magic
@ -698,7 +698,7 @@ extern char *path; // Declared later in the input
</pre>
</blockquote>
<a name="n17"></a><H3>19.4.3 Constants</H3>
<a name="n17"></a><H3>20.4.3 Constants</H3>
Constants are wrapped as read-only Perl variables. For example:
@ -721,7 +721,7 @@ $example::FOO = 2; # Error
</pre>
</blockquote>
<a name="n18"></a><H3>19.4.4 Pointers</H3>
<a name="n18"></a><H3>20.4.4 Pointers</H3>
SWIG represents pointers as blessed references. A blessed reference
@ -820,7 +820,7 @@ C-style cast may return a bogus result whereas as the C++-style cast will return
as XS and <tt>xsubpp</tt>. Given the advancement of the SWIG typesystem and the growing differences between
SWIG and XS, this is no longer supported.
<a name="n19"></a><H3>19.4.5 Structures</H3>
<a name="n19"></a><H3>20.4.5 Structures</H3>
Access to the contents of a structure are provided through a set of low-level
@ -941,7 +941,7 @@ void Bar_f_set(Bar *b, Foo *val) {
</blockquote>
<a name="n20"></a><H3>19.4.6 C++ classes</H3>
<a name="n20"></a><H3>20.4.6 C++ classes</H3>
C++ classes are wrapped by building a set of low level accessor functions.
@ -999,7 +999,7 @@ as the first argument. Although this interface is fairly primitive, it
provides direct access to C++ objects. A higher level interface using Perl proxy classes
can be built using these low-level accessors. This is described shortly.
<a name="n21"></a><H3>19.4.7 C++ classes and type-checking</H3>
<a name="n21"></a><H3>20.4.7 C++ classes and type-checking</H3>
The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have
@ -1029,7 +1029,7 @@ then the function <tt>spam()</tt> accepts <tt>Foo *</tt> or a pointer to any cla
If necesssary, the type-checker also adjusts the value of the pointer (as is necessary when
multiple inheritance is used).
<a name="n22"></a><H3>19.4.8 C++ overloaded functions</H3>
<a name="n22"></a><H3>20.4.8 C++ overloaded functions</H3>
If you have a C++ program with overloaded functions or methods, you will need to disambiguate
@ -1067,7 +1067,7 @@ example::Spam_foo_d($s,3.14);
Please refer to the "SWIG Basics" chapter for more information.
<a name="n23"></a><H3>19.4.9 Operators</H3>
<a name="n23"></a><H3>20.4.9 Operators</H3>
C++ operators can also be wrapped using the <tt>%rename</tt> directive. All you need to do is
@ -1094,7 +1094,7 @@ $c = example::add_complex($a,$b);
Some preliminary work on mapping C++ operators into Perl operators has been completed. This is covered later.
<a name="n24"></a><H3>19.4.10 Modules and packages</H3>
<a name="n24"></a><H3>20.4.10 Modules and packages</H3>
When you create a SWIG extension, everything gets placed into
@ -1149,7 +1149,7 @@ print Foo::fact(4),"\n"; # Call a function in package FooBar
</pre></blockquote>
-->
<a name="n25"></a><H2>19.5 Input and output parameters</H2>
<a name="n25"></a><H2>20.5 Input and output parameters</H2>
A common problem in some C programs is handling parameters passed as simple pointers. For
@ -1335,7 +1335,7 @@ print "$c\n";
<b>Note:</b> The <tt>REFERENCE</tt> feature is only currently supported for numeric types (integers and floating point).
<a name="n26"></a><H2>19.6 Exception handling </H2>
<a name="n26"></a><H2>20.6 Exception handling </H2>
The SWIG <tt>%exception</tt> directive can be used to create a
@ -1484,7 +1484,7 @@ See the chapter on "<a href="Customization.html">Customization features</a>" for
This is still supported, but it is deprecated. The newer <tt>%exception</tt> directive provides the same
functionality, but it has additional capabilities that make it more powerful.
<a name="n27"></a><H2>19.7 Remapping datatypes with typemaps</H2>
<a name="n27"></a><H2>20.7 Remapping datatypes with typemaps</H2>
This section describes how you can modify SWIG's default wrapping behavior
@ -1498,7 +1498,7 @@ part of using SWIG---the default wrapping behavior is enough in most cases.
Typemaps are only used if you want to change some aspect of the primitive
C-Perl interface.
<a name="n28"></a><H3>19.7.1 A simple typemap example</H3>
<a name="n28"></a><H3>20.7.1 A simple typemap example</H3>
A typemap is nothing more than a code generation rule that is attached to
@ -1588,7 +1588,7 @@ example::count("e","Hello World");
</blockquote>
<a name="n29"></a><H3>19.7.2 Perl5 typemaps</H3>
<a name="n29"></a><H3>20.7.2 Perl5 typemaps</H3>
The previous section illustrated an "in" typemap for converting Perl objects to C.
@ -1668,7 +1668,7 @@ Return of C++ member data (all languages).<p>
Check value of input parameter.<p>
</blockquote>
<a name="n30"></a><H3>19.7.3 Typemap variables</H3>
<a name="n30"></a><H3>20.7.3 Typemap variables</H3>
Within typemap code, a number of special variables prefaced with a <tt>$</tt> may appear.
@ -1722,7 +1722,7 @@ properly assigned.
The Perl name of the wrapper function being created.
</blockquote>
<a name="n31"></a><H3>19.7.4 Useful functions</H3>
<a name="n31"></a><H3>20.7.4 Useful functions</H3>
When writing typemaps, it is necessary to work directly with Perl5
@ -1782,14 +1782,14 @@ int sv_isa(SV *, char *0;
</blockquote>
<a name="n32"></a><H2>19.8 Typemap Examples</H2>
<a name="n32"></a><H2>20.8 Typemap Examples</H2>
This section includes a few examples of typemaps. For more examples, you
might look at the files "<tt>perl5.swg</tt>" and "<tt>typemaps.i</tt>" in
the SWIG library.
<a name="n33"></a><H3>19.8.1 Converting a Perl5 array to a char ** </H3>
<a name="n33"></a><H3>20.8.1 Converting a Perl5 array to a char ** </H3>
A common problem in many C programs is the processing of command line
@ -1877,7 +1877,7 @@ print @$b,"\n"; # Print it out
</pre></blockquote>
<a name="n34"></a><H3>19.8.2 Return values </H3>
<a name="n34"></a><H3>20.8.2 Return values </H3>
Return values are placed on the argument stack of each wrapper
@ -1903,7 +1903,7 @@ can be done using the <tt>EXTEND()</tt> macro as in :<p>
}
</pre></blockquote>
<a name="n35"></a><H3>19.8.3 Returning values from arguments</H3>
<a name="n35"></a><H3>20.8.3 Returning values from arguments</H3>
Sometimes it is desirable for a function to return a value in one of
@ -1954,7 +1954,7 @@ print "multout(7,13) = @r\n";
($x,$y) = multout(7,13);
</pre></blockquote>
<a name="n36"></a><H3>19.8.4 Accessing array structure members</H3>
<a name="n36"></a><H3>20.8.4 Accessing array structure members</H3>
Consider the following data structure :<p>
@ -2006,7 +2006,7 @@ the "in" typemap in the previous section would be used to convert an
<tt>int[]</tt> array to C whereas the "memberin" typemap would be used
to copy the converted array into a C data structure.
<a name="n37"></a><H3>19.8.5 Turning Perl references into C pointers</H3>
<a name="n37"></a><H3>20.8.5 Turning Perl references into C pointers</H3>
A frequent confusion on the SWIG mailing list is errors caused by the
@ -2064,7 +2064,7 @@ print "$c\n";
</pre></blockquote>
<a name="n38"></a><H3>19.8.6 Pointer handling</H3>
<a name="n38"></a><H3>20.8.6 Pointer handling</H3>
Occasionally, it might be necessary to convert pointer values that have
@ -2136,7 +2136,7 @@ For example:
</pre>
</blockquote>
<a name="n39"></a><H2>19.9 Proxy classes</H2>
<a name="n39"></a><H2>20.9 Proxy classes</H2>
<b>Out of date. Needs update.</b>
@ -2149,7 +2149,7 @@ This is done by constructing a Perl proxy class that provides an OO wrapper
to the underlying code. This section describes the implementation
details of the proxy interface.
<a name="n40"></a><H3>19.9.1 Preliminaries</H3>
<a name="n40"></a><H3>20.9.1 Preliminaries</H3>
To generate proxy classes, you need to use the <tt>-proxy</tt> command line option.
@ -2283,7 +2283,7 @@ $v-&gt;DESTROY();
</pre></blockquote>
<a name="n41"></a><H3>19.9.2 Object Ownership</H3>
<a name="n41"></a><H3>20.9.2 Object Ownership</H3>
In order for shadow classes to work properly, it is necessary for Perl
@ -2356,7 +2356,7 @@ As always, a little care is in order. SWIG does not provide reference
counting, garbage collection, or advanced features one might find in
sophisticated languages.<p>
<a name="n42"></a><H3>19.9.3 Nested Objects</H3>
<a name="n42"></a><H3>20.9.3 Nested Objects</H3>
Suppose that we have a new object that looks like this :<p>
@ -2399,7 +2399,7 @@ $p-&gt;{f}-&gt;{x} = 0.0;
%${$p-&gt;{v}} = ( x=&gt;0, y=&gt;0, z=&gt;0);
</pre></blockquote>
<p>
<a name="n43"></a><H3>19.9.4 Shadow Functions</H3>
<a name="n43"></a><H3>20.9.4 Shadow Functions</H3>
When functions take arguments involving a complex object, it is
@ -2429,7 +2429,7 @@ this :<p>
This function replaces the original function, but operates in an
identical manner.<p>
<a name="n44"></a><H3>19.9.5 Inheritance</H3>
<a name="n44"></a><H3>20.9.5 Inheritance</H3>
Simple C++ inheritance is handled using the Perl <tt>@ISA</tt> array

View file

@ -6,7 +6,7 @@
</head>
<body bgcolor="#ffffff">
<a name="n1"></a><H1>20 SWIG and PHP4</H1>
<a name="n1"></a><H1>21 SWIG and PHP4</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Preliminaries</a>
@ -43,7 +43,7 @@ if you thought you were familiar with what it said. The major change is
that shadow classes are implemented inside the php module in C++ instead
of in the generated .php file in php.
<a name="n2"></a><H2>20.1 Preliminaries</H2>
<a name="n2"></a><H2>21.1 Preliminaries</H2>
In order to use this module, you will need to have a copy of the PHP 4.0 (or
@ -53,7 +53,7 @@ need either the php binary or the Apache php module. If you want to build your
extension into php directly (without having the overhead of loading it into
each script), you will need the complete PHP source tree available.
<a name="n3"></a><H2>20.2 Building PHP4 Extensions</H2>
<a name="n3"></a><H2>21.2 Building PHP4 Extensions</H2>
To build a PHP4 extension, run swig using the <tt>-php4</tt> option as follows :
@ -86,7 +86,7 @@ the extension into the php executable/library so it will be available in every
script. The first choice is the default, however it can be changed by passing
the '-phpfull' command line switch to select the second build method.
<a name="n4"></a><H3>20.2.1 Building a loadable extension</H3>
<a name="n4"></a><H3>21.2.1 Building a loadable extension</H3>
To build a dynamic module for PHP, you have two options. You can use the
@ -146,10 +146,10 @@ attempts to do the <tt>dl()</tt> call for you:
A more complicated method which builds the module directly into the <tt>php</tt>
executable is described <a href="n12">below</a>.
<a name="n5"></a><H3>20.2.2 Basic PHP4 interface</H3>
<a name="n5"></a><H3>21.2.2 Basic PHP4 interface</H3>
<a name="n6"></a><H3>20.2.3 Functions</H3>
<a name="n6"></a><H3>21.2.3 Functions</H3>
C functions are converted into PHP functions. Default/optional arguments are
@ -170,7 +170,7 @@ $c = bar(3.5); # Use default argument for 2nd parameter
</pre></blockquote>
<a name="n7"></a><H3>20.2.4 Global Variables</H3>
<a name="n7"></a><H3>21.2.4 Global Variables</H3>
Global variables are difficult for PHP to handle, unlike Perl, their is no
@ -198,7 +198,7 @@ example_func(); # Syncs C variable to PHP Variable, now both 4
SWIG supports global variables of all C datatypes including pointers and complex
objects.<p>
<a name="n8"></a><H3>20.2.5 Pointers </H3>
<a name="n8"></a><H3>21.2.5 Pointers </H3>
Pointers to C/C++ objects <b>no longer</b> represented as character
@ -208,7 +208,7 @@ as PHP resources, rather like MySQL connection handles.
You can also explicitly create a NULL pointer as a string "NULL"
or by passing a null or empty value.
<a name="n9"></a><H3>20.2.6 Structures and C++ classes</H3>
<a name="n9"></a><H3>21.2.6 Structures and C++ classes</H3>
For structures and classes, SWIG produces accessor fuction for each member function and data. For example :<p>
@ -241,7 +241,7 @@ To use the class, simply use these functions. However, SWIG also has a mechanism
for creating shadow classes that hides these functions and uses an object
oriented interface instead - see <a href="n7">below</a>
<a name="n10"></a><H3>20.2.7 Constants</H3>
<a name="n10"></a><H3>21.2.7 Constants</H3>
These work in much the same way as in C/C++, constants can be defined by using
@ -337,7 +337,7 @@ both point to the same value, without the case test taking place.
</pre>
</blockquote>
<a name="n11"></a><H3>20.2.8 Shadow classes</H3>
<a name="n11"></a><H3>21.2.8 Shadow classes</H3>
To avoid having to call the various accessor function to get at structures or
@ -360,7 +360,7 @@ functions like before.
.... ( more examples on the way ) ....
<a name="n12"></a><H3>20.2.9 Constructors and Destructers</H3>
<a name="n12"></a><H3>21.2.9 Constructors and Destructers</H3>
Constructors are used in PHP as in C++, they are called when the object is
@ -384,7 +384,7 @@ object. 'RegisterShutdownFunction' is no longer needed for this.
I am not sure if PHP resources are all freed at the end of a script, or
when they each go out of scope.
<a name="n13"></a><H3>20.2.10 Static Member Variables</H3>
<a name="n13"></a><H3>21.2.10 Static Member Variables</H3>
Class variables are not supported in PHP, however class functions are, using
@ -418,7 +418,7 @@ echo "There has now been " . Ko::threats() . " threats\n";
</pre></blockquote>
<a name="n14"></a><H3>20.2.11 PHP4 Pragmas</H3>
<a name="n14"></a><H3>21.2.11 PHP4 Pragmas</H3>
There are a few pragmas understood by the PHP4 module. The first,
@ -447,7 +447,7 @@ function is called.
%include "example.h"
</pre></blockquote>
<a name="n15"></a><H3>20.2.12 Building extensions into php</H3>
<a name="n15"></a><H3>21.2.12 Building extensions into php</H3>
This method, selected with the <tt>-phpfull</tt> command line switch, involves
@ -489,7 +489,7 @@ Once configure has completed, you can run make to build php. If this all
compiles correctly, you should end up with a php executable/library
which contains your new module. You can test it with a php script which
does not have the 'dl' command as used above.
<a name="n16"></a><H3>20.2.13 To be furthered...</H3>
<a name="n16"></a><H3>21.2.13 To be furthered...</H3>
</body>

View file

@ -105,6 +105,7 @@ about this can be obtained at:
<a name="n6"></a><H2>0.5 Prerequisites</H2>
This manual assumes that you know how to write C/C++ programs and that you
have at least heard of scripting languages such as
Tcl, Python, and Perl. A detailed knowledge of these scripting
@ -188,6 +189,7 @@ port.
<a name="n11"></a><H2>0.10 Bug reports</H2>
Although every attempt has been made to make SWIG bug-free, we are also trying
to make feature improvements that may introduce bugs.
To report a bug, either send mail to the SWIG developer
@ -201,4 +203,4 @@ can only fix bugs if we know about them.
<p><hr>
<address>SWIG 1.3 - Last Modified : March 9, 2003</address>
</body>
</html>
</html>

View file

@ -5,7 +5,7 @@
</head>
<body bgcolor="#ffffff">
<a name="n1"></a><H1>21 SWIG and Python</H1>
<a name="n1"></a><H1>22 SWIG and Python</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Overview</a>
@ -107,7 +107,7 @@ are covered in less depth than in earlier chapters. At the
very least, make sure you read the "<a href="SWIG.html">SWIG
Basics</a>" chapter.
<a name="n2"></a><H2>21.1 Overview</H2>
<a name="n2"></a><H2>22.1 Overview</H2>
To build Python extension modules, SWIG uses a layered approach in which
@ -130,10 +130,10 @@ described. Advanced customization features such as typemaps are then
described followed by a discussion of low-level implementation
details.
<a name="n3"></a><H2>21.2 Preliminaries</H2>
<a name="n3"></a><H2>22.2 Preliminaries</H2>
<a name="n4"></a><H3>21.2.1 Running SWIG</H3>
<a name="n4"></a><H3>22.2.1 Running SWIG</H3>
Suppose that you defined a SWIG module such as the following:
@ -174,7 +174,7 @@ To change this, you can use the <tt>-o</tt> option. The name of the Python fil
from the module name specified with <tt>%module</tt>. If the module name is <tt>example</tt>, then
a file <tt>example.py</tt> is created.
<a name="n5"></a><H3>21.2.2 Getting the right header files</H3>
<a name="n5"></a><H3>22.2.2 Getting the right header files</H3>
In order to compile the C/C++ wrappers, the compiler needs the <tt>Python.h</tt> header file.
@ -201,7 +201,7 @@ Type "copyright", "credits" or "license" for more information.
</pre>
</blockquote>
<a name="n6"></a><H3>21.2.3 Compiling a dynamic module</H3>
<a name="n6"></a><H3>22.2.3 Compiling a dynamic module</H3>
The preferred approach to building an extension module is to compile it into
@ -239,10 +239,10 @@ other Python extension modules. For example, the <tt>socket</tt>
module actually consists of two files; <tt>socket.py</tt> and
<tt>_socket.so</tt>. Many other built-in Python modules follow a similar convention.
<a name="n7"></a><H3>21.2.4 Using distutils</H3>
<a name="n7"></a><H3>22.2.4 Using distutils</H3>
<a name="n8"></a><H3>21.2.5 Static linking</H3>
<a name="n8"></a><H3>22.2.5 Static linking</H3>
An alternative approach to dynamic linking is to rebuild the Python
@ -310,7 +310,7 @@ appears to "work" with Python 2.1, no future support is guaranteed.
If using static linking, you might want to rely on a different approach
(perhaps using distutils).
<a name="n9"></a><H3>21.2.6 Using your module</H3>
<a name="n9"></a><H3>22.2.6 Using your module</H3>
To use your module, simply use the Python <tt>import</tt> statement. If
@ -445,7 +445,7 @@ Finally, you can use a command such as <tt>ldconfig</tt> (Linux) or
system configuration (this requires root access and you will need to
read the man pages).
<a name="n10"></a><H3>21.2.7 Compilation of C++ extensions</H3>
<a name="n10"></a><H3>22.2.7 Compilation of C++ extensions</H3>
Compilation of C++ extensions has traditionally been a tricky problem.
@ -518,7 +518,7 @@ you will need to take steps to avoid segmentation faults and other
erratic program behavior. If working with lots of software components, you
might want to investigate using a more formal standard such as COM.
<a name="n11"></a><H3>21.2.8 Compiling for 64-bit platforms</H3>
<a name="n11"></a><H3>22.2.8 Compiling for 64-bit platforms</H3>
On platforms that support 64-bit applications (Solaris, Irix, etc.),
@ -541,7 +541,7 @@ that software. This may prevent the use of 64-bit extensions. It may
also introduce problems on platforms that support more than one
linking standard (e.g., -o32 and -n32 on Irix).
<a name="n12"></a><H3>21.2.9 Building Python Extensions under Windows</H3>
<a name="n12"></a><H3>22.2.9 Building Python Extensions under Windows</H3>
Building a SWIG extension to Python under Windows is roughly
@ -623,14 +623,14 @@ compilers tends to be rather problematic. For the latest information,
you may want to consult the <a href="http://swig.cs.uchicago.edu/cgi-bin/wiki.pl">
SWIG Wiki</a>.
<a name="n13"></a><H2>21.3 A tour of basic C/C++ wrapping</H2>
<a name="n13"></a><H2>22.3 A tour of basic C/C++ wrapping</H2>
By default, SWIG tries to build a very natural Python interface
to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, and so forth.
This section briefly covers the essential aspects of this wrapping.
<a name="n14"></a><H3>21.3.1 Modules</H3>
<a name="n14"></a><H3>22.3.1 Modules</H3>
The SWIG <tt>%module</tt> directive specifies the name of the Python
@ -641,7 +641,7 @@ extension module <tt>_example.so</tt>. When choosing a
module name, make sure you don't use the same name as a built-in
Python command or standard module name.
<a name="n15"></a><H3>21.3.2 Functions</H3>
<a name="n15"></a><H3>22.3.2 Functions</H3>
Global functions are wrapped as new Python built-in functions. For example,
@ -662,7 +662,7 @@ like you think it does:<p>
&gt;&gt;&gt;
</pre></blockquote>
<a name="n16"></a><H3>21.3.3 Global variables</H3>
<a name="n16"></a><H3>22.3.3 Global variables</H3>
C/C++ global variables are fully supported by SWIG. However, the underlying
@ -774,7 +774,7 @@ module loaded. To prevent this, you might consider renaming
that starts with a leading underscore. SWIG does not create <tt>cvar</tt>
if there are no global variables in a module.<p>
<a name="n17"></a><H3>21.3.4 Constants and enums</H3>
<a name="n17"></a><H3>22.3.4 Constants and enums</H3>
C/C++ constants are installed as Python objects containing the
@ -808,7 +808,7 @@ of the constant could be accidentally reassigned to refer to some
other object. Unfortunately, there is no easy way for SWIG to
generate code that prevents this. You will just have to be careful.
<a name="n18"></a><H3>21.3.5 Pointers</H3>
<a name="n18"></a><H3>22.3.5 Pointers</H3>
C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with
@ -940,7 +940,7 @@ to use the new C++ style casts. For example, in the above code, the
C-style cast may return a bogus result whereas as the C++-style cast will return
<tt>None</tt> if the conversion can't be performed.
<a name="n19"></a><H3>21.3.6 Structures</H3>
<a name="n19"></a><H3>22.3.6 Structures</H3>
If you wrap a C structure, it is wrapped by a Python class. This provides
@ -1103,7 +1103,7 @@ everything works just like you would expect. For example:
</pre>
</blockquote>
<a name="n20"></a><H3>21.3.7 C++ classes</H3>
<a name="n20"></a><H3>22.3.7 C++ classes</H3>
C++ classes are wrapped by Python classes as well. For example, if you have this class,
@ -1182,7 +1182,7 @@ they are accessed through <tt>cvar</tt> like this:
</pre></blockquote>
<a name="n21"></a><H3>21.3.8 C++ inheritance</H3>
<a name="n21"></a><H3>22.3.8 C++ inheritance</H3>
SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have
@ -1228,7 +1228,7 @@ then the function <tt>spam()</tt> accepts <tt>Foo *</tt> or a pointer to any cla
<p>
It is safe to use multiple inheritance with SWIG.
<a name="n22"></a><H3>21.3.9 Pointers, references, values, and arrays</H3>
<a name="n22"></a><H3>22.3.9 Pointers, references, values, and arrays</H3>
In C++, there are many different ways a function might receive
@ -1275,7 +1275,7 @@ Since the third function (spam7) returns a value, newly allocated memory is used
to hold the result and a pointer is returned (Python will release this memory
when the return value is garbage collected).
<a name="n23"></a><H3>21.3.10 C++ overloaded functions</H3>
<a name="n23"></a><H3>22.3.10 C++ overloaded functions</H3>
C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example,
@ -1376,7 +1376,7 @@ first declaration takes precedence.
<P>
Please refer to the "SWIG and C++" chapter for more information about overloading.
<a name="n24"></a><H3>21.3.11 C++ operators</H3>
<a name="n24"></a><H3>22.3.11 C++ operators</H3>
Certain C++ overloaded operators can be handled automatically by SWIG. For example,
@ -1449,7 +1449,7 @@ Keep reading.
Also, be aware that certain operators don't map cleanly to Python. For instance,
overloaded assignment operators don't map to Python semantics and will be ignored.
<a name="n25"></a><H3>21.3.12 C++ namespaces</H3>
<a name="n25"></a><H3>22.3.12 C++ namespaces</H3>
SWIG is aware of C++ namespaces, but namespace names do not appear in
@ -1508,7 +1508,7 @@ extension modules for each namespace separately. If your program
utilizes thousands of small deeply nested namespaces each with
identical symbol names, well, then you get what you deserve.
<a name="n26"></a><H3>21.3.13 C++ templates</H3>
<a name="n26"></a><H3>22.3.13 C++ templates</H3>
C++ templates don't present a huge problem for SWIG. However, in order
@ -1555,7 +1555,7 @@ Obviously, there is more to template wrapping than shown in this example.
More details can be found in the <a href="SWIGPlus.html">SWIG and C++</a> chapter. Some more complicated
examples will appear later.
<a name="n27"></a><H3>21.3.14 C++ Smart Pointers</H3>
<a name="n27"></a><H3>22.3.14 C++ Smart Pointers</H3>
In certain C++ programs, it is common to use classes that have been wrapped by
@ -1627,7 +1627,7 @@ simply use the <tt>__deref__()</tt> method. For example:
</pre>
</blockquote>
<a name="n28"></a><H2>21.4 Further details on the Python class interface</H2>
<a name="n28"></a><H2>22.4 Further details on the Python class interface</H2>
In the previous section, a high-level view of Python wrapping was
@ -1638,7 +1638,7 @@ advanced features such as operator overloading. However, a number
of low-level details were omitted. This section provides a brief overview
of how the proxy classes work.
<a name="n29"></a><H3>21.4.1 Proxy classes</H3>
<a name="n29"></a><H3>22.4.1 Proxy classes</H3>
In the <a href="SWIG.html">"SWIG basics"</a> and <a href="SWIGPlus.html">"SWIG and C++"</a> chapters,
@ -1715,7 +1715,7 @@ The fact that the class has been wrapped by a real Python class offers certain a
you can attach new Python methods to the class and you can even inherit from it (something not supported
by Python built-in types until Python 2.2).
<a name="n30"></a><H3>21.4.2 Memory management</H3>
<a name="n30"></a><H3>22.4.2 Memory management</H3>
Associated with proxy object, is an ownership flag <tt>.thisown</tt> The value of this
@ -1877,7 +1877,7 @@ To work around this, it is always possible to flip the ownership flag. For examp
It is also possible to deal with situations like this using
typemaps--an advanced topic discussed later.
<a name="n31"></a><H3>21.4.3 Python 2.2 and classic classes</H3>
<a name="n31"></a><H3>22.4.3 Python 2.2 and classic classes</H3>
SWIG makes every attempt to preserve backwards compatibility with
@ -1909,7 +1909,7 @@ of static member functions. In Python-2.2, they can be accessed via the
class itself. In Python-2.1 and earlier, they have to be accessed as a global
function or through an instance (see the earlier section).
<a name="n32"></a><H2>21.5 Cross language polymorphism (experimental)</H2>
<a name="n32"></a><H2>22.5 Cross language polymorphism (experimental)</H2>
Proxy classes provide a more natural, object-oriented way to access
@ -1937,7 +1937,7 @@ to know where a particular method is implemented: the combination of
proxy classes, director classes, and C wrapper functions takes care of
all the cross-language method routing transparently.
<a name="n33"></a><H3>21.5.1 Enabling directors</H3>
<a name="n33"></a><H3>22.5.1 Enabling directors</H3>
The director feature is disabled by default. To use directors you
@ -2002,7 +2002,7 @@ public:
</pre>
</blockquote>
<a name="n34"></a><H3>21.5.2 Director classes</H3>
<a name="n34"></a><H3>22.5.2 Director classes</H3>
For each class that has directors enabled, SWIG generates a new class
@ -2075,7 +2075,7 @@ unmodified proxy classes, all methods are ultimately implemented in C++
so there is no need for the extra overhead involved with routing the
calls through Python.
<a name="n35"></a><H3>21.5.3 Ownership and object destruction</H3>
<a name="n35"></a><H3>22.5.3 Ownership and object destruction</H3>
Memory management issues are slightly more complicated with directors
@ -2135,7 +2135,7 @@ deleting all the Foo pointers it contains at some point. Note that no hard
references to the Foo objects remain in Python.
<p>
<a name="n36"></a><H3>21.5.4 Exception unrolling</H3>
<a name="n36"></a><H3>22.5.4 Exception unrolling</H3>
With directors routing method calls to Python, and proxies routing them
@ -2187,7 +2187,7 @@ exception. Because the Python error state is still set when
Swig::DirectorMethodException is thrown, Python will register the
exception as soon as the C wrapper function returns.
<a name="n37"></a><H3>21.5.5 Overhead and code bloat</H3>
<a name="n37"></a><H3>22.5.5 Overhead and code bloat</H3>
Enabling directors for a class will generate a new director method for
@ -2217,7 +2217,7 @@ optimized by selectively enabling director methods (using the %feature
directive) for only those methods that are likely to be extended in
Python.
<a name="n38"></a><H3>21.5.6 Typemaps</H3>
<a name="n38"></a><H3>22.5.6 Typemaps</H3>
Typemaps for input and output of most of the basic types from director
@ -2233,10 +2233,10 @@ for std::string, std::vector, and std::complex, although there's no
guarantee these are fully functional yet.
<p>
<a name="n39"></a><H3>21.5.7 Miscellaneous</H3>
<a name="n39"></a><H3>22.5.7 Miscellaneous</H3>
<a name="n40"></a><H2>21.6 Common customization features</H2>
<a name="n40"></a><H2>22.6 Common customization features</H2>
The last section presented the absolute basics of C/C++ wrapping. If you do nothing
@ -2246,7 +2246,7 @@ types of functionality might be missing or the interface to certain functions mi
be awkward. This section describes some common SWIG features that are used
to improve your the interface to an extension module.
<a name="n41"></a><H3>21.6.1 C/C++ helper functions</H3>
<a name="n41"></a><H3>22.6.1 C/C++ helper functions</H3>
Sometimes when you create a module, it is missing certain bits of functionality. For
@ -2317,7 +2317,7 @@ Admittedly, this is not the most elegant looking approach. However, it works an
hard to implement. It is possible to clean this up using Python code, typemaps, and other
customization features as covered in later sections.
<a name="n42"></a><H3>21.6.2 Adding additional Python code</H3>
<a name="n42"></a><H3>22.6.2 Adding additional Python code</H3>
If writing support code in C isn't enough, it is also possible to write code in
@ -2365,7 +2365,7 @@ soon enough. For now, think of this example as an illustration of
what can be done without having to rely on any of the more advanced
customization features.
<a name="n43"></a><H3>21.6.3 Class extension with %extend</H3>
<a name="n43"></a><H3>22.6.3 Class extension with %extend</H3>
One of the more interesting features of SWIG is that it can extend
@ -2444,7 +2444,7 @@ Vector(12,14,16)
<tt>%extend</tt> works with both C and C++ code. It does not modify the underlying object
in any way---the extensions only show up in the Python interface.
<a name="n44"></a><H3>21.6.4 Exception handling with %exception</H3>
<a name="n44"></a><H3>22.6.4 Exception handling with %exception</H3>
If a C or C++ function throws an error, you may want to convert that error into a Python
@ -2557,7 +2557,7 @@ PyExc_ZeroDivisionError
The language-independent <tt>exception.i</tt> library file can also be used
to raise exceptions. See the <a href="Library.html">SWIG Library</a> chapter.
<a name="n45"></a><H2>21.7 Tips and techniques</H2>
<a name="n45"></a><H2>22.7 Tips and techniques</H2>
Although SWIG is largely automatic, there are certain types of wrapping problems that
@ -2565,7 +2565,7 @@ require additional user input. Examples include dealing with output parameter
strings, binary data, and arrays. This chapter discusses the common techniques for
solving these problems.
<a name="n46"></a><H3>21.7.1 Input and output parameters</H3>
<a name="n46"></a><H3>22.7.1 Input and output parameters</H3>
A common problem in some C programs is handling parameters passed as simple pointers. For
@ -2745,7 +2745,7 @@ void foo(Bar *OUTPUT);
may not have the intended effect since <tt>typemaps.i</tt> does not define an OUTPUT rule for <tt>Bar</tt>.
<a name="n47"></a><H3>21.7.2 Simple pointers</H3>
<a name="n47"></a><H3>22.7.2 Simple pointers</H3>
If you must work with simple pointers such as <tt>int *</tt> or <tt>double *</tt> and you don't want to use
@ -2801,7 +2801,7 @@ If you replace <tt>%pointer_functions()</tt> by <tt>%pointer_class(type,name)</t
See the <a href="Library.html">SWIG Library</a> chapter for further details.
<a name="n48"></a><H3>21.7.3 Unbounded C Arrays</H3>
<a name="n48"></a><H3>22.7.3 Unbounded C Arrays</H3>
Sometimes a C function expects an array to be passed as a pointer. For example,
@ -2855,7 +2855,7 @@ On the other hand, this low-level approach is extremely efficient and
well suited for applications in which you need to create buffers,
package binary data, etc.
<a name="n49"></a><H3>21.7.4 String handling</H3>
<a name="n49"></a><H3>22.7.4 String handling</H3>
If a C function has an argument of <tt>char *</tt>, then a Python string
@ -2909,16 +2909,16 @@ If you need to return binary data, you might use the
<tt>cstring.i</tt> library file. The <tt>cdata.i</tt> library can
also be used to extra binary data from arbitrary pointers.
<a name="n50"></a><H3>21.7.5 Arrays</H3>
<a name="n50"></a><H3>22.7.5 Arrays</H3>
<a name="n51"></a><H3>21.7.6 String arrays</H3>
<a name="n51"></a><H3>22.7.6 String arrays</H3>
<a name="n52"></a><H3>21.7.7 STL wrappers</H3>
<a name="n52"></a><H3>22.7.7 STL wrappers</H3>
<a name="n53"></a><H2>21.8 Typemaps</H2>
<a name="n53"></a><H2>22.8 Typemaps</H2>
This section describes how you can modify SWIG's default wrapping behavior
@ -2932,7 +2932,7 @@ part of using SWIG---the default wrapping behavior is enough in most cases.
Typemaps are only used if you want to change some aspect of the primitive
C-Python interface or if you want to elevate your guru status.
<a name="n54"></a><H3>21.8.1 What is a typemap?</H3>
<a name="n54"></a><H3>22.8.1 What is a typemap?</H3>
A typemap is nothing more than a code generation rule that is attached to
@ -3030,7 +3030,7 @@ parameter is omitted):
</pre>
</blockquote>
<a name="n55"></a><H3>21.8.2 Python typemaps</H3>
<a name="n55"></a><H3>22.8.2 Python typemaps</H3>
The previous section illustrated an "in" typemap for converting Python objects to C.
@ -3062,7 +3062,7 @@ $ cat python.swg
Additional typemap examples can also be found in the <tt>typemaps.i</tt> file.
<a name="n56"></a><H3>21.8.3 Typemap variables</H3>
<a name="n56"></a><H3>22.8.3 Typemap variables</H3>
Within typemap code, a number of special variables prefaced with a <tt>$</tt> may appear.
@ -3116,7 +3116,7 @@ properly assigned.
The Python name of the wrapper function being created.
</blockquote>
<a name="n57"></a><H3>21.8.4 Useful Python Functions</H3>
<a name="n57"></a><H3>22.8.4 Useful Python Functions</H3>
When you write a typemap, you usually have to work directly with Python objects.
@ -3213,14 +3213,14 @@ write me
</pre>
</blockquote>
<a name="n58"></a><H2>21.9 Typemap Examples</H2>
<a name="n58"></a><H2>22.9 Typemap Examples</H2>
This section includes a few examples of typemaps. For more examples, you
might look at the files "<tt>python.swg</tt>" and "<tt>typemaps.i</tt>" in
the SWIG library.
<a name="n59"></a><H3>21.9.1 Converting Python list to a char ** </H3>
<a name="n59"></a><H3>22.9.1 Converting Python list to a char ** </H3>
A common problem in many C programs is the processing of command line
@ -3293,7 +3293,7 @@ memory allocation is used to allocate memory for the array, the
"freearg" typemap is used to later release this memory after the execution of
the C function.
<a name="n60"></a><H3>21.9.2 Expanding a Python object into multiple arguments</H3>
<a name="n60"></a><H3>22.9.2 Expanding a Python object into multiple arguments</H3>
Suppose that you had a collection of C functions with arguments
@ -3363,7 +3363,7 @@ to supply the argument count. This is automatically set by the typemap code. F
</pre>
</blockquote>
<a name="n61"></a><H3>21.9.3 Using typemaps to return arguments</H3>
<a name="n61"></a><H3>22.9.3 Using typemaps to return arguments</H3>
A common problem in some C programs is that values may be returned in
@ -3441,7 +3441,7 @@ function can now be used as follows:
&gt;&gt;&gt;
</pre></blockquote>
<a name="n62"></a><H3>21.9.4 Mapping Python tuples into small arrays</H3>
<a name="n62"></a><H3>22.9.4 Mapping Python tuples into small arrays</H3>
In some applications, it is sometimes desirable to pass small arrays
@ -3482,7 +3482,7 @@ Since our mapping copies the contents of a Python tuple into a C
array, such an approach would not be recommended for huge arrays, but
for small structures, this approach works fine.<p>
<a name="n63"></a><H3>21.9.5 Mapping sequences to C arrays</H3>
<a name="n63"></a><H3>22.9.5 Mapping sequences to C arrays</H3>
Suppose that you wanted to generalize the previous example to handle C
@ -3561,7 +3561,7 @@ static int convert_darray(PyObject *input, double *ptr, int size) {
</pre>
</blockquote>
<a name="n64"></a><H3>21.9.6 Pointer handling</H3>
<a name="n64"></a><H3>22.9.6 Pointer handling</H3>
Occasionally, it might be necessary to convert pointer values that have

View file

@ -5,7 +5,7 @@
</head>
<body bgcolor="#ffffff">
<a name="n1"></a><H1>22 SWIG and Ruby</H1>
<a name="n1"></a><H1>23 SWIG and Ruby</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Preliminaries</a>
@ -86,7 +86,7 @@
This chapter describes SWIG's support of Ruby.
<hr>
<a name="n2"></a><H2>22.1 Preliminaries</H2>
<a name="n2"></a><H2>23.1 Preliminaries</H2>
SWIG 1.3 is known to work with Ruby versions 1.6 and later. Given the choice, you should
@ -100,7 +100,7 @@ href="SWIG.html">SWIG Basics</a>" chapter. It is also assumed that the reader
has a basic understanding of Ruby.
<a name="n3"></a><H3>22.1.1 Running SWIG</H3>
<a name="n3"></a><H3>23.1.1 Running SWIG</H3>
<p>
@ -120,7 +120,7 @@ compiling a C++ extension) that contains all of the code needed to build a
Ruby extension module. To finish building the module, you need to compile this
file and link it with the rest of your program.
<a name="n4"></a><H3>22.1.2 Getting the right header files</H3>
<a name="n4"></a><H3>23.1.2 Getting the right header files</H3>
In order to compile the wrapper code, the compiler needs the <tt>ruby.h</tt>
@ -147,7 +147,7 @@ $ <b>ruby -e 'puts $:.join("\n")'</b>
</pre>
</blockquote>
<a name="n5"></a><H3>22.1.3 Compiling a dynamic module</H3>
<a name="n5"></a><H3>23.1.3 Compiling a dynamic module</H3>
Ruby extension modules are typically compiled into shared libraries that the
@ -206,7 +206,7 @@ pages for your compiler and linker to determine the correct set of options.
You might also check the <a href="http://swig.cs.uchicago.edu/cgi-bin/wiki.pl">
SWIG Wiki</a> for additional information.<p>
<a name="n6"></a><H3>22.1.4 Using your module</H3>
<a name="n6"></a><H3>23.1.4 Using your module</H3>
Ruby <i>module</i> names must be capitalized, but the convention for Ruby
@ -231,7 +231,7 @@ extension. So for example, a SWIG interface file that begins with:
will result in an extension module using the feature name "example" and
Ruby module name "Example".
<a name="n7"></a><H3>22.1.5 Static linking</H3>
<a name="n7"></a><H3>23.1.5 Static linking</H3>
An alternative approach to dynamic linking is to rebuild the Ruby
@ -247,7 +247,7 @@ the Ruby source, adding an entry to the <tt>ext/Setup</tt> file,
adding your directory to the list of extensions in the file, and finally rebuilding Ruby.
<p>
<a name="n8"></a><H3>22.1.6 Compilation of C++ extensions</H3>
<a name="n8"></a><H3>23.1.6 Compilation of C++ extensions</H3>
<p>
@ -279,7 +279,7 @@ create_makefile('example')
</blockquote>
<hr>
<a name="n9"></a><H2>22.2 Building Ruby Extensions under Windows 95/NT</H2>
<a name="n9"></a><H2>23.2 Building Ruby Extensions under Windows 95/NT</H2>
Building a SWIG extension to Ruby under Windows 95/NT is roughly similar to the
@ -300,7 +300,7 @@ IDE, instead of using the command line tools). In order to build extensions,
you may need to download the source distribution to the Ruby package, as you
will need the Ruby header files.<p>
<a name="n10"></a><H3>22.2.1 Running SWIG from Developer Studio</H3>
<a name="n10"></a><H3>23.2.1 Running SWIG from Developer Studio</H3>
If you are developing your application within Microsoft developer studio, SWIG
@ -364,13 +364,13 @@ Foo = 3.0
<hr>
<a name="n11"></a><H2>22.3 The Ruby-to-C/C++ Mapping</H2>
<a name="n11"></a><H2>23.3 The Ruby-to-C/C++ Mapping</H2>
This section describes the basics of how SWIG maps C or C++ declarations
in your SWIG interface files to Ruby constructs.
<a name="n12"></a><H3>22.3.1 Modules</H3>
<a name="n12"></a><H3>23.3.1 Modules</H3>
The SWIG <tt>%module</tt> directive specifies the name of the Ruby module. If
@ -396,7 +396,7 @@ using the <tt>-globalmodule</tt> option to wrap everything into the global modul
take care that the names of your constants, classes and methods don't conflict
with any of Ruby's built-in names.
<a name="n13"></a><H3>22.3.2 Functions</H3>
<a name="n13"></a><H3>23.3.2 Functions</H3>
Global functions are wrapped as Ruby module methods. For example, given
@ -429,7 +429,7 @@ irb(main):002:0&gt; <b>Example.fact(4)</b>
24
</pre></blockquote>
<a name="n14"></a><H3>22.3.3 Variable Linking</H3>
<a name="n14"></a><H3>23.3.3 Variable Linking</H3>
C/C++ global variables are wrapped as a pair of singleton methods for the
@ -490,7 +490,7 @@ extern char *path;
The <tt>%immutable</tt> directive stays in effect until it is explicitly
disabled using <tt>%mutable</tt>.
<a name="n15"></a><H3>22.3.4 Constants</H3>
<a name="n15"></a><H3>23.3.4 Constants</H3>
C/C++ constants are wrapped as module constants initialized to the
@ -519,7 +519,7 @@ irb(main):002:0&gt; <b>Example::PI</b>
3.14159
</pre></blockquote>
<a name="n16"></a><H3>22.3.5 Pointers</H3>
<a name="n16"></a><H3>23.3.5 Pointers</H3>
"Opaque" pointers to arbitrary C/C++ types (i.e. types that aren't explicitly
@ -540,7 +540,7 @@ irb(main):001:0&gt; <b>foo = Example::get_foo()</b>
A <tt>NULL</tt> pointer is always represented by the Ruby <tt>nil</tt> object.
<a name="n17"></a><H3>22.3.6 Structures</H3>
<a name="n17"></a><H3>23.3.6 Structures</H3>
C/C++ structs are wrapped as Ruby classes, with accessor methods (i.e. "getters"
@ -655,7 +655,7 @@ void Bar_f_set(Bar *b, Foo *val) {
</pre>
</blockquote>
<a name="n18"></a><H3>22.3.7 C++ classes</H3>
<a name="n18"></a><H3>23.3.7 C++ classes</H3>
Like structs, C++ classes are wrapped by creating a new Ruby class of the same
@ -707,7 +707,7 @@ Ale
3
</pre></blockquote>
<a name="n19"></a><H3>22.3.8 C++ Inheritance</H3>
<a name="n19"></a><H3>23.3.8 C++ Inheritance</H3>
The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have
@ -856,7 +856,7 @@ In most cases, this is not a serious problem since objects of type <tt>Derived</
will otherwise behave as though they inherit from both <tt>Base1</tt> and <tt>Base2</tt>
(i.e. they exhibit <a href="http://c2.com/cgi/wiki?DuckTyping">"Duck Typing"</a>).
<a name="n20"></a><H3>22.3.9 C++ Overloaded Functions</H3>
<a name="n20"></a><H3>23.3.9 C++ Overloaded Functions</H3>
C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example,
@ -957,7 +957,7 @@ first declaration takes precedence.
<P>
Please refer to the <a href="SWIGPlus.html">"SWIG and C++"</a> chapter for more information about overloading.
<a name="n21"></a><H3>22.3.10 C++ Operators</H3>
<a name="n21"></a><H3>23.3.10 C++ Operators</H3>
For the most part, overloaded operators are handled automatically by SWIG
@ -1002,7 +1002,7 @@ c = Example.add_complex(a, b)
More details about wrapping C++ operators into Ruby operators is discussed in
the <a href="#n39">section on operator overloading</a>.
<a name="n22"></a><H3>22.3.11 C++ namespaces</H3>
<a name="n22"></a><H3>23.3.11 C++ namespaces</H3>
SWIG is aware of C++ namespaces, but namespace names do not appear in
@ -1063,7 +1063,7 @@ extension modules for each namespace separately. If your program
utilizes thousands of small deeply nested namespaces each with
identical symbol names, well, then you get what you deserve.
<a name="n23"></a><H3>22.3.12 C++ templates</H3>
<a name="n23"></a><H3>23.3.12 C++ templates</H3>
C++ templates don't present a huge problem for SWIG. However, in order
@ -1140,7 +1140,7 @@ float sum(const std::vector&lt;float&gt;& values);
Obviously, there is a lot more to template wrapping than shown in these examples.
More details can be found in the <a href="SWIGPlus.html">SWIG and C++</a> chapter.
<a name="n24"></a><H3>22.3.13 C++ Smart Pointers</H3>
<a name="n24"></a><H3>23.3.13 C++ Smart Pointers</H3>
In certain C++ programs, it is common to use classes that have been wrapped by
@ -1215,7 +1215,7 @@ irb(main):004:0> <b>f = p.__deref__()</b> # Returns underlying Foo *
</blockquote>
<a name="n25"></a><H3>22.3.14 Cross-Language Polymorphism</H3>
<a name="n25"></a><H3>23.3.14 Cross-Language Polymorphism</H3>
SWIG's Ruby module supports cross-language polymorphism (a.k.a. the "directors"
@ -1224,7 +1224,7 @@ information presented in the <a href="Python.html">Python</a> chapter, this
secton just notes the differences that you need to be aware of when using this
feature with Ruby.
<a name="n26"></a><H4>22.3.14.1 Exception Unrolling</H4>
<a name="n26"></a><H4>23.3.14.1 Exception Unrolling</H4>
Whenever a C++ director class routes one of its virtual member function calls to a
@ -1245,7 +1245,7 @@ using the <tt>rb_rescue2()</tt> function from Ruby's C API. If any Ruby exceptio
is raised, it will be caught here and a C++ exception is raised in its place.
<hr>
<a name="n27"></a><H2>22.4 Input and output parameters</H2>
<a name="n27"></a><H2>23.4 Input and output parameters</H2>
A common problem in some C programs is handling parameters passed as simple
@ -1403,7 +1403,7 @@ r, c = Example.get_dimensions(m)
</blockquote>
<hr>
<a name="n28"></a><H2>22.5 Simple exception handling </H2>
<a name="n28"></a><H2>23.5 Simple exception handling </H2>
The SWIG <tt>%exception</tt> directive can be used to define a user-definable
@ -1521,7 +1521,7 @@ shown above) or one of the built-in Ruby exception types. For a list of the stan
Ruby exception classes, consult a Ruby reference such as <a href="http://www.rubycentral.com/book"><em>Programming Ruby</em></a>.
<hr>
<a name="n29"></a><H2>22.6 Typemaps</H2>
<a name="n29"></a><H2>23.6 Typemaps</H2>
This section describes how you can modify SWIG's default wrapping behavior
@ -1535,7 +1535,7 @@ part of using SWIG---the default wrapping behavior is enough in most cases.
Typemaps are only used if you want to change some aspect of the primitive
C-Ruby interface.
<a name="n30"></a><H3>22.6.1 What is a typemap?</H3>
<a name="n30"></a><H3>23.6.1 What is a typemap?</H3>
A typemap is nothing more than a code generation rule that is attached to
@ -1643,7 +1643,7 @@ puts Example.count('o','Hello World')
</pre>
</blockquote>
<a name="n31"></a><H3>22.6.2 Ruby typemaps</H3>
<a name="n31"></a><H3>23.6.2 Ruby typemaps</H3>
The previous section illustrated an "in" typemap for converting Ruby objects to
@ -1725,7 +1725,7 @@ Initialize an argument to a value before any conversions occur.
Examples of these typemaps appears in the <a href="#n34">section on typemap
examples</a>
<a name="n32"></a><H3>22.6.3 Typemap variables</H3>
<a name="n32"></a><H3>23.6.3 Typemap variables</H3>
Within a typemap, a number of special variables prefaced with a <tt>$</tt>
@ -1781,7 +1781,7 @@ so that their values can be properly assigned.
The Ruby name of the wrapper function being created.
</blockquote>
<a name="n33"></a><H3>22.6.4 Useful Functions</H3>
<a name="n33"></a><H3>23.6.4 Useful Functions</H3>
When you write a typemap, you usually have to work directly with Ruby objects.
@ -1790,7 +1790,7 @@ more can be found in <a href="http://www.rubycentral.com/book"><em>Programming R
and Andrew Hunt.)
<p>
<a name="n34"></a><H4>22.6.4.1 C Datatypes to Ruby Objects</H4>
<a name="n34"></a><H4>23.6.4.1 C Datatypes to Ruby Objects</H4>
<blockquote>
@ -1803,7 +1803,7 @@ rb_float_new(double) - double to Float
</pre>
</blockquote>
<a name="n35"></a><H4>22.6.4.2 Ruby Objects to C Datatypes</H4>
<a name="n35"></a><H4>23.6.4.2 Ruby Objects to C Datatypes</H4>
<blockquote>
@ -1823,7 +1823,7 @@ unsigned long FIX2ULONG(Numeric)
</pre>
</blockquote>
<a name="n36"></a><H4>22.6.4.3 Macros for VALUE</H4>
<a name="n36"></a><H4>23.6.4.3 Macros for VALUE</H4>
<p>
@ -1842,7 +1842,7 @@ unsigned long FIX2ULONG(Numeric)
<tt>RARRAY(arr)-&gt;ptr</tt>
<blockquote>pointer to array storage</blockquote>
<a name="n37"></a><H4>22.6.4.4 Exceptions</H4>
<a name="n37"></a><H4>23.6.4.4 Exceptions</H4>
<p>
@ -1917,7 +1917,7 @@ unsigned long FIX2ULONG(Numeric)
</pre>
</blockquote>
<a name="n38"></a><H4>22.6.4.5 Iterators</H4>
<a name="n38"></a><H4>23.6.4.5 Iterators</H4>
<p>
@ -1964,13 +1964,13 @@ unsigned long FIX2ULONG(Numeric)
<a name="n39"></a><H3>22.6.5 Typemap Examples</H3>
<a name="n39"></a><H3>23.6.5 Typemap Examples</H3>
This section includes a few examples of typemaps. For more examples, you
might look at the examples in the <tt>Example/ruby</tt> directory.
<a name="n40"></a><H3>22.6.6 Converting a Ruby array to a char **</H3>
<a name="n40"></a><H3>23.6.6 Converting a Ruby array to a char **</H3>
A common problem in many C programs is the processing of command line
@ -2034,7 +2034,7 @@ receive an input argument and convert it to a C array. Since dynamic memory
allocation is used to allocate memory for the array, the "freearg" typemap is
used to later release this memory after the execution of the C function.
<a name="n41"></a><H3>22.6.7 Collecting arguments in a hash</H3>
<a name="n41"></a><H3>23.6.7 Collecting arguments in a hash</H3>
Ruby's solution to the "keyword arguments" capability of some other languages is
@ -2242,7 +2242,7 @@ All of the code for this example, as well as a sample Ruby program that uses
the extension, can be found in the <tt>Examples/ruby/hashargs</tt> directory
of the SWIG distribution.
<a name="n42"></a><H3>22.6.8 Pointer handling</H3>
<a name="n42"></a><H3>23.6.8 Pointer handling</H3>
Occasionally, it might be necessary to convert pointer values that have been
@ -2301,7 +2301,7 @@ typemap variable <tt>$1_descriptor</tt>. For example:
</pre>
</blockquote>
<a name="n43"></a><H4>22.6.8.1 Ruby Datatype Wrapping</H4>
<a name="n43"></a><H4>23.6.8.1 Ruby Datatype Wrapping</H4>
<p>
@ -2322,7 +2322,7 @@ Retrieves the original C pointer of type <i>c-type</i> from the data object
</blockquote>
<hr>
<a name="n44"></a><H2>22.7 Operator overloading</H2>
<a name="n44"></a><H2>23.7 Operator overloading</H2>
SWIG allows operator overloading with, by using the <tt>%extend</tt> or
@ -2380,7 +2380,7 @@ __ge__ - &gt;=
Note that although SWIG supports the <tt>__eq__</tt> magic method name for defining an equivalence operator, there is no separate method for handling <i>inequality</i> since Ruby parses the expression <i>a != b</i> as <i>!(a == b)</i>.
<a name="n45"></a><H3>22.7.1 Example: STL Vector to Ruby Array</H3>
<a name="n45"></a><H3>23.7.1 Example: STL Vector to Ruby Array</H3>
<em><b>FIXME: This example is out of place here!</b></em><p>
@ -2469,10 +2469,10 @@ It is also possible to create a Ruby array from a vector of static data types:
</pre></blockquote>
<a name="n46"></a><H2>22.8 Advanced Topics</H2>
<a name="n46"></a><H2>23.8 Advanced Topics</H2>
<a name="n47"></a><H3>22.8.1 Creating Multi-Module Packages</H3>
<a name="n47"></a><H3>23.8.1 Creating Multi-Module Packages</H3>
The chapter on <a href="Advanced.html">Advanced Topics</a> discusses the basics
@ -2597,7 +2597,7 @@ irb(main):005:0> <b>c.getX()</b>
</pre>
</blockquote>
<a name="n48"></a><H3>22.8.2 Defining Aliases</H3>
<a name="n48"></a><H3>23.8.2 Defining Aliases</H3>
It's a fairly common practice in the Ruby built-ins and standard library to
@ -2665,7 +2665,7 @@ mechanism and so the same name matching rules used for other kinds of features
apply (see the chapter on <a href="Customization.html">"Customization Features"</a>)
for more details).
<a name="n49"></a><H3>22.8.3 Predicate Methods</H3>
<a name="n49"></a><H3>23.8.3 Predicate Methods</H3>
Predicate methods in Ruby are those which return either <tt>true</tt> or
@ -2716,7 +2716,7 @@ Note that the <tt>%predicate</tt> directive is implemented using SWIG's
of features apply (see the chapter on <a href="Customization.html">"Customization
Features"</a>) for more details).
<a name="n50"></a><H3>22.8.4 Specifying Mixin Modules</H3>
<a name="n50"></a><H3>23.8.4 Specifying Mixin Modules</H3>
The Ruby language doesn't support multiple inheritance, but it does allow you
@ -2788,7 +2788,7 @@ Note that the <tt>%mixin</tt> directive is implemented using SWIG's
of features apply (see the chapter on <a href="Customization.html">"Customization
Features"</a>) for more details).
<a name="n51"></a><H3>22.8.5 Interacting with Ruby's Garbage Collector</H3>
<a name="n51"></a><H3>23.8.5 Interacting with Ruby's Garbage Collector</H3>
<b>This section is still unfinished!</b><p>

View file

@ -2657,4 +2657,4 @@ The bottom line: don't do this.
<address>SWIG 1.3 - Last Modified : August 7, 2003</address>
</body>
</html>
</html>

View file

@ -3723,4 +3723,4 @@ is the reference document we use to guide a lot of SWIG's C++ support.
<address>SWIG 1.3 - Last Modified : April 3, 2003</address>
</body>
</html>
</html>

View file

@ -5,7 +5,7 @@
</head>
<body bgcolor="#ffffff">
<a name="n1"></a><H1>23 SWIG and Tcl</H1>
<a name="n1"></a><H1>24 SWIG and Tcl</H1>
<!-- INDEX -->
<ul>
<li><a href="#n2">Preliminaries</a>
@ -76,7 +76,7 @@ This chapter discusses SWIG's support of Tcl. SWIG currently requires
Tcl 8.0 or a later release. Earlier releases of SWIG supported Tcl 7.x, but
this is no longer supported.
<a name="n2"></a><H2>23.1 Preliminaries</H2>
<a name="n2"></a><H2>24.1 Preliminaries</H2>
To build a Tcl module, run SWIG using the <tt>-tcl</tt> option :<p>
@ -97,7 +97,7 @@ This creates a file <tt>example_wrap.c</tt> or
build a Tcl extension module. To finish building the module, you
need to compile this file and link it with the rest of your program.
<a name="n3"></a><H3>23.1.1 Getting the right header files</H3>
<a name="n3"></a><H3>24.1.1 Getting the right header files</H3>
In order to compile the wrapper code, the compiler needs the <tt>tcl.h</tt> header file.
@ -111,7 +111,7 @@ Be aware that some Tcl versions install this header file with a version number a
this is the case, you should probably make a symbolic link so that <tt>tcl.h</tt> points to the correct
header file.
<a name="n4"></a><H3>23.1.2 Compiling a dynamic module</H3>
<a name="n4"></a><H3>24.1.2 Compiling a dynamic module</H3>
The preferred approach to building an extension module is to compile it into
@ -140,7 +140,7 @@ name of the corresponding object file should be
The name of the module is specified using the <tt>%module</tt> directive or the
<tt> -module</tt> command line option.<p>
<a name="n5"></a><H3>23.1.3 Static linking</H3>
<a name="n5"></a><H3>24.1.3 Static linking</H3>
An alternative approach to dynamic linking is to rebuild the Tcl
@ -196,7 +196,7 @@ However, the performance gained by static linking tends to be rather
minimal in most situations (and quite frankly not worth the extra
hassle in the opinion of this author).
<a name="n6"></a><H3>23.1.4 Using your module</H3>
<a name="n6"></a><H3>24.1.4 Using your module</H3>
To use your module, simply use the Tcl <tt>load</tt> command. If
@ -305,7 +305,7 @@ Finally, you can use a command such as <tt>ldconfig</tt> to add additional searc
to the default system configuration (this requires root access and you will need to read
the man pages).
<a name="n7"></a><H3>23.1.5 Compilation of C++ extensions</H3>
<a name="n7"></a><H3>24.1.5 Compilation of C++ extensions</H3>
Compilation of C++ extensions has traditionally been a tricky problem.
@ -378,7 +378,7 @@ you will need to take steps to avoid segmentation faults and other
erratic program behavior. If working with lots of software components, you
might want to investigate using a more formal standard such as COM.
<a name="n8"></a><H3>23.1.6 Compiling for 64-bit platforms</H3>
<a name="n8"></a><H3>24.1.6 Compiling for 64-bit platforms</H3>
On platforms that support 64-bit applications (Solaris, Irix, etc.),
@ -401,7 +401,7 @@ that software. This may prevent the use of 64-bit extensions. It may
also introduce problems on platforms that support more than one
linking standard (e.g., -o32 and -n32 on Irix).
<a name="n9"></a><H3>23.1.7 Setting a package prefix</H3>
<a name="n9"></a><H3>24.1.7 Setting a package prefix</H3>
To avoid namespace problems, you can instruct SWIG to append a package
@ -415,7 +415,7 @@ If you have a function "<tt>bar</tt>" in the SWIG file, the prefix
option will append the prefix to the name when creating a command and
call it "<tt>Foo_bar</tt>". <p>
<a name="n10"></a><H3>23.1.8 Using namespaces</H3>
<a name="n10"></a><H3>24.1.8 Using namespaces</H3>
Alternatively, you can have SWIG install your module into a Tcl
@ -430,7 +430,7 @@ name, but you can override it using the <tt>-prefix</tt> option.<p>
When the<tt> -namespace</tt> option is used, objects in the module
are always accessed with the namespace name such as <tt>Foo::bar</tt>.
<a name="n11"></a><H2>23.2 Building Tcl/Tk Extensions under Windows 95/NT</H2>
<a name="n11"></a><H2>24.2 Building Tcl/Tk Extensions under Windows 95/NT</H2>
Building a SWIG extension to Tcl/Tk under Windows 95/NT is roughly
@ -439,7 +439,7 @@ produce a DLL that can be loaded into tclsh or wish. This section
covers the process of using SWIG with Microsoft Visual C++.
although the procedure may be similar with other compilers.<p>
<a name="n12"></a><H3>23.2.1 Running SWIG from Developer Studio</H3>
<a name="n12"></a><H3>24.2.1 Running SWIG from Developer Studio</H3>
If you are developing your application within Microsoft developer
@ -496,7 +496,7 @@ MSDOS &gt; tclsh80
%
</pre></blockquote>
<a name="n13"></a><H3>23.2.2 Using NMAKE</H3>
<a name="n13"></a><H3>24.2.2 Using NMAKE</H3>
Alternatively, SWIG extensions can be built by writing a Makefile for
@ -553,7 +553,7 @@ first). This is a pretty minimal Makefile, but hopefully its enough
to get you started. With a little practice, you'll be making lots of
Tcl extensions.<p>
<a name="n14"></a><H2>23.3 A tour of basic C/C++ wrapping</H2>
<a name="n14"></a><H2>24.3 A tour of basic C/C++ wrapping</H2>
By default, SWIG tries to build a very natural Tcl interface to your
@ -562,7 +562,7 @@ in an interface that mimics the style of Tk widgets and [incr Tcl]
classes. This section briefly covers the essential aspects of this
wrapping.
<a name="n15"></a><H3>23.3.1 Modules</H3>
<a name="n15"></a><H3>24.3.1 Modules</H3>
The SWIG <tt>%module</tt> directive specifies the name of the Tcl
@ -591,7 +591,7 @@ To fix this, supply an extra argument to <tt>load</tt> like this:
</pre>
</blockquote>
<a name="n16"></a><H3>23.3.2 Functions</H3>
<a name="n16"></a><H3>24.3.2 Functions</H3>
Global functions are wrapped as new Tcl built-in commands. For example,
@ -614,7 +614,7 @@ like you think it does:<p>
%
</pre></blockquote>
<a name="n17"></a><H3>23.3.3 Global variables</H3>
<a name="n17"></a><H3>24.3.3 Global variables</H3>
C/C++ global variables are wrapped by Tcl global variables. For example:
@ -675,7 +675,7 @@ extern char *path; // Read-only (due to %immutable)
</pre>
</blockquote>
<a name="n18"></a><H3>23.3.4 Constants and enums</H3>
<a name="n18"></a><H3>24.3.4 Constants and enums</H3>
C/C++ constants are installed as global Tcl variables containing the
@ -746,7 +746,7 @@ proc blah {} {
When an identifier name is given, it is used to perform an implicit hash-table lookup of the value during argument
conversion. This allows the <tt>global</tt> statement to be ommitted.
<a name="n19"></a><H3>23.3.5 Pointers</H3>
<a name="n19"></a><H3>24.3.5 Pointers</H3>
C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with
@ -831,7 +831,7 @@ to use the new C++ style casts. For example, in the above code, the
C-style cast may return a bogus result whereas as the C++-style cast will return
<tt>None</tt> if the conversion can't be performed.
<a name="n20"></a><H3>23.3.6 Structures</H3>
<a name="n20"></a><H3>24.3.6 Structures</H3>
If you wrap a C structure, it is wrapped by a Tcl interface that somewhat resembles a Tk widget.
@ -1071,7 +1071,7 @@ or
Note: Tcl only destroys the underlying object if it has ownership. See the
memory management section that appears shortly.
<a name="n21"></a><H3>23.3.7 C++ classes</H3>
<a name="n21"></a><H3>24.3.7 C++ classes</H3>
C++ classes are wrapped as an extension of structure wrapping. For example, if you have this class,
@ -1129,7 +1129,7 @@ In Tcl, the static member is accessed as follows:
</pre>
</blockquote>
<a name="n22"></a><H3>23.3.8 C++ inheritance</H3>
<a name="n22"></a><H3>24.3.8 C++ inheritance</H3>
SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have
@ -1171,7 +1171,7 @@ For instance:
<p>
It is safe to use multiple inheritance with SWIG.
<a name="n23"></a><H3>23.3.9 Pointers, references, values, and arrays</H3>
<a name="n23"></a><H3>24.3.9 Pointers, references, values, and arrays</H3>
In C++, there are many different ways a function might receive
@ -1217,7 +1217,7 @@ Since the third function (spam7) returns a value, newly allocated memory is used
to hold the result and a pointer is returned (Tcl will release this memory
when the return value is garbage collected).
<a name="n24"></a><H3>23.3.10 C++ overloaded functions</H3>
<a name="n24"></a><H3>24.3.10 C++ overloaded functions</H3>
C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example,
@ -1318,7 +1318,7 @@ first declaration takes precedence.
<P>
Please refer to the "SWIG and C++" chapter for more information about overloading.
<a name="n25"></a><H3>23.3.11 C++ operators</H3>
<a name="n25"></a><H3>24.3.11 C++ operators</H3>
Certain C++ overloaded operators can be handled automatically by SWIG. For example,
@ -1408,7 +1408,7 @@ Complex operator+(double, const Complex &c);
There are ways to make this operator appear as part of the class using the <tt>%extend</tt> directive.
Keep reading.
<a name="n26"></a><H3>23.3.12 C++ namespaces</H3>
<a name="n26"></a><H3>24.3.12 C++ namespaces</H3>
SWIG is aware of C++ namespaces, but namespace names do not appear in
@ -1464,7 +1464,7 @@ extension modules for each namespace separately. If your program
utilizes thousands of small deeply nested namespaces each with
identical symbol names, well, then you get what you deserve.
<a name="n27"></a><H3>23.3.13 C++ templates</H3>
<a name="n27"></a><H3>24.3.13 C++ templates</H3>
C++ templates don't present a huge problem for SWIG. However, in order
@ -1510,7 +1510,7 @@ Obviously, there is more to template wrapping than shown in this example.
More details can be found in the <a href="SWIGPlus.html">SWIG and C++</a> chapter. Some more complicated
examples will appear later.
<a name="n28"></a><H3>23.3.14 C++ Smart Pointers</H3>
<a name="n28"></a><H3>24.3.14 C++ Smart Pointers</H3>
In certain C++ programs, it is common to use classes that have been wrapped by
@ -1582,7 +1582,7 @@ simply use the <tt>__deref__()</tt> method. For example:
</pre>
</blockquote>
<a name="n29"></a><H2>23.4 Further details on the Tcl class interface</H2>
<a name="n29"></a><H2>24.4 Further details on the Tcl class interface</H2>
In the previous section, a high-level view of Tcl wrapping was
@ -1593,7 +1593,7 @@ advanced features such as operator overloading. However, a number
of low-level details were omitted. This section provides a brief overview
of how the proxy classes work.
<a name="n30"></a><H3>23.4.1 Proxy classes</H3>
<a name="n30"></a><H3>24.4.1 Proxy classes</H3>
In the <a href="SWIG.html">"SWIG basics"</a> and <a href="SWIGPlus.html">"SWIG and C++"</a> chapters,
@ -1650,7 +1650,7 @@ However, in addition to this, the classname <tt>Foo</tt> is used as an object co
function. This allows objects to be encapsulated objects that look a lot like Tk widgets
as shown in the last section.
<a name="n31"></a><H3>23.4.2 Memory management</H3>
<a name="n31"></a><H3>24.4.2 Memory management</H3>
Associated with each wrapped object, is an ownership flag <tt>thisown</tt> The value of this
@ -1814,7 +1814,7 @@ It is also possible to deal with situations like this using
typemaps--an advanced topic discussed later.
<a name="n32"></a><H2>23.5 Input and output parameters</H2>
<a name="n32"></a><H2>24.5 Input and output parameters</H2>
A common problem in some C programs is handling parameters passed as simple pointers. For
@ -1975,7 +1975,7 @@ set c [lindex $dim 1]
</pre>
</blockquote>
<a name="n33"></a><H2>23.6 Exception handling </H2>
<a name="n33"></a><H2>24.6 Exception handling </H2>
The <tt>%exception</tt> directive can be used to create a user-definable
@ -2101,7 +2101,7 @@ For example:
Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling.
See the chapter on "<a href="Customization.html">Customization Features</a>" for more examples.
<a name="n34"></a><H2>23.7 Typemaps</H2>
<a name="n34"></a><H2>24.7 Typemaps</H2>
This section describes how you can modify SWIG's default wrapping behavior
@ -2115,7 +2115,7 @@ part of using SWIG---the default wrapping behavior is enough in most cases.
Typemaps are only used if you want to change some aspect of the primitive
C-Tcl interface.
<a name="n35"></a><H3>23.7.1 What is a typemap?</H3>
<a name="n35"></a><H3>24.7.1 What is a typemap?</H3>
A typemap is nothing more than a code generation rule that is attached to
@ -2212,7 +2212,7 @@ parameter is ommitted):
</pre>
</blockquote>
<a name="n36"></a><H3>23.7.2 Tcl typemaps</H3>
<a name="n36"></a><H3>24.7.2 Tcl typemaps</H3>
The previous section illustrated an "in" typemap for converting Tcl objects to C.
@ -2302,7 +2302,7 @@ Initialize an argument to a value before any conversions occur.
Examples of these methods will appear shortly.
<a name="n37"></a><H3>23.7.3 Typemap variables</H3>
<a name="n37"></a><H3>24.7.3 Typemap variables</H3>
Within typemap code, a number of special variables prefaced with a <tt>$</tt> may appear.
@ -2356,7 +2356,7 @@ properly assigned.
The Tcl name of the wrapper function being created.
</blockquote>
<a name="n38"></a><H3>23.7.4 Converting a Tcl list to a char ** </H3>
<a name="n38"></a><H3>24.7.4 Converting a Tcl list to a char ** </H3>
A common problem in many C programs is the processing of command line
@ -2413,7 +2413,7 @@ argv[2] = Larry
3
</pre></blockquote>
<a name="n39"></a><H3>23.7.5 Returning values in arguments</H3>
<a name="n39"></a><H3>24.7.5 Returning values in arguments</H3>
The "argout" typemap can be used to return a value originating from a
@ -2451,7 +2451,7 @@ result, a Tcl function using these typemaps will work like this :<p>
%
</pre></blockquote>
<a name="n40"></a><H3>23.7.6 Useful functions</H3>
<a name="n40"></a><H3>24.7.6 Useful functions</H3>
The following tables provide some functions that may be useful in
@ -2514,7 +2514,7 @@ int Tcl_IsShared(Tcl_Obj *obj);
</pre>
</blockquote>
<a name="n41"></a><H3>23.7.7 Standard typemaps</H3>
<a name="n41"></a><H3>24.7.7 Standard typemaps</H3>
The following typemaps show how to convert a few common kinds of
@ -2587,7 +2587,7 @@ work)<p>
</pre>
</blockquote>
<a name="n42"></a><H3>23.7.8 Pointer handling</H3>
<a name="n42"></a><H3>24.7.8 Pointer handling</H3>
SWIG pointers are mapped into Tcl strings containing the
@ -2656,7 +2656,7 @@ For example:
</pre>
</blockquote>
<a name="n43"></a><H2>23.8 Turning a SWIG module into a Tcl Package.</H2>
<a name="n43"></a><H2>24.8 Turning a SWIG module into a Tcl Package.</H2>
Tcl 7.4 introduced the idea of an extension package. By default, SWIG
@ -2717,7 +2717,7 @@ As a final note, most SWIG examples do not yet use the
<tt>package</tt> commands. For simple extensions it may be easier just
to use the <tt>load</tt> command instead.<p>
<a name="n44"></a><H2>23.9 Building new kinds of Tcl interfaces (in Tcl)</H2>
<a name="n44"></a><H2>24.9 Building new kinds of Tcl interfaces (in Tcl)</H2>
One of the most interesting aspects of Tcl and SWIG is that you can
@ -2809,7 +2809,7 @@ the Tcl code would simply return with an error so there is very little
danger of blowing something up (although it is easily accomplished
with an out of bounds array access).<p>
<a name="n45"></a><H3>23.9.1 Shadow classes</H3>
<a name="n45"></a><H3>24.9.1 Shadow classes</H3>
A similar approach can be applied to shadow classes. The following

View file

@ -438,4 +438,4 @@ The ability to control warning messages was first added to SWIG-1.3.12.
<p><hr>
<address>SWIG 1.3 - Last Modified : June 28, 2003</address>
</body>
</html>
</html>

View file

@ -22,19 +22,19 @@
<li><a href="#n9">Perl</a>
<li><a href="#n10">Java</a>
<li><a href="#n11">Ruby</a>
<li><a href="#n110">C#</a>
<li><a href="#n12">C#</a>
</ul>
<li><a href="#n12">Instructions for using the Examples with other compilers</a>
<li><a href="#n13">Instructions for using the Examples with other compilers</a>
</ul>
<li><a href="#n13">SWIG on Cygwin and MinGW</a>
<li><a href="#n14">SWIG on Cygwin and MinGW</a>
<ul>
<li><a href="#n14">Building swig.exe on Windows</a>
<li><a href="#n15">Building swig.exe on Windows</a>
<ul>
<li><a href="#n15">Building swig.exe using MinGW and MSYS</a>
<li><a href="#n16">Building swig.exe using Cygwin</a>
<li><a href="#n17">Building swig.exe alternatives</a>
<li><a href="#n16">Building swig.exe using MinGW and MSYS</a>
<li><a href="#n17">Building swig.exe using Cygwin</a>
<li><a href="#n18">Building swig.exe alternatives</a>
</ul>
<li><a href="#n18">Running the examples on Windows using Cygwin</a>
<li><a href="#n19">Running the examples on Windows using Cygwin</a>
</ul>
</ul>
<!-- INDEX -->
@ -169,23 +169,25 @@ RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32<br>
RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib<br>
</tt>
<a name="n110"></a><H4>2.2.1.6 C#</H4>
<a name="n12"></a><H4>2.2.1.6 C#</H4>
The C# examples do not require any environment variables to be set as a C# project file is included.
Just open up the .sln solution file in Visual Studio .NET 2003 and do a Rebuild All from the Build menu.
The accompanying C# and C++ project file are automatically used by the solution file.
<a name="n12"></a><H3>2.2.2 Instructions for using the Examples with other compilers</H3>
<a name="n13"></a><H3>2.2.2 Instructions for using the Examples with other compilers</H3>
If you do not have access to Visual C++ you will have to set up project files / Makefiles for your chosen compiler. There is a section in each of the language modules detailing what needs setting up using Visual C++ which may be of some guidance. Alternatively you may want to use Cygwin as described in the following section.
<a name="n13"></a><H2>2.3 SWIG on Cygwin and MinGW</H2>
<a name="n14"></a><H2>2.3 SWIG on Cygwin and MinGW</H2>
SWIG can also be compiled and run using <a href="http://www.cygwin.com">Cygwin</a> or <a href=http://www.mingw.org>MinGW</a> which provides a Unix like front end to Windows and comes free with gcc, an ANSI C/C++ compiler. However, this is not a recommended approach as the prebuilt executable is supplied.
<a name="swig_exe"></a>
<a name="n14"></a><H3>2.3.1 Building swig.exe on Windows</H3>
<a name="n15"></a><H3>2.3.1 Building swig.exe on Windows</H3>
If you want to replicate the build of swig.exe that comes with the download, follow the MinGW instructions below.
@ -193,7 +195,7 @@ This is not necessary to use the supplied swig.exe.
This information is provided for those that want to modify the SWIG source code in a Windows environment.
Normally this is not needed, so most people will want to ignore this section.
<a name="n15"></a><H4>2.3.1.1 Building swig.exe using MinGW and MSYS</H4>
<a name="n16"></a><H4>2.3.1.1 Building swig.exe using MinGW and MSYS</H4>
<ul>
@ -202,7 +204,7 @@ Normally this is not needed, so most people will want to ignore this section.
</ul>
<a name="n16"></a><H4>2.3.1.2 Building swig.exe using Cygwin</H4>
<a name="n17"></a><H4>2.3.1.2 Building swig.exe using Cygwin</H4>
Note that SWIG can also be built using Cygwin.
@ -213,7 +215,7 @@ Note that the Cygwin environment will also allow one to regenerate the autotool
These files are generated using the <tt>autogen.sh</tt> script and will only need regenerating in circumstances such as changing the build system.
<p>
<a name="n17"></a><H4>2.3.1.3 Building swig.exe alternatives</H4>
<a name="n18"></a><H4>2.3.1.3 Building swig.exe alternatives</H4>
If you don't want to install Cygwin or MinGW, use a different compiler to build
@ -222,7 +224,7 @@ file in order to build swig.exe from the Visual C++ IDE.
<a name="examples_cygwin"></a>
<a name="n18"></a><H3>2.3.2 Running the examples on Windows using Cygwin</H3>
<a name="n19"></a><H3>2.3.2 Running the examples on Windows using Cygwin</H3>
The examples and test-suite work as successfully on Cygwin as on any other Unix operating system.
@ -232,4 +234,4 @@ Follow the Unix instructions in the README file in the SWIG root directory to bu
<p>
</body>
</html>
</html>

View file

@ -16,6 +16,7 @@ Modules.html
Advanced.html
Guile.html
Java.html
Modula3.html
Ocaml.html
Perl5.html
Php.html

View file

@ -494,6 +494,31 @@ java_multi_cpp: $(SRCS)
java_clean:
rm -f *.@OBJEXT@ *@JAVASO@ *_wrap* *~ .~* core @EXTRA_CLEAN@ *.class `find . -name \*.java | grep -v main.java`
##################################################################
##### MODULA3 ######
##################################################################
MODULA3_INCLUDE= @MODULA3INC@
# ----------------------------------------------------------------
# Build a modula3 dynamically loadable module (C)
# ----------------------------------------------------------------
modula3: $(SRCS)
$(SWIG) -modula3 $(SWIGOPT) $(INTERFACE)
# $(CC) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(ISRCS) $(INCLUDES) \
# $(OBJS) $(IOBJS) $(LIBS)
modula3_cpp: $(SRCS)
$(SWIG) -modula3 -c++ $(SWIGOPT) $(INTERFACE)
# -----------------------------------------------------------------
# Cleaning the modula3 examples
# -----------------------------------------------------------------
modula3_clean:
rm -f *_wrap* *.i3 *.m3
##################################################################
##### MZSCHEME ######
##################################################################

View file

@ -0,0 +1,7 @@
# see top-level Makefile.in
class
enum
exception
reference
simple
typemap

View file

@ -0,0 +1,17 @@
runme
*_wrap.c
*_wrap.cxx
*_wrap.xml
*.iltmp
*.cs
*.dll
*.dsw
*.exp
*.lib
*.ncb
*.opt
*.plg
Release
Debug
src
LINUXLIBC6

View file

@ -0,0 +1,25 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS =
TARGET = example
PLATFORM = LINUXLIBC6
INTERFACE = example.i
SWIGOPT = -c++
MODULA3SRCS = *.[im]3
all:: modula3
modula3::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' modula3
m3ppinplace $(MODULA3SRCS)
# compilation of example_wrap.cxx is started by cm3
# $(CXX) -c $(TARGET)_wrap.cxx
mv example_wrap.cxx m3makefile $(MODULA3SRCS) src/
ln -sf ../example.h src/example.h
cm3
clean::
$(MAKE) -f $(TOP)/Makefile modula3_clean
check: all

View file

@ -0,0 +1,28 @@
/* File : example.c */
#include "example.h"
#define M_PI 3.14159265358979323846
/* Move the shape to a new location */
void Shape::move(double dx, double dy) {
x += dx;
y += dy;
}
int Shape::nshapes = 0;
double Circle::area(void) {
return M_PI*radius*radius;
}
double Circle::perimeter(void) {
return 2*M_PI*radius;
}
double Square::area(void) {
return width*width;
}
double Square::perimeter(void) {
return 4*width;
}

View file

@ -0,0 +1,44 @@
/* File : example.h */
class Shape
{
public:
Shape ()
{
nshapes++;
}
virtual ~ Shape ()
{
nshapes--;
};
double x, y;
void move (double dx, double dy);
virtual double area (void) const = 0;
virtual double perimeter (void) const = 0;
protected:
static int nshapes;
};
class Circle:public Shape
{
private:
double radius;
public:
Circle (double r):radius (r)
{
};
virtual double area (void) const;
virtual double perimeter (void) const;
};
class Square:public Shape
{
private:
double width;
public:
Square (double w):width (w)
{
};
virtual double area (void) const;
virtual double perimeter (void) const;
};

View file

@ -0,0 +1,32 @@
/* File : example.i */
%module Example
%{
#include "example.h"
%}
%insert(m3makefile) %{template("../swig")
cxx_source("example_wrap")%}
%typemap(m3rawinmode) Shape *, Circle *, Square * ""
%typemap(m3rawrettype) Shape *, Circle *, Square * "$1_basetype"
%typemap(m3wrapinmode) Shape *, Circle *, Square * ""
%typemap(m3wrapargraw) Shape *, Circle *, Square * "self.cxxObj"
%typemap(m3wrapretvar) Circle *, Square * "cxxObj : ExampleRaw.$1_basetype;"
%typemap(m3wrapretraw) Circle *, Square * "cxxObj"
%typemap(m3wrapretconv) Circle *, Square * "NEW($1_basetype,cxxObj:=cxxObj)"
%typemap(m3wraprettype) Circle *, Square * "$1_basetype"
/* Should work with and without renaming
%rename(M3Shape) Shape;
%rename(M3Circle) Circle;
%rename(M3Square) Square;
%typemap(m3wrapintype) Shape *, Circle *, Square * "M3$1_basetype"
%typemap(m3wraprettype) Shape *, Circle *, Square * "M3$1_basetype"
%typemap(m3wrapretconv) Circle *, Square * "NEW(M3$1_basetype,cxxObj:=cxxObj)"
*/
/* Let's just grab the original header file here */
%include "example.h"

View file

@ -0,0 +1,11 @@
readonly proc cxx_source (X) is
local cxxfile = X&".cxx"
local objfile = X&".o"
%exec("echo $PWD")
if stale(objfile,cxxfile)
exec("cd",path(),"; g++ -I.. -c -o",objfile,cxxfile)
end
import_obj(X)
%unlink_file(path()&SL&objfile)
end

View file

@ -0,0 +1,18 @@
*.class
*.java
*_wrap.*
*_const*
*.i3
*.m3
m3makefile
src
LINUXLIBC6
*.dll
*.dsw
*.exp
*.lib
*.ncb
*.opt
*.plg
Release
Debug

View file

@ -0,0 +1,26 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS =
TARGET = example
INTERFACE = example.i
CONSTNUMERIC = example_const
SWIGOPT = -c++
MODULA3SRCS = *.[im]3
all:: modula3
modula3::
$(SWIG) -modula3 $(SWIGOPT) -module Example -generateconst $(CONSTNUMERIC) $(TARGET).h
$(CXX) -Wall $(CONSTNUMERIC).c -o $(CONSTNUMERIC)
$(CONSTNUMERIC) >$(CONSTNUMERIC).i
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' modula3
m3ppinplace $(MODULA3SRCS)
mv m3makefile $(MODULA3SRCS) src/
cm3
clean::
$(MAKE) -f $(TOP)/Makefile modula3_clean
check: all

View file

@ -0,0 +1,32 @@
/* File : example.cxx */
#include "example.h"
#include <stdio.h>
void Foo::enum_test(speed s) {
if (s == IMPULSE) {
printf("IMPULSE speed\n");
} else if (s == WARP) {
printf("WARP speed\n");
} else if (s == LUDICROUS) {
printf("LUDICROUS speed\n");
} else if (s == HYPER) {
printf("HYPER speed\n");
} else {
printf("Unknown speed\n");
}
}
void enum_test(color c, Foo::speed s) {
if (c == RED) {
printf("color = RED, ");
} else if (c == BLUE) {
printf("color = BLUE, ");
} else if (c == GREEN) {
printf("color = GREEN, ");
} else {
printf("color = Unknown color!, ");
}
Foo obj;
obj.enum_test(s);
}

View file

@ -0,0 +1,83 @@
/* File : example.h */
#define PI 3.141
#define DAY_MONDAY 0
#define DAY_TUESDAY 1
#define DAY_WEDNESDAY 2
#define DAY_THURSDAY 3
#define DAY_FRIDAY 4
#define DAY_SATURDAY 5
#define DAY_SUNDAY 6
enum color { BLUE, RED, GREEN };
#define CLB_BLACK 0
#define CLB_BLUE 1
#define CLB_RED 2
#define CLB_MAGENTA 3
#define CLB_GREEN 4
#define CLB_CYAN 5
#define CLB_YELLOW 6
#define CLB_WHITE 7
/* Using this would be good style
which cannot be expected for general C header files.
Instead I want to demonstrate how to live without it.
enum month {
MTHF_JANUARY,
MTHF_FEBRUARY,
MTHF_MARCH,
MTHF_APRIL,
MTHF_MAY,
MTHF_JUNE,
MTHF_JULY,
MTHF_AUGUST,
MTHF_SEPTEMBER,
MTHF_OCTOBER,
MTHF_NOVEMBER,
MTHF_DECEMBER,
}
*/
/* Since there are no compile time constants in C / C++
it is a common abuse
to declare bit set (flag) constants
as enumerations. */
enum calendar {
MTHB_JANUARY = 1 << 0, /* 1 << MTHF_JANUARY, */
MTHB_FEBRUARY = 1 << 1, /* 1 << MTHF_FEBRUARY, */
MTHB_MARCH = 1 << 2, /* 1 << MTHF_MARCH, */
MTHB_APRIL = 1 << 3, /* 1 << MTHF_APRIL, */
MTHB_MAY = 1 << 4, /* 1 << MTHF_MAY, */
MTHB_JUNE = 1 << 5, /* 1 << MTHF_JUNE, */
MTHB_JULY = 1 << 6, /* 1 << MTHF_JULY, */
MTHB_AUGUST = 1 << 7, /* 1 << MTHF_AUGUST, */
MTHB_SEPTEMBER = 1 << 8, /* 1 << MTHF_SEPTEMBER, */
MTHB_OCTOBER = 1 << 9, /* 1 << MTHF_OCTOBER, */
MTHB_NOVEMBER = 1 << 10, /* 1 << MTHF_NOVEMBER, */
MTHB_DECEMBER = 1 << 11, /* 1 << MTHF_DECEMBER, */
MTHB_SPRING = MTHB_MARCH | MTHB_APRIL | MTHB_MAY,
MTHB_SUMMER = MTHB_JUNE | MTHB_JULY | MTHB_AUGUST,
MTHB_AUTUMN = MTHB_SEPTEMBER | MTHB_OCTOBER | MTHB_NOVEMBER,
MTHB_WINTER = MTHB_DECEMBER | MTHB_JANUARY | MTHB_FEBRUARY,
};
namespace Answer {
enum {
UNIVERSE_AND_EVERYTHING = 42,
SEVENTEEN_AND_FOUR = 21,
TWOHUNDRED_PERCENT_OF_NOTHING = 0,
};
class Foo {
public:
Foo() { }
enum speed { IMPULSE = -2, WARP = 0, HYPER, LUDICROUS = 3};
void enum_test(speed s);
};
};
void enum_test(color c, Answer::Foo::speed s);

View file

@ -0,0 +1,72 @@
/* File : example.i */
%module Example
%{
#include "example.h"
%}
%include "example_const.i"
// such features are generated by the following pragmas
#if 0
%feature("modula3:enumitem:enum","Days") DAY_MONDAY;
%feature("modula3:enumitem:name","monday") DAY_MONDAY;
%feature("modula3:enumitem:conv","int:int") DAY_MONDAY;
%feature("modula3:enumitem:enum","Month") MTHB_JANUARY;
%feature("modula3:enumitem:name","january") MTHB_JANUARY;
%feature("modula3:enumitem:conv","set:int") MTHB_JANUARY;
//%feature("modula3:constset:type","MonthSet") MTHB_JANUARY; /*type in the constant definition*/
%feature("modula3:constset:set", "MonthSet") MTHB_JANUARY; /*remarks that the 'type' is a set type*/
%feature("modula3:constset:base","Month") MTHB_JANUARY;
%feature("modula3:constset:name","monthsJanuary") MTHB_JANUARY;
%feature("modula3:constset:conv","set:set") MTHB_JANUARY; /*conversion of the bit pattern: no change*/
%feature("modula3:enumitem:enum","Color") BLUE;
%feature("modula3:enumitem:name","blue") BLUE;
%feature("modula3:enumitem:conv","int:int") BLUE;
%feature("modula3:constint:type","INTEGER") Foo::IMPULSE;
%feature("modula3:constint:name","impulse") Foo::IMPULSE;
%feature("modula3:constint:conv","int:int") Foo::IMPULSE;
#endif
%rename(pi) PI;
%pragma(modula3) enumitem="prefix=DAY_;int;srcstyle=underscore;Day";
%pragma(modula3) enumitem="enum=color;int;srcstyle=underscore;Color";
%pragma(modula3) makesetofenum="Color";
%pragma(modula3) constset="prefix=CLB_;set;srcstyle=underscore,prefix=clb;ColorSet,Color";
%pragma(modula3) enumitem="prefix=MTHB_,enum=calendar;set;srcstyle=underscore;Month";
%pragma(modula3) makesetofenum="Month";
%pragma(modula3) constset="prefix=MTHB_,enum=calendar;set;srcstyle=underscore,prefix=monthset;MonthSet,Month";
%pragma(modula3) constint="prefix=Answer::Foo::,enum=Answer::Foo::speed;int;srcstyle=underscore,prefix=speed;INTEGER";
%pragma(modula3) constint="prefix=Answer::,enum=Answer::;int;srcstyle=underscore,prefix=answer;CARDINAL";
%rename(AnswerFoo) Answer::Foo;
%typemap("m3rawrettype") Answer::Foo * %{AnswerFoo%}
%typemap("m3rawintype") Answer::Foo * %{AnswerFoo%}
%typemap("m3rawinmode") Answer::Foo * %{%}
%typemap("m3wraprettype") Answer::Foo * %{AnswerFoo%}
%typemap("m3wrapintype") Answer::Foo * %{AnswerFoo%}
%typemap("m3wrapinmode") Answer::Foo * %{%}
%typemap("m3wrapargraw") Answer::Foo * %{self.cxxObj%}
%typemap("m3wrapretvar") Answer::Foo * %{cxxObj : ExampleRaw.AnswerFoo;%}
%typemap("m3wrapretraw") Answer::Foo * %{cxxObj%}
%typemap("m3wrapretconv") Answer::Foo * %{NEW(AnswerFoo,cxxObj:=cxxObj)%}
%typemap("m3rawintype") Answer::Foo::speed %{C.int%};
%typemap("m3rawintype:import") Answer::Foo::speed %{Ctypes AS C%};
%typemap("m3wrapintype") Answer::Foo::speed %{[-2..3]%};
%typemap("m3wrapintype") color %{Color%};
%typemap("m3wrapargraw") color %{ORD($1_name)%};
/* Let's just grab the original header file here */
%include "example.h"

View file

@ -0,0 +1,17 @@
*.class
*.java
*_wrap.*
*.i3
*.m3
m3makefile
src
LINUXLIBC6
*.dll
*.dsw
*.exp
*.lib
*.ncb
*.opt
*.plg
Release
Debug

View file

@ -0,0 +1,23 @@
TOP = ../..
SWIG = $(TOP)/../swig
CXXSRCS = example.cxx
TARGET = example
INTERFACE = example.i
SWIGOPT =
MODULA3SRCS = *.[im]3
MODULA3FLAGS= -o runme
all:: modula3
modula3::
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' modula3_cpp
# $(MAKE) -f $(TOP)/Makefile MODULA3SRCS='$(MODULA3SRCS)' MODULA3FLAGS='$(MODULA3FLAGS)' modula3_compile
m3ppinplace $(MODULA3SRCS)
mv m3makefile $(MODULA3SRCS) src/
cm3
clean::
$(MAKE) -f $(TOP)/Makefile modula3_clean
check: all

View file

@ -0,0 +1,18 @@
/* File : example.h */
enum error {OK, OVERFLOW, DIVISION_BY_ZERO, NEGATIVE_RADICAND, NEGATIVE_BASE};
typedef error errorstate; /* just to separate the typemaps */
error acc_add (double &x, double y);
error acc_sub (double &x, double y);
error acc_mul (double &x, double y);
error acc_div (double &x, double y);
double op_add (double x, double y, errorstate &err);
double op_sub (double x, double y, errorstate &err);
double op_mul (double x, double y, errorstate &err);
double op_div (double x, double y, errorstate &err);
double op_sqrt (double x, errorstate &err);
double op_pow (double x, double y, errorstate &err);
double op_noexc (double x, double y);

View file

@ -0,0 +1,43 @@
/* File : example.i */
%module Example
%{
#include "example.h"
%}
%insert(m3wrapintf) %{
EXCEPTION E(Error);
%}
%insert(m3wrapimpl) %{
IMPORT Ctypes AS C;
%}
%pragma(modula3) enumitem="enum=error;int;srcstyle=underscore;Error";
%typemap("m3rawintype") double & %{C.double%};
%typemap("m3wrapintype") double & %{LONGREAL%};
%typemap("m3wraprettype") error ""
%typemap("m3wrapretvar") error "rawerr: C.int;"
%typemap("m3wrapretraw") error "rawerr"
%typemap("m3wrapretcheck:throws") error "E"
%typemap("m3wrapretcheck") error
%{VAR err := VAL(rawerr, Error);
BEGIN
IF err # Error.ok THEN
RAISE E(err);
END;
END;%}
%typemap("m3rawintype") errorstate & %{C.int%};
%typemap("m3wrapintype",numinputs=0) errorstate & %{%};
%typemap("m3wrapargvar") errorstate & %{err:C.int:=ORD(Error.ok);%};
%typemap("m3wrapoutcheck:throws") errorstate & "E";
%typemap("m3wrapoutcheck") errorstate &
%{IF VAL(err,Error) # Error.ok THEN
RAISE E(VAL(err,Error));
END;%}
/* Let's just grab the original header file here */
%include "example.h"

View file

@ -0,0 +1,15 @@
*.class
*.java
*_wrap.*
*.i3
*.m3
*.dll
*.dsw
*.exp
*.lib
*.ncb
*.opt
*.plg
src
Release
Debug

View file

@ -0,0 +1,21 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS =
TARGET = example
INTERFACE = example.i
SWIGOPT = -c++
MODULA3SRCS = *.[im]3
all:: modula3
modula3::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' modula3
m3ppinplace $(MODULA3SRCS)
mv m3makefile $(MODULA3SRCS) src/
cm3
clean::
$(MAKE) -f $(TOP)/Makefile modula3_clean
check: all

View file

@ -0,0 +1,41 @@
/* File : example.cxx */
#include "example.h"
#include <stdio.h>
#include <stdlib.h>
Vector operator+(const Vector &a, const Vector &b) {
Vector r;
r.x = a.x + b.x;
r.y = a.y + b.y;
r.z = a.z + b.z;
return r;
}
char *Vector::print() {
static char temp[512];
sprintf(temp,"Vector %x (%g,%g,%g)", (int)this, x,y,z);
return temp;
}
VectorArray::VectorArray(int size) {
items = new Vector[size];
maxsize = size;
}
VectorArray::~VectorArray() {
delete [] items;
}
Vector &VectorArray::operator[](int index) {
if ((index < 0) || (index >= maxsize)) {
printf("Panic! Array index out of bounds.\n");
exit(1);
}
return items[index];
}
int VectorArray::size() {
return maxsize;
}

View file

@ -0,0 +1,22 @@
/* File : example.h */
struct Vector {
private:
double x,y,z;
public:
Vector() : x(0), y(0), z(0) { };
Vector(double x, double y, double z) : x(x), y(y), z(z) { };
Vector operator+(const Vector &b) const;
char *print();
};
struct VectorArray {
private:
Vector *items;
int maxsize;
public:
VectorArray(int maxsize);
~VectorArray();
Vector &operator[](int);
int size();
};

View file

@ -0,0 +1,32 @@
/* File : example.i */
/* This file has a few "typical" uses of C++ references. */
%module Example
%{
#include "example.h"
%}
%pragma(modula3) unsafe="1";
%insert(m3wrapintf) %{FROM ExampleRaw IMPORT Vector, VectorArray;%}
%insert(m3wrapimpl) %{FROM ExampleRaw IMPORT Vector, VectorArray;%}
%typemap(m3wrapretvar) Vector %{vec: UNTRACED REF Vector;%}
%typemap(m3wrapretraw) Vector %{vec%}
%typemap(m3wrapretconv) Vector %{vec^%}
/* This helper function calls an overloaded operator */
%inline %{
Vector addv(const Vector &a, const Vector &b) {
return a+b;
}
%}
%rename(Vector_Clear) Vector::Vector();
%rename(Add) Vector::operator+;
%rename(GetItem) VectorArray::operator[];
%include "example.h"

View file

@ -0,0 +1,8 @@
*_wrap.c
*_wrap.xml
*.i3
*.m3
m3makefile
src
Release
Debug

View file

@ -0,0 +1,21 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS =
TARGET = example
INTERFACE = example.i
SWIGOPT =
MODULA3SRCS = *.[im]3
all:: modula3
modula3::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' modula3
m3ppinplace $(MODULA3SRCS)
mv m3makefile $(MODULA3SRCS) src/
cm3
clean::
$(MAKE) -f $(TOP)/Makefile modula3_clean
check: all

View file

@ -0,0 +1,18 @@
/* 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;
}

View file

@ -0,0 +1,5 @@
/* File : example.i */
%module Example
extern int gcd(int x, int y);
extern double Foo;

View file

@ -0,0 +1,17 @@
*.class
*.java
*_wrap.*
*.i3
*.m3
m3makefile
src
LINUXLIBC6
*.dll
*.dsw
*.exp
*.lib
*.ncb
*.opt
*.plg
Release
Debug

View file

@ -0,0 +1,21 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS =
TARGET = example
INTERFACE = example.i
SWIGOPT =
MODULA3SRCS = *.[im]3
all:: modula3
modula3::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' modula3
m3ppinplace $(MODULA3SRCS)
mv m3makefile $(MODULA3SRCS) src/
cm3
clean::
$(MAKE) -f $(TOP)/Makefile modula3_clean
check: all

View file

@ -0,0 +1,90 @@
/* File : example.i */
%module Example
%pragma(modula3) unsafe="true";
%insert(m3wrapintf) %{FROM ExampleRaw IMPORT Window, Point;
%}
%insert(m3wrapimpl) %{FROM ExampleRaw IMPORT Window, Point;
IMPORT M3toC;
IMPORT Ctypes AS C;
%}
/* Typemap applied to patterns of multiple arguments */
%typemap(m3rawinmode) (char *outstr) %{VAR%}
%typemap(m3rawintype) (char *outstr) %{CHAR%}
%typemap(m3wrapinmode) (char *outstr, int size) %{VAR%}
%typemap(m3wrapintype) (char *outstr, int size) %{ARRAY OF CHAR%}
%typemap(m3wrapargraw) (char *outstr, int size) %{$1_name[0], NUMBER($1_name)%}
%typemap(m3rawinmode) (const struct Window *) %{READONLY%}
%typemap(m3wrapinmode) (const struct Window *) %{READONLY%}
%typemap(m3rawintype) ( struct Window *) %{Window%}
%typemap(m3wrapintype) ( struct Window *) %{Window%}
%typemap(m3rawinmode) (const char *str []) %{READONLY%}
%typemap(m3wrapinmode) (const char *str []) %{READONLY%}
%typemap(m3rawintype) (const char *str []) %{(*ARRAY OF*) C.char_star%}
%typemap(m3wrapintype) (const char *str []) %{ARRAY OF TEXT%}
%typemap(m3wrapargvar) (const char *str []) %{$1: REF ARRAY OF C.char_star;%}
%typemap(m3wrapargraw) (const char *str []) %{$1[0]%}
%typemap(m3wrapinconv) (const char *str []) %{$1:= NEW(REF ARRAY OF C.char_star,NUMBER($1_name));
FOR i:=FIRST($1_name) TO LAST($1_name) DO
$1[i]:=M3toC.SharedTtoS($1_name[i]);
END;%}
%typemap(m3wrapfreearg) (const char *str [])
%{FOR i:=FIRST($1_name) TO LAST($1_name) DO
M3toC.FreeSharedS($1_name[i],$1[i]);
END;%}
%typemap(m3wraprettype) char * %{TEXT%}
%typemap(m3wrapretvar) char * %{result_string: C.char_star;%}
%typemap(m3wrapretraw) char * %{result_string%}
%typemap(m3wrapretconv) char * %{M3toC.CopyStoT(result_string)%}
struct Window {
char *label;
int left,top,width,height;
};
%typemap(m3wrapinname) (int x, int y) %{p%}
%typemap(m3wrapinmode) (int x, int y) %{READONLY%}
%typemap(m3wrapintype) (int x, int y) %{Point%}
%typemap(m3wrapargraw) (int x, int y) %{p.$1_name, p.$2_name%}
%typemap(m3wrapargraw) (int &x, int &y) %{p.$1_name, p.$2_name%}
%typemap(m3wrapintype) (int &x, int &y) %{Point%}
%typemap(m3wrapoutname) (int &x, int &y) %{p%}
%typemap(m3wrapouttype) (int &x, int &y) %{Point%}
%typemap(m3wrapargdir) (int &x, int &y) "out"
%typemap(m3wrapargvar) int &left, int &top, int &width, int &height "$1:C.int;"
%typemap(m3wrapargraw) int &left, int &top, int &width, int &height "$1"
%typemap(m3wrapoutconv) int &left, int &top, int &width, int &height "$1"
%typemap(m3wrapargdir) int &left, int &top "out"
%typemap(m3wrapouttype) int &width, int &height "CARDINAL"
%typemap(m3wrapargdir) int &width, int &height "out"
struct Point {
int x,y;
};
%m3multiretval get_box;
void set_label ( struct Window *win, const char *str, bool activate);
void set_multi_label ( struct Window *win, const char *str []);
void write_label (const struct Window *win, char *outstr, int size);
int get_label (const struct Window *win, char *outstr, int size);
char *get_label_ptr (const struct Window *win);
void move(struct Window *win, int x, int y);
int get_area(const struct Window *win);
void get_box(const struct Window *win, int &left, int &top, int &width, int &height);
void get_left(const struct Window *win, int &left);
void get_mouse(const struct Window *win, int &x, int &y);
int get_attached_data(const struct Window *win, const char *id);

699
Lib/modula3/modula3.swg Normal file
View file

@ -0,0 +1,699 @@
/* -----------------------------------------------------------------------------
* modula3.swg
*
* Modula3 typemaps
* ----------------------------------------------------------------------------- */
%include "modula3head.swg"
/* The ctype, m3rawtype and m3wraptype typemaps work together and so there should be one of each.
* The ctype typemap contains the C type used in the signature of C wrappers for C++ functions.
* The m3rawtype typemap contains the M3 type used in the raw interface.
* The m3rawintype typemap contains the M3 type used as function argument.
* The m3rawrettype typemap contains the M3 type used as return value.
* The m3wraptype typemap contains the M3 type used in the M3 type wrapper classes and module class. */
/* Primitive types */
%typemap(ctype) bool, const bool & "bool"
%typemap(ctype) char, const char & "char"
%typemap(ctype) signed char, const signed char & "signed char"
%typemap(ctype) unsigned char, const unsigned char & "unsigned short"
%typemap(ctype) short, const short & "short"
%typemap(ctype) unsigned short, const unsigned short & "unsigned short"
%typemap(ctype) int, const int & "int"
%typemap(ctype) unsigned int, const unsigned int & "unsigned int"
%typemap(ctype) long, const long & "long"
%typemap(ctype) unsigned long, const unsigned long & "unsigned long"
%typemap(ctype) long long, const long long & "long long"
%typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long"
%typemap(ctype) float, const float & "float"
%typemap(ctype) double, const double & "double"
%typemap(ctype) char * "char *"
%typemap(ctype) void "void"
%typemap(m3rawtype) bool, const bool & "BOOLEAN"
%typemap(m3rawtype) char, const char & "C.char"
%typemap(m3rawtype) signed char, const signed char & "C.signed_char"
%typemap(m3rawtype) unsigned char, const unsigned char & "C.unsigned_char"
%typemap(m3rawtype) short, const short & "C.short"
%typemap(m3rawtype) unsigned short, const unsigned short & "C.unsigned_short"
%typemap(m3rawtype) int, const int & "C.int"
%typemap(m3rawtype) unsigned int, const unsigned int & "C.unsigned_int"
%typemap(m3rawtype) long, const long & "C.long"
%typemap(m3rawtype) unsigned long, const unsigned long & "C.unsigned_long"
%typemap(m3rawtype) long long, const long long & "C.long_long"
%typemap(m3rawtype) unsigned long long, const unsigned long long & "C.unsigned_long_long"
%typemap(m3rawtype) float, const float & "C.float"
%typemap(m3rawtype) double, const double & "C.double"
%typemap(m3rawtype) long double, const long double & "C.long_double"
%typemap(m3rawtype) char * "C.char_star"
%typemap(m3rawtype) void ""
%typemap(m3rawintype) bool *, bool &, bool "BOOLEAN"
%typemap(m3rawintype) char *, char &, char "C.char"
%typemap(m3rawintype) signed char *, signed char &, signed char "C.signed_char"
%typemap(m3rawintype) unsigned char *, unsigned char &, unsigned char "C.unsigned_char"
%typemap(m3rawintype) short *, short &, short "C.short"
%typemap(m3rawintype) unsigned short *, unsigned short &, unsigned short "C.unsigned_short"
%typemap(m3rawintype) int *, int &, int "C.int"
%typemap(m3rawintype) unsigned int *, unsigned int &, unsigned int "C.unsigned_int"
%typemap(m3rawintype) long *, long &, long "C.long"
%typemap(m3rawintype) unsigned long *, unsigned long &, unsigned long "C.unsigned_long"
%typemap(m3rawintype) long long *, long long &, long long "C.long_long"
%typemap(m3rawintype) unsigned long long *, unsigned long long &, unsigned long long "C.unsigned_long_long"
%typemap(m3rawintype) float *, float &, float "C.float"
%typemap(m3rawintype) double *, double &, double "C.double"
%typemap(m3rawintype) long double *, long double &, long double "C.long_double"
%typemap(m3rawintype) char * "C.char_star"
%typemap(m3rawintype) void ""
%typemap(m3rawinmode) char * ""
%typemap(m3rawrettype) bool, const bool & "BOOLEAN"
%typemap(m3rawrettype) char, const char & "C.char"
%typemap(m3rawrettype) signed char, const signed char & "C.signed_char"
%typemap(m3rawrettype) unsigned char, const unsigned char & "C.unsigned_char"
%typemap(m3rawrettype) short, const short & "C.short"
%typemap(m3rawrettype) unsigned short, const unsigned short & "C.unsigned_short"
%typemap(m3rawrettype) int, const int & "C.int"
%typemap(m3rawrettype) unsigned int, const unsigned int & "C.unsigned_int"
%typemap(m3rawrettype) long, const long & "C.long"
%typemap(m3rawrettype) unsigned long, const unsigned long & "C.unsigned_long"
%typemap(m3rawrettype) long long, const long long & "C.long_long"
%typemap(m3rawrettype) unsigned long long, const unsigned long long & "C.unsigned_long_long"
%typemap(m3rawrettype) float, const float & "C.float"
%typemap(m3rawrettype) double, const double & "C.double"
%typemap(m3rawrettype) long double, const long double & "C.long_double"
%typemap(m3rawrettype) char * "C.char_star"
%typemap(m3rawrettype) void ""
%typemap("m3rawtype:import")
char, const char &,
signed char, const signed char &,
unsigned char, const unsigned char &,
short, const short &,
unsigned short, const unsigned short &,
int, const int &,
unsigned int, const unsigned int &,
long, const long &,
unsigned long, const unsigned long &,
long long, const long long &,
unsigned long long, const unsigned long long &,
float, const float &,
double, const double &,
long double, const long double &,
char *
"Ctypes AS C"
%typemap("m3rawintype:import")
char, const char &,
signed char, const signed char &,
unsigned char, const unsigned char &,
short, const short &,
unsigned short, const unsigned short &,
int, const int &,
unsigned int, const unsigned int &,
long, const long &,
unsigned long, const unsigned long &,
long long, const long long &,
unsigned long long, const unsigned long long &,
float, const float &,
double, const double &,
long double, const long double &,
char *
"Ctypes AS C"
%typemap("m3rawrettype:import")
char, const char &,
signed char, const signed char &,
unsigned char, const unsigned char &,
short, const short &,
unsigned short, const unsigned short &,
int, const int &,
unsigned int, const unsigned int &,
long, const long &,
unsigned long, const unsigned long &,
long long, const long long &,
unsigned long long, const unsigned long long &,
float, const float &,
double, const double &,
long double, const long double &,
char *
"Ctypes AS C"
%typemap(m3wraptype) bool, const bool & "BOOLEAN"
%typemap(m3wraptype) char, const char & "CHAR"
%typemap(m3wraptype) signed char, const signed char & "CHAR"
%typemap(m3wraptype) unsigned char, const unsigned char & "CHAR"
%typemap(m3wraptype) short, const short & "Integer16.T"
%typemap(m3wraptype) unsigned short, const unsigned short & "Cardinal16.T"
%typemap(m3wraptype) int, const int & "INTEGER"
%typemap(m3wraptype) unsigned int, const unsigned int & "CARDINAL"
%typemap(m3wraptype) long, const long & "Integer32.T"
%typemap(m3wraptype) unsigned long, const unsigned long & "Cardinal32.T"
%typemap(m3wraptype) long long, const long long & "Integer64.T"
%typemap(m3wraptype) unsigned long long, const unsigned long long & "Cardinal64.T"
%typemap(m3wraptype) float, const float & "REAL"
%typemap(m3wraptype) double, const double & "LONGREAL"
%typemap(m3wraptype) long double, const long double & "EXTENDED"
%typemap(m3wraptype) char * "TEXT"
%typemap(m3wraptype) void ""
%typemap(m3wrapintype) bool, const bool *, const bool & "BOOLEAN"
%typemap(m3wrapintype) char, const char *, const char & "CHAR"
%typemap(m3wrapintype) signed char, const signed char *, const signed char & "CHAR"
%typemap(m3wrapintype) unsigned char, const unsigned char *, const unsigned char & "CHAR"
%typemap(m3wrapintype) short, const short *, const short & "INTEGER"
%typemap(m3wrapintype) unsigned short, const unsigned short *, const unsigned short & "CARDINAL"
%typemap(m3wrapintype) int, const int *, const int & "INTEGER"
%typemap(m3wrapintype) unsigned int, const unsigned int *, const unsigned int & "CARDINAL"
%typemap(m3wrapintype) long, const long *, const long & "INTEGER"
%typemap(m3wrapintype) unsigned long, const unsigned long *, const unsigned long & "CARDINAL"
%typemap(m3wrapintype) long long, const long long *, const long long & "INTEGER"
%typemap(m3wrapintype) unsigned long long, const unsigned long long *, const unsigned long long & "CARDINAL"
%typemap(m3wrapintype) float, const float *, const float & "REAL"
%typemap(m3wrapintype) double, const double *, const double & "LONGREAL"
%typemap(m3wrapintype) long double, const long double *, const long double & "EXTENDED"
%typemap(m3wrapintype) const char *, const char [] "TEXT"
%typemap(m3wrapintype,numinputs=0) void ""
%typemap(m3wrapouttype) bool, bool *, bool & "BOOLEAN"
%typemap(m3wrapouttype) char, char *, char & "CHAR"
%typemap(m3wrapouttype) signed char, signed char *, signed char & "CHAR"
%typemap(m3wrapouttype) unsigned char, unsigned char *, unsigned char & "CHAR"
%typemap(m3wrapouttype) short, short *, short & "INTEGER"
%typemap(m3wrapouttype) unsigned short, unsigned short *, unsigned short & "CARDINAL"
%typemap(m3wrapouttype) int, int *, int & "INTEGER"
%typemap(m3wrapouttype) unsigned int, unsigned int *, unsigned int & "CARDINAL"
%typemap(m3wrapouttype) long, long *, long & "INTEGER"
%typemap(m3wrapouttype) unsigned long, unsigned long *, unsigned long & "CARDINAL"
%typemap(m3wrapouttype) long long, long long *, long long & "INTEGER"
%typemap(m3wrapouttype) unsigned long long, unsigned long long *, unsigned long long & "CARDINAL"
%typemap(m3wrapouttype) float, float *, float & "REAL"
%typemap(m3wrapouttype) double, double *, double & "LONGREAL"
%typemap(m3wrapouttype) long double, long double *, long double & "EXTENDED"
%typemap(m3wrapouttype) char *, char [] "TEXT"
%typemap(m3wrapouttype,numinputs=0) void ""
%typemap(m3wraprettype) bool, const bool & "BOOLEAN"
%typemap(m3wraprettype) char, const char & "CHAR"
%typemap(m3wraprettype) signed char, const signed char & "CHAR"
%typemap(m3wraprettype) unsigned char, const unsigned char & "CHAR"
%typemap(m3wraprettype) short, const short & "INTEGER"
%typemap(m3wraprettype) unsigned short, const unsigned short & "CARDINAL"
%typemap(m3wraprettype) int, const int & "INTEGER"
%typemap(m3wraprettype) unsigned int, const unsigned int & "CARDINAL"
%typemap(m3wraprettype) long, const long & "INTEGER"
%typemap(m3wraprettype) unsigned long, const unsigned long & "CARDINAL"
%typemap(m3wraprettype) long long, const long long & "INTEGER"
%typemap(m3wraprettype) unsigned long long, const unsigned long long & "CARDINAL"
%typemap(m3wraprettype) float, const float & "REAL"
%typemap(m3wraprettype) double, const double & "LONGREAL"
%typemap(m3wraprettype) long double, const long double & "EXTENDED"
%typemap(m3wraprettype) char * "TEXT"
%typemap(m3wraprettype) void ""
%typemap(ctype) char[ANY] "char *"
%typemap(m3rawtype) char[ANY] "C.char_star"
%typemap(m3rawintype) char[ANY] "C.char_star"
%typemap(m3rawrettype) char[ANY] "C.char_star"
%typemap(m3wraptype) char[ANY] "TEXT"
%typemap(m3wrapintype) char[ANY] "TEXT"
%typemap(m3wrapouttype) char[ANY] "TEXT"
%typemap(m3wraprettype) char[ANY] "TEXT"
%typemap(m3wrapinmode) const char * %{%}
%typemap(m3wrapargvar) const char * %{$1 : C.char_star;%}
%typemap(m3wrapinconv) const char * %{$1 := M3toC.SharedTtoS($1_name);%}
%typemap(m3wrapfreearg) const char * %{M3toC.FreeSharedS($1_name,$1);%}
%typemap(m3wrapargraw) const char * %{$1%}
%typemap("m3wrapargvar:import") const char * "Ctypes AS C"
%typemap("m3wrapinconv:import") const char * "M3toC"
%typemap("m3wrapfreearg:import") const char * "M3toC"
%typemap(m3wrapretvar) char * %{result : C.char_star;%}
%typemap(m3wrapretraw) char * %{result%}
%typemap(m3wrapretconv) char * %{M3toC.CopyStoT(result)%}
%typemap("m3wrapretvar:import") char * "Ctypes AS C"
%typemap("m3wrapretconv:import") char * "M3toC"
/* Composed types */
%typemap(ctype) SWIGTYPE "$1_type"
%typemap(m3rawtype) SWIGTYPE "$1_basetype"
%typemap(m3rawrettype) SWIGTYPE "UNTRACED REF $1_basetype"
%typemap(m3wraptype) SWIGTYPE "$1_basetype"
%typemap(m3wrapintype) SWIGTYPE "$1_basetype"
%typemap(m3wrapouttype) SWIGTYPE "$1_basetype"
%typemap(m3wraprettype) SWIGTYPE "$1_basetype"
%typemap(ctype) SWIGTYPE [] "$1_type"
%typemap(m3rawtype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype"
%typemap(m3rawtype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype"
%typemap(m3rawintype) const SWIGTYPE [] "(*ARRAY OF*) $1_basetype"
%typemap(m3rawinmode) const SWIGTYPE [] "READONLY"
%typemap(m3rawintype) SWIGTYPE [] "(*ARRAY OF*) $1_basetype"
%typemap(m3rawinmode) SWIGTYPE [] "VAR"
%typemap(m3rawrettype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype"
%typemap(m3rawrettype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype"
%typemap(m3wraptype) SWIGTYPE [] "$1_basetype"
%typemap(m3wrapintype) const SWIGTYPE [] "ARRAY OF $1_basetype"
%typemap(m3wrapinmode) const SWIGTYPE [] "READONLY"
%typemap(m3wrapintype) SWIGTYPE [] "ARRAY OF $1_basetype"
%typemap(m3wrapinmode) SWIGTYPE [] "VAR"
%typemap(m3wrapouttype) SWIGTYPE [] "ARRAY OF $1_basetype"
%typemap(m3wraprettype) SWIGTYPE [] "REF ARRAY OF $1_basetype"
%typemap(ctype) SWIGTYPE * "$1_type"
%typemap(m3rawtype) const SWIGTYPE * "UNTRACED REF $1_basetype"
%typemap(m3rawtype) SWIGTYPE * "UNTRACED REF $1_basetype"
%typemap(m3rawintype) const SWIGTYPE * "$1_basetype"
%typemap(m3rawinmode) const SWIGTYPE * "READONLY"
%typemap(m3rawintype) SWIGTYPE * "$1_basetype"
%typemap(m3rawinmode) SWIGTYPE * "VAR"
%typemap(m3rawrettype) const SWIGTYPE * "UNTRACED REF $1_basetype"
%typemap(m3rawrettype) SWIGTYPE * "UNTRACED REF $1_basetype"
%typemap(m3wraptype) SWIGTYPE * "$1_basetype"
%typemap(m3wrapintype) const SWIGTYPE * "$1_basetype"
%typemap(m3wrapinmode) const SWIGTYPE * "READONLY"
%typemap(m3wrapintype) SWIGTYPE * "$1_basetype"
%typemap(m3wrapinmode) SWIGTYPE * "VAR"
%typemap(m3wrapouttype) SWIGTYPE * "$1_basetype"
%typemap(m3wraprettype) SWIGTYPE * "UNTRACED REF $1_basetype"
%typemap(ctype) SWIGTYPE & "$1_type"
%typemap(m3rawtype) const SWIGTYPE & "UNTRACED REF $1_basetype"
%typemap(m3rawtype) SWIGTYPE & "UNTRACED REF $1_basetype"
%typemap(m3rawintype) const SWIGTYPE & "$1_basetype"
%typemap(m3rawinmode) const SWIGTYPE & "READONLY"
%typemap(m3rawintype) SWIGTYPE & "$1_basetype"
%typemap(m3rawinmode) SWIGTYPE & "VAR"
%typemap(m3rawrettype) const SWIGTYPE & "UNTRACED REF $1_basetype"
%typemap(m3rawrettype) SWIGTYPE & "UNTRACED REF $1_basetype"
%typemap(m3wraptype) SWIGTYPE & "$1_basetype"
%typemap(m3wrapintype) const SWIGTYPE & "$1_basetype"
%typemap(m3wrapinmode) const SWIGTYPE & "READONLY"
%typemap(m3wrapintype) SWIGTYPE & "$1_basetype"
%typemap(m3wrapinmode) SWIGTYPE & "VAR"
%typemap(m3wrapouttype) SWIGTYPE & "$1_basetype"
%typemap(m3wraprettype) SWIGTYPE & "UNTRACED REF $1_basetype"
%typemap(ctype) enum SWIGTYPE "$1_type"
%typemap(m3rawtype) enum SWIGTYPE "C.int"
%typemap(m3rawintype) enum SWIGTYPE "C.int (* $1_type *)"
%typemap(m3rawrettype) enum SWIGTYPE "C.int"
%typemap(m3wraptype) enum SWIGTYPE "$*1_type"
%typemap(m3wrapintype) enum SWIGTYPE "$1_type"
%typemap(m3wrapouttype) enum SWIGTYPE "$1_type"
%typemap(m3wraprettype) enum SWIGTYPE "$*1_type"
/* pointer to a class member */
%typemap(ctype) SWIGTYPE (CLASS::*) "$1_type"
%typemap(m3rawtype) SWIGTYPE (CLASS::*) "REFANY"
%typemap(m3wraptype) SWIGTYPE (CLASS::*) "$1_basetype"
/* The following are the in, out, freearg, argout typemaps.
These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */
/* primitive types */
%typemap(in) bool
%{ $1 = $input ? true : false; %}
%typemap(in) char,
signed char,
unsigned char,
short,
unsigned short,
int,
unsigned int,
long,
unsigned long,
long long,
unsigned long long,
float,
double,
enum SWIGTYPE
%{ $1 = ($1_ltype)$input; %}
%typemap(out) bool %{ $result = $1; %}
%typemap(out) char %{ $result = $1; %}
%typemap(out) signed char %{ $result = $1; %}
%typemap(out) unsigned char %{ $result = $1; %}
%typemap(out) short %{ $result = $1; %}
%typemap(out) unsigned short %{ $result = $1; %}
%typemap(out) int %{ $result = $1; %}
%typemap(out) unsigned int %{ $result = $1; %}
%typemap(out) long %{ $result = $1; %}
%typemap(out) unsigned long %{ $result = $1; %}
%typemap(out) long long %{ $result = $1; %}
%typemap(out) unsigned long long %{ $result = $1; %}
%typemap(out) float %{ $result = $1; %}
%typemap(out) double %{ $result = $1; %}
%typemap(out) enum SWIGTYPE %{ $result = $1; %}
/* char * - treat as String */
%typemap(in) char * {
$1 = $input;
}
//%typemap(freearg) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); }
//%typemap(out) char * { if($1) $result = JCALL1(NewStringUTF, jenv, $1); }
%typemap(out) void ""
/* primitive types by const reference */
%typemap(in) const bool & (bool temp)
%{ temp = $input ? true : false;
$1 = &temp; %}
%typemap(in) const char & (char temp),
const signed char & (signed char temp),
const unsigned char & (unsigned char temp),
const short & (short temp),
const unsigned short & (unsigned short temp),
const int & (int temp),
const unsigned int & (unsigned int temp),
const long & (long temp),
const unsigned long & (unsigned long temp),
const long long & ($*1_ltype temp),
const unsigned long long & ($*1_ltype temp),
const float & (float temp),
const double & (double temp)
%{ temp = ($*1_ltype)$input;
$1 = &temp; %}
%typemap(out) const bool & %{ $result = *$1; %}
%typemap(out) const char & %{ $result = *$1; %}
%typemap(out) const signed char & %{ $result = *$1; %}
%typemap(out) const unsigned char & %{ $result = *$1; %}
%typemap(out) const short & %{ $result = *$1; %}
%typemap(out) const unsigned short & %{ $result = *$1; %}
%typemap(out) const int & %{ $result = *$1; %}
%typemap(out) const unsigned int & %{ $result = *$1; %}
%typemap(out) const long & %{ $result = *$1; %}
%typemap(out) const unsigned long & %{ $result = *$1; %}
%typemap(out) const long long & %{ $result = *$1; %}
%typemap(out) const unsigned long long & %{ $result = *$1; %}
%typemap(out) const float & %{ $result = *$1; %}
%typemap(out) const double & %{ $result = *$1; %}
/* Default handling. Object passed by value. Convert to a pointer */
%typemap(in) SWIGTYPE ($&1_type argp)
%{ argp = *($&1_ltype*)&$input;
if (!argp) {
// SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type");
RETURN $null;
}
$1 = *argp; %}
%typemap(out) SWIGTYPE
#ifdef __cplusplus
%{*($&1_ltype*)&$result = new $1_ltype(($1_ltype &)$1); %}
#else
{
$&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype));
memmove($1ptr, &$1, sizeof($1_type));
*($&1_ltype*)&$result = $1ptr;
}
#endif
/* Generic pointers and references */
%typemap(in) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)&$input; %}
%typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input;
if(!$1) {
//SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null");
RETURN $null;
} %}
%typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE (CLASS::*) %{ *($&1_ltype)&$result = $1; %}
/* Default array handling */
%typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %}
%typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %}
/* char[ANY] - treat as String */
%typemap(in) char[ANY] {
$1 = $input;
}
%typemap(argout) char[ANY] ""
%typemap(freearg) char[ANY] ""//{ if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); }
%typemap(out) char[ANY] { if($1) $result = $1; }
/* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions
* that cannot be overloaded in C# as more than one C++ type maps to a single C# type */
%typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */
bool,
const bool &
""
%typecheck(SWIG_TYPECHECK_CHAR) /* Java char */
char,
const char &
""
%typecheck(SWIG_TYPECHECK_INT8) /* Java byte */
signed char,
const signed char &
""
%typecheck(SWIG_TYPECHECK_INT16) /* Java short */
unsigned char,
short,
const unsigned char &,
const short &
""
%typecheck(SWIG_TYPECHECK_INT32) /* Java int */
unsigned short,
int,
long,
const unsigned short &,
const int &,
const long &,
enum SWIGTYPE
""
%typecheck(SWIG_TYPECHECK_INT64) /* Java long */
unsigned int,
unsigned long,
long long,
const unsigned int &,
const unsigned long &,
const long long &
""
%typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */
unsigned long long
""
%typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */
float,
const float &
""
%typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */
double,
const double &
""
%typecheck(SWIG_TYPECHECK_STRING) /* Java String */
char *,
char[ANY]
""
%typecheck(SWIG_TYPECHECK_POINTER) /* Default */
SWIGTYPE,
SWIGTYPE *,
SWIGTYPE &,
SWIGTYPE [],
SWIGTYPE (CLASS::*)
""
/* Exception handling */
%typemap(throws) int,
long,
short,
unsigned int,
unsigned long,
unsigned short {
char error_msg[256];
sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1);
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg);
RETURN $null;
}
%typemap(throws) SWIGTYPE {
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown");
RETURN $null;
}
%typemap(throws) char * {
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1);
RETURN $null;
}
/* Typemaps for code generation in proxy classes and C# type wrapper classes */
/* The in typemap is used for converting function parameter types from the type
* used in the proxy, module or type wrapper class to the type used in the PInvoke class. */
%typemap(m3in) bool, const bool &,
char, const char &,
signed char, const signed char &,
unsigned char, const unsigned char &,
short, const short &,
unsigned short, const unsigned short &,
int, const int &,
unsigned int, const unsigned int &,
long, const long &,
unsigned long, const unsigned long &,
long long, const long long &,
unsigned long long, const unsigned long long &,
float, const float &,
double, const double &,
char *,
char[ANY],
enum SWIGTYPE
"$input"
%typemap(m3in) SWIGTYPE "$&*1_type.getCPtr($input)"
%typemap(m3in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "$1_basetype.getCPtr($input)"
/* The m3out typemap is used for converting function return types from the return type
* used in the PInvoke class to the type returned by the proxy, module or type wrapper class. */
%typemap(m3out) bool, const bool &,
char, const char &,
signed char, const signed char &,
unsigned char, const unsigned char &,
short, const short &,
unsigned short, const unsigned short &,
int, const int &,
unsigned int, const unsigned int &,
long, const long &,
unsigned long, const unsigned long &,
long long, const long long &,
unsigned long long, const unsigned long long &,
float, const float &,
double, const double &,
char *,
char[ANY],
enum SWIGTYPE
%{$imcall%}
%typemap(m3out) void %{$imcall%}
%typemap(m3out) SWIGTYPE %{
RETURN NEW(REF $1_basetype, $imcall);
%}
%typemap(m3out) SWIGTYPE & %{
RETURN NEW($1_basetype, $imcall, $owner);
%}
%typemap(m3out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
cPtr := $imcall;
RETURN (cPtr = IntPtr.Zero) ? null : NEW($1_basetype, cPtr, $owner);
%}
/* Properties */
%typemap(m3varin) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
PROCEDURE Set$var (value: $vartype) =
BEGIN
$imcall;
END Set$var;
%}
%typemap(m3varout) bool, const bool &,
char, const char &,
signed char, const signed char &,
unsigned char, const unsigned char &,
short, const short &,
unsigned short, const unsigned short &,
int, const int &,
unsigned int, const unsigned int &,
long, const long &,
unsigned long, const unsigned long &,
long long, const long long &,
unsigned long long, const unsigned long long &,
float, const float &,
double, const double &,
char *,
char[ANY],
enum SWIGTYPE %{
PROCEDURE Get$var (): $vartype =
BEGIN
RETURN $imcall;
END Get$var;
%}
%typemap(m3varout) void %{
get {
$imcall;
} %}
%typemap(m3varout) SWIGTYPE %{
get {
RETURN new $&*1_mangle($imcall, true);
} %}
%typemap(m3varout) SWIGTYPE & %{
get {
RETURN new $1_basetype($imcall, $owner);
} %}
%typemap(m3varout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
get {
IntPtr cPtr = $imcall;
RETURN (cPtr == IntPtr.Zero) ? null : new $1_basetype(cPtr, $owner);
} %}
/* Typemaps used for the generation of proxy and type wrapper class code */
%typemap(m3base) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) ""
%typemap(m3classmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "public"
%typemap(m3code) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) ""
%typemap(m3imports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "using System;"
%typemap(m3interfaces) SWIGTYPE "IDisposable"
%typemap(m3interfaces_derived) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) ""
%typemap(m3ptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "internal"
%typemap(m3finalize) SWIGTYPE %{
~$1_basetype() {
Dispose();
}
%}
%typemap(m3destruct, methodname="Dispose") SWIGTYPE {
if(swigCPtr != IntPtr.Zero && swigCMemOwn) {
$imcall;
swigCMemOwn = false;
}
swigCPtr = IntPtr.Zero;
GC.SuppressFinalize(this);
}
%typemap(m3destruct_derived, methodname="Dispose") SWIGTYPE {
if(swigCPtr != IntPtr.Zero && swigCMemOwn) {
$imcall;
swigCMemOwn = false;
}
swigCPtr = IntPtr.Zero;
GC.SuppressFinalize(this);
base.Dispose();
}
%typemap(m3getcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
internal static IntPtr getCPtr($1_basetype obj) {
RETURN (obj == null) ? IntPtr.Zero : obj.swigCPtr;
}
%}
/* M3 specific directives */
#define %m3multiretval %feature("modula3:multiretval")
#define %constnumeric(num) %feature("constnumeric","num")
%pragma(modula3) moduleimports=%{
IMPORT BlaBla;
%}
%pragma(modula3) imclassimports=%{
FROM BlaBla IMPORT Bla;
%}
/* Some ANSI C typemaps */
%apply long { size_t };

View file

@ -0,0 +1,69 @@
/* -----------------------------------------------------------------------------
* modula3head.swg
*
* Modula3 support code
* ----------------------------------------------------------------------------- */
%insert(runtime) %{
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifdef WIN32
# define DllExport __declspec( dllexport )
#else
# define DllExport
#endif
%}
#if 0
%insert(runtime) %{
/* Support for throwing Modula3 exceptions */
typedef enum {
SWIG_JavaOutOfMemoryError = 1,
SWIG_JavaIOException,
SWIG_JavaRuntimeException,
SWIG_JavaIndexOutOfBoundsException,
SWIG_JavaArithmeticException,
SWIG_JavaIllegalArgumentException,
SWIG_JavaNullPointerException,
SWIG_JavaUnknownError
} SWIG_JavaExceptionCodes;
typedef struct {
SWIG_JavaExceptionCodes code;
const char *java_exception;
} SWIG_JavaExceptions_t;
#if defined(SWIG_NOINCLUDE)
void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg);
#else
%}
%insert(runtime) {
void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) {
jclass excep;
static const SWIG_JavaExceptions_t java_exceptions[] = {
{ SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" },
{ SWIG_JavaIOException, "java/io/IOException" },
{ SWIG_JavaRuntimeException, "java/lang/RuntimeException" },
{ SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" },
{ SWIG_JavaArithmeticException, "java/lang/ArithmeticException" },
{ SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" },
{ SWIG_JavaNullPointerException, "java/lang/NullPointerException" },
{ SWIG_JavaUnknownError, "java/lang/UnknownError" },
{ (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } };
const SWIG_JavaExceptions_t *except_ptr = java_exceptions;
while (except_ptr->code != code && except_ptr->code)
except_ptr++;
JCALL0(ExceptionClear, jenv);
excep = JCALL1(FindClass, jenv, except_ptr->java_exception);
if (excep)
JCALL2(ThrowNew, jenv, excep, msg);
}
}
%insert(runtime) %{
#endif
%}
#endif

66
Lib/modula3/typemaps.i Normal file
View file

@ -0,0 +1,66 @@
/* These typemaps will eventually probably maybe make their way into named typemaps
* OUTPUT * and OUTPUT & as they currently break functions that return a pointer or
* reference. */
%typemap(ctype) bool *, bool & "bool *"
%typemap(ctype) char & "char *"
%typemap(ctype) signed char *, signed char & "signed char *"
%typemap(ctype) unsigned char *, unsigned char & "unsigned short *"
%typemap(ctype) short *, short & "short *"
%typemap(ctype) unsigned short *, unsigned short & "unsigned short *"
%typemap(ctype) int *, int & "int *"
%typemap(ctype) unsigned int *, unsigned int & "unsigned int *"
%typemap(ctype) long *, long & "long *"
%typemap(ctype) unsigned long *, unsigned long & "unsigned long *"
%typemap(ctype) long long *, long long & "long long *"
%typemap(ctype) unsigned long long *, unsigned long long & "unsigned long long *"
%typemap(ctype) float *, float & "float *"
%typemap(ctype) double *, double & "double *"
%typemap(imtype) bool *, bool & "ref bool"
%typemap(imtype) char & "ref char"
%typemap(imtype) signed char *, signed char & "ref sbyte"
%typemap(imtype) unsigned char *, unsigned char & "ref byte"
%typemap(imtype) short *, short & "ref short"
%typemap(imtype) unsigned short *, unsigned short & "ref ushort"
%typemap(imtype) int *, int & "ref int"
%typemap(imtype) unsigned int *, unsigned int & "ref uint"
%typemap(imtype) long *, long & "ref int"
%typemap(imtype) unsigned long *, unsigned long & "ref uint"
%typemap(imtype) long long *, long long & "ref long"
%typemap(imtype) unsigned long long *, unsigned long long & "ref ulong"
%typemap(imtype) float *, float & "ref float"
%typemap(imtype) double *, double & "ref double"
%typemap(cstype) bool *, bool & "ref bool"
%typemap(cstype) char & "ref char"
%typemap(cstype) signed char *, signed char & "ref sbyte"
%typemap(cstype) unsigned char *, unsigned char & "ref byte"
%typemap(cstype) short *, short & "ref short"
%typemap(cstype) unsigned short *, unsigned short & "ref ushort"
%typemap(cstype) int *, int & "ref int"
%typemap(cstype) unsigned int *, unsigned int & "ref uint"
%typemap(cstype) long *, long & "ref int"
%typemap(cstype) unsigned long *, unsigned long & "ref uint"
%typemap(cstype) long long *, long long & "ref long"
%typemap(cstype) unsigned long long *, unsigned long long & "ref ulong"
%typemap(cstype) float *, float & "ref float"
%typemap(cstype) double *, double & "ref double"
%typemap(csin) bool *, bool &,
char &,
signed char *, signed char &,
unsigned char *, unsigned char &,
short *, short &,
unsigned short *, unsigned short &,
int *, int &,
unsigned int *, unsigned int &,
long *, long &,
unsigned long *, unsigned long &,
long long *, long long &,
unsigned long long *, unsigned long long &,
float *, float &,
double *, double &
"ref $csinput"

View file

@ -47,6 +47,7 @@ skip-ocaml = test -n "@SKIP_OCAML@"
skip-pike = test -n "@SKIP_PIKE@"
skip-chicken = test -n "@SKIP_CHICKEN@"
skip-csharp = test -n "@SKIP_CSHARP@"
skip-modula3 = test -n "@SKIP_MODULA3@"
#####################################################################
# CHECK
@ -78,6 +79,7 @@ check-aliveness:
@$(skip-pike) || ./$(TARGET) -pike -help
@$(skip-chicken) || ./$(TARGET) -chicken -help
@$(skip-csharp) || ./$(TARGET) -csharp -help
@$(skip-modula3) || ./$(TARGET) -modula3 -help
check-examples: \
check-tcl-examples \
@ -91,7 +93,8 @@ check-examples: \
check-php4-examples \
check-pike-examples \
check-chicken-examples \
check-csharp-examples
check-csharp-examples \
check-modula3-examples
check-%-examples:
@passed=true; \
@ -124,6 +127,7 @@ check-test-suite: \
check-php4-test-suite \
check-pike-test-suite \
check-csharp-test-suite \
check-modula3-test-suite \
# check-chicken-test-suite
check-%-test-suite:
@ -155,7 +159,8 @@ check-gifplot: \
check-php4-gifplot \
check-pike-gifplot \
check-chicken-gifplot \
# check-csharp-gifplot
# check-csharp-gifplot \
# check-modula3-gifplot
check-%-gifplot: gifplot-library
@passed=true; \
@ -194,6 +199,7 @@ all-test-suite: \
all-php4-test-suite \
all-pike-test-suite \
all-csharp-test-suite \
all-modula3-test-suite \
# all-chicken-test-suite
all-%-test-suite:
@ -216,6 +222,7 @@ broken-test-suite: \
broken-php4-test-suite \
broken-pike-test-suite \
broken-csharp-test-suite \
broken-modula3-test-suite \
# broken-chicken-test-suite
broken-%-test-suite:
@ -327,7 +334,7 @@ install-main:
@$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(BIN_DIR)/$(TARGET)
lib-languages = tcl perl5 python guile java mzscheme ruby php4 ocaml \
pike chicken csharp
pike chicken csharp modula3
install-lib:
@echo "Installing the SWIG library"

View file

@ -39,9 +39,7 @@ Mapping Operations (for hash table behavior)
Getattr(hash,key) Get an attribute
Setattr(hash,key,value) Set an attribute
Delattr(hash,key) Delete an attribute
Firstkey(hash) Get first key
Nextkey(hash) Get next key
First(hash) Get first object
First(hash) Get first object (iterator)
Next(hash) Get next object
GetInt(hash,key) Get attribute as an 'int'
SetInt(hash,key,ivalue) Set attribute as an 'int'

View file

@ -203,6 +203,20 @@
/* please leave 830-849 free for C# */
#define WARN_MODULA3_TYPEMAP_TYPE_UNDEF 850
#define WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851
#define WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852
#define WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853
#define WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854
#define WARN_MODULA3_MULTIPLE_INHERITANCE 855
#define WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856
#define WARN_MODULA3_UNKNOWN_PRAGMA 857
#define WARN_MODULA3_BAD_ENUMERATION 858
#define WARN_MODULA3_DOUBLE_ID 859
#define WARN_MODULA3_BAD_IMPORT 860
/* please leave 850-869 free for Modula 3 */
/* Feel free to claim any number in this space that's not currently being used. Just make sure you

View file

@ -46,6 +46,7 @@ eswig_SOURCES = CParse/cscanner.c \
Modules/java.cxx \
Modules/lang.cxx \
Modules/main.cxx \
Modules/modula3.cxx \
Modules/module.cxx \
Modules/mzscheme.cxx \
Modules/ocaml.cxx \

4184
Source/Modules/modula3.cxx Normal file

File diff suppressed because it is too large Load diff

View file

@ -36,6 +36,7 @@ extern "C" {
Language *swig_perl5(void);
Language *swig_ruby(void);
Language *swig_guile(void);
Language *swig_modula3(void);
Language *swig_mzscheme(void);
Language *swig_java(void);
Language *swig_php(void);
@ -62,6 +63,7 @@ swig_module modules[] = {
{"-csharp", swig_csharp, "C#"},
{"-guile", swig_guile, "Guile"},
{"-java", swig_java, "Java"},
{"-modula3", swig_modula3, "Modula 3"},
{"-mzscheme", swig_mzscheme, "Mzscheme"},
{"-ocaml", swig_ocaml, "Ocaml"},
{"-perl", swig_perl5, "Perl"},