summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Zeitlin <vz-swig@zeitlins.org>2015-08-06 00:10:51 +0200
committerVadim Zeitlin <vz-swig@zeitlins.org>2015-08-07 19:44:45 +0200
commita1bddd56eb3404c9a069a48fa7b391fd255a7905 (patch)
tree627617e726b9aba8e39aaa33f59fc288c6cf4c66
parent95a08b3950ea1f43846ccff11969c9179f2eeddd (diff)
downloadswig-a1bddd56eb3404c9a069a48fa7b391fd255a7905.tar.gz
Make (char*, size_t) typemap usable for strings of other types in Java.
Notably it now works for "unsigned char*" strings. Add a test to check that it now works in Java and also showing that it already worked for the other languages with support for this typemap.
-rw-r--r--CHANGES.current4
-rw-r--r--Examples/test-suite/char_binary.i4
-rw-r--r--Examples/test-suite/java/char_binary_runme.java6
-rw-r--r--Examples/test-suite/javascript/char_binary_runme.js10
-rw-r--r--Examples/test-suite/perl5/char_binary_runme.pl5
-rw-r--r--Examples/test-suite/python/char_binary_runme.py7
-rw-r--r--Lib/java/java.swg4
7 files changed, 37 insertions, 3 deletions
diff --git a/CHANGES.current b/CHANGES.current
index c0694f657..f78f6bb48 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -4,3 +4,7 @@ See the RELEASENOTES file for a summary of changes in each release.
Version 3.0.8 (in progress)
===========================
+
+2015-08-05: vadz
+ [Java] Make (char* STRING, size_t LENGTH) typemaps usable for
+ strings of other types, e.g. "unsigned char*".
diff --git a/Examples/test-suite/char_binary.i b/Examples/test-suite/char_binary.i
index 778792946..394565438 100644
--- a/Examples/test-suite/char_binary.i
+++ b/Examples/test-suite/char_binary.i
@@ -5,12 +5,16 @@ A test case for testing non null terminated char pointers.
%module char_binary
%apply (char *STRING, size_t LENGTH) { (const char *str, size_t len) }
+%apply (char *STRING, size_t LENGTH) { (const unsigned char *str, size_t len) }
%inline %{
struct Test {
size_t strlen(const char *str, size_t len) {
return len;
}
+ size_t ustrlen(const unsigned char *str, size_t len) {
+ return len;
+ }
};
typedef char namet[5];
diff --git a/Examples/test-suite/java/char_binary_runme.java b/Examples/test-suite/java/char_binary_runme.java
index 9227f8617..bc811ef5d 100644
--- a/Examples/test-suite/java/char_binary_runme.java
+++ b/Examples/test-suite/java/char_binary_runme.java
@@ -20,5 +20,11 @@ public class char_binary_runme {
if (t.strlen(hil0) != 4)
throw new RuntimeException("bad multi-arg typemap");
+
+ if (t.ustrlen(hile) != 4)
+ throw new RuntimeException("bad multi-arg typemap");
+
+ if (t.ustrlen(hil0) != 4)
+ throw new RuntimeException("bad multi-arg typemap");
}
}
diff --git a/Examples/test-suite/javascript/char_binary_runme.js b/Examples/test-suite/javascript/char_binary_runme.js
index b2aac920c..01b72ebe1 100644
--- a/Examples/test-suite/javascript/char_binary_runme.js
+++ b/Examples/test-suite/javascript/char_binary_runme.js
@@ -5,10 +5,17 @@ if (t.strlen('hile') != 4) {
print(t.strlen('hile'));
throw("bad multi-arg typemap 1");
}
+if (t.ustrlen('hile') != 4) {
+ print(t.ustrlen('hile'));
+ throw("bad multi-arg typemap 1");
+}
if (t.strlen('hil\0') != 4) {
throw("bad multi-arg typemap 2");
}
+if (t.ustrlen('hil\0') != 4) {
+ throw("bad multi-arg typemap 2");
+}
/*
* creating a raw char*
@@ -24,6 +31,9 @@ char_binary.pchar_setitem(pc, 4, 0);
if (t.strlen(pc) != 4) {
throw("bad multi-arg typemap (3)");
}
+if (t.ustrlen(pc) != 4) {
+ throw("bad multi-arg typemap (3)");
+}
char_binary.var_pchar = pc;
if (char_binary.var_pchar != "hola") {
diff --git a/Examples/test-suite/perl5/char_binary_runme.pl b/Examples/test-suite/perl5/char_binary_runme.pl
index 4c50ee700..f97d740a6 100644
--- a/Examples/test-suite/perl5/char_binary_runme.pl
+++ b/Examples/test-suite/perl5/char_binary_runme.pl
@@ -1,14 +1,16 @@
use strict;
use warnings;
-use Test::More tests => 7;
+use Test::More tests => 10;
BEGIN { use_ok('char_binary') }
require_ok('char_binary');
my $t = char_binary::Test->new();
is($t->strlen('hile'), 4, "string typemap");
+is($t->ustrlen('hile'), 4, "unsigned string typemap");
is($t->strlen("hil\0"), 4, "string typemap");
+is($t->ustrlen("hil\0"), 4, "unsigned string typemap");
#
# creating a raw char*
@@ -22,6 +24,7 @@ char_binary::pchar_setitem($pc, 4, 0);
is($t->strlen($pc), 4, "string typemap");
+is($t->ustrlen($pc), 4, "unsigned string typemap");
$char_binary::var_pchar = $pc;
is($char_binary::var_pchar, "hola", "pointer case");
diff --git a/Examples/test-suite/python/char_binary_runme.py b/Examples/test-suite/python/char_binary_runme.py
index 13457253f..34caa3208 100644
--- a/Examples/test-suite/python/char_binary_runme.py
+++ b/Examples/test-suite/python/char_binary_runme.py
@@ -4,9 +4,14 @@ t = Test()
if t.strlen('hile') != 4:
print t.strlen('hile')
raise RuntimeError, "bad multi-arg typemap"
+if t.ustrlen('hile') != 4:
+ print t.ustrlen('hile')
+ raise RuntimeError, "bad multi-arg typemap"
if t.strlen('hil\0') != 4:
raise RuntimeError, "bad multi-arg typemap"
+if t.ustrlen('hil\0') != 4:
+ raise RuntimeError, "bad multi-arg typemap"
#
# creating a raw char*
@@ -21,6 +26,8 @@ pchar_setitem(pc, 4, 0)
if t.strlen(pc) != 4:
raise RuntimeError, "bad multi-arg typemap"
+if t.ustrlen(pc) != 4:
+ raise RuntimeError, "bad multi-arg typemap"
cvar.var_pchar = pc
if cvar.var_pchar != "hola":
diff --git a/Lib/java/java.swg b/Lib/java/java.swg
index 2e106796c..0ff487d80 100644
--- a/Lib/java/java.swg
+++ b/Lib/java/java.swg
@@ -1330,8 +1330,8 @@ SWIG_PROXY_CONSTRUCTOR(true, true, SWIGTYPE)
%typemap(freearg) (char *STRING, size_t LENGTH) ""
%typemap(in) (char *STRING, size_t LENGTH) {
if ($input) {
- $1 = (char *) JCALL2(GetByteArrayElements, jenv, $input, 0);
- $2 = (size_t) JCALL1(GetArrayLength, jenv, $input);
+ $1 = ($1_ltype) JCALL2(GetByteArrayElements, jenv, $input, 0);
+ $2 = ($2_type) JCALL1(GetArrayLength, jenv, $input);
} else {
$1 = 0;
$2 = 0;