summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2016-03-12 17:42:37 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2016-03-12 18:52:49 +0000
commit5fb6537f699cf39507ba5240b3eeccdedf8c0293 (patch)
treeda32d09931f12cf07291ecee45c435922d3c93ed
parent391a3cf00a81535e75177b34dbfac0c007efbd66 (diff)
downloadswig-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.i4
-rw-r--r--Examples/test-suite/chartest.i4
-rw-r--r--Source/Modules/csharp.cxx19
-rw-r--r--Source/Swig/misc.c39
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);