New example

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@736 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-08-30 20:31:30 +00:00
commit 88c47f1f45
7 changed files with 82 additions and 22 deletions

View file

@ -16,6 +16,8 @@ The following examples illustrate the use of SWIG with Tcl.
be used to wrap a C function and a global variable.
<li><a href="constants/index.html">constants</a>. This shows how preprocessor macros and
certain C declarations are turned into constants.
<li><a href="variables/index.html">variables</a>. How SWIG can be used to wrap C global variables.
</ul>
<h2>Compilation Issues</h2>

View file

@ -3,3 +3,5 @@
extern int gcd(int x, int y);
extern double Foo;

View file

@ -4,6 +4,7 @@
#include <stdio.h>
#include <stdlib.h>
#include "example.h"
int ivar = 0;
short svar = 0;
@ -17,8 +18,15 @@ char cvar = 0;
float fvar = 0;
double dvar = 0;
char *strvar = 0;
const char *cstrvar = 0;
int *iptrvar = 0;
char name[256] = "Dave";
char path[256] = "/home/beazley";
/* Global variables involving a structure */
Point *ptptr = 0;
Point pt = { 10, 20 };
/* A variable that we will make read-only in the interface */
int status = 1;
@ -38,8 +46,11 @@ void print_vars() {
printf("dvar = %g\n", dvar);
printf("cvar = %c\n", cvar);
printf("strvar = %s\n", strvar ? strvar : "(null)");
printf("cstrvar = %s\n", cstrvar ? cstrvar : "(null)");
printf("iptrvar = %x\n", iptrvar);
printf("name = %s\n", name);
printf("ptptr = %x (%d, %d)\n", ptptr, ptptr ? ptptr->x : 0, ptptr ? ptptr->y : 0);
printf("pt = (%d, %d)\n", pt.x, pt.y);
printf("status = %d\n", status);
}
@ -51,4 +62,25 @@ int *new_int(int value) {
return ip;
}
/* A function to create a point */
Point *new_Point(int x, int y) {
Point *p = (Point *) malloc(sizeof(Point));
p->x = x;
p->y = y;
return p;
}
char * Point_print(Point *p) {
static char buffer[256];
if (p) {
sprintf(buffer,"(%d,%d)", p->x,p->y);
} else {
sprintf(buffer,"null");
}
return buffer;
}
void pt_print() {
printf("(%d, %d)\n", pt.x, pt.y);
}

View file

@ -0,0 +1,6 @@
/* File: example.h */
typedef struct {
int x,y;
} Point;

View file

@ -1,5 +1,8 @@
/* File : example.i */
%module example
%{
#include "example.h"
%}
/* Some global variable declarations */
extern int ivar;
@ -14,18 +17,28 @@ extern char cvar;
extern float fvar;
extern double dvar;
extern char *strvar;
extern const char *cstrvar;
extern int *iptrvar;
extern char name[256];
extern Point *ptptr;
extern Point pt;
/* Some read-only variables */
%readonly
extern int status;
extern char path[256];
%readwrite
/* Some helper functions to make it easier to test */
extern void print_vars();
extern int *new_int(int value);
/* A read-only variable */
%readonly
extern int status;
%readwrite
extern Point *new_Point(int x, int y);
extern char *Point_print(Point *p);
extern void pt_print();

View file

@ -17,7 +17,10 @@ set cvar "S"
set fvar 3.14159
set dvar 2.1828
set strvar "Hello World"
set cstrvar "Goodbye"
set iptrvar [new_int 37]
set ptptr [new_Point 37 42]
set name "Bill"
# Now print out the values of the variables
@ -35,8 +38,11 @@ puts "fvar = $fvar"
puts "dvar = $dvar"
puts "cvar = $cvar"
puts "strvar = $strvar"
puts "cstrvar = $cstrvar"
puts "iptrvar = $iptrvar"
puts "name = $name"
puts "ptptr = $ptptr [Point_print $ptptr]"
puts "pt = $pt [Point_print $pt]"
puts "\nVariables (values printed from C)"
@ -44,9 +50,9 @@ print_vars
puts "\nNow I'm going to try and modify some read only variables";
puts " Tring to set 'name'";
puts " Tring to set 'path'";
if { [catch {
set name "Whoa!"
set path "Whoa!"
puts "Hey, what's going on?!?! This shouldn't work"
}]} {
puts "Good."
@ -60,4 +66,13 @@ if { [catch {
puts "Good."
}
puts "\nI'm going to try and update a structure variable.\n"
set pt $ptptr
puts "The new value is"
pt_print
puts "You should see the value [Point_print $ptptr]"

View file

@ -39,20 +39,10 @@ string. However, whenever the value of such a variable is set from Tcl, the ol
value is destroyed using <tt>free()</tt> or <tt>delete</tt> (the choice of which depends
on whether or not SWIG was run with the -c++ option).
<li><tt>signed char</tt> and <tt>unsigned char</tt> are handled as small 8-bit integers.
<li>Array variables such as '<tt>char name[256]</tt>' are read-only variables because
SWIG doesn't really know how to change the "value" of an array. You can work
around this by writing some kind of helper function in the SWIG interface.
For example:
<blockquote>
<pre>
%inline %{
void set_name(char *newname) {
strncpy(name,newname,256);
}
%}
</pre>
</blockquote>
<li>String array variables such as '<tt>char name[256]</tt>' are managed as Tcl strings, but
when setting the value, the result is truncated to the maximum length of the array. Furthermore, the string is assumed to be null-terminated.
<li>When structures and classes are used as global variables, they are mapped into pointers.
Getting the "value" returns a pointer to the global variable. Setting the value of a structure results in a memory copy from a pointer to the global.
</ul>
<h2>Creating read-only variables</h2>