diff --git a/Examples/test-suite/csharp_director_typemaps.i b/Examples/test-suite/csharp_director_typemaps.i index 2bc0281ee..614bdbf23 100644 --- a/Examples/test-suite/csharp_director_typemaps.i +++ b/Examples/test-suite/csharp_director_typemaps.i @@ -10,8 +10,8 @@ %typemap(ctype) int* readLen, int* writeLen "/*ctype*/ int*" %typemap(imtype) int* readLen, int* writeLen "/*imtype*/ out int" %typemap(cstype) int* readLen "/*cstype*/ out int" -//%typemap(cstype) int* writeLen "/*out cstype out*/ out int" -%apply int *readLen { int* writeLen } // Replaced above - 'out' in a comment is not working yet +// Note for below: 'out' used in typemap comment +%typemap(cstype) int* writeLen "/*out cstype out*/ out int" %typemap(csin) int* readLen, int* writeLen "/*csin*/ out $csinput" %typemap(in) int* readLen, int* writeLen %{/*in*/ $1 = ($1_ltype)$input; %} %typemap(out) int* readLen, int* writeLen %{/*out*/ $result = (void *)$1; %} diff --git a/Source/DOH/README b/Source/DOH/README index 8be5f652a..be90f25b4 100644 --- a/Source/DOH/README +++ b/Source/DOH/README @@ -73,11 +73,17 @@ Replace(obj, orig, rep, flags) Replace occurrences of orig with rep. Chop(obj) Remove trailing whitespace flags is one of the following: - DOH_REPLACE_ANY - DOH_REPLACE_NOQUOTE - DOH_REPLACE_ID - DOH_REPLACE_FIRST - + DOH_REPLACE_ID + DOH_REPLACE_ID_BEGIN + DOH_REPLACE_ID_END + DOH_REPLACE_NUMBER_END + +and can be combined with one or more of the following: + DOH_REPLACE_ANY + DOH_REPLACE_NOQUOTE + DOH_REPLACE_NOCOMMENT + DOH_REPLACE_FIRST + Callable Operations ------------------- Call(obj, args) Perform a function call with arguments args. diff --git a/Source/DOH/doh.h b/Source/DOH/doh.h index 7fb64c058..fd0530e9c 100644 --- a/Source/DOH/doh.h +++ b/Source/DOH/doh.h @@ -289,11 +289,12 @@ extern char *DohStrchr(const DOHString_or_char *s1, int ch); #define DOH_REPLACE_ANY 0x01 #define DOH_REPLACE_NOQUOTE 0x02 -#define DOH_REPLACE_ID 0x04 -#define DOH_REPLACE_FIRST 0x08 -#define DOH_REPLACE_ID_BEGIN 0x10 -#define DOH_REPLACE_ID_END 0x20 -#define DOH_REPLACE_NUMBER_END 0x40 +#define DOH_REPLACE_NOCOMMENT 0x04 +#define DOH_REPLACE_ID 0x08 +#define DOH_REPLACE_FIRST 0x10 +#define DOH_REPLACE_ID_BEGIN 0x20 +#define DOH_REPLACE_ID_END 0x40 +#define DOH_REPLACE_NUMBER_END 0x80 #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 6c6728578..3689f4ffe 100644 --- a/Source/DOH/string.c +++ b/Source/DOH/string.c @@ -595,6 +595,13 @@ static char *end_quote(char *s) { } } +static char *end_comment(char *s) { + char *substring = strstr(s, "*/"); + if (substring) + ++substring; + return substring; +} + static char *match_simple(char *base, char *s, char *token, int tokenlen) { (void) base; (void) tokenlen; @@ -677,6 +684,7 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co int ic; int rcount = 0; int noquote = 0; + int nocomment = 0; char *c, *s, *t, *first; char *q, *q2; char *base; @@ -698,6 +706,11 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co if (flags & DOH_REPLACE_NOQUOTE) noquote = 1; + if (flags & DOH_REPLACE_NOCOMMENT) + nocomment = 1; + + assert(!(noquote && nocomment)); /* quote and comment combination not implemented */ + /* If we are not replacing inside quotes, we need to do a little extra work */ if (noquote) { q = strpbrk(base, "\"\'"); @@ -723,6 +736,31 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } + /* If we are not replacing inside comments, we need to do a little extra work */ + if (nocomment) { + q = strstr(base, "/*"); + if (!q) { + nocomment = 0; /* Well, no comments to worry about. Oh well */ + } else { + while (q && (q < s)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + return 0; + } + if (q2 > s) { + /* Find next match */ + s = (*match) (base, q2 + 1, token, tokenlen); + } + if (!s) + return 0; /* Oh well, no matches */ + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; /* No more comments */ + } + } + } + first = s; replen = (int)strlen(rep); @@ -768,6 +806,28 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } } + if (nocomment) { + q = strstr(s, "/*"); + if (!q) { + nocomment = 0; + } else { + while (q && (q < c)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + c = 0; + break; + } + if (q2 > c) + c = (*match) (base, q2 + 1, token, tokenlen); + if (!c) + break; + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; /* No more comments */ + } + } + } if (delta) { if (c) { memmove(t, s, c - s); @@ -823,6 +883,29 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } } + if (nocomment) { + q = strstr(s, "/*"); + if (!q) { + break; + } else { + while (q && (q < c)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + c = 0; + break; + } + if (q2 > c) { + c = (*match) (base, q2 + 1, token, tokenlen); + if (!c) + break; + } + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; + } + } + } if (c) { rcount++; ic--; @@ -875,6 +958,29 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } } + if (nocomment) { + q = strstr(s, "/*"); + if (!q) { + nocomment = 0; + } else { + while (q && (q < c)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + c = 0; + break; + } + if (q2 > c) { + c = (*match) (base, q2 + 1, token, tokenlen); + if (!c) + break; + } + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; /* No more comments */ + } + } + } if (i < (rcount - 1)) { memcpy(t, s, c - s); t += (c - s); diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index 27dbd6427..d08884b0f 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -4064,7 +4064,7 @@ public: /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); - int flags = DOH_REPLACE_FIRST | DOH_REPLACE_ID_BEGIN; + int flags = DOH_REPLACE_FIRST | DOH_REPLACE_ID_BEGIN | DOH_REPLACE_NOCOMMENT; if (Replace(tm, "ref ", "", flags) || Replace(tm, "ref\t", "", flags)) { Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else if (Replace(tm, "out ", "", flags) || Replace(tm, "out\t", "", flags)) {