/trunk/Lib/ocaml/std_string.i
Swig | 126 lines | 90 code | 22 blank | 14 comment | 0 complexity | 03fc892ed0263f6ceed48e011c77cad5 MD5 | raw file
1/* ----------------------------------------------------------------------------- 2 * std_string.i 3 * 4 * SWIG typemaps for std::string 5 * ----------------------------------------------------------------------------- */ 6 7// ------------------------------------------------------------------------ 8// std::string is typemapped by value 9// This can prevent exporting methods which return a string 10// in order for the user to modify it. 11// However, I think I'll wait until someone asks for it... 12// ------------------------------------------------------------------------ 13 14%{ 15#include <string> 16#include <vector> 17%} 18 19%include <exception.i> 20%include <std_vector.i> 21 22namespace std { 23 24%naturalvar string; 25%naturalvar wstring; 26 27class string; 28class wstring; 29 30/* Overloading check */ 31%typemap(in) string { 32 /* %typemap(in) string */ 33 if (caml_ptr_check($input)) 34 $1.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); 35 else 36 SWIG_exception(SWIG_TypeError, "string expected"); 37} 38 39%typemap(in) const string & (std::string temp) { 40 /* %typemap(in) const string & */ 41 if (caml_ptr_check($input)) { 42 temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); 43 $1 = &temp; 44 } else { 45 SWIG_exception(SWIG_TypeError, "string expected"); 46 } 47} 48 49%typemap(in) string & (std::string temp) { 50 /* %typemap(in) string & */ 51 if (caml_ptr_check($input)) { 52 temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); 53 $1 = &temp; 54 } else { 55 SWIG_exception(SWIG_TypeError, "string expected"); 56 } 57} 58 59%typemap(in) string * (std::string *temp) { 60 /* %typemap(in) string * */ 61 if (caml_ptr_check($input)) { 62 temp = new std::string((char *)caml_ptr_val($input,0), caml_string_len($input)); 63 $1 = temp; 64 } else { 65 SWIG_exception(SWIG_TypeError, "string expected"); 66 } 67} 68 69%typemap(free) string * (std::string *temp) { 70 delete temp; 71} 72 73%typemap(argout) string & { 74 /* %typemap(argout) string & */ 75 swig_result = caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), (*$1).size())); 76} 77 78%typemap(directorout) string { 79 /* %typemap(directorout) string */ 80 $result.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); 81} 82 83%typemap(out) string { 84 /* %typemap(out) string */ 85 $result = caml_val_string_len($1.c_str(),$1.size()); 86} 87 88%typemap(out) string * { 89 /* %typemap(out) string * */ 90 $result = caml_val_string_len((*$1).c_str(),(*$1).size()); 91} 92} 93 94#ifdef ENABLE_CHARPTR_ARRAY 95char **c_charptr_array( const std::vector <std::string > &str_v ); 96 97%{ 98 SWIGEXT char **c_charptr_array( const std::vector <std::string > &str_v ) { 99 char **out = new char *[str_v.size() + 1]; 100 out[str_v.size()] = 0; 101 for( int i = 0; i < str_v.size(); i++ ) { 102 out[i] = (char *)str_v[i].c_str(); 103 } 104 return out; 105 } 106%} 107#endif 108 109#ifdef ENABLE_STRING_VECTOR 110%template (StringVector) std::vector<std::string >; 111 112%insert(ml) %{ 113 (* Some STL convenience items *) 114 115 let string_array_to_vector sa = 116 let nv = _new_StringVector C_void in 117 array_to_vector nv (fun x -> C_string x) sa ; nv 118 119 let c_string_array ar = 120 _c_charptr_array (string_array_to_vector ar) 121%} 122 123%insert(mli) %{ 124 val c_string_array: string array -> c_obj 125%} 126#endif