std::string and std::wstring example.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@4324 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
9c3c115a11
commit
277a7e01e8
5 changed files with 106 additions and 0 deletions
22
SWIG/Examples/ocaml/std_string/Makefile
Normal file
22
SWIG/Examples/ocaml/std_string/Makefile
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
TOP = ../..
|
||||||
|
SWIG = $(TOP)/../swig -I/usr/include/g++-3
|
||||||
|
SRCS =
|
||||||
|
TARGET = example
|
||||||
|
INTERFACE = example.i
|
||||||
|
PROGFILE = runme.ml
|
||||||
|
|
||||||
|
default:: static
|
||||||
|
|
||||||
|
all::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
||||||
|
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ocaml_cpp
|
||||||
|
|
||||||
|
static::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \
|
||||||
|
PROGFILE='$(PROGFILE)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \
|
||||||
|
ocaml_static_cpp
|
||||||
|
|
||||||
|
clean::
|
||||||
|
$(MAKE) -f $(TOP)/Makefile TARGET='$(TARGET)' ocaml_clean
|
||||||
|
|
||||||
|
check: all
|
||||||
13
SWIG/Examples/ocaml/std_string/README
Normal file
13
SWIG/Examples/ocaml/std_string/README
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
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
|
||||||
|
Ocaml program.
|
||||||
|
|
||||||
|
These are two sample runs; note that the output is different based on the
|
||||||
|
locale chosen to perform the conversion to wchar_t.
|
||||||
|
|
||||||
|
bash-2.05a$ ./example ja_JP.EUC-JP
|
||||||
|
the original string contains 2
|
||||||
|
the new string contains 1 : [ 29494; ]
|
||||||
|
bash-2.05a$ ./example en_US
|
||||||
|
the original string contains 2
|
||||||
|
the new string contains 2 : [ 205; 177; ]
|
||||||
36
SWIG/Examples/ocaml/std_string/example.h
Normal file
36
SWIG/Examples/ocaml/std_string/example.h
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* File : example.h -- stolen from the guile std_vector example */
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <functional>
|
||||||
|
#include <numeric>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
|
std::string from_wstring_with_locale( const std::wstring source,
|
||||||
|
const std::string locale ) {
|
||||||
|
const char *current_locale = setlocale( LC_CTYPE, locale.c_str() );
|
||||||
|
int required_chars = wcstombs( NULL, source.c_str(), 0 );
|
||||||
|
std::string s;
|
||||||
|
char *temp_chars = new char[required_chars + 1];
|
||||||
|
temp_chars[0] = 0;
|
||||||
|
wcstombs( temp_chars, source.c_str(), required_chars + 1 );
|
||||||
|
s = temp_chars;
|
||||||
|
delete [] temp_chars;
|
||||||
|
setlocale( LC_CTYPE, current_locale );
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring to_wstring_with_locale( const std::string source,
|
||||||
|
const std::string locale ) {
|
||||||
|
const char *current_locale = setlocale( LC_CTYPE, locale.c_str() );
|
||||||
|
int required_chars = mbstowcs( NULL, source.c_str(), 0 );
|
||||||
|
std::wstring s;
|
||||||
|
wchar_t *temp_chars = new wchar_t[required_chars + 1];
|
||||||
|
temp_chars[0] = 0;
|
||||||
|
mbstowcs( temp_chars, source.c_str(), required_chars + 1 );
|
||||||
|
s = temp_chars;
|
||||||
|
delete [] temp_chars;
|
||||||
|
setlocale( LC_CTYPE, current_locale );
|
||||||
|
return s;
|
||||||
|
}
|
||||||
12
SWIG/Examples/ocaml/std_string/example.i
Normal file
12
SWIG/Examples/ocaml/std_string/example.i
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
/* -*- C++ -*- */
|
||||||
|
/* File : example.i -- stolen from the guile std_vector example */
|
||||||
|
%module example
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include "example.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
%include stl.i
|
||||||
|
|
||||||
|
/* Let's just grab the original header file here */
|
||||||
|
%include "example.h"
|
||||||
23
SWIG/Examples/ocaml/std_string/runme.ml
Normal file
23
SWIG/Examples/ocaml/std_string/runme.ml
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
(* This example was mostly lifted from the guile example directory *)
|
||||||
|
|
||||||
|
open Example
|
||||||
|
|
||||||
|
let y = new_string (C_string "\205\177")
|
||||||
|
let z = _to_wstring_with_locale (C_list [ y ; new_string (C_string Sys.argv.(1)) ])
|
||||||
|
|
||||||
|
let _ =
|
||||||
|
begin
|
||||||
|
print_string "the original string contains " ;
|
||||||
|
print_int (get_int ((invoke y) "size" C_void)) ;
|
||||||
|
print_newline () ;
|
||||||
|
|
||||||
|
print_string "the new string contains " ;
|
||||||
|
print_int (get_int ((invoke z) "size" C_void)) ;
|
||||||
|
print_string " : [ " ;
|
||||||
|
for i = 0 to pred (get_int ((invoke z) "size" C_void)) do
|
||||||
|
print_int (get_int ((invoke z) "[]" (C_int i))) ;
|
||||||
|
print_string "; " ;
|
||||||
|
done ;
|
||||||
|
print_string "]" ;
|
||||||
|
print_newline () ;
|
||||||
|
end
|
||||||
Loading…
Add table
Add a link
Reference in a new issue