From 6d922f2ddd752c8e4dd0133df3af854d78de92af Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 28 Nov 2011 19:35:44 +0000 Subject: [PATCH] Fix #3433541 %typemap(in, numinputs=0) with 10+ arguments. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12849 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/test-suite/common.mk | 1 + Examples/test-suite/typemap_manyargs.i | 20 ++++++++++++++++++++ Source/DOH/doh.h | 1 + Source/DOH/string.c | 17 +++++++++++++++++ Source/Swig/typemap.c | 2 +- 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Examples/test-suite/typemap_manyargs.i diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 4f64ca0b3..b02afb463 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -420,6 +420,7 @@ CPP_TEST_CASES += \ typemap_arrays \ typemap_delete \ typemap_global_scope \ + typemap_manyargs \ typemap_namespace \ typemap_ns_using \ typemap_numinputs \ diff --git a/Examples/test-suite/typemap_manyargs.i b/Examples/test-suite/typemap_manyargs.i new file mode 100644 index 000000000..bde1f8d90 --- /dev/null +++ b/Examples/test-suite/typemap_manyargs.i @@ -0,0 +1,20 @@ +%module typemap_manyargs + +%typemap(in,numinputs=0) (int* a1, int* a2, int* a3, int* a4, int* a5, int* a6, int *a7, int *a8, int *a9, int *a10) (int temp1,int temp2,int temp3,int temp4,int temp5,int temp6,int temp7,int temp8, int temp9, int temp10) +{ + $1 = &temp1; // the code generate for this is arg2 = &temp1; + $2 = &temp2; // the code generate for this is arg3 = &temp2; + $3 = &temp3; // and so on... + $4 = &temp4; + $5 = &temp5; + $6 = &temp6; + $7 = &temp7; + $8 = &temp8; + $9 = &temp9; + $10 = &temp10; // the code generated for this is arg20 = &temp1, and arg20 does not exist. + int $10_ptr = 0; // Was arg20_ptr +} + +%inline %{ +void my_c_function(char * filename,int* a1, int* a2, int* a3, int* a4, int* a5, int* a6, int *a7, int *a8, int *a9, int *a10) {} +%} diff --git a/Source/DOH/doh.h b/Source/DOH/doh.h index bca5f0f0f..621d0957c 100644 --- a/Source/DOH/doh.h +++ b/Source/DOH/doh.h @@ -294,6 +294,7 @@ extern char *DohStrchr(const DOHString_or_char *s1, int ch); #define DOH_REPLACE_FIRST 0x08 #define DOH_REPLACE_ID_BEGIN 0x10 #define DOH_REPLACE_ID_END 0x20 +#define DOH_REPLACE_NUMBER_END 0x40 #define Replaceall(s,t,r) DohReplace(s,t,r,DOH_REPLACE_ANY) #define Replaceid(s,t,r) DohReplace(s,t,r,DOH_REPLACE_ID) diff --git a/Source/DOH/string.c b/Source/DOH/string.c index b067d239c..e94a2bdb2 100644 --- a/Source/DOH/string.c +++ b/Source/DOH/string.c @@ -651,6 +651,21 @@ static char *match_identifier_end(char *base, char *s, char *token, int tokenlen return 0; } +static char *match_number_end(char *base, char *s, char *token, int tokenlen) { + (void) base; + while (s) { + s = strstr(s, token); + if (!s) + return 0; + if (isdigit((int) *(s + tokenlen))) { + s += tokenlen; + continue; + } + return s; + } + return 0; +} + /* ----------------------------------------------------------------------------- * replace_simple() * @@ -899,6 +914,8 @@ static int String_replace(DOH *stro, const DOHString_or_char *token, const DOHSt return replace_simple(str, Char(token), Char(rep), flags, count, match_identifier_begin); } else if (flags & DOH_REPLACE_ID) { return replace_simple(str, Char(token), Char(rep), flags, count, match_identifier); + } else if (flags & DOH_REPLACE_NUMBER_END) { + return replace_simple(str, Char(token), Char(rep), flags, count, match_number_end); } else { return replace_simple(str, Char(token), Char(rep), flags, count, match_simple); } diff --git a/Source/Swig/typemap.c b/Source/Swig/typemap.c index 60d15ea99..da5e3309c 100644 --- a/Source/Swig/typemap.c +++ b/Source/Swig/typemap.c @@ -1178,7 +1178,7 @@ static int typemap_replace_vars(String *s, ParmList *locals, SwigType *type, Swi /* Replace the bare $n variable */ sprintf(var, "$%d", index); - bare_substitution_count = Replace(s, var, lname, DOH_REPLACE_ANY); + bare_substitution_count = Replace(s, var, lname, DOH_REPLACE_NUMBER_END); Delete(ftype); return bare_substitution_count; }