diff options
Diffstat (limited to 'share/swig/2.0.11/ocaml/std_string.i')
-rw-r--r-- | share/swig/2.0.11/ocaml/std_string.i | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/share/swig/2.0.11/ocaml/std_string.i b/share/swig/2.0.11/ocaml/std_string.i new file mode 100644 index 0000000..bd5be0d --- /dev/null +++ b/share/swig/2.0.11/ocaml/std_string.i @@ -0,0 +1,126 @@ +/* ----------------------------------------------------------------------------- + * std_string.i + * + * SWIG typemaps for std::string + * ----------------------------------------------------------------------------- */ + +// ------------------------------------------------------------------------ +// std::string is typemapped by value +// This can prevent exporting methods which return a string +// in order for the user to modify it. +// However, I think I'll wait until someone asks for it... +// ------------------------------------------------------------------------ + +%{ +#include <string> +#include <vector> +%} + +%include <exception.i> +%include <std_vector.i> + +namespace std { + +%naturalvar string; +%naturalvar 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"); +} + +%typemap(in) const string & ($*1_ltype temp) { + /* %typemap(in) const string & */ + if (caml_ptr_check($input)) { + temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); + $1 = &temp; + } else { + SWIG_exception(SWIG_TypeError, "string expected"); + } +} + +%typemap(in) string & ($*1_ltype temp) { + /* %typemap(in) string & */ + if (caml_ptr_check($input)) { + temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); + $1 = &temp; + } else { + SWIG_exception(SWIG_TypeError, "string expected"); + } +} + +%typemap(in) string * ($*1_ltype *temp) { + /* %typemap(in) string * */ + if (caml_ptr_check($input)) { + temp = new $*1_ltype((char *)caml_ptr_val($input,0), caml_string_len($input)); + $1 = temp; + } else { + SWIG_exception(SWIG_TypeError, "string expected"); + } +} + +%typemap(free) string * ($*1_ltype *temp) { + delete temp; +} + +%typemap(argout) string & { + /* %typemap(argout) string & */ + swig_result = caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), (*$1).size())); +} + +%typemap(directorout) string { + /* %typemap(directorout) string */ + $result.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); +} + +%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()); +} +} + +#ifdef ENABLE_CHARPTR_ARRAY +char **c_charptr_array( const std::vector <std::string > &str_v ); + +%{ + SWIGEXT char **c_charptr_array( const std::vector <std::string > &str_v ) { + char **out = new char *[str_v.size() + 1]; + out[str_v.size()] = 0; + for( int i = 0; i < str_v.size(); i++ ) { + out[i] = (char *)str_v[i].c_str(); + } + return out; + } +%} +#endif + +#ifdef ENABLE_STRING_VECTOR +%template (StringVector) std::vector<std::string >; + +%insert(ml) %{ + (* Some STL convenience items *) + + let string_array_to_vector sa = + let nv = _new_StringVector C_void in + array_to_vector nv (fun x -> C_string x) sa ; nv + + let c_string_array ar = + _c_charptr_array (string_array_to_vector ar) +%} + +%insert(mli) %{ + val c_string_array: string array -> c_obj +%} +#endif |