[Ocaml] Apply patch #3151788 from Joel Reymont. Brings Ocaml support a up to date (ver 3.11 and 3.12), including std::string.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12460 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2011-02-14 07:22:06 +00:00
commit 1fab53b204
9 changed files with 240 additions and 245 deletions

View file

@ -632,7 +632,7 @@ ocaml_static_cpp: $(SRCS)
$(OCAMLCORE) $(OCAMLCORE)
$(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACEPATH) $(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACEPATH)
cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c) cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c)
$(OCC) -cc '$(CXX)' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \ $(OCC) -cc '$(CXX) -Wno-write-strings' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \
$(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS) $(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS)
$(OCC) -g -c $(INTERFACE:%.i=%.mli) $(OCC) -g -c $(INTERFACE:%.i=%.mli)
$(OCC) -g -c $(INTERFACE:%.i=%.ml) $(OCC) -g -c $(INTERFACE:%.i=%.ml)
@ -643,13 +643,13 @@ ocaml_static_cpp: $(SRCS)
$(INTERFACE:%.i=%.cmo) \ $(INTERFACE:%.i=%.cmo) \
$(PROGFILE:%.ml=%.cmo) \ $(PROGFILE:%.ml=%.cmo) \
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \ $(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \
-cclib "$(LIBS)" -cc '$(CXX)' -cclib "$(LIBS)" -cc '$(CXX) -Wno-write-strings'
ocaml_static_cpp_toplevel: $(SRCS) ocaml_static_cpp_toplevel: $(SRCS)
$(OCAMLCORE) $(OCAMLCORE)
$(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACEPATH) $(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACEPATH)
cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c) cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c)
$(OCC) -cc '$(CXX)' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \ $(OCC) -cc '$(CXX) -Wno-write-strings' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \
$(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS) $(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS)
$(OCC) -g -c $(INTERFACE:%.i=%.mli) $(OCC) -g -c $(INTERFACE:%.i=%.mli)
$(OCC) -g -c $(INTERFACE:%.i=%.ml) $(OCC) -g -c $(INTERFACE:%.i=%.ml)
@ -657,17 +657,17 @@ ocaml_static_cpp_toplevel: $(SRCS)
$(OCC) $(OCAMLPP) -c $(PROGFILE) $(OCC) $(OCAMLPP) -c $(PROGFILE)
$(NOLINK) || $(OCAMLMKTOP) \ $(NOLINK) || $(OCAMLMKTOP) \
swig.cmo \ swig.cmo \
-I $(OCAMLP4WHERE) camlp4o.cma swigp4.cmo \ -I $(OCAMLP4WHERE) dynlink.cma camlp4o.cma swigp4.cmo \
-g -ccopt -g -cclib -g -custom -o $(TARGET)_top \ -g -ccopt -g -cclib -g -custom -o $(TARGET)_top \
$(INTERFACE:%.i=%.cmo) \ $(INTERFACE:%.i=%.cmo) \
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \ $(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \
-cclib "$(LIBS)" -cc '$(CXX)' -cclib "$(LIBS)" -cc '$(CXX) -Wno-write-strings'
ocaml_dynamic_cpp: $(SRCS) ocaml_dynamic_cpp: $(SRCS)
$(OCAMLCORE) $(OCAMLCORE)
$(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACEPATH) $(SWIG) -ocaml -c++ $(SWIGOPT) $(INTERFACEPATH)
cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c) cp $(ICXXSRCS) $(ICXXSRCS:%.cxx=%.c)
$(OCC) -cc '$(CXX)' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \ $(OCC) -cc '$(CXX) -Wno-write-strings' -g -c -ccopt -g -ccopt "-xc++ $(INCLUDES)" \
$(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS) -ccopt -fPIC $(ICXXSRCS:%.cxx=%.c) $(SRCS) $(CXXSRCS) -ccopt -fPIC
$(CXXSHARED) $(CFLAGS) -o $(INTERFACE:%.i=%@SO@) \ $(CXXSHARED) $(CFLAGS) -o $(INTERFACE:%.i=%@SO@) \
$(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \ $(INTERFACE:%.i=%_wrap.@OBJEXT@) $(OBJS) \
@ -684,7 +684,7 @@ ocaml_dynamic_cpp: $(SRCS)
$(OCC) -cclib -export-dynamic -g -ccopt -g -cclib -g -custom \ $(OCC) -cclib -export-dynamic -g -ccopt -g -cclib -g -custom \
-o $(TARGET) \ -o $(TARGET) \
-package dl -linkpkg \ -package dl -linkpkg \
$(INTERFACE:%.i=%.cmo) $(PROGFILE:%.ml=%.cmo) -cc '$(CXX)' $(INTERFACE:%.i=%.cmo) $(PROGFILE:%.ml=%.cmo) -cc '$(CXX) -Wno-write-strings'
ocaml_clean: ocaml_clean:
rm -f *_wrap* *~ .~* *.cmo *.cmi $(MLFILE) $(MLFILE)i swig.mli swig.cmi swig.ml swig.cmo swigp4.ml swigp4.cmo rm -f *_wrap* *~ .~* *.cmo *.cmi $(MLFILE) $(MLFILE)i swig.mli swig.cmi swig.ml swig.cmo swigp4.ml swigp4.cmo

View file

@ -1,4 +1,8 @@
/* File : example.i */ /* File : example.i */
%module example %module example
%{
extern "C" void factor(int &x, int &y);
%}
extern "C" void factor(int &x, int &y); extern "C" void factor(int &x, int &y);

View file

@ -46,3 +46,5 @@ void draw_depth_map( volume *v, int div_x, int div_y ) {
} }
double volume::depth( double x, double y ) { return 0.0; } double volume::depth( double x, double y ) { return 0.0; }
volume::~volume() { }

View file

@ -9,7 +9,8 @@ public:
class volume { class volume {
public: public:
virtual double depth( double x, double y ); virtual double depth( double x, double y );
virtual ~volume();
}; };
extern void draw_shape_coverage( shape *s, int div_x, int div_y ); extern void draw_shape_coverage( shape *s, int div_x, int div_y );

View file

@ -1,3 +1,9 @@
--- New ---
It's not possible to access std::(w)string at the moment as it breaks other string examples.
--- Old ---
This example shows how to use both std::string and std::wstring in Ocaml, This example shows how to use both std::string and std::wstring in Ocaml,
and also demonstrates that one might use this to make a locale-obedient and also demonstrates that one might use this to make a locale-obedient
Ocaml program. Ocaml program.

View file

@ -1,14 +1,18 @@
/* -*- mode: c++ -*- */ /* -*- mode: c++ -*- */
/* File : example.h -- Tests all string typemaps */ /* File : example.h -- Tests all string typemaps */
#include <sys/time.h>
#include <time.h>
void takes_std_string( std::string in ) { void takes_std_string( std::string in ) {
cout << "takes_std_string( \"" << in << "\" );" << endl; cout << "takes_std_string( \"" << in << "\" );" << endl;
} }
std::string gives_std_string() { std::string gives_std_string() {
time_t t; struct timeval tv;
return std::string( asctime( localtime( &t ) ) ); gettimeofday(&tv, NULL);
return std::string( asctime( localtime( &tv.tv_sec ) ) );
} }
void takes_char_ptr( char *p ) { void takes_char_ptr( char *p ) {
@ -24,10 +28,10 @@ void takes_and_gives_std_string( std::string &inout ) {
inout.insert( inout.end(), ']' ); inout.insert( inout.end(), ']' );
} }
void takes_and_gives_char_ptr( char *&ptr ) { void takes_and_gives_char_ptr( char *&inout ) {
char *pout = strchr( ptr, '.' ); char *pout = strchr( inout, '.' );
if( pout ) ptr = pout + 1; if( pout ) inout = pout + 1;
else ptr = "foo"; else inout = "foo";
} }
/* /*

View file

@ -11,141 +11,91 @@
// However, I think I'll wait until someone asks for it... // However, I think I'll wait until someone asks for it...
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
%include <exception.i>
%{ %{
#include <string> #include <string>
#include <vector> #include <vector>
using std::string;
using std::vector;
%} %}
%include <exception.i>
%include <std_vector.i> %include <std_vector.i>
%naturalvar std::string;
%naturalvar std::wstring;
namespace std { namespace std {
template <class charT> class basic_string {
public:
typedef charT *pointer;
typedef charT &reference;
typedef const charT &const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
basic_string();
basic_string( charT *str );
size_t size();
charT operator []( int pos ) const;
charT *c_str() const;
basic_string<charT> &operator = ( const basic_string &ws );
basic_string<charT> &operator = ( const charT *str );
basic_string<charT> &append( const basic_string<charT> &other );
basic_string<charT> &append( const charT *str );
void push_back( charT c );
void clear();
void reserve( size_type t );
void resize( size_type n, charT c = charT() );
int compare( const basic_string<charT> &other ) const;
int compare( const charT *str ) const;
basic_string<charT> &insert( size_type pos,
const basic_string<charT> &str );
size_type find( const basic_string<charT> &other, int pos = 0 ) const;
size_type find( charT c, int pos = 0 ) const;
%extend {
bool operator == ( const basic_string<charT> &other ) const {
return self->compare( other ) == 0;
}
bool operator != ( const basic_string<charT> &other ) const {
return self->compare( other ) != 0;
}
bool operator < ( const basic_string<charT> &other ) const {
return self->compare( other ) == -1;
}
bool operator > ( const basic_string<charT> &other ) const {
return self->compare( other ) == 1;
}
bool operator <= ( const basic_string<charT> &other ) const {
return self->compare( other ) != 1;
}
bool operator >= ( const basic_string<charT> &other ) const {
return self->compare( other ) != -1;
}
}
};
%template(string) basic_string<char>; %naturalvar string;
%template(wstring) basic_string<wchar_t>; %naturalvar wstring;
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring; class string;
class wstring;
/* Overloading check */
%typemap(in) string {
/* %typemap(in) string */
if (caml_ptr_check($input))
$1.assign((char *)caml_ptr_val($input,0), caml_string_len($input));
else
SWIG_exception(SWIG_TypeError, "string expected");
}
/* Overloading check */ %typemap(in) const string & (std::string temp) {
%typemap(in) string { /* %typemap(in) const string & */
if (caml_ptr_check($input)) if (caml_ptr_check($input)) {
$1.assign((char *)caml_ptr_val($input,0), temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input));
caml_string_len($input)); $1 = &temp;
else } else {
SWIG_exception(SWIG_TypeError, "string expected"); SWIG_exception(SWIG_TypeError, "string expected");
} }
}
%typemap(in) const string & (std::string temp) { %typemap(in) string & (std::string temp) {
if (caml_ptr_check($input)) { /* %typemap(in) string & */
temp.assign((char *)caml_ptr_val($input,0), if (caml_ptr_check($input)) {
caml_string_len($input)); temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input));
$1 = &temp; $1 = &temp;
} else { } else {
SWIG_exception(SWIG_TypeError, "string expected"); SWIG_exception(SWIG_TypeError, "string expected");
} }
} }
%typemap(in) string & (std::string temp) { %typemap(in) string * (std::string *temp) {
if (caml_ptr_check($input)) { /* %typemap(in) string * */
temp.assign((char *)caml_ptr_val($input,0), if (caml_ptr_check($input)) {
caml_string_len($input)); temp = new std::string((char *)caml_ptr_val($input,0), caml_string_len($input));
$1 = &temp; $1 = temp;
} else { } else {
SWIG_exception(SWIG_TypeError, "string expected"); SWIG_exception(SWIG_TypeError, "string expected");
} }
} }
%typemap(in) string * (std::string *temp) { %typemap(free) string * (std::string *temp) {
if (caml_ptr_check($input)) { delete temp;
temp = new std::string((char *)caml_ptr_val($input,0), }
caml_string_len($input));
$1 = temp;
} else {
SWIG_exception(SWIG_TypeError, "string expected");
}
}
%typemap(free) string * (std::string *temp) { %typemap(argout) string & {
delete temp; /* %typemap(argout) string & */
} swig_result = caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), (*$1).size()));
}
%typemap(argout) string & { %typemap(directorout) string {
caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), /* %typemap(directorout) string */
(*$1).size())); $result.assign((char *)caml_ptr_val($input,0), caml_string_len($input));
} }
%typemap(directorout) string { %typemap(out) string {
$result.assign((char *)caml_ptr_val($input,0), /* %typemap(out) string */
caml_string_len($input)); $result = caml_val_string_len($1.c_str(),$1.size());
} }
%typemap(out) string { %typemap(out) string * {
$result = caml_val_string_len($1.c_str(),$1.size()); /* %typemap(out) string * */
}
%typemap(out) string * {
$result = caml_val_string_len((*$1).c_str(),(*$1).size()); $result = caml_val_string_len((*$1).c_str(),(*$1).size());
} }
} }
#ifdef ENABLE_CHARPTR_ARRAY #ifdef ENABLE_CHARPTR_ARRAY
char **c_charptr_array( const std::vector <string > &str_v ); char **c_charptr_array( const std::vector <std::string > &str_v );
%{ %{
SWIGEXT char **c_charptr_array( const std::vector <string > &str_v ) { SWIGEXT char **c_charptr_array( const std::vector <std::string > &str_v ) {
char **out = new char *[str_v.size() + 1]; char **out = new char *[str_v.size() + 1];
out[str_v.size()] = 0; out[str_v.size()] = 0;
for( int i = 0; i < str_v.size(); i++ ) { for( int i = 0; i < str_v.size(); i++ ) {
@ -157,7 +107,7 @@ char **c_charptr_array( const std::vector <string > &str_v );
#endif #endif
#ifdef ENABLE_STRING_VECTOR #ifdef ENABLE_STRING_VECTOR
%template (StringVector) std::vector<string >; %template (StringVector) std::vector<std::string >;
%insert(ml) %{ %insert(ml) %{
(* Some STL convenience items *) (* Some STL convenience items *)

View file

@ -1,118 +1,135 @@
open Pcaml ;; open Camlp4
module Id : Sig.Id =
struct
let name = "swigp4"
let version = "0.1"
end
module Make (Syntax : Sig.Camlp4Syntax) =
struct
open Sig
include Syntax
let lap x y = x :: y let _loc = Loc.ghost
let c_ify e @OCAMLLOC@ = let lap x y = x :: y
match e with let c_ify e loc =
<:expr< $int:_$ >> -> <:expr< (C_int $e$) >> match e with
| <:expr< $str:_$ >> -> <:expr< (C_string $e$) >> <:expr< $int:_$ >> -> <:expr< (C_int $e$) >>
| <:expr< $chr:_$ >> -> <:expr< (C_char $e$) >> | <:expr< $str:_$ >> -> <:expr< (C_string $e$) >>
| <:expr< $flo:_$ >> -> <:expr< (C_double $e$) >> | <:expr< $chr:_$ >> -> <:expr< (C_char $e$) >>
| <:expr< True >> -> <:expr< (C_bool $e$) >> | <:expr< $flo:_$ >> -> <:expr< (C_double $e$) >>
| <:expr< False >> -> <:expr< (C_bool $e$) >> | <:expr< True >> -> <:expr< (C_bool $e$) >>
| _ -> <:expr< $e$ >> | <:expr< False >> -> <:expr< (C_bool $e$) >>
let mk_list args @OCAMLLOC@ f = | _ -> <:expr< $e$ >>
let rec mk_list_inner args @OCAMLLOC@ f = let mk_list args loc f =
match args with let rec mk_list_inner args loc f =
[] -> <:expr< [] >> match args with
| x :: xs -> [] -> <:expr< [] >>
(let @OCAMLLOC@ = MLast.loc_of_expr x in | x :: xs ->
<:expr< [ ($f x @OCAMLLOC@$) ] @ ($mk_list_inner xs @OCAMLLOC@ f$) >>) in (let loc = Ast.loc_of_expr x in
match args with <:expr< [ ($f x _loc$) ] @ ($mk_list_inner xs loc f$) >>) in
[] -> <:expr< (Obj.magic C_void) >> match args with
| [ a ] -> <:expr< (Obj.magic $f a @OCAMLLOC@$) >> [] -> <:expr< (Obj.magic C_void) >>
| _ -> <:expr< (Obj.magic (C_list ($mk_list_inner args @OCAMLLOC@ f$))) >> | [ a ] -> <:expr< (Obj.magic $f a _loc$) >>
| _ -> <:expr< (Obj.magic (C_list ($mk_list_inner args loc f$))) >> ;;
EXTEND Gram
GLOBAL: expr;
EXTEND expr: LEVEL "top"
expr: [ [ e1 = expr ; "'" ; "[" ; e2 = expr ; "]" ->
[ [ e1 = expr ; "'" ; "[" ; e2 = expr ; "]" -> <:expr< (invoke $e1$) "[]" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "[]" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| e1 = expr ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:l$ ($mk_list args _loc c_ify$) >>
<:expr< (invoke $e1$) $str:l$ ($mk_list args @OCAMLLOC@ c_ify$) >> | e1 = expr ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| e1 = expr ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:u$ ($mk_list args _loc c_ify$) >>
<:expr< (invoke $e1$) $str:u$ ($mk_list args @OCAMLLOC@ c_ify$) >> | e1 = expr ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| e1 = expr ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $s$ ($mk_list args _loc c_ify$) >>
<:expr< (invoke $e1$) $s$ ($mk_list args @OCAMLLOC@ c_ify$) >> | e1 = expr ; "'" ; "." ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| e1 = expr ; "'" ; "." ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) "()" ($mk_list args _loc c_ify$) >>
<:expr< (invoke $e1$) "()" ($mk_list args @OCAMLLOC@ c_ify$) >> | e1 = expr ; "'" ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| e1 = expr ; "'" ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:l$ ($mk_list args _loc c_ify$) >>
<:expr< (invoke ((invoke $e1$) "->" C_void)) $str:l$ ($mk_list args @OCAMLLOC@ c_ify$) >> | e1 = expr ; "'" ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| e1 = expr ; "'" ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:u$ ($mk_list args _loc c_ify$) >>
<:expr< (invoke ((invoke $e1$) "->" C_void)) $str:u$ ($mk_list args @OCAMLLOC@ c_ify$) >> | e1 = expr ; "'" ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| e1 = expr ; "'" ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $s$ ($mk_list args _loc c_ify$) >>
<:expr< (invoke ((invoke $e1$) "->" C_void)) $s$ ($mk_list args @OCAMLLOC@ c_ify$) >> | e1 = expr ; "'" ; "++" ->
| e1 = expr ; "'" ; "++" -> <:expr< (invoke $e1$) "++" C_void >>
<:expr< (invoke $e1$) "++" C_void >> | e1 = expr ; "'" ; "--" ->
| e1 = expr ; "'" ; "--" -> <:expr< (invoke $e1$) "--" C_void >>
<:expr< (invoke $e1$) "--" C_void >> | e1 = expr ; "'" ; "-" ; e2 = expr ->
| e1 = expr ; "'" ; "-" ; e2 = expr -> <:expr< (invoke $e1$) "-" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "-" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "+" ; e2 = expr -> <:expr< (invoke $e1$) "+" (C_list [ $c_ify e2 _loc$ ]) >>
| e1 = expr ; "'" ; "+" ; e2 = expr -> <:expr< (invoke $e1$) "+" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "*" ; e2 = expr -> <:expr< (invoke $e1$) "*" (C_list [ $c_ify e2 _loc$ ]) >>
| e1 = expr ; "'" ; "*" ; e2 = expr -> <:expr< (invoke $e1$) "*" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | "'" ; "&" ; e1 = expr ->
| "'" ; "&" ; e1 = expr -> <:expr< (invoke $e1$) "&" C_void >>
<:expr< (invoke $e1$) "&" C_void >> | "'" ; "!" ; e1 = expr ->
| "'" ; "!" ; e1 = expr -> <:expr< (invoke $e1$) "!" C_void >>
<:expr< (invoke $e1$) "!" C_void >> | "'" ; "~" ; e1 = expr ->
| "'" ; "~" ; e1 = expr -> <:expr< (invoke $e1$) "~" C_void >>
<:expr< (invoke $e1$) "~" C_void >> | e1 = expr ; "'" ; "/" ; e2 = expr ->
| e1 = expr ; "'" ; "/" ; e2 = expr -> <:expr< (invoke $e1$) "/" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "/" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "%" ; e2 = expr ->
| e1 = expr ; "'" ; "%" ; e2 = expr -> <:expr< (invoke $e1$) "%" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "%" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "lsl" ; e2 = expr ->
| e1 = expr ; "'" ; "lsl" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<") (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) ("<" ^ "<") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "lsr" ; e2 = expr ->
| e1 = expr ; "'" ; "lsr" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">") (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) (">" ^ ">") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "<" ; e2 = expr ->
| e1 = expr ; "'" ; "<" ; e2 = expr -> <:expr< (invoke $e1$) "<" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "<" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "<=" ; e2 = expr ->
| e1 = expr ; "'" ; "<=" ; e2 = expr -> <:expr< (invoke $e1$) "<=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "<=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; ">" ; e2 = expr ->
| e1 = expr ; "'" ; ">" ; e2 = expr -> <:expr< (invoke $e1$) ">" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) ">" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; ">=" ; e2 = expr ->
| e1 = expr ; "'" ; ">=" ; e2 = expr -> <:expr< (invoke $e1$) ">=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) ">=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "==" ; e2 = expr ->
| e1 = expr ; "'" ; "==" ; e2 = expr -> <:expr< (invoke $e1$) "==" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "==" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "!=" ; e2 = expr ->
| e1 = expr ; "'" ; "!=" ; e2 = expr -> <:expr< (invoke $e1$) "!=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "!=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "&" ; e2 = expr ->
| e1 = expr ; "'" ; "&" ; e2 = expr -> <:expr< (invoke $e1$) "&" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "&" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "^" ; e2 = expr ->
| e1 = expr ; "'" ; "^" ; e2 = expr -> <:expr< (invoke $e1$) "^" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "^" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "|" ; e2 = expr ->
| e1 = expr ; "'" ; "|" ; e2 = expr -> <:expr< (invoke $e1$) "|" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "|" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "&&" ; e2 = expr ->
| e1 = expr ; "'" ; "&&" ; e2 = expr -> <:expr< (invoke $e1$) "&&" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "&&" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "||" ; e2 = expr ->
| e1 = expr ; "'" ; "||" ; e2 = expr -> <:expr< (invoke $e1$) "||" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "||" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "=" ; e2 = expr ->
| e1 = expr ; "'" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) "=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "+=" ; e2 = expr ->
| e1 = expr ; "'" ; "+=" ; e2 = expr -> <:expr< (invoke $e1$) "+=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "+=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "-=" ; e2 = expr ->
| e1 = expr ; "'" ; "-=" ; e2 = expr -> <:expr< (invoke $e1$) "-=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "-=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "*=" ; e2 = expr ->
| e1 = expr ; "'" ; "*=" ; e2 = expr -> <:expr< (invoke $e1$) "*=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "*=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "/=" ; e2 = expr ->
| e1 = expr ; "'" ; "/=" ; e2 = expr -> <:expr< (invoke $e1$) "/=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "/=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "%=" ; e2 = expr ->
| e1 = expr ; "'" ; "%=" ; e2 = expr -> <:expr< (invoke $e1$) "%=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "%=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "lsl" ; "=" ; e2 = expr ->
| e1 = expr ; "'" ; "lsl" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<=") (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) ("<" ^ "<=") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "lsr" ; "=" ; e2 = expr ->
| e1 = expr ; "'" ; "lsr" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">=") (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) (">" ^ ">=") (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "&=" ; e2 = expr ->
| e1 = expr ; "'" ; "&=" ; e2 = expr -> <:expr< (invoke $e1$) "&=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "&=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "^=" ; e2 = expr ->
| e1 = expr ; "'" ; "^=" ; e2 = expr -> <:expr< (invoke $e1$) "^=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "^=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | e1 = expr ; "'" ; "|=" ; e2 = expr ->
| e1 = expr ; "'" ; "|=" ; e2 = expr -> <:expr< (invoke $e1$) "|=" (C_list [ $c_ify e2 _loc$ ]) >>
<:expr< (invoke $e1$) "|=" (C_list [ $c_ify e2 @OCAMLLOC@$ ]) >> | "'" ; e = expr -> c_ify e _loc
| "'" ; e = expr -> c_ify e @OCAMLLOC@ | c = expr ; "as" ; id = LIDENT -> <:expr< $lid:"get_" ^ id$ $c$ >>
| c = expr ; "as" ; id = LIDENT -> <:expr< $lid:"get_" ^ id$ $c$ >> | c = expr ; "to" ; id = LIDENT -> <:expr< $uid:"C_" ^ id$ $c$ >>
| c = expr ; "to" ; id = LIDENT -> <:expr< $uid:"C_" ^ id$ $c$ >> | "`" ; "`" ; l = LIDENT -> <:expr< C_enum `$lid:l$ >>
| "`" ; "`" ; l = LIDENT -> <:expr< C_enum `$lid:l$ >> | "`" ; "`" ; u = UIDENT -> <:expr< C_enum `$uid:u$ >>
| "`" ; "`" ; u = UIDENT -> <:expr< C_enum `$uid:u$ >> | f = expr ; "'" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" ->
| f = expr ; "'" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< $f$ ($mk_list args _loc c_ify$) >>
<:expr< $f$ ($mk_list args @OCAMLLOC@ c_ify$) >> ] ] ;
] ] ; END ;;
END ;;
end
module M = Register.OCamlSyntaxExtension(Id)(Make)

View file

@ -82,6 +82,17 @@
} }
} }
%typemap(in) char *& (char *temp) {
/* %typemap(in) char *& */
temp = (char*)caml_val_ptr($1,$descriptor);
$1 = &temp;
}
%typemap(argout) char *& {
/* %typemap(argout) char *& */
swig_result = caml_list_append(swig_result,caml_val_string_len(*$1, strlen(*$1)));
}
#else #else
%typemap(in) SWIGTYPE { %typemap(in) SWIGTYPE {