diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2016-03-12 17:42:37 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2016-03-12 18:52:49 +0000 |
commit | 5fb6537f699cf39507ba5240b3eeccdedf8c0293 (patch) | |
tree | da32d09931f12cf07291ecee45c435922d3c93ed | |
parent | 391a3cf00a81535e75177b34dbfac0c007efbd66 (diff) | |
download | swig-5fb6537f699cf39507ba5240b3eeccdedf8c0293.tar.gz |
C# char wrappers fixes for enum values, static const member char values and %csconst
Use hex escaping for char values used as C# constants
-rw-r--r-- | Examples/test-suite/char_constant.i | 4 | ||||
-rw-r--r-- | Examples/test-suite/chartest.i | 4 | ||||
-rw-r--r-- | Source/Modules/csharp.cxx | 19 | ||||
-rw-r--r-- | Source/Swig/misc.c | 39 |
4 files changed, 56 insertions, 10 deletions
diff --git a/Examples/test-suite/char_constant.i b/Examples/test-suite/char_constant.i index 30db62c4f..918456192 100644 --- a/Examples/test-suite/char_constant.i +++ b/Examples/test-suite/char_constant.i @@ -24,8 +24,8 @@ #if defined(SWIGJAVA) %javaconst(1); -//#elif SWIGCSHARP -//%csconst(1); +#elif SWIGCSHARP +%csconst(1); #elif SWIGD %dmanifestconst; #endif diff --git a/Examples/test-suite/chartest.i b/Examples/test-suite/chartest.i index b86bfdc91..7c187817c 100644 --- a/Examples/test-suite/chartest.i +++ b/Examples/test-suite/chartest.i @@ -41,8 +41,8 @@ struct CharTestClass { #if defined(SWIGJAVA) %javaconst(1); -//#elif SWIGCSHARP -//%csconst(1); +#elif SWIGCSHARP +%csconst(1); #elif SWIGD %dmanifestconst; #endif diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index eaa027f2a..b3dd7e38f 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -1309,7 +1309,7 @@ public: const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { - String *val = NewStringf("'%s'", Getattr(n, "enumvalue")); + String *val = NewStringf("'%(hexescape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } @@ -1433,6 +1433,7 @@ public: virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); + SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); String *tm; String *return_type = NewString(""); @@ -1485,13 +1486,15 @@ public: Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } + // Default (octal) escaping is no good - change to hex escaped value + String *hexescaped_value = Getattr(n, "rawvalue") ? NewStringf("%(hexescape)s", Getattr(n, "rawvalue")) : 0; // Add the stripped quotes back in String *new_value = NewString(""); if (SwigType_type(t) == T_STRING) { - Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); + Printf(new_value, "\"%s\"", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { - Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); + Printf(new_value, "\'%s\'", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } @@ -1532,10 +1535,14 @@ public: } else { // Alternative constant handling will use the C syntax to make a true C# constant and hope that it compiles as C# code if (Getattr(n, "wrappedasconstant")) { - if (SwigType_type(t) == T_CHAR) - Printf(constants_code, "\'%s\';\n", Getattr(n, "staticmembervariableHandler:value")); - else + if (SwigType_type(t) == T_CHAR) { + if (SwigType_type(valuetype) == T_CHAR) + Printf(constants_code, "\'%(hexescape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); + else + Printf(constants_code, "(char)%s;\n", Getattr(n, "staticmembervariableHandler:value")); + } else { Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); + } } else { Printf(constants_code, "%s;\n", Getattr(n, "value")); } diff --git a/Source/Swig/misc.c b/Source/Swig/misc.c index c552ac2cb..402db2be3 100644 --- a/Source/Swig/misc.c +++ b/Source/Swig/misc.c @@ -309,6 +309,7 @@ int Swig_storage_isstatic(Node *n) { * Swig_string_escape() * * Takes a string object and produces a string with escape codes added to it. + * Octal escaping is used. * ----------------------------------------------------------------------------- */ String *Swig_string_escape(String *s) { @@ -342,6 +343,43 @@ String *Swig_string_escape(String *s) { return ns; } +/* ----------------------------------------------------------------------------- + * Swig_string_hexescape() + * + * Takes a string object and produces a string with escape codes added to it. + * Hex escaping is used. + * ----------------------------------------------------------------------------- */ + +String *Swig_string_hexescape(String *s) { + String *ns; + int c; + ns = NewStringEmpty(); + + while ((c = Getc(s)) != EOF) { + if (c == '\n') { + Printf(ns, "\\n"); + } else if (c == '\r') { + Printf(ns, "\\r"); + } else if (c == '\t') { + Printf(ns, "\\t"); + } else if (c == '\\') { + Printf(ns, "\\\\"); + } else if (c == '\'') { + Printf(ns, "\\'"); + } else if (c == '\"') { + Printf(ns, "\\\""); + } else if (c == ' ') { + Putc(c, ns); + } else if (!isgraph(c)) { + if (c < 0) + c += UCHAR_MAX + 1; + Printf(ns, "\\x%X", c); + } else { + Putc(c, ns); + } + } + return ns; +} /* ----------------------------------------------------------------------------- * Swig_string_upper() @@ -1392,6 +1430,7 @@ String *Swig_pcre_version(void) { void Swig_init() { /* Set some useful string encoding methods */ DohEncoding("escape", Swig_string_escape); + DohEncoding("hexescape", Swig_string_hexescape); DohEncoding("upper", Swig_string_upper); DohEncoding("lower", Swig_string_lower); DohEncoding("title", Swig_string_title); |