diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2009-08-18 20:56:02 +0000 |
---|---|---|
committer | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-09-25 16:59:08 +0000 |
commit | 9f8a09ed743cedd9547bf0661d518647966ab114 (patch) | |
tree | 9c7803d3b27a8ec22e91792ac7f7932efa128b20 /Examples/php | |
download | swig-tarball-master.tar.gz |
Imported from /srv/lorry/lorry-area/swig-tarball/swig-1.3.40.tar.gz.HEADswig-1.3.40master
Diffstat (limited to 'Examples/php')
84 files changed, 2539 insertions, 0 deletions
diff --git a/Examples/php/callback/Makefile b/Examples/php/callback/Makefile new file mode 100644 index 0000000..4259720 --- /dev/null +++ b/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/Examples/php/callback/example.cxx b/Examples/php/callback/example.cxx new file mode 100644 index 0000000..450d756 --- /dev/null +++ b/Examples/php/callback/example.cxx @@ -0,0 +1,4 @@ +/* File : example.cxx */ + +#include "example.h" + diff --git a/Examples/php/callback/example.h b/Examples/php/callback/example.h new file mode 100644 index 0000000..2a01949 --- /dev/null +++ b/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/Examples/php/callback/example.i b/Examples/php/callback/example.i new file mode 100644 index 0000000..90beda0 --- /dev/null +++ b/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/Examples/php/callback/index.html b/Examples/php/callback/index.html new file mode 100644 index 0000000..2aa720e --- /dev/null +++ b/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/Examples/php/callback/runme.php b/Examples/php/callback/runme.php new file mode 100644 index 0000000..2be7199 --- /dev/null +++ b/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/Examples/php/check.list b/Examples/php/check.list new file mode 100644 index 0000000..28c7a61 --- /dev/null +++ b/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/Examples/php/class/Makefile b/Examples/php/class/Makefile new file mode 100644 index 0000000..1bc0bea --- /dev/null +++ b/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/Examples/php/class/example.cxx b/Examples/php/class/example.cxx new file mode 100644 index 0000000..f171f10 --- /dev/null +++ b/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/Examples/php/class/example.h b/Examples/php/class/example.h new file mode 100644 index 0000000..02eaf72 --- /dev/null +++ b/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/Examples/php/class/example.i b/Examples/php/class/example.i new file mode 100644 index 0000000..75700b3 --- /dev/null +++ b/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/Examples/php/class/runme.php b/Examples/php/class/runme.php new file mode 100644 index 0000000..12b6860 --- /dev/null +++ b/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/Examples/php/constants/Makefile b/Examples/php/constants/Makefile new file mode 100644 index 0000000..23e2675 --- /dev/null +++ b/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/Examples/php/constants/example.i b/Examples/php/constants/example.i new file mode 100644 index 0000000..0098a89 --- /dev/null +++ b/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/Examples/php/constants/runme.php b/Examples/php/constants/runme.php new file mode 100644 index 0000000..cea0648 --- /dev/null +++ b/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/Examples/php/cpointer/Makefile b/Examples/php/cpointer/Makefile new file mode 100644 index 0000000..0862ce5 --- /dev/null +++ b/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/Examples/php/cpointer/example.c b/Examples/php/cpointer/example.c new file mode 100644 index 0000000..3326dec --- /dev/null +++ b/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/Examples/php/cpointer/example.i b/Examples/php/cpointer/example.i new file mode 100644 index 0000000..52e6df1 --- /dev/null +++ b/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/Examples/php/cpointer/runme.php b/Examples/php/cpointer/runme.php new file mode 100644 index 0000000..f5ef08a --- /dev/null +++ b/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 " 38 + 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/Examples/php/disown/Makefile b/Examples/php/disown/Makefile new file mode 100644 index 0000000..1bc0bea --- /dev/null +++ b/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/Examples/php/disown/example.cxx b/Examples/php/disown/example.cxx new file mode 100644 index 0000000..6393735 --- /dev/null +++ b/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/Examples/php/disown/example.h b/Examples/php/disown/example.h new file mode 100644 index 0000000..985bc33 --- /dev/null +++ b/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/Examples/php/disown/example.i b/Examples/php/disown/example.i new file mode 100644 index 0000000..599f162 --- /dev/null +++ b/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/Examples/php/disown/runme.php b/Examples/php/disown/runme.php new file mode 100644 index 0000000..73d5078 --- /dev/null +++ b/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/Examples/php/enum/Makefile b/Examples/php/enum/Makefile new file mode 100644 index 0000000..252a726 --- /dev/null +++ b/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/Examples/php/enum/example.cxx b/Examples/php/enum/example.cxx new file mode 100644 index 0000000..df7bb63 --- /dev/null +++ b/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/Examples/php/enum/example.h b/Examples/php/enum/example.h new file mode 100644 index 0000000..525d62a --- /dev/null +++ b/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/Examples/php/enum/example.i b/Examples/php/enum/example.i new file mode 100644 index 0000000..abf2547 --- /dev/null +++ b/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/Examples/php/enum/runme.php b/Examples/php/enum/runme.php new file mode 100644 index 0000000..55b0bc4 --- /dev/null +++ b/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/Examples/php/extend/Makefile b/Examples/php/extend/Makefile new file mode 100644 index 0000000..4259720 --- /dev/null +++ b/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/Examples/php/extend/example.cxx b/Examples/php/extend/example.cxx new file mode 100644 index 0000000..450d756 --- /dev/null +++ b/Examples/php/extend/example.cxx @@ -0,0 +1,4 @@ +/* File : example.cxx */ + +#include "example.h" + diff --git a/Examples/php/extend/example.h b/Examples/php/extend/example.h new file mode 100644 index 0000000..b27ab97 --- /dev/null +++ b/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/Examples/php/extend/example.i b/Examples/php/extend/example.i new file mode 100644 index 0000000..c8ec32e --- /dev/null +++ b/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/Examples/php/extend/index.html b/Examples/php/extend/index.html new file mode 100644 index 0000000..32c6a49 --- /dev/null +++ b/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/Examples/php/extend/runme.php b/Examples/php/extend/runme.php new file mode 100644 index 0000000..1586831 --- /dev/null +++ b/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/Examples/php/funcptr/Makefile b/Examples/php/funcptr/Makefile new file mode 100644 index 0000000..0862ce5 --- /dev/null +++ b/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/Examples/php/funcptr/example.c b/Examples/php/funcptr/example.c new file mode 100644 index 0000000..99583b7 --- /dev/null +++ b/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/Examples/php/funcptr/example.h b/Examples/php/funcptr/example.h new file mode 100644 index 0000000..58989db --- /dev/null +++ b/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/Examples/php/funcptr/example.i b/Examples/php/funcptr/example.i new file mode 100644 index 0000000..39390da --- /dev/null +++ b/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/Examples/php/funcptr/runme.php b/Examples/php/funcptr/runme.php new file mode 100644 index 0000000..712d414 --- /dev/null +++ b/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/Examples/php/overloading/Makefile b/Examples/php/overloading/Makefile new file mode 100644 index 0000000..1bc0bea --- /dev/null +++ b/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/Examples/php/overloading/example.cxx b/Examples/php/overloading/example.cxx new file mode 100644 index 0000000..2f684f0 --- /dev/null +++ b/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/Examples/php/overloading/example.h b/Examples/php/overloading/example.h new file mode 100644 index 0000000..01d71dd --- /dev/null +++ b/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/Examples/php/overloading/example.i b/Examples/php/overloading/example.i new file mode 100644 index 0000000..950d254 --- /dev/null +++ b/Examples/php/overloading/example.i @@ -0,0 +1,8 @@ +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +%include "example.h" diff --git a/Examples/php/overloading/runme.php b/Examples/php/overloading/runme.php new file mode 100644 index 0000000..5aa6904 --- /dev/null +++ b/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/Examples/php/pointer/Makefile b/Examples/php/pointer/Makefile new file mode 100644 index 0000000..0862ce5 --- /dev/null +++ b/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/Examples/php/pointer/example.c b/Examples/php/pointer/example.c new file mode 100644 index 0000000..3326dec --- /dev/null +++ b/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/Examples/php/pointer/example.i b/Examples/php/pointer/example.i new file mode 100644 index 0000000..c14b941 --- /dev/null +++ b/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/Examples/php/pointer/runme.php b/Examples/php/pointer/runme.php new file mode 100644 index 0000000..5e86de6 --- /dev/null +++ b/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/Examples/php/pragmas/Makefile b/Examples/php/pragmas/Makefile new file mode 100644 index 0000000..23e2675 --- /dev/null +++ b/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/Examples/php/pragmas/example.i b/Examples/php/pragmas/example.i new file mode 100644 index 0000000..c7e8bf3 --- /dev/null +++ b/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/Examples/php/pragmas/include.php b/Examples/php/pragmas/include.php new file mode 100644 index 0000000..e19880a --- /dev/null +++ b/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/Examples/php/pragmas/runme.php b/Examples/php/pragmas/runme.php new file mode 100755 index 0000000..538548b --- /dev/null +++ b/Examples/php/pragmas/runme.php @@ -0,0 +1,5 @@ +<?php + +require "example.php"; + +?> diff --git a/Examples/php/proxy/Makefile b/Examples/php/proxy/Makefile new file mode 100644 index 0000000..1bc0bea --- /dev/null +++ b/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/Examples/php/proxy/example.cxx b/Examples/php/proxy/example.cxx new file mode 100644 index 0000000..94e4a78 --- /dev/null +++ b/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/Examples/php/proxy/example.h b/Examples/php/proxy/example.h new file mode 100644 index 0000000..361dff8 --- /dev/null +++ b/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/Examples/php/proxy/example.i b/Examples/php/proxy/example.i new file mode 100644 index 0000000..ce73746 --- /dev/null +++ b/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/Examples/php/proxy/runme.php b/Examples/php/proxy/runme.php new file mode 100644 index 0000000..dea80e3 --- /dev/null +++ b/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 = 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/Examples/php/reference/Makefile b/Examples/php/reference/Makefile new file mode 100644 index 0000000..1bc0bea --- /dev/null +++ b/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/Examples/php/reference/example.cxx b/Examples/php/reference/example.cxx new file mode 100644 index 0000000..13e47ea --- /dev/null +++ b/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/Examples/php/reference/example.h b/Examples/php/reference/example.h new file mode 100644 index 0000000..1b88cbf --- /dev/null +++ b/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/Examples/php/reference/example.i b/Examples/php/reference/example.i new file mode 100644 index 0000000..d612286 --- /dev/null +++ b/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/Examples/php/reference/runme-proxy.php4 b/Examples/php/reference/runme-proxy.php4 new file mode 100644 index 0000000..9d216f7 --- /dev/null +++ b/Examples/php/reference/runme-proxy.php4 @@ -0,0 +1,79 @@ +<?php + +# This file illustrates the manipulation of C++ references in Php. +# This uses the low-level interface. Proxy classes work differently. + +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 " . $a->print() . "\n"; +print " Created b: $b " . $b->print() . "\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 = addv($a,$b); +print " a+b =". $c->print()."\n"; + +# Note: Unless we free the result, a memory leak will occur +$c = 0; + +# ----- Create a vector array ----- + +# Note: Using the high-level interface here +print "Creating an array of vectors\n"; +$va = new VectorArray(10); + +print " va: $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->get(0); +# This will work, but it will cause a memory leak! + +$va->set(2,addv($a,$b)); + +# The non-leaky way to do it + +$c = addv($a,$b); +$va->set(3,$c); +$c = NULL; + +# Get some values from the array + +print "Getting some array values\n"; +for ($i = 0; $i < 5; $i++) { +print "do $i\n"; + $v = $va->get($i); + print " va($i) = ". $v->print(). "\n"; +} + +# Watch under resource meter to check on this +#print "Making sure we don't leak memory.\n"; +#for ($i = 0; $i < 1000000; $i++) { +# $c = VectorArray_get($va,$i % 10); +#} + +# ----- Clean up ----- +print "Cleaning up\n"; +# wants fixing FIXME +#delete_VectorArray($va); +#delete_Vector($a); +#delete_Vector($b); + +?> diff --git a/Examples/php/reference/runme.php b/Examples/php/reference/runme.php new file mode 100644 index 0000000..5d264ee --- /dev/null +++ b/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/Examples/php/simple/Makefile b/Examples/php/simple/Makefile new file mode 100644 index 0000000..0862ce5 --- /dev/null +++ b/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/Examples/php/simple/example.c b/Examples/php/simple/example.c new file mode 100644 index 0000000..2fe2756 --- /dev/null +++ b/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/Examples/php/simple/example.i b/Examples/php/simple/example.i new file mode 100644 index 0000000..af4ff08 --- /dev/null +++ b/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/Examples/php/simple/runme.php b/Examples/php/simple/runme.php new file mode 100755 index 0000000..0e96fe8 --- /dev/null +++ b/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/Examples/php/sync/Makefile b/Examples/php/sync/Makefile new file mode 100644 index 0000000..1bc0bea --- /dev/null +++ b/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/Examples/php/sync/example.cxx b/Examples/php/sync/example.cxx new file mode 100644 index 0000000..31ed202 --- /dev/null +++ b/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/Examples/php/sync/example.h b/Examples/php/sync/example.h new file mode 100644 index 0000000..d67ec21 --- /dev/null +++ b/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/Examples/php/sync/example.i b/Examples/php/sync/example.i new file mode 100644 index 0000000..17ff87c --- /dev/null +++ b/Examples/php/sync/example.i @@ -0,0 +1,7 @@ +%module example + +%{ +#include "example.h" +%} + +%include "example.h" diff --git a/Examples/php/sync/runme.php b/Examples/php/sync/runme.php new file mode 100644 index 0000000..a7c4347 --- /dev/null +++ b/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/Examples/php/value/Makefile b/Examples/php/value/Makefile new file mode 100644 index 0000000..9e69d00 --- /dev/null +++ b/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/Examples/php/value/example.c b/Examples/php/value/example.c new file mode 100644 index 0000000..3c402a2 --- /dev/null +++ b/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/Examples/php/value/example.h b/Examples/php/value/example.h new file mode 100644 index 0000000..f55752a --- /dev/null +++ b/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/Examples/php/value/example.i b/Examples/php/value/example.i new file mode 100644 index 0000000..386fa3b --- /dev/null +++ b/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/Examples/php/value/runme.php b/Examples/php/value/runme.php new file mode 100644 index 0000000..4911537 --- /dev/null +++ b/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/Examples/php/variables/Makefile b/Examples/php/variables/Makefile new file mode 100644 index 0000000..0862ce5 --- /dev/null +++ b/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/Examples/php/variables/example.c b/Examples/php/variables/example.c new file mode 100644 index 0000000..3114c7c --- /dev/null +++ b/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/Examples/php/variables/example.h b/Examples/php/variables/example.h new file mode 100644 index 0000000..3b3659c --- /dev/null +++ b/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/Examples/php/variables/example.i b/Examples/php/variables/example.i new file mode 100644 index 0000000..3edbb72 --- /dev/null +++ b/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/Examples/php/variables/runme.php b/Examples/php/variables/runme.php new file mode 100644 index 0000000..bbfeb61 --- /dev/null +++ b/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"; + +?> + diff --git a/Examples/php/variables/runme.php4.old b/Examples/php/variables/runme.php4.old new file mode 100644 index 0000000..9a6bfb3 --- /dev/null +++ b/Examples/php/variables/runme.php4.old @@ -0,0 +1,80 @@ +<?php +### THIS VERSION was written for when php global vars fakingly mirrored +### the wrapped global vars, but it was very inefficient. +### For now we don't do this (pending some changes to php itself) so +### we use accessor functions instead; WE KEEP THIS version around ready +### for when those php changes are made and we can switch back. +### Specifically we want $_GLOBALS variable overloading like object +### property overloading + + require "example.php"; + + /* Try to set the values of some global variables */ + + $ivar = 42; + $svar = -31000; + $lvar = 65537; + $uivar = 123456; + $usvar = 61000; + $ulvar = 654321; + $scvar = -13; + $ucvar = 251; + $cvar = "S"; + $fvar = 3.14159; + $dvar = 2.1828; + $strvar = "Hello World"; + $cstrvar = "Goodbye"; + $iptrvar = new_int(37); + $ptptr = new_point(37,42); + $name = "Bill"; + + echo "Variables (values printed from PHP)\n"; + + echo "ivar = $ivar\n"; + echo "svar = $svar\n"; + echo "lvar = $lvar\n"; + echo "uivar = $uivar\n"; + echo "usvar = $usvar\n"; + echo "ulvar = $ulvar\n"; + echo "scvar = $scvar\n"; + echo "ucvar = $ucvar\n"; + echo "cvar = $cvar\n"; + echo "fvar = $fvar\n"; + echo "dvar = $dvar\n"; + echo "strvar = $strvar\n"; + echo "cstrvar = $cstrvar\n"; + echo "iptrvar = $iptrvar\n"; + echo "name = $name\n"; + echo "ptptr = $ptptr" , point_print($ptptr) , "\n"; + echo "pt = $pt" , point_print($pt) , "\n"; + + echo "\nVariables (values printed from C)\n"; + + print_vars(); + + echo "\nI'm going to try and update a structure variable.\n"; + + $pt = $ptptr; + + echo "The new value is \n"; + + pt_print(); + + echo "You should see the value", point_print($ptptr), "\n"; + + echo "\nNow I'm going to try and modify some read only variables\n"; + + echo "Trying to set 'path'\n"; + + /* Sadly this works */ + $path = "Whoa!"; + echo "Path = $path\n"; + + echo "Trying to set 'status'\n"; + + /* And this */ + $status = 0; + echo "Status = $status\n"; + +?> + |