summaryrefslogtreecommitdiff
path: root/trunk/Examples/php
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/Examples/php')
-rw-r--r--trunk/Examples/php/callback/Makefile22
-rw-r--r--trunk/Examples/php/callback/example.cxx4
-rw-r--r--trunk/Examples/php/callback/example.h22
-rw-r--r--trunk/Examples/php/callback/example.i13
-rw-r--r--trunk/Examples/php/callback/index.html19
-rw-r--r--trunk/Examples/php/callback/runme.php47
-rw-r--r--trunk/Examples/php/check.list19
-rw-r--r--trunk/Examples/php/class/Makefile24
-rw-r--r--trunk/Examples/php/class/example.cxx39
-rw-r--r--trunk/Examples/php/class/example.h38
-rw-r--r--trunk/Examples/php/class/example.i10
-rw-r--r--trunk/Examples/php/class/runme.php60
-rw-r--r--trunk/Examples/php/constants/Makefile24
-rw-r--r--trunk/Examples/php/constants/example.i26
-rw-r--r--trunk/Examples/php/constants/runme.php28
-rw-r--r--trunk/Examples/php/cpointer/Makefile24
-rw-r--r--trunk/Examples/php/cpointer/example.c16
-rw-r--r--trunk/Examples/php/cpointer/example.i26
-rw-r--r--trunk/Examples/php/cpointer/runme.php45
-rw-r--r--trunk/Examples/php/disown/Makefile24
-rw-r--r--trunk/Examples/php/disown/example.cxx51
-rw-r--r--trunk/Examples/php/disown/example.h50
-rw-r--r--trunk/Examples/php/disown/example.i12
-rw-r--r--trunk/Examples/php/disown/runme.php49
-rw-r--r--trunk/Examples/php/enum/Makefile24
-rw-r--r--trunk/Examples/php/enum/example.cxx37
-rw-r--r--trunk/Examples/php/enum/example.h13
-rw-r--r--trunk/Examples/php/enum/example.i12
-rw-r--r--trunk/Examples/php/enum/runme.php32
-rw-r--r--trunk/Examples/php/extend/Makefile22
-rw-r--r--trunk/Examples/php/extend/example.cxx4
-rw-r--r--trunk/Examples/php/extend/example.h56
-rw-r--r--trunk/Examples/php/extend/example.i15
-rw-r--r--trunk/Examples/php/extend/index.html19
-rw-r--r--trunk/Examples/php/extend/runme.php76
-rw-r--r--trunk/Examples/php/funcptr/Makefile24
-rw-r--r--trunk/Examples/php/funcptr/example.c17
-rw-r--r--trunk/Examples/php/funcptr/example.h7
-rw-r--r--trunk/Examples/php/funcptr/example.i15
-rw-r--r--trunk/Examples/php/funcptr/runme.php24
-rw-r--r--trunk/Examples/php/overloading/Makefile24
-rw-r--r--trunk/Examples/php/overloading/example.cxx55
-rw-r--r--trunk/Examples/php/overloading/example.h46
-rw-r--r--trunk/Examples/php/overloading/example.i8
-rw-r--r--trunk/Examples/php/overloading/runme.php59
-rw-r--r--trunk/Examples/php/pointer/Makefile24
-rw-r--r--trunk/Examples/php/pointer/example.c16
-rw-r--r--trunk/Examples/php/pointer/example.i24
-rw-r--r--trunk/Examples/php/pointer/runme.php35
-rw-r--r--trunk/Examples/php/pragmas/Makefile24
-rw-r--r--trunk/Examples/php/pragmas/example.i31
-rw-r--r--trunk/Examples/php/pragmas/include.php7
-rwxr-xr-xtrunk/Examples/php/pragmas/runme.php5
-rw-r--r--trunk/Examples/php/proxy/Makefile24
-rw-r--r--trunk/Examples/php/proxy/example.cxx43
-rw-r--r--trunk/Examples/php/proxy/example.h43
-rw-r--r--trunk/Examples/php/proxy/example.i12
-rw-r--r--trunk/Examples/php/proxy/runme.php68
-rw-r--r--trunk/Examples/php/reference/Makefile24
-rw-r--r--trunk/Examples/php/reference/example.cxx49
-rw-r--r--trunk/Examples/php/reference/example.h26
-rw-r--r--trunk/Examples/php/reference/example.i47
-rw-r--r--trunk/Examples/php/reference/runme.php49
-rw-r--r--trunk/Examples/php/simple/Makefile24
-rw-r--r--trunk/Examples/php/simple/example.c23
-rw-r--r--trunk/Examples/php/simple/example.i10
-rwxr-xr-xtrunk/Examples/php/simple/runme.php25
-rw-r--r--trunk/Examples/php/sync/Makefile24
-rw-r--r--trunk/Examples/php/sync/example.cxx13
-rw-r--r--trunk/Examples/php/sync/example.h9
-rw-r--r--trunk/Examples/php/sync/example.i7
-rw-r--r--trunk/Examples/php/sync/runme.php15
-rw-r--r--trunk/Examples/php/value/Makefile24
-rw-r--r--trunk/Examples/php/value/example.c13
-rw-r--r--trunk/Examples/php/value/example.h8
-rw-r--r--trunk/Examples/php/value/example.i17
-rw-r--r--trunk/Examples/php/value/runme.php43
-rw-r--r--trunk/Examples/php/variables/Makefile24
-rw-r--r--trunk/Examples/php/variables/example.c95
-rw-r--r--trunk/Examples/php/variables/example.h34
-rw-r--r--trunk/Examples/php/variables/example.i44
-rw-r--r--trunk/Examples/php/variables/runme.php96
82 files changed, 2380 insertions, 0 deletions
diff --git a/trunk/Examples/php/callback/Makefile b/trunk/Examples/php/callback/Makefile
new file mode 100644
index 000000000..42597202b
--- /dev/null
+++ b/trunk/Examples/php/callback/Makefile
@@ -0,0 +1,22 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS = -lm
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile $(SWIGLIB) CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile $(SWIGLIB) CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/callback/example.cxx b/trunk/Examples/php/callback/example.cxx
new file mode 100644
index 000000000..450d75608
--- /dev/null
+++ b/trunk/Examples/php/callback/example.cxx
@@ -0,0 +1,4 @@
+/* File : example.cxx */
+
+#include "example.h"
+
diff --git a/trunk/Examples/php/callback/example.h b/trunk/Examples/php/callback/example.h
new file mode 100644
index 000000000..2a0194999
--- /dev/null
+++ b/trunk/Examples/php/callback/example.h
@@ -0,0 +1,22 @@
+/* File : example.h */
+
+#include <iostream>
+
+class Callback {
+public:
+ virtual ~Callback() { std::cout << "Callback::~Callback()" << std:: endl; }
+ virtual void run() { std::cout << "Callback::run()" << std::endl; }
+};
+
+
+class Caller {
+private:
+ Callback *_callback;
+public:
+ Caller(): _callback(0) {}
+ ~Caller() { delCallback(); }
+ void delCallback() { delete _callback; _callback = 0; }
+ void setCallback(Callback *cb) { delCallback(); _callback = cb; }
+ void call() { if (_callback) _callback->run(); }
+};
+
diff --git a/trunk/Examples/php/callback/example.i b/trunk/Examples/php/callback/example.i
new file mode 100644
index 000000000..90beda01a
--- /dev/null
+++ b/trunk/Examples/php/callback/example.i
@@ -0,0 +1,13 @@
+/* File : example.i */
+%module(directors="1") example
+%{
+#include "example.h"
+%}
+
+%include "std_string.i"
+
+/* turn on director wrapping Callback */
+%feature("director") Callback;
+
+%include "example.h"
+
diff --git a/trunk/Examples/php/callback/index.html b/trunk/Examples/php/callback/index.html
new file mode 100644
index 000000000..2aa720e24
--- /dev/null
+++ b/trunk/Examples/php/callback/index.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>SWIG:Examples:php:callback</title>
+</head>
+
+<body bgcolor="#ffffff">
+
+
+<tt>SWIG/Examples/php/callback/</tt>
+<hr>
+
+<H2>Implementing C++ callbacks in PHP</H2>
+
+<p>
+This example illustrates how to use directors to implement C++ callbacks in PHP.
+
+<hr>
+</body>
+</html>
diff --git a/trunk/Examples/php/callback/runme.php b/trunk/Examples/php/callback/runme.php
new file mode 100644
index 000000000..2be71994f
--- /dev/null
+++ b/trunk/Examples/php/callback/runme.php
@@ -0,0 +1,47 @@
+<?php
+
+# This file illustrates the cross language polymorphism using directors.
+
+require("example.php");
+
+# Class, which overwrites Callback::run().
+
+class PhpCallback extends Callback {
+ function run() {
+ print "PhpCallback.run()\n";
+ }
+};
+
+# Create an Caller instance
+
+$caller = new Caller();
+
+# Add a simple C++ callback (caller owns the callback, so
+# we disown it first by clearing the .thisown flag).
+
+print "Adding and calling a normal C++ callback\n";
+print "----------------------------------------\n";
+
+$callback = new Callback();
+$callback->thisown = 0;
+$caller->setCallback($callback);
+$caller->call();
+$caller->delCallback();
+
+print "\n";
+print "Adding and calling a PHP callback\n";
+print "------------------------------------\n";
+
+# Add a PHP callback.
+
+$callback = new PhpCallback();
+$callback->thisown = 0;
+$caller->setCallback($callback);
+$caller->call();
+$caller->delCallback();
+
+# All done.
+
+print "php exit\n";
+
+?>
diff --git a/trunk/Examples/php/check.list b/trunk/Examples/php/check.list
new file mode 100644
index 000000000..28c7a619f
--- /dev/null
+++ b/trunk/Examples/php/check.list
@@ -0,0 +1,19 @@
+# see top-level Makefile.in
+# (see also top-level configure.in kludge)
+callback
+class
+constants
+cpointer
+disown
+enum
+extend
+funcptr
+overloading
+pointer
+pragmas
+proxy
+reference
+simple
+sync
+value
+variables
diff --git a/trunk/Examples/php/class/Makefile b/trunk/Examples/php/class/Makefile
new file mode 100644
index 000000000..1bc0beaab
--- /dev/null
+++ b/trunk/Examples/php/class/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/class/example.cxx b/trunk/Examples/php/class/example.cxx
new file mode 100644
index 000000000..f171f10e9
--- /dev/null
+++ b/trunk/Examples/php/class/example.cxx
@@ -0,0 +1,39 @@
+/* File : example.c */
+
+#include "example.h"
+#include <math.h>
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+int Shape::get_nshapes() {
+ return nshapes;
+}
+
+/* Move the shape to a new location */
+void Shape::move(double dx, double dy) {
+ x += dx;
+ y += dy;
+}
+
+int Shape::nshapes = 0;
+
+void Circle::set_radius( double r ) {
+ radius = r;
+}
+
+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;
+}
diff --git a/trunk/Examples/php/class/example.h b/trunk/Examples/php/class/example.h
new file mode 100644
index 000000000..02eaf7232
--- /dev/null
+++ b/trunk/Examples/php/class/example.h
@@ -0,0 +1,38 @@
+/* File : example.h */
+
+class Shape {
+public:
+ Shape() {
+ nshapes++;
+ }
+ virtual ~Shape() {
+ nshapes--;
+ }
+ double x, y;
+ void move(double dx, double dy);
+ virtual double area(void) = 0;
+ virtual double perimeter(void) = 0;
+ static int nshapes;
+ static int get_nshapes();
+};
+
+class Circle : public Shape {
+private:
+ double radius;
+public:
+ Circle(double r) : radius(r) { }
+ ~Circle() { }
+ void set_radius( double r );
+ virtual double area(void);
+ virtual double perimeter(void);
+};
+
+class Square : public Shape {
+private:
+ double width;
+public:
+ Square(double w) : width(w) { }
+ ~Square() { }
+ virtual double area(void);
+ virtual double perimeter(void);
+};
diff --git a/trunk/Examples/php/class/example.i b/trunk/Examples/php/class/example.i
new file mode 100644
index 000000000..75700b305
--- /dev/null
+++ b/trunk/Examples/php/class/example.i
@@ -0,0 +1,10 @@
+/* File : example.i */
+%module example
+
+%{
+#include "example.h"
+%}
+
+/* Let's just grab the original header file here */
+%include "example.h"
+
diff --git a/trunk/Examples/php/class/runme.php b/trunk/Examples/php/class/runme.php
new file mode 100644
index 000000000..12b686052
--- /dev/null
+++ b/trunk/Examples/php/class/runme.php
@@ -0,0 +1,60 @@
+<?php
+
+# This example illustrates how member variables are wrapped.
+
+require("example.php");
+
+# ----- Object creation -----
+
+print "Creating some objects:\n";
+$c = new Circle(10);
+print " Created circle\n";
+$s = new Square(10);
+print " Created square\n";
+
+# ----- Access a static member -----
+
+print "\nA total of " . Shape::get_nshapes() . " shapes were created\n";
+
+# ----- Member data access -----
+
+# Set the location of the object.
+# Note: methods in the base class Shape are used since
+# x and y are defined there.
+
+$c->x = 20;
+$c->y = 30;
+$s->x = -10;
+$s->y = 5;
+
+print "\nHere is their current position:\n";
+print " Circle = ({$c->x},{$c->y})\n";
+print " Square = ({$s->x},{$s->y})\n";
+
+# ----- Call some methods -----
+
+# Notice how the Shape_area() and Shape_perimeter() functions really
+# invoke the appropriate virtual method on each object.
+print "\nHere are some properties of the shapes:\n";
+foreach (array($c,$s) as $o) {
+ print " ". get_class($o) . "\n";
+ print " area = {$o->area()}\n";
+ print " perimeter = {$o->perimeter()}\n";
+}
+
+# ----- Delete everything -----
+
+print "\nGuess I'll clean up now\n";
+
+# Note: this invokes the virtual destructor
+$c = NULL;
+$s = NULL;
+
+# and don't forget the $o from the for loop above. It still refers to
+# the square.
+$o = NULL;
+
+print Shape::get_nshapes() . " shapes remain\n";
+print "Goodbye\n";
+
+?>
diff --git a/trunk/Examples/php/constants/Makefile b/trunk/Examples/php/constants/Makefile
new file mode 100644
index 000000000..23e2675d7
--- /dev/null
+++ b/trunk/Examples/php/constants/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS =
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/constants/example.i b/trunk/Examples/php/constants/example.i
new file mode 100644
index 000000000..0098a893a
--- /dev/null
+++ b/trunk/Examples/php/constants/example.i
@@ -0,0 +1,26 @@
+/* File : example.i */
+%module example
+
+/* A few preprocessor macros */
+
+#define ICONST 42
+#define FCONST 2.1828
+#define CCONST 'x'
+#define CCONST2 '\n'
+#define SCONST "Hello World"
+#define SCONST2 "\"Hello World\""
+
+/* This should work just fine */
+#define EXPR ICONST + 3*(FCONST)
+
+/* This shouldn't do anything */
+#define EXTERN extern
+
+/* Neither should this (BAR isn't defined) */
+#define FOO (ICONST + BAR)
+
+/* The following statements also produce constants */
+%constant int iconst = 37;
+%constant double fconst = 3.14;
+
+
diff --git a/trunk/Examples/php/constants/runme.php b/trunk/Examples/php/constants/runme.php
new file mode 100644
index 000000000..cea06485f
--- /dev/null
+++ b/trunk/Examples/php/constants/runme.php
@@ -0,0 +1,28 @@
+<?php
+
+require "example.php";
+
+print "ICONST = " . ICONST . " (should be 42)\n";
+print "FCONST = " . FCONST . " (should be 2.1828)\n";
+print "CCONST = " . CCONST . " (should be 'x')\n";
+print "CCONST2 = " . CCONST2 . " (this should be on a new line)\n";
+print "SCONST = " . SCONST . " (should be 'Hello World')\n";
+print "SCONST2 = " . SCONST2 . " (should be '\"Hello World\"')\n";
+print "EXPR = " . EXPR . " (should be 48.5484)\n";
+print "iconst = " . iconst . " (should be 37)\n";
+print "fconst = " . fconst . " (should be 3.14)\n";
+
+if (EXTERN!="EXTERN") {
+ print "EXTERN = " . EXTERN . " (Arg! This shouldn't print anything)\n";
+} else {
+ print "EXTERN defaults to 'EXTERN', it probably isn't defined (good)\n";
+}
+
+if (FOO!="FOO") {
+ print "FOO = " . FOO . "(Arg! This shouldn't print anything)\n";
+} else {
+ print "FOO defaults to 'FOO', it probably isn't defined (good)\n";
+}
+
+
+?>
diff --git a/trunk/Examples/php/cpointer/Makefile b/trunk/Examples/php/cpointer/Makefile
new file mode 100644
index 000000000..0862ce5ec
--- /dev/null
+++ b/trunk/Examples/php/cpointer/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS = example.c
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/cpointer/example.c b/trunk/Examples/php/cpointer/example.c
new file mode 100644
index 000000000..3326dec3e
--- /dev/null
+++ b/trunk/Examples/php/cpointer/example.c
@@ -0,0 +1,16 @@
+/* File : example.c */
+
+void add(double *x, double *y, double *result) {
+ *result = *x + *y;
+}
+
+void sub(int *x, int *y, int *result) {
+ *result = *x - *y;
+}
+
+int divide(int n, int d, int *r) {
+ int q;
+ q = n/d;
+ *r = n - q*d;
+ return q;
+}
diff --git a/trunk/Examples/php/cpointer/example.i b/trunk/Examples/php/cpointer/example.i
new file mode 100644
index 000000000..52e6df190
--- /dev/null
+++ b/trunk/Examples/php/cpointer/example.i
@@ -0,0 +1,26 @@
+/* File : example.i */
+%module example
+
+/* This example illustrates a couple of different techniques
+ for manipulating C pointers */
+
+/* First we'll use the pointer library */
+extern void add(int *x, int *y, int *result);
+
+%include cpointer.i
+%pointer_functions(int, intp);
+
+/* Next we'll use some typemaps */
+
+%include typemaps.i
+extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
+
+/* Next we'll use typemaps and the %apply directive */
+
+//%apply int *OUTPUT { int *r };
+//extern int divide(int n, int d, int *r);
+
+
+
+
+
diff --git a/trunk/Examples/php/cpointer/runme.php b/trunk/Examples/php/cpointer/runme.php
new file mode 100644
index 000000000..48f0ad631
--- /dev/null
+++ b/trunk/Examples/php/cpointer/runme.php
@@ -0,0 +1,45 @@
+<?php
+
+ require "example.php";
+
+ # First create some objects using the pointer library.
+
+ print "Testing the pointer library\n";
+
+ $a = new_intp();
+ $b = new_intp();
+ $c = new_intp();
+ intp_assign($a,37);
+ intp_assign($b,42);
+
+ print " a = $a\n";
+ print " b = $b\n";
+ print " c = $c\n";
+
+ # Call the add() function wuth some pointers
+ add($a,$b,$c);
+
+ # Now get the result
+ $r = intp_value($c);
+
+ print " 37 + 42 = $r\n";
+
+ # Clean up the pointers
+ delete_intp($a);
+ delete_intp($b);
+ delete_intp($c);
+
+ # Now try the typemap library
+ # This should be much easier. Now how it is no longer
+ # necessary to manufacture pointers.
+
+ print "Trying the typemap library\n";
+ $r = sub(37,42);
+ print " 37 - 42 = $r\n";
+
+ # Now try the version with multiple return values
+ # print "Testing multiple return values\n";
+ # ($q,$r) = divide(42,37);
+ # print " 42/37 = $q remainder $r\n";
+
+?>
diff --git a/trunk/Examples/php/disown/Makefile b/trunk/Examples/php/disown/Makefile
new file mode 100644
index 000000000..1bc0beaab
--- /dev/null
+++ b/trunk/Examples/php/disown/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/disown/example.cxx b/trunk/Examples/php/disown/example.cxx
new file mode 100644
index 000000000..6393735e9
--- /dev/null
+++ b/trunk/Examples/php/disown/example.cxx
@@ -0,0 +1,51 @@
+/* File : example.c */
+
+#include "example.h"
+#include <math.h>
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+int Shape::get_nshapes() {
+ return nshapes;
+}
+
+/* Move the shape to a new location */
+void Shape::move(double dx, double dy) {
+ x += dx;
+ y += dy;
+}
+
+int Shape::nshapes = 0;
+
+void Circle::set_radius( double r ) {
+ radius = r;
+}
+
+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;
+}
+
+ShapeContainer::~ShapeContainer() {
+ iterator i=shapes.begin();
+ for( iterator i = shapes.begin(); i != shapes.end(); ++i ) {
+ delete *i;
+ }
+}
+
+void
+ShapeContainer::addShape( Shape *s ) {
+ shapes.push_back( s );
+}
diff --git a/trunk/Examples/php/disown/example.h b/trunk/Examples/php/disown/example.h
new file mode 100644
index 000000000..985bc333d
--- /dev/null
+++ b/trunk/Examples/php/disown/example.h
@@ -0,0 +1,50 @@
+/* File : example.h */
+
+#include <vector>
+
+class Shape {
+public:
+ Shape() {
+ nshapes++;
+ }
+ virtual ~Shape() {
+ nshapes--;
+ };
+ double x, y;
+ void move(double dx, double dy);
+ virtual double area(void) = 0;
+ virtual double perimeter(void) = 0;
+ static int nshapes;
+ static int get_nshapes();
+};
+
+class Circle : public Shape {
+private:
+ double radius;
+public:
+ Circle(double r) : radius(r) { };
+ ~Circle() { };
+ void set_radius( double r );
+ virtual double area(void);
+ virtual double perimeter(void);
+};
+
+class Square : public Shape {
+private:
+ double width;
+public:
+ Square(double w) : width(w) { };
+ ~Square() { }
+ virtual double area(void);
+ virtual double perimeter(void);
+};
+
+class ShapeContainer {
+private:
+ typedef std::vector<Shape*>::iterator iterator;
+ std::vector<Shape*> shapes;
+public:
+ ShapeContainer() : shapes() {};
+ ~ShapeContainer();
+ void addShape( Shape *s );
+};
diff --git a/trunk/Examples/php/disown/example.i b/trunk/Examples/php/disown/example.i
new file mode 100644
index 000000000..599f162c5
--- /dev/null
+++ b/trunk/Examples/php/disown/example.i
@@ -0,0 +1,12 @@
+/* File : example.i */
+%module example
+
+%{
+#include "example.h"
+%}
+
+%apply SWIGTYPE *DISOWN {(Shape *s)};
+
+/* Let's just grab the original header file here */
+%include "example.h"
+
diff --git a/trunk/Examples/php/disown/runme.php b/trunk/Examples/php/disown/runme.php
new file mode 100644
index 000000000..d90b03a9d
--- /dev/null
+++ b/trunk/Examples/php/disown/runme.php
@@ -0,0 +1,49 @@
+<?php
+
+# This file illustrates the low-level C++ interface
+# created by SWIG. In this case, all of our C++ classes
+# get converted into function calls.
+
+require("example.php");
+
+# ----- Object creation -----
+
+print "Creating some objects:\n";
+$c = new Circle(10);
+print " Created circle \$c\n";
+$s = new Square(10);
+print " Created square \$s\n";
+
+# ----- Create the ShapeContainer ----
+
+$container = new ShapeContainer();
+
+$container->addShape($c);
+$container->addShape($s);
+
+# ----- Access a static member -----
+
+print "\nA total of " . Shape::nshapes() . " shapes were created\n";
+
+# ----- Delete by the old references -----
+# This should not truely delete the shapes because they are now owned
+# by the ShapeContainer.
+
+print "Delete the old references.";
+
+# Note: this invokes the virtual destructor
+$c = NULL;
+$s = NULL;
+
+print "\nA total of " . Shape::nshapes() . " shapes remain\n";
+
+# ----- Delete by the container -----
+# This should truely delete the shapes
+
+print "Delete the container.";
+$container = NULL;
+print "\nA total of " . Shape::nshapes() . " shapes remain\n";
+
+print "Goodbye\n";
+
+?>
diff --git a/trunk/Examples/php/enum/Makefile b/trunk/Examples/php/enum/Makefile
new file mode 100644
index 000000000..252a72660
--- /dev/null
+++ b/trunk/Examples/php/enum/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT = -noproxy
+
+all::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/enum/example.cxx b/trunk/Examples/php/enum/example.cxx
new file mode 100644
index 000000000..df7bb6328
--- /dev/null
+++ b/trunk/Examples/php/enum/example.cxx
@@ -0,0 +1,37 @@
+/* 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 {
+ 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!, ");
+ }
+ if (s == Foo::IMPULSE) {
+ printf("speed = IMPULSE speed\n");
+ } else if (s == Foo::WARP) {
+ printf("speed = WARP speed\n");
+ } else if (s == Foo::LUDICROUS) {
+ printf("speed = LUDICROUS speed\n");
+ } else {
+ printf("speed = Unknown speed!\n");
+ }
+}
diff --git a/trunk/Examples/php/enum/example.h b/trunk/Examples/php/enum/example.h
new file mode 100644
index 000000000..525d62afc
--- /dev/null
+++ b/trunk/Examples/php/enum/example.h
@@ -0,0 +1,13 @@
+/* File : example.h */
+
+enum color { RED, BLUE, GREEN };
+
+class Foo {
+ public:
+ Foo() { }
+ enum speed { IMPULSE, WARP, LUDICROUS };
+ void enum_test(speed s);
+};
+
+void enum_test(color c, Foo::speed s);
+
diff --git a/trunk/Examples/php/enum/example.i b/trunk/Examples/php/enum/example.i
new file mode 100644
index 000000000..abf254731
--- /dev/null
+++ b/trunk/Examples/php/enum/example.i
@@ -0,0 +1,12 @@
+/* File : example.i */
+%module example
+
+%{
+#include "example.h"
+%}
+
+
+/* Let's just grab the original header file here */
+
+%include "example.h"
+
diff --git a/trunk/Examples/php/enum/runme.php b/trunk/Examples/php/enum/runme.php
new file mode 100644
index 000000000..55b0bc4c3
--- /dev/null
+++ b/trunk/Examples/php/enum/runme.php
@@ -0,0 +1,32 @@
+<?php
+
+require "example.php";
+
+# ----- Object creation -----
+
+# Print out the value of some enums
+print "*** color ***";
+print " RED =" . RED;
+print " BLUE =" . BLUE;
+print " GREEN =" . GREEN;
+
+print "\n*** Foo::speed ***";
+print " Foo_IMPULSE =" . Foo_IMPULSE;
+print " Foo_WARP =" . Foo_WARP;
+print " Foo_LUDICROUS =" . Foo_LUDICROUS;
+
+print "\nTesting use of enums with functions\n";
+
+enum_test(RED, Foo_IMPULSE);
+enum_test(BLUE, Foo_WARP);
+enum_test(GREEN, Foo_LUDICROUS);
+enum_test(1234,5678);
+
+print "\nTesting use of enum with class method\n";
+$f = new_Foo();
+
+Foo_enum_test($f,Foo_IMPULSE);
+Foo_enum_test($f,Foo_WARP);
+Foo_enum_test($f,Foo_LUDICROUS);
+
+?>
diff --git a/trunk/Examples/php/extend/Makefile b/trunk/Examples/php/extend/Makefile
new file mode 100644
index 000000000..42597202b
--- /dev/null
+++ b/trunk/Examples/php/extend/Makefile
@@ -0,0 +1,22 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS = -lm
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile $(SWIGLIB) CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile $(SWIGLIB) CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/extend/example.cxx b/trunk/Examples/php/extend/example.cxx
new file mode 100644
index 000000000..450d75608
--- /dev/null
+++ b/trunk/Examples/php/extend/example.cxx
@@ -0,0 +1,4 @@
+/* File : example.cxx */
+
+#include "example.h"
+
diff --git a/trunk/Examples/php/extend/example.h b/trunk/Examples/php/extend/example.h
new file mode 100644
index 000000000..b27ab9711
--- /dev/null
+++ b/trunk/Examples/php/extend/example.h
@@ -0,0 +1,56 @@
+/* File : example.h */
+
+#include <cstdio>
+#include <iostream>
+#include <vector>
+#include <string>
+#include <cmath>
+
+class Employee {
+private:
+ std::string name;
+public:
+ Employee(const char* n): name(n) {}
+ virtual std::string getTitle() { return getPosition() + " " + getName(); }
+ virtual std::string getName() { return name; }
+ virtual std::string getPosition() const { return "Employee"; }
+ virtual ~Employee() { printf("~Employee() @ %p\n", this); }
+};
+
+
+class Manager: public Employee {
+public:
+ Manager(const char* n): Employee(n) {}
+ virtual std::string getPosition() const { return "Manager"; }
+};
+
+
+class EmployeeList {
+ std::vector<Employee*> list;
+public:
+ EmployeeList() {
+ list.push_back(new Employee("Bob"));
+ list.push_back(new Employee("Jane"));
+ list.push_back(new Manager("Ted"));
+ }
+ void addEmployee(Employee *p) {
+ list.push_back(p);
+ std::cout << "New employee added. Current employees are:" << std::endl;
+ std::vector<Employee*>::iterator i;
+ for (i=list.begin(); i!=list.end(); i++) {
+ std::cout << " " << (*i)->getTitle() << std::endl;
+ }
+ }
+ const Employee *get_item(int i) {
+ return list[i];
+ }
+ ~EmployeeList() {
+ std::vector<Employee*>::iterator i;
+ std::cout << "~EmployeeList, deleting " << list.size() << " employees." << std::endl;
+ for (i=list.begin(); i!=list.end(); i++) {
+ delete *i;
+ }
+ std::cout << "~EmployeeList empty." << std::endl;
+ }
+};
+
diff --git a/trunk/Examples/php/extend/example.i b/trunk/Examples/php/extend/example.i
new file mode 100644
index 000000000..c8ec32e09
--- /dev/null
+++ b/trunk/Examples/php/extend/example.i
@@ -0,0 +1,15 @@
+/* File : example.i */
+%module(directors="1") example
+%{
+#include "example.h"
+%}
+
+%include "std_vector.i"
+%include "std_string.i"
+
+/* turn on director wrapping for Manager */
+%feature("director") Employee;
+%feature("director") Manager;
+
+%include "example.h"
+
diff --git a/trunk/Examples/php/extend/index.html b/trunk/Examples/php/extend/index.html
new file mode 100644
index 000000000..32c6a4913
--- /dev/null
+++ b/trunk/Examples/php/extend/index.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<title>SWIG:Examples:php:extend</title>
+</head>
+
+<body bgcolor="#ffffff">
+
+
+<tt>SWIG/Examples/php/extend/</tt>
+<hr>
+
+<H2>Extending a simple C++ class in PHP</H2>
+
+<p>
+This example illustrates the extending of a C++ class with cross language polymorphism.
+
+<hr>
+</body>
+</html>
diff --git a/trunk/Examples/php/extend/runme.php b/trunk/Examples/php/extend/runme.php
new file mode 100644
index 000000000..158683142
--- /dev/null
+++ b/trunk/Examples/php/extend/runme.php
@@ -0,0 +1,76 @@
+<?php
+
+# This file illustrates the cross language polymorphism using directors.
+
+require("example.php");
+
+# CEO class, which overrides Employee::getPosition().
+
+class CEO extends Manager {
+ function getPosition() {
+ return "CEO";
+ }
+}
+
+# Create an instance of our employee extension class, CEO. The calls to
+# getName() and getPosition() are standard, the call to getTitle() uses
+# the director wrappers to call CEO.getPosition.
+
+$e = new CEO("Alice");
+print $e->getName() . " is a " . $e->getPosition() . "\n";
+printf("Just call her \"%s\"\n", $e->getTitle());
+print "----------------------\n";
+
+# Create a new EmployeeList instance. This class does not have a C++
+# director wrapper, but can be used freely with other classes that do.
+
+$list = new EmployeeList();
+
+# EmployeeList owns its items, so we must surrender ownership of objects
+# we add. This involves first clearing the ->disown member to tell the
+# C++ director to start reference counting.
+
+$e->thisown = 0;
+$list->addEmployee($e);
+print "----------------------\n";
+
+# Now we access the first four items in list (three are C++ objects that
+# EmployeeList's constructor adds, the last is our CEO). The virtual
+# methods of all these instances are treated the same. For items 0, 1, and
+# 2, both all methods resolve in C++. For item 3, our CEO, getTitle calls
+# getPosition which resolves in PHP. The call to getPosition is
+# slightly different, however, from the e.getPosition() call above, since
+# now the object reference has been "laundered" by passing through
+# EmployeeList as an Employee*. Previously, PHP resolved the call
+# immediately in CEO, but now PHP thinks the object is an instance of
+# class Employee (actually EmployeePtr). So the call passes through the
+# Employee proxy class and on to the C wrappers and C++ director,
+# eventually ending up back at the CEO implementation of getPosition().
+# The call to getTitle() for item 3 runs the C++ Employee::getTitle()
+# method, which in turn calls getPosition(). This virtual method call
+# passes down through the C++ director class to the PHP implementation
+# in CEO. All this routing takes place transparently.
+
+print "(position, title) for items 0-3:\n";
+
+printf(" %s, \"%s\"\n", $list->get_item(0)->getPosition(), $list->get_item(0)->getTitle());
+printf(" %s, \"%s\"\n", $list->get_item(1)->getPosition(), $list->get_item(1)->getTitle());
+printf(" %s, \"%s\"\n", $list->get_item(2)->getPosition(), $list->get_item(2)->getTitle());
+printf(" %s, \"%s\"\n", $list->get_item(3)->getPosition(), $list->get_item(3)->getTitle());
+print "----------------------\n";
+
+# Time to delete the EmployeeList, which will delete all the Employee*
+# items it contains. The last item is our CEO, which gets destroyed as its
+# reference count goes to zero. The PHP destructor runs, and is still
+# able to call the getName() method since the underlying C++ object still
+# exists. After this destructor runs the remaining C++ destructors run as
+# usual to destroy the object.
+
+unset($list);
+print "----------------------\n";
+
+# All done.
+
+print "php exit\n";
+
+?>
diff --git a/trunk/Examples/php/funcptr/Makefile b/trunk/Examples/php/funcptr/Makefile
new file mode 100644
index 000000000..0862ce5ec
--- /dev/null
+++ b/trunk/Examples/php/funcptr/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS = example.c
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/funcptr/example.c b/trunk/Examples/php/funcptr/example.c
new file mode 100644
index 000000000..99583b72e
--- /dev/null
+++ b/trunk/Examples/php/funcptr/example.c
@@ -0,0 +1,17 @@
+/* File : example.c */
+
+int do_op(int a, int b, int (*op)(int,int)) {
+ return (*op)(a,b);
+}
+
+int add(int a, int b) {
+ return a+b;
+}
+
+int sub(int a, int b) {
+ return a-b;
+}
+
+int mul(int a, int b) {
+ return a*b;
+}
diff --git a/trunk/Examples/php/funcptr/example.h b/trunk/Examples/php/funcptr/example.h
new file mode 100644
index 000000000..58989db79
--- /dev/null
+++ b/trunk/Examples/php/funcptr/example.h
@@ -0,0 +1,7 @@
+/* file: example.h */
+
+extern int do_op(int,int, int (*op)(int,int));
+extern int add(int,int);
+extern int sub(int,int);
+extern int mul(int,int);
+
diff --git a/trunk/Examples/php/funcptr/example.i b/trunk/Examples/php/funcptr/example.i
new file mode 100644
index 000000000..39390da27
--- /dev/null
+++ b/trunk/Examples/php/funcptr/example.i
@@ -0,0 +1,15 @@
+/* File : example.i */
+%module example
+%{
+#include "example.h"
+%}
+
+/* Wrap a function taking a pointer to a function */
+extern int do_op(int a, int b, int (*op)(int, int));
+
+/* Now install a bunch of "ops" as constants */
+%constant int (*ADD)(int,int) = add;
+%constant int (*SUB)(int,int) = sub;
+%constant int (*MUL)(int,int) = mul;
+
+
diff --git a/trunk/Examples/php/funcptr/runme.php b/trunk/Examples/php/funcptr/runme.php
new file mode 100644
index 000000000..712d4147c
--- /dev/null
+++ b/trunk/Examples/php/funcptr/runme.php
@@ -0,0 +1,24 @@
+<?php
+
+require "example.php";
+
+$a = 37;
+$b = 42;
+
+# Now call our C function with a bunch of callbacks
+
+print "Trying some C callback functions\n";
+print " a = $a\n";
+print " b = $b\n";
+print " ADD(a,b) = ". do_op($a,$b,ADD)."\n";
+print " SUB(a,b) = ". do_op($a,$b,SUB)."\n";
+print " MUL(a,b) = ". do_op($a,$b,MUL)."\n";
+
+print "Here is what the C callback function objects look like in php\n";
+print "Using swig style string pointers as we need them registered as constants\n";
+print " ADD = " . ADD . "\n";
+print " SUB = " . SUB . "\n";
+print " MUL = " . MUL . "\n";
+
+?>
+
diff --git a/trunk/Examples/php/overloading/Makefile b/trunk/Examples/php/overloading/Makefile
new file mode 100644
index 000000000..1bc0beaab
--- /dev/null
+++ b/trunk/Examples/php/overloading/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/overloading/example.cxx b/trunk/Examples/php/overloading/example.cxx
new file mode 100644
index 000000000..2f684f05c
--- /dev/null
+++ b/trunk/Examples/php/overloading/example.cxx
@@ -0,0 +1,55 @@
+/* File : example.c */
+
+#include "example.h"
+#include <math.h>
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+int Shape::get_nshapes() {
+ return nshapes;
+}
+
+/* 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;
+}
+
+const char *overloaded(int i) {
+ return "Overloaded with int";
+}
+
+const char *overloaded(double d) {
+ return "Overloaded with double";
+}
+
+const char *overloaded(const char * str) {
+ return "Overloaded with char *";
+}
+
+const char *overloaded( const Circle& ) {
+ return "Overloaded with Circle";
+}
+
+const char *overloaded( const Shape& ) {
+ return "Overloaded with Shape";
+}
diff --git a/trunk/Examples/php/overloading/example.h b/trunk/Examples/php/overloading/example.h
new file mode 100644
index 000000000..01d71dd70
--- /dev/null
+++ b/trunk/Examples/php/overloading/example.h
@@ -0,0 +1,46 @@
+/* File : example.h */
+
+#include <stdio.h>
+
+class Shape {
+public:
+ Shape() {
+ nshapes++;
+ }
+ virtual ~Shape() {
+ nshapes--;
+ }
+ double x, y;
+ void move(double dx, double dy);
+ virtual double area(void) = 0;
+ virtual double perimeter(void) = 0;
+ static int nshapes;
+ static int get_nshapes();
+};
+
+class Circle : public Shape {
+private:
+ double radius;
+public:
+ Circle(double r) : radius(r) { }
+ ~Circle() { }
+ virtual double area(void);
+ virtual double perimeter(void);
+};
+
+class Square : public Shape {
+private:
+ double width;
+public:
+ Square(double w) : width(w) { }
+ ~Square() { }
+ virtual double area(void);
+ virtual double perimeter(void);
+};
+
+const char *overloaded( int i );
+const char *overloaded( double d );
+const char *overloaded( const char * str );
+const char *overloaded( const Circle& );
+const char *overloaded( const Shape& );
+
diff --git a/trunk/Examples/php/overloading/example.i b/trunk/Examples/php/overloading/example.i
new file mode 100644
index 000000000..950d2549d
--- /dev/null
+++ b/trunk/Examples/php/overloading/example.i
@@ -0,0 +1,8 @@
+/* File : example.i */
+%module example
+
+%{
+#include "example.h"
+%}
+
+%include "example.h"
diff --git a/trunk/Examples/php/overloading/runme.php b/trunk/Examples/php/overloading/runme.php
new file mode 100644
index 000000000..01044445f
--- /dev/null
+++ b/trunk/Examples/php/overloading/runme.php
@@ -0,0 +1,59 @@
+<?php
+
+# This file illustrates the low-level C++ interface
+# created by SWIG. In this case, all of our C++ classes
+# get converted into function calls.
+
+include("example.php");
+
+# ----- Object creation -----
+
+print "Creating some objects:\n";
+$c = new Circle(10);
+print " Created circle \$c\n";
+$s = new Square(10);
+print " Created square \$s\n";
+
+# ----- Access a static member -----
+
+print "\nA total of " . Shape::nshapes() . " shapes were created\n";
+
+# ----- Member data access -----
+
+# Set the location of the object.
+# Note: methods in the base class Shape are used since
+# x and y are defined there.
+
+$c->x = 20;
+$c->y = 30;
+$s->x = -10;
+$s->y = 5;
+
+print "\nHere is their current position:\n";
+print " Circle = (" . $c->x . "," . $c->y . ")\n";
+print " Square = (" . $s->x . "," . $s->y . ")\n";
+
+# ----- Call some methods -----
+
+print "\nHere are some properties of the shapes:\n";
+foreach (array(1, 2.1, "quick brown fox", $c, $s) as $o) {
+ print " ".get_class($o)." \$o\n";
+ print " overloaded = " . overloaded($o) . "\n";
+ }
+
+# Need to unset($o) or else we hang on to a reference to the Square object.
+unset($o);
+
+# ----- Delete everything -----
+
+print "\nGuess I'll clean up now\n";
+
+# Note: this invokes the virtual destructor
+unset($c);
+$s = 42;
+
+print Shape::nshapes() . " shapes remain\n";
+
+print "Goodbye\n";
+
+?>
diff --git a/trunk/Examples/php/pointer/Makefile b/trunk/Examples/php/pointer/Makefile
new file mode 100644
index 000000000..0862ce5ec
--- /dev/null
+++ b/trunk/Examples/php/pointer/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS = example.c
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/pointer/example.c b/trunk/Examples/php/pointer/example.c
new file mode 100644
index 000000000..3326dec3e
--- /dev/null
+++ b/trunk/Examples/php/pointer/example.c
@@ -0,0 +1,16 @@
+/* File : example.c */
+
+void add(double *x, double *y, double *result) {
+ *result = *x + *y;
+}
+
+void sub(int *x, int *y, int *result) {
+ *result = *x - *y;
+}
+
+int divide(int n, int d, int *r) {
+ int q;
+ q = n/d;
+ *r = n - q*d;
+ return q;
+}
diff --git a/trunk/Examples/php/pointer/example.i b/trunk/Examples/php/pointer/example.i
new file mode 100644
index 000000000..c14b94189
--- /dev/null
+++ b/trunk/Examples/php/pointer/example.i
@@ -0,0 +1,24 @@
+/* File : example.i */
+%module example
+
+/* This example illustrates a couple of different techniques
+ for manipulating C pointers */
+
+%include phppointers.i
+/* First we'll use the pointer library */
+extern void add(double *REF, double *REF, double *REF);
+
+/* Next we'll use some typemaps */
+
+%include typemaps.i
+extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
+
+/* Next we'll use typemaps and the %apply directive */
+
+//%apply int *OUTPUT { int *r };
+//extern int divide(int n, int d, int *r);
+
+
+
+
+
diff --git a/trunk/Examples/php/pointer/runme.php b/trunk/Examples/php/pointer/runme.php
new file mode 100644
index 000000000..5e86de6a2
--- /dev/null
+++ b/trunk/Examples/php/pointer/runme.php
@@ -0,0 +1,35 @@
+<?php
+
+ require "example.php";
+
+ # First create some objects using the pointer library.
+
+ print "Testing the pointer library\n";
+
+ $a = 37.145;
+ $b = 42.555;
+ $c = ""; // $c must be defined and not null.
+
+ print " a = $a\n";
+ print " b = $b\n";
+ print " c = $c\n";
+
+ # Call the add() function wuth some pointers
+ add(&$a,&$b,&$c);
+
+ print " $a + $b = $c\n";
+
+ # Now try the typemap library
+ # This should be much easier. Now how it is no longer
+ # necessary to manufacture pointers.
+
+ print "Trying the typemap library\n";
+ $r = sub(37,42);
+ print " 37 - 42 = $r\n";
+
+ # Now try the version with multiple return values
+ # print "Testing multiple return values\n";
+ # ($q,$r) = divide(42,37);
+ # print " 42/37 = $q remainder $r\n";
+
+?>
diff --git a/trunk/Examples/php/pragmas/Makefile b/trunk/Examples/php/pragmas/Makefile
new file mode 100644
index 000000000..23e2675d7
--- /dev/null
+++ b/trunk/Examples/php/pragmas/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS =
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/pragmas/example.i b/trunk/Examples/php/pragmas/example.i
new file mode 100644
index 000000000..c7e8bf303
--- /dev/null
+++ b/trunk/Examples/php/pragmas/example.i
@@ -0,0 +1,31 @@
+/* File : example.i */
+%module example
+
+%init{
+ zend_printf("This was %%init\n");
+}
+
+%minit{
+ zend_printf("This was %%minit\n");
+}
+
+%mshutdown{
+ zend_printf("This was %%shutdown\n");
+}
+
+%rinit{
+ zend_printf("This was %%rinit\n");
+}
+
+%rshutdown{
+ zend_printf("This was %%rshutdown\n");
+}
+
+%pragma(php) include="include.php";
+
+%pragma(php) code="
+# This code is inserted into example.php
+echo \"this was php code\\n\";
+"
+
+%pragma(php) phpinfo="php_info_print_table_start();"
diff --git a/trunk/Examples/php/pragmas/include.php b/trunk/Examples/php/pragmas/include.php
new file mode 100644
index 000000000..e19880a06
--- /dev/null
+++ b/trunk/Examples/php/pragmas/include.php
@@ -0,0 +1,7 @@
+<?php
+
+# This code is inserted into example.php
+echo "this is include.php\n";
+
+
+?>
diff --git a/trunk/Examples/php/pragmas/runme.php b/trunk/Examples/php/pragmas/runme.php
new file mode 100755
index 000000000..538548b6f
--- /dev/null
+++ b/trunk/Examples/php/pragmas/runme.php
@@ -0,0 +1,5 @@
+<?php
+
+require "example.php";
+
+?>
diff --git a/trunk/Examples/php/proxy/Makefile b/trunk/Examples/php/proxy/Makefile
new file mode 100644
index 000000000..1bc0beaab
--- /dev/null
+++ b/trunk/Examples/php/proxy/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/proxy/example.cxx b/trunk/Examples/php/proxy/example.cxx
new file mode 100644
index 000000000..94e4a7888
--- /dev/null
+++ b/trunk/Examples/php/proxy/example.cxx
@@ -0,0 +1,43 @@
+/* File : example.c */
+
+#include "example.h"
+#include <math.h>
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+int Shape::get_nshapes() {
+ return nshapes;
+}
+
+/* Move the shape to a new location */
+void Shape::move(double dx, double dy) {
+ x += dx;
+ y += dy;
+}
+
+int Shape::nshapes = 0;
+
+void Circle::set_radius( double r ) {
+ radius = r;
+}
+
+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;
+}
+
+Circle *CircleFactory( double r ) {
+ return new Circle(r);
+}
diff --git a/trunk/Examples/php/proxy/example.h b/trunk/Examples/php/proxy/example.h
new file mode 100644
index 000000000..361dff898
--- /dev/null
+++ b/trunk/Examples/php/proxy/example.h
@@ -0,0 +1,43 @@
+/* File : example.h */
+
+#include <stdio.h>
+
+class Shape {
+public:
+ Shape() {
+ nshapes++;
+ }
+ virtual ~Shape() {
+ nshapes--;
+ };
+ double x, y;
+ void move(double dx, double dy);
+ virtual double area(void) = 0;
+ virtual double perimeter(void) = 0;
+ static int nshapes;
+ static int get_nshapes();
+};
+
+class Circle : public Shape {
+private:
+ double radius;
+public:
+ Circle(double r) : radius(r) { };
+ ~Circle() { };
+ void set_radius( double r );
+ virtual double area(void);
+ virtual double perimeter(void);
+};
+
+class Square : public Shape {
+private:
+ double width;
+public:
+ Square(double w) : width(w) { };
+ ~Square() { }
+ virtual double area(void);
+ virtual double perimeter(void);
+};
+
+Circle *CircleFactory( double r );
+
diff --git a/trunk/Examples/php/proxy/example.i b/trunk/Examples/php/proxy/example.i
new file mode 100644
index 000000000..ce73746d0
--- /dev/null
+++ b/trunk/Examples/php/proxy/example.i
@@ -0,0 +1,12 @@
+/* File : example.i */
+%module example
+
+%{
+#include "example.h"
+%}
+
+/* Let's just grab the original header file here */
+
+%newobject CircleFactory;
+%include "example.h"
+
diff --git a/trunk/Examples/php/proxy/runme.php b/trunk/Examples/php/proxy/runme.php
new file mode 100644
index 000000000..e70ab229f
--- /dev/null
+++ b/trunk/Examples/php/proxy/runme.php
@@ -0,0 +1,68 @@
+<?php
+
+# This file illustrates the low-level C++ interface
+# created by SWIG. In this case, all of our C++ classes
+# get converted into function calls.
+
+include("example.php");
+
+# ----- Object creation -----
+
+print "Creating some objects:\n";
+$c = example::CircleFactory(10);
+print " Created circle \$c with area ". $c->area() ."\n";
+$s = new Square(10);
+print " Created square \$s\n";
+
+# ----- Access a static member -----
+
+print "\nA total of " . Shape::nshapes() . " shapes were created\n";
+
+# ----- Member data access -----
+
+# Set the location of the object.
+# Note: methods in the base class Shape are used since
+# x and y are defined there.
+
+$c->x = 20;
+$c->y = 30;
+$s->x = -10;
+$s->y = 5;
+
+print "\nHere is their current position:\n";
+print " Circle = (" . $c->x . "," . $c->y . ")\n";
+print " Square = (" . $s->x . "," . $s->y . ")\n";
+
+# ----- Call some methods -----
+
+print "\nHere are some properties of the shapes:\n";
+foreach (array($c,$s) as $o) {
+ print " ".get_class($o)." \$o\n";
+ print " x = " . $o->x . "\n";
+ print " y = " . $o->y . "\n";
+ print " area = " . $o->area() . "\n";
+ print " perimeter = " . $o->perimeter() . "\n";
+ }
+
+# Need to unset($o) or else we hang on to a reference to the Square object.
+unset($o);
+
+# ----- Delete everything -----
+
+print "\nGuess I'll clean up now\n";
+
+# Note: this invokes the virtual destructor
+unset($c);
+$s = 42;
+
+print Shape::nshapes() . " shapes remain\n";
+
+print "Manually setting nshapes\n";
+
+Shape::nshapes(42);
+
+print Shape::get_nshapes() ." == 42\n";
+
+print "Goodbye\n";
+
+?>
diff --git a/trunk/Examples/php/reference/Makefile b/trunk/Examples/php/reference/Makefile
new file mode 100644
index 000000000..1bc0beaab
--- /dev/null
+++ b/trunk/Examples/php/reference/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/reference/example.cxx b/trunk/Examples/php/reference/example.cxx
new file mode 100644
index 000000000..13e47eade
--- /dev/null
+++ b/trunk/Examples/php/reference/example.cxx
@@ -0,0 +1,49 @@
+/* File : example.cxx */
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+#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::as_string() {
+ static char temp[512];
+ sprintf(temp,"Vector %p (%g,%g,%g)", this, x,y,z);
+ return temp;
+}
+
+VectorArray::VectorArray(int size) {
+ items = new Vector[size];
+ maxsize = size;
+ printf("VectorArray new: self=%p\n",this);
+}
+
+VectorArray::~VectorArray() {
+ printf("VectorArray delete: self=%p\n",this);
+ delete [] items;
+}
+
+Vector &VectorArray::operator[](int index) {
+ printf("VectorArray: read[%d] self=%p\n",index,this);
+ if ((index < 0) || (index >= maxsize)) {
+ printf("Panic! Array index out of bounds.\n");
+ exit(1);
+ }
+ return items[index];
+}
+
+int VectorArray::size() {
+ printf("VectorArray: size %d self=%p\n",maxsize,this);
+ return maxsize;
+}
diff --git a/trunk/Examples/php/reference/example.h b/trunk/Examples/php/reference/example.h
new file mode 100644
index 000000000..1b88cbf5c
--- /dev/null
+++ b/trunk/Examples/php/reference/example.h
@@ -0,0 +1,26 @@
+/* File : example.h */
+
+class 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) { };
+ friend Vector operator+(const Vector &a, const Vector &b);
+ char *as_string();
+};
+
+class VectorArray {
+private:
+ Vector *items;
+ int maxsize;
+public:
+ VectorArray(int maxsize);
+ ~VectorArray();
+ Vector &operator[](int);
+ int size();
+};
+
+
+
+
diff --git a/trunk/Examples/php/reference/example.i b/trunk/Examples/php/reference/example.i
new file mode 100644
index 000000000..d6122866b
--- /dev/null
+++ b/trunk/Examples/php/reference/example.i
@@ -0,0 +1,47 @@
+/* File : example.i */
+
+/* This example has nothing to do with references but the name is used by all
+ * the other languages so it's hard to rename to something more meaningful.
+ *
+ * Mostly it shows how to use %extend.
+ */
+
+%module example
+
+%{
+#include "example.h"
+%}
+
+class Vector {
+public:
+ Vector(double x, double y, double z);
+ ~Vector();
+ char *as_string();
+};
+
+/* This helper function calls an overloaded operator */
+%inline %{
+Vector addv(Vector &a, Vector &b) {
+ return a+b;
+}
+%}
+
+/* Wrapper around an array of vectors class */
+
+class VectorArray {
+public:
+ VectorArray(int maxsize);
+ ~VectorArray();
+ int size();
+
+ /* This wrapper provides an alternative to the [] operator */
+ %extend {
+ Vector &get(int index) {
+ printf("VectorArray extended get: %p %d\n",$self,index);
+ return (*$self)[index];
+ }
+ void set(int index, Vector &a) {
+ (*$self)[index] = a;
+ }
+ }
+};
diff --git a/trunk/Examples/php/reference/runme.php b/trunk/Examples/php/reference/runme.php
new file mode 100644
index 000000000..5d264ee43
--- /dev/null
+++ b/trunk/Examples/php/reference/runme.php
@@ -0,0 +1,49 @@
+<?php
+
+# This file illustrates the manipulation of C++ references in PHP.
+
+require "example.php";
+
+# ----- Object creation -----
+
+print "Creating some objects:\n";
+$a = new Vector(3, 4, 5);
+$b = new Vector(10, 11, 12);
+
+print " Created a: {$a->as_string()}\n";
+print " Created b: {$b->as_string()}\n";
+
+# ----- Call an overloaded operator -----
+
+# This calls the wrapper we placed around
+#
+# operator+(const Vector &a, const Vector &)
+#
+# It returns a new allocated object.
+
+print "Adding a+b\n";
+$c = example::addv($a, $b);
+print " a+b ={$c->as_string()}\n";
+
+# ----- Create a vector array -----
+
+print "Creating an array of vectors\n";
+$va = new VectorArray(10);
+
+print " va: size={$va->size()}\n";
+
+# ----- Set some values in the array -----
+
+# These operators copy the value of $a and $b to the vector array
+$va->set(0, $a);
+$va->set(1, $b);
+$va->set(2, addv($a, $b));
+
+# Get some values from the array
+
+print "Getting some array values\n";
+for ($i = 0; $i < 5; $i++) {
+ print " va[$i] = {$va->get($i)->as_string()}\n";
+}
+
+?>
diff --git a/trunk/Examples/php/simple/Makefile b/trunk/Examples/php/simple/Makefile
new file mode 100644
index 000000000..0862ce5ec
--- /dev/null
+++ b/trunk/Examples/php/simple/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS = example.c
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/simple/example.c b/trunk/Examples/php/simple/example.c
new file mode 100644
index 000000000..2fe275632
--- /dev/null
+++ b/trunk/Examples/php/simple/example.c
@@ -0,0 +1,23 @@
+/* File : example.c */
+#include <stdio.h>
+
+/* A global variable */
+double Foo = 3.0;
+
+void print_Foo() {
+ printf("In C, Foo = %f\n",Foo);
+}
+
+/* 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;
+}
+
+
diff --git a/trunk/Examples/php/simple/example.i b/trunk/Examples/php/simple/example.i
new file mode 100644
index 000000000..af4ff08a7
--- /dev/null
+++ b/trunk/Examples/php/simple/example.i
@@ -0,0 +1,10 @@
+/* File : example.i */
+%module example
+
+%{
+ extern double Foo;
+%}
+
+extern double Foo;
+void print_Foo();
+int gcd(int x, int y);
diff --git a/trunk/Examples/php/simple/runme.php b/trunk/Examples/php/simple/runme.php
new file mode 100755
index 000000000..0e96fe800
--- /dev/null
+++ b/trunk/Examples/php/simple/runme.php
@@ -0,0 +1,25 @@
+<?php
+
+require "example.php";
+
+# Call our gcd() function
+
+$x = "42 aaa";
+$y = 105;
+$g = gcd($x,$y);
+print "The gcd of $x and $y is $g\n";
+
+# Manipulate the Foo global variable
+
+# Output its current value
+print "Foo = " . Foo_get() . "\n";
+
+# Change its value
+Foo_set(3.1415926);
+
+# See if the change took effect ( this isn't a good example for php, see
+# manual for why. )
+print "Foo = " . Foo_get() . "\n";
+print_Foo();
+
+?>
diff --git a/trunk/Examples/php/sync/Makefile b/trunk/Examples/php/sync/Makefile
new file mode 100644
index 000000000..1bc0beaab
--- /dev/null
+++ b/trunk/Examples/php/sync/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+CXXSRCS = example.cxx
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php_cpp
+
+static::
+ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_cpp_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/sync/example.cxx b/trunk/Examples/php/sync/example.cxx
new file mode 100644
index 000000000..31ed2021b
--- /dev/null
+++ b/trunk/Examples/php/sync/example.cxx
@@ -0,0 +1,13 @@
+#include "example.h"
+#include <stdio.h>
+
+int x = 42;
+char *s = (char *)"Test";
+
+void Sync::printer(void) {
+
+ printf("The value of global s is %s\n", s);
+ printf("The value of global x is %d\n", x);
+ printf("The value of class s is %s\n", s);
+ printf("The value of class x is %d\n", x);
+};
diff --git a/trunk/Examples/php/sync/example.h b/trunk/Examples/php/sync/example.h
new file mode 100644
index 000000000..d67ec21dc
--- /dev/null
+++ b/trunk/Examples/php/sync/example.h
@@ -0,0 +1,9 @@
+extern char *s;
+extern int x;
+
+class Sync {
+ public:
+ int x;
+ char *s;
+ void printer(void);
+};
diff --git a/trunk/Examples/php/sync/example.i b/trunk/Examples/php/sync/example.i
new file mode 100644
index 000000000..17ff87cf3
--- /dev/null
+++ b/trunk/Examples/php/sync/example.i
@@ -0,0 +1,7 @@
+%module example
+
+%{
+#include "example.h"
+%}
+
+%include "example.h"
diff --git a/trunk/Examples/php/sync/runme.php b/trunk/Examples/php/sync/runme.php
new file mode 100644
index 000000000..a7c43474f
--- /dev/null
+++ b/trunk/Examples/php/sync/runme.php
@@ -0,0 +1,15 @@
+<?
+
+// Load module and PHP classes.
+include("example.php");
+
+echo "Got new object\n";
+echo "Got string $s and value $x \n";
+
+$s = new Sync();
+echo "Got new object\n";
+
+$s->printer();
+
+?>
+
diff --git a/trunk/Examples/php/value/Makefile b/trunk/Examples/php/value/Makefile
new file mode 100644
index 000000000..9e69d00a4
--- /dev/null
+++ b/trunk/Examples/php/value/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS = example.c
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT = -noproxy
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/value/example.c b/trunk/Examples/php/value/example.c
new file mode 100644
index 000000000..3c402a214
--- /dev/null
+++ b/trunk/Examples/php/value/example.c
@@ -0,0 +1,13 @@
+/* File : example.c */
+
+#include "example.h"
+
+double dot_product(Vector a, Vector b) {
+ return (a.x*b.x + a.y*b.y + a.z*b.z);
+}
+
+void vector_add(Vector a, Vector b, Vector* result) {
+ result->x = a.x + b.x;
+ result->y = a.y + b.y;
+ result->z = a.z + b.z;
+}
diff --git a/trunk/Examples/php/value/example.h b/trunk/Examples/php/value/example.h
new file mode 100644
index 000000000..f55752a5f
--- /dev/null
+++ b/trunk/Examples/php/value/example.h
@@ -0,0 +1,8 @@
+/* File : example.h */
+
+typedef struct {
+ double x, y, z;
+} Vector;
+
+double dot_product(Vector a, Vector b);
+void vector_add(Vector a, Vector b, Vector* result);
diff --git a/trunk/Examples/php/value/example.i b/trunk/Examples/php/value/example.i
new file mode 100644
index 000000000..386fa3b84
--- /dev/null
+++ b/trunk/Examples/php/value/example.i
@@ -0,0 +1,17 @@
+// Tests SWIG's handling of pass-by-value for complex datatypes
+%module example
+
+%{
+#include "example.h"
+%}
+
+%include "example.h"
+
+/* Some helper functions for our interface */
+%inline %{
+
+void vector_print(Vector *v) {
+ printf("Vector %p = (%g, %g, %g)\n", v, v->x, v->y, v->z);
+}
+%}
+
diff --git a/trunk/Examples/php/value/runme.php b/trunk/Examples/php/value/runme.php
new file mode 100644
index 000000000..49115376c
--- /dev/null
+++ b/trunk/Examples/php/value/runme.php
@@ -0,0 +1,43 @@
+<?php
+
+ require "example.php";
+
+
+ $v = new_vector();
+ vector_x_set($v,1.0);
+ vector_y_set($v,2.0);
+ vector_z_set($v,3.0);
+
+ $w = new_vector();
+ vector_x_set($w,10.0);
+ vector_y_set($w,11.0);
+ vector_z_set($w,12.0);
+
+ echo "I just created the following vector\n";
+ vector_print($v);
+ vector_print($w);
+
+ echo "\nNow I'm going to compute the dot product\n";
+
+ $d = dot_product($v, $w);
+
+ echo "dot product = $d (should be 68)\n";
+
+ echo "\nNow I'm going to add the vectors together\n";
+
+ $r = new_vector();
+ vector_add($v, $w, $r);
+
+ vector_print($r);
+
+ echo "The value should be (11,13,15)\n";
+
+ echo "\nNow I'm going to clean up the return result\n";
+
+# free($r);
+
+ echo "Good\n";
+
+?>
+
+
diff --git a/trunk/Examples/php/variables/Makefile b/trunk/Examples/php/variables/Makefile
new file mode 100644
index 000000000..0862ce5ec
--- /dev/null
+++ b/trunk/Examples/php/variables/Makefile
@@ -0,0 +1,24 @@
+TOP = ../..
+SWIG = $(TOP)/../preinst-swig
+SRCS = example.c
+TARGET = example
+INTERFACE = example.i
+LIBS =
+SWIGOPT =
+
+all::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
+ php
+
+static::
+ $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
+ SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \
+ php_static
+
+clean::
+ $(MAKE) -f $(TOP)/Makefile php_clean
+ rm -f $(TARGET).php
+
+check: all
+ $(MAKE) -f $(TOP)/Makefile php_run
diff --git a/trunk/Examples/php/variables/example.c b/trunk/Examples/php/variables/example.c
new file mode 100644
index 000000000..3114c7c5f
--- /dev/null
+++ b/trunk/Examples/php/variables/example.c
@@ -0,0 +1,95 @@
+/* File : example.c */
+
+/* I'm a file containing some C global variables */
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+#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[] = "Goodbye";
+int *iptrvar = 0;
+char name[5] = "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 = %p\n", iptrvar);
+ printf("name = %c%c%c%c%c\n", name[0],name[1],name[2],name[3],name[4]);
+ printf("ptptr = %p %s\n", ptptr, Point_print( ptptr ) );
+ 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;
+}
+
+int value_int(int *value) {
+ return *value;
+}
+
+/* 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);
+}
diff --git a/trunk/Examples/php/variables/example.h b/trunk/Examples/php/variables/example.h
new file mode 100644
index 000000000..3b3659ce5
--- /dev/null
+++ b/trunk/Examples/php/variables/example.h
@@ -0,0 +1,34 @@
+/* File: example.h */
+
+typedef struct {
+ int x,y;
+} Point;
+
+/* 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[5];
+
+extern Point *ptptr;
+extern Point pt;
+
+extern int status;
+extern char path[256];
+
+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();
diff --git a/trunk/Examples/php/variables/example.i b/trunk/Examples/php/variables/example.i
new file mode 100644
index 000000000..3edbb72d7
--- /dev/null
+++ b/trunk/Examples/php/variables/example.i
@@ -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[5];
+
+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();
+
+
+
+
diff --git a/trunk/Examples/php/variables/runme.php b/trunk/Examples/php/variables/runme.php
new file mode 100644
index 000000000..bbfeb610b
--- /dev/null
+++ b/trunk/Examples/php/variables/runme.php
@@ -0,0 +1,96 @@
+<?php
+
+ require "example.php";
+ echo "\nVariables (values printed from C)\n";
+
+ print_vars();
+
+ echo "Variables (values printed from PHP)\n";
+
+ echo "ivar = ".ivar_get()."\n";
+ echo "svar = ".svar_get()."\n";
+ echo "lvar = ".lvar_get()."\n";
+ echo "uivar = ".uivar_get()."\n";
+ echo "usvar = ".usvar_get()."\n";
+ echo "ulvar = ".ulvar_get()."\n";
+ echo "scvar = ".scvar_get()."\n";
+ echo "ucvar = ".ucvar_get()."\n";
+ echo "cvar = ".cvar_get()."\n";
+ echo "fvar = ".fvar_get()."\n";
+ echo "dvar = ".dvar_get()."\n";
+ echo "strvar = ".strvar_get()."\n";
+ echo "cstrvar = ".cstrvar_get()."\n";
+ echo "iptrvar = ".iptrvar_get()."\n";
+ echo "name = \"".name_get()."\"\n";
+ echo "ptptr = ".ptptr_get() , point_print(ptptr_get()) , "\n";
+ echo "pt = ".pt_get(), point_print(pt_get()) , "\n";
+
+ /* Try to set the values of some global variables */
+$a = "42.14";
+
+ ivar_set($a);
+echo "a = $a\n";
+ svar_set(-31000);
+ lvar_set(65537);
+ uivar_set(123456);
+ usvar_set(61000);
+ ulvar_set(654321);
+ scvar_set(-13);
+ ucvar_set(251);
+ cvar_set("S");
+ fvar_set(3.14159);
+ dvar_set(2.1828);
+ strvar_set("Hello World");
+ iptrvar_set(new_int(37));
+ ptptr_set(new_point(37,42));
+ name_set("B");
+
+ echo "Variables (values printed from PHP)\n";
+
+ echo "ivar = ".ivar_get()."\n";
+ echo "svar = ".svar_get()."\n";
+ echo "lvar = ".lvar_get()."\n";
+ echo "uivar = ".uivar_get()."\n";
+ echo "usvar = ".usvar_get()."\n";
+ echo "ulvar = ".ulvar_get()."\n";
+ echo "scvar = ".scvar_get()."\n";
+ echo "ucvar = ".ucvar_get()."\n";
+ echo "cvar = ".cvar_get()."\n";
+ echo "fvar = ".fvar_get()."\n";
+ echo "dvar = ".dvar_get()."\n";
+ echo "strvar = ".strvar_get()."\n";
+ echo "cstrvar = ".cstrvar_get()."\n";
+ echo "iptrvar = ".iptrvar_get()."\n";
+ echo "name = ".name_get()."\n";
+ echo "ptptr = ".ptptr_get() , point_print(ptptr_get()) , "\n";
+ echo "pt = ".pt_get(), point_print(pt_get()) , "\n";
+
+ echo "\nVariables (values printed from C)\n";
+
+ print_vars();
+
+ echo "\nI'm going to try and update a structure variable.\n";
+
+ pt_set(ptptr_get());
+
+ echo "The new value is \n";
+
+ pt_print();
+
+ echo "You should see the value", point_print(ptptr_get()), "\n";
+
+ echo "\nNow I'm going to try and modify some read only variables\n";
+
+ echo "Trying to set 'path'\n";
+
+ //path_set("Whoa!");
+ echo "Path = ".path_get()."\n";
+
+ echo "Trying to set 'status'\n";
+
+ /* And this */
+ //status_set(0);
+ echo "Status = ".status_get()."\n";
+
+?>
+