The great merge

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4141 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2002-11-30 22:01:28 +00:00
commit 12a43edc2d
1508 changed files with 125983 additions and 44037 deletions

View file

@ -0,0 +1,11 @@
*.class
*.java
*_wrap.c
*_wrap.cxx
example.dll
example.dsw
example.ncb
example.opt
example.plg
Release
Debug

View file

@ -0,0 +1,18 @@
TOP = ../..
SWIG = $(TOP)/../swig
SRCS = example.c
TARGET = example
INTERFACE = example.i
SWIGOPT =
all:: java
java::
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' java
javac *.java
clean::
$(MAKE) -f $(TOP)/Makefile java_clean
check: all

View file

@ -0,0 +1,86 @@
/* File : example.c */
/* I'm a file containing some C global variables */
#include <stdio.h>
#include <stdlib.h>
#include "example.h"
int ivar = 0;
short svar = 0;
long lvar = 0;
unsigned int uivar = 0;
unsigned short usvar = 0;
unsigned long ulvar = 0;
signed char scvar = 0;
unsigned char ucvar = 0;
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;
/* A debugging function to print out their values */
void print_vars() {
printf("ivar = %d\n", ivar);
printf("svar = %d\n", svar);
printf("lvar = %ld\n", lvar);
printf("uivar = %u\n", uivar);
printf("usvar = %u\n", usvar);
printf("ulvar = %lu\n", ulvar);
printf("scvar = %d\n", scvar);
printf("ucvar = %u\n", ucvar);
printf("fvar = %g\n", fvar);
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);
}
/* A function to create an integer (to test iptrvar) */
int *new_int(int value) {
int *ip = (int *) malloc(sizeof(int));
*ip = 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

@ -0,0 +1,44 @@
/* File : example.i */
%module example
%{
#include "example.h"
%}
/* Some global variable declarations */
extern int ivar;
extern short svar;
extern long lvar;
extern unsigned int uivar;
extern unsigned short usvar;
extern unsigned long ulvar;
extern signed char scvar;
extern unsigned char ucvar;
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 */
%immutable;
extern int status;
extern char path[256];
%mutable;
/* Some helper functions to make it easier to test */
extern void print_vars();
extern int *new_int(int value);
extern Point *new_Point(int x, int y);
extern char *Point_print(Point *p);
extern void pt_print();

View file

@ -0,0 +1,85 @@
<html>
<head>
<title>SWIG:Examples:java:variables</title>
</head>
<body bgcolor="#ffffff">
<tt>SWIG/Examples/java/variables/</tt>
<hr>
<H2>Wrapping C Global Variables</H2>
<tt>$Header$</tt><br>
<p>
When a C global variable appears in an interface file, SWIG tries to
wrap it using a technique known as "variable linking." The idea is
pretty simple---we try to create a Java variable that magically
retrieves or updates the value of the underlying C variable when it is
accessed. Click <a href="example.i">here</a> to see a SWIG interface with some variable
declarations in it.
<h2>Manipulating Variables from Java</h2>
C variables are accessed through getters and setters from Java. Unfortunately this is the only way to get current values from variables because it is not possible to overload the dot operator in Java. All global variables are accessible from the module class. For example if the module class is called 'example', the global variable
<blockquote>
<pre>
double foo;
</pre>
</blockquote>
will be accessed in the Java module as
<blockquote>
<pre>
example.get_foo();
example.set_foo(12.3);
</pre>
</blockquote>
Click <a href="main.java">here</a> to see the example program that updates and prints
out the values of the variables using this technique.
<h2>Key points</h2>
<ul>
<li>When a global variable has the type "<tt>char *</tt>", SWIG manages it as a character
string. However, whenever the value of such a variable is set from Java, the old
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>String array variables such as '<tt>char name[256]</tt>' are managed as Java 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>
The <tt>%immutable</tt> and <tt>%mutable</tt> directives can be used to
specify a collection of read-only variables. For example:
<blockquote>
<pre>
%immutable;
int status;
double blah;
...
%mutable;
</pre>
</blockquote>
The <tt>%immutable</tt> directive remains in effect until it is explicitly disabled
using the <tt>%mutable</tt> directive.
<h2>Comments</h2>
<ul>
<li>Management of global variables is one of the most problematic aspects
of C/C++ wrapping because the Java interface and resulting memory management
is much trickier than simply creating a wrapper function.
</ul>
</body>
</html>
<hr>

View file

@ -0,0 +1,98 @@
// This example illustrates global variable access from Java.
import java.lang.reflect.*;
public class main {
static {
try {
System.loadLibrary("example");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
System.exit(1);
}
}
public static void main(String argv[]) {
// Try to set the values of some global variables
example.setIvar(42);
example.setSvar((short)-31000);
example.setLvar(65537);
example.setUivar(123456);
example.setUsvar(61000);
example.setUlvar(654321);
example.setScvar((byte)-13);
example.setUcvar((short)251);
example.setCvar('S');
example.setFvar((float)3.14159);
example.setDvar(2.1828);
example.setStrvar("Hello World");
example.setCstrvar("Goodbye");
example.setIptrvar(example.new_int(37));
example.setPtptr(example.new_Point(37,42));
example.setName("Bill");
// Now print out the values of the variables
System.out.println( "Variables (values printed from Java)" );
System.out.println( "ivar =" + example.getIvar() );
System.out.println( "svar =" + example.getSvar() );
System.out.println( "lvar =" + example.getLvar() );
System.out.println( "uivar =" + example.getUivar() );
System.out.println( "usvar =" + example.getUsvar() );
System.out.println( "ulvar =" + example.getUlvar() );
System.out.println( "scvar =" + example.getScvar() );
System.out.println( "ucvar =" + example.getUcvar() );
System.out.println( "fvar =" + example.getFvar() );
System.out.println( "dvar =" + example.getDvar() );
System.out.println( "cvar =" + (char)example.getCvar() );
System.out.println( "strvar =" + example.getStrvar() );
System.out.println( "cstrvar =" + example.getCstrvar() );
System.out.println( "iptrvar =" + Long.toHexString(SWIGTYPE_p_int.getCPtr(example.getIptrvar())) );
System.out.println( "name =" + example.getName() );
System.out.println( "ptptr =" + Long.toHexString(SWIGTYPE_p_Point.getCPtr(example.getPtptr())) + example.Point_print(example.getPtptr()) );
System.out.println( "pt =" + Long.toHexString(SWIGTYPE_p_Point.getCPtr(example.getPt())) + example.Point_print(example.getPt()) );
System.out.println( "\nVariables (values printed from C)" );
example.print_vars();
System.out.println( "\nNow I'm going to try and modify some read only variables" );
System.out.println( " Trying to set 'path'" );
try {
Method m = example.class.getDeclaredMethod("setPath", new Class[] {String.class});
m.invoke(example.class, new Object[] {"Whoa!"} );
System.out.println( "Hey, what's going on?!?! This shouldn't work" );
}
catch (NoSuchMethodException e) {
System.out.println( "Good." );
}
catch (Throwable t) {
System.out.println( "You shouldn't see this!" );
}
System.out.println( " Trying to set 'status'" );
try {
Method m = example.class.getDeclaredMethod("setStatus", new Class[] {Integer.class});
m.invoke(example.class, new Object[] {new Integer(0)} );
System.out.println( "Hey, what's going on?!?! This shouldn't work" );
}
catch (NoSuchMethodException e) {
System.out.println( "Good." );
}
catch (Throwable t) {
System.out.println( "You shouldn't see this!" );
}
System.out.println( "\nI'm going to try and update a structure variable.\n" );
example.setPt(example.getPtptr());
System.out.println( "The new value is" );
example.pt_print();
System.out.println( "You should see the value" + example.Point_print(example.getPtptr()) );
}
}