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:
Art Yerkes 2003-02-16 13:32:08 +00:00
commit 277a7e01e8
5 changed files with 106 additions and 0 deletions

View 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

View 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; ]

View 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;
}

View 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"

View 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