diff options
Diffstat (limited to 'Examples/ocaml')
-rw-r--r-- | Examples/ocaml/check.list | 2 | ||||
-rw-r--r-- | Examples/ocaml/simple/Makefile | 21 | ||||
-rw-r--r-- | Examples/ocaml/simple/example.c | 18 | ||||
-rw-r--r-- | Examples/ocaml/simple/example.dsp | 148 | ||||
-rw-r--r-- | Examples/ocaml/simple/example.i | 5 | ||||
-rw-r--r-- | Examples/ocaml/simple/example_prog.ml | 37 | ||||
-rw-r--r-- | Examples/ocaml/simple/index.html | 99 |
7 files changed, 330 insertions, 0 deletions
diff --git a/Examples/ocaml/check.list b/Examples/ocaml/check.list new file mode 100644 index 000000000..d38998cab --- /dev/null +++ b/Examples/ocaml/check.list @@ -0,0 +1,2 @@ +# see top-level Makefile.in +simple diff --git a/Examples/ocaml/simple/Makefile b/Examples/ocaml/simple/Makefile new file mode 100644 index 000000000..bac7edf47 --- /dev/null +++ b/Examples/ocaml/simple/Makefile @@ -0,0 +1,21 @@ +TOP = ../.. +SWIG = $(TOP)/../swig +SRCS = example.c +TARGET = example +INTERFACE = example.i +MLFILE = example.ml +PROGFILE = example_prog.ml +OBJS = example.o + +all:: static + +static:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' MLFILE='$(MLFILE)' \ + PROGFILE='$(PROGFILE)' OBJS='$(OBJS)' \ + ocaml_static + +clean:: + $(MAKE) -f $(TOP)/Makefile MLFILE='$(MLFILE)' ocaml_clean + +check: all diff --git a/Examples/ocaml/simple/example.c b/Examples/ocaml/simple/example.c new file mode 100644 index 000000000..1c2af789c --- /dev/null +++ b/Examples/ocaml/simple/example.c @@ -0,0 +1,18 @@ +/* File : example.c */ + +/* A global variable */ +double Foo = 3.0; + +/* Compute the greatest common divisor of positive integers */ +int gcd(int x, int y) { + int g; + g = y; + while (x > 0) { + g = x; + x = y % x; + y = g; + } + return g; +} + + diff --git a/Examples/ocaml/simple/example.dsp b/Examples/ocaml/simple/example.dsp new file mode 100644 index 000000000..e905647a5 --- /dev/null +++ b/Examples/ocaml/simple/example.dsp @@ -0,0 +1,148 @@ +# Microsoft Developer Studio Project File - Name="example" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=example - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "example.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "example.mak" CFG="example - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "example - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "example - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "example - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "$(PYTHON_INCLUDE)" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib $(PYTHON_LIB) /nologo /dll /debug /machine:I386 /out:"example.dll" /pdbtype:sept + +!ELSEIF "$(CFG)" == "example - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "$(PYTHON_INCLUDE)" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib $(PYTHON_LIB) /nologo /dll /machine:I386 /out:"example.dll" + +!ENDIF + +# Begin Target + +# Name "example - Win32 Debug" +# Name "example - Win32 Release" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\example.c +# End Source File +# Begin Source File + +SOURCE=.\example_wrap.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\example.i + +!IF "$(CFG)" == "example - Win32 Debug" + +# Begin Custom Build +InputPath=.\example.i +InputName=example + +"$(InputName)_wrap.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + echo In order to function correctly, please ensure the following environment variables are correctly set: + echo PYTHON_INCLUDE: %PYTHON_INCLUDE% + echo PYTHON_LIB: %PYTHON_LIB% + echo on + ..\..\..\swig -python $(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "example - Win32 Release" + +# Begin Custom Build +InputPath=.\example.i +InputName=example + +"$(InputName)_wrap.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + echo In order to function correctly, please ensure the following environment variables are correctly set: + echo PYTHON_INCLUDE: %PYTHON_INCLUDE% + echo PYTHON_LIB: %PYTHON_LIB% + echo on + ..\..\..\swig -python $(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/Examples/ocaml/simple/example.i b/Examples/ocaml/simple/example.i new file mode 100644 index 000000000..6702abb1e --- /dev/null +++ b/Examples/ocaml/simple/example.i @@ -0,0 +1,5 @@ +/* File : example.i */ +%module example + +extern int gcd(int x, int y); +extern double Foo; diff --git a/Examples/ocaml/simple/example_prog.ml b/Examples/ocaml/simple/example_prog.ml new file mode 100644 index 000000000..5dafdc219 --- /dev/null +++ b/Examples/ocaml/simple/example_prog.ml @@ -0,0 +1,37 @@ +(* example_prog.ml *) + +open Example + +(* Call our gcd() function *) + +exception NoReturn + +let single_int x = + match x with C_int a -> a | _ -> raise NoReturn +let get_float x = + match x with C_float f -> f | C_double f -> f | _ -> raise NoReturn + +let x = 42 +let y = 105 +let g = single_int (_gcd (C_list [ C_int x ; C_int y ])) +let _ = Printf.printf "The gcd of %d and %d is %d\n" x y g + +(* Manipulate the Foo global variable *) + +(* Output its current value *) +let _ = Printf.printf "Foo = %f\n" (get_float (_Foo C_void)) + +(* Change its value *) +let _ = _Foo (C_float 3.1415926) + +(* See if the change took effect *) +let _ = Printf.printf "Foo = %f\n" (get_float (_Foo C_void)) + + + + + + + + + diff --git a/Examples/ocaml/simple/index.html b/Examples/ocaml/simple/index.html new file mode 100644 index 000000000..9638708cc --- /dev/null +++ b/Examples/ocaml/simple/index.html @@ -0,0 +1,99 @@ +<html> +<head> +<title>SWIG:Examples:python:simple</title> +</head> + +<body bgcolor="#ffffff"> + + +<tt>SWIG/Examples/python/simple/</tt> +<hr> + +<H2>Simple Python Example</H2> + +<tt>$Header$</tt><br> + +<p> +This example illustrates how you can hook Python to a very simple C program containing +a function and a global variable. + +<h2>The C Code</h2> + +Suppose you have the following C code: + +<blockquote> +<pre> +/* File : example.c */ + +/* A global variable */ +double Foo = 3.0; + +/* Compute the greatest common divisor of positive integers */ +int gcd(int x, int y) { + int g; + g = y; + while (x > 0) { + g = x; + x = y % x; + y = g; + } + return g; +} +</pre> +</blockquote> + +<h2>The SWIG interface</h2> + +Here is a simple SWIG interface file: + +<blockquote> +<pre> +/* File: example.i */ +%module example + +extern int gcd(int x, int y); +extern double Foo; +</pre> +</blockquote> + +<h2>Compilation</h2> + +<ol> +<li><tt>swig -python <a href="example.i">example.i</a></tt> +<p> +<li>Compile <tt><a href="example_wrap.c">example_wrap.c</a></tt> and <tt><a href="example.c">example.c</a></tt> +to create the extension <tt>examplemodule.so</tt>. +</ol> + +<h2>Using the extension</h2> + +Click <a href="example.py">here</a> to see a script that calls our C functions from Python. + +<h2>Key points</h2> + +<ul> +<li>Use the <tt>import</tt> statement to load your extension module from Python. For example: +<blockquote> +<pre> +import example +</pre> +</blockquote> + +<li>C functions work just like Python functions. For example: +<blockquote> +<pre> +g = example.gcd(42,105) +</pre> +</blockquote> + +<li>C global variables are accessed through a special variable called 'cvar'. For example: +<blockquote> +<pre> +a = example.cvar.Foo +</pre> +</blockquote> +</ul> + +<hr> +</body> +</html> |