Browse Source

Added an option for an encoding.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/60/head
Dimitar Dobrev 13 years ago
parent
commit
f38fa134e4
  1. 7
      src/Generator/Driver.cs
  2. 38
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  3. 4
      tests/Basic/Basic.Tests.cs
  4. 5
      tests/Basic/Basic.cpp
  5. 2
      tests/Basic/Basic.h

7
src/Generator/Driver.cs

@ -1,4 +1,5 @@ @@ -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 @@ -226,6 +227,8 @@ namespace CppSharp
OutputInteropIncludes = true;
MaxIndent = 80;
CommentPrefix = "///";
Encoding = Encoding.ASCII;
}
// General options
@ -274,6 +277,8 @@ namespace CppSharp @@ -274,6 +277,8 @@ namespace CppSharp
public int MaxIndent;
public string CommentPrefix;
public Encoding Encoding { get; set; }
private string inlinesLibraryName;
public string InlinesLibraryName
{

38
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -1,6 +1,7 @@ @@ -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 @@ -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 @@ -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 @@ -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 @@ -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)

4
tests/Basic/Basic.Tests.cs

@ -108,9 +108,7 @@ public class BasicTests @@ -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"));
}
}

5
tests/Basic/Basic.cpp

@ -4,6 +4,11 @@ Foo::Foo() @@ -4,6 +4,11 @@ Foo::Foo()
{
}
const char* Foo::GetANSI()
{
return "ANSI";
}
Foo2 Foo2::operator<<(signed int i)
{
Foo2 foo;

2
tests/Basic/Basic.h

@ -13,6 +13,8 @@ public: @@ -13,6 +13,8 @@ public:
float B;
const char* Unicode;
const char* GetANSI();
};
class DLL_API Foo2 : public Foo

Loading…
Cancel
Save