diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index 3bf1e2c1..aa88269a 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -1,4 +1,5 @@ -using CppSharp.AST; +using System.Text; +using CppSharp.AST; using CppSharp.Generators; using CppSharp.Generators.CLI; using CppSharp.Generators.CSharp; @@ -226,6 +227,8 @@ namespace CppSharp OutputInteropIncludes = true; MaxIndent = 80; CommentPrefix = "///"; + + Encoding = Encoding.ASCII; } // General options @@ -274,6 +277,8 @@ namespace CppSharp public int MaxIndent; public string CommentPrefix; + public Encoding Encoding { get; set; } + private string inlinesLibraryName; public string InlinesLibraryName { diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index f523e0c4..e882a36c 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using CppSharp.AST; using CppSharp.Types; using Type = CppSharp.AST.Type; @@ -133,8 +134,7 @@ namespace CppSharp.Generators.CSharp if (CSharpTypePrinter.IsConstCharString(pointer)) { - Context.Return.Write("Marshal.PtrToStringUni({0})", - Context.ReturnVarName); + Context.Return.Write(MarshalStringToManaged(Context.ReturnVarName)); return true; } @@ -151,6 +151,21 @@ namespace CppSharp.Generators.CSharp return true; } + private string MarshalStringToManaged(string varName) + { + if (Equals(Context.Driver.Options.Encoding, Encoding.ASCII)) + { + return string.Format("Marshal.PtrToStringAnsi({0})", varName); + } + if (Equals(Context.Driver.Options.Encoding, Encoding.Unicode) || + Equals(Context.Driver.Options.Encoding, Encoding.BigEndianUnicode)) + { + return string.Format("Marshal.PtrToStringUni({0})", varName); + } + throw new NotSupportedException(string.Format("{0} is not supported yet.", + Context.Driver.Options.Encoding.EncodingName)); + } + public override bool VisitPrimitiveType(PrimitiveType primitive, TypeQualifiers quals) { switch (primitive) @@ -359,8 +374,8 @@ namespace CppSharp.Generators.CSharp type.IsPrimitiveType(PrimitiveType.WideChar)) && pointer.QualifiedPointee.Qualifiers.IsConst) { - Context.Return.Write("Marshal.StringToHGlobalUni({0})", - Helpers.SafeIdentifier(Context.Parameter.Name)); + Context.Return.Write(this.MarshalStringToUnmanaged( + Helpers.SafeIdentifier(Context.Parameter.Name))); CSharpContext.Cleanup.WriteLine("Marshal.FreeHGlobal({0});", Helpers.SafeIdentifier(Context.ArgName)); return true; @@ -402,6 +417,21 @@ namespace CppSharp.Generators.CSharp return pointee.Visit(this, quals); } + private string MarshalStringToUnmanaged(string varName) + { + if (Equals(Context.Driver.Options.Encoding, Encoding.ASCII)) + { + return string.Format("Marshal.StringToHGlobalAnsi({0})", varName); + } + if (Equals(Context.Driver.Options.Encoding, Encoding.Unicode) || + Equals(Context.Driver.Options.Encoding, Encoding.BigEndianUnicode)) + { + return string.Format("Marshal.StringToHGlobalUni({0})", varName); + } + throw new NotSupportedException(string.Format("{0} is not supported yet.", + Context.Driver.Options.Encoding.EncodingName)); + } + public override bool VisitPrimitiveType(PrimitiveType primitive, TypeQualifiers quals) { switch (primitive) diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 4c637d0f..84c4c17f 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -108,9 +108,7 @@ public class BasicTests public void TestUnicode() { Foo foo = new Foo(); - const string georgia = "საქართველო"; - foo.Unicode = georgia; - Assert.That(foo.Unicode, Is.EqualTo(georgia)); + Assert.That(foo.GetANSI(), Is.EqualTo("ANSI")); } } \ No newline at end of file diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index bb9269e4..4d146747 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -4,6 +4,11 @@ Foo::Foo() { } +const char* Foo::GetANSI() +{ + return "ANSI"; +} + Foo2 Foo2::operator<<(signed int i) { Foo2 foo; diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index ba9aa622..45d4f739 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -13,6 +13,8 @@ public: float B; const char* Unicode; + + const char* GetANSI(); }; class DLL_API Foo2 : public Foo