diff --git a/src/Generator/Types/Std/Stdlib.cs b/src/Generator/Types/Std/Stdlib.cs index edc965eb..c78c02b9 100644 --- a/src/Generator/Types/Std/Stdlib.cs +++ b/src/Generator/Types/Std/Stdlib.cs @@ -155,7 +155,7 @@ namespace CppSharp.Types.Std return new CustomType(typePrinter.IntPtrType); } - Encoding enconding = GetEncoding(); + var (enconding, _) = GetEncoding(); if (enconding == Encoding.ASCII) return new CustomType("[MarshalAs(UnmanagedType.LPStr)] string"); @@ -225,8 +225,7 @@ namespace CppSharp.Types.Std string bytes = $"__bytes{ctx.ParameterIndex}"; string bytePtr = $"__bytePtr{ctx.ParameterIndex}"; ctx.Before.WriteLine($@"byte[] {bytes} = global::System.Text.Encoding.{ - GetEncoding().GetType().Name.Replace( - nameof(Encoding), string.Empty)}.GetBytes({param});"); + GetEncoding().Name}.GetBytes({param});"); ctx.Before.WriteLine($"fixed (byte* {bytePtr} = {bytes})"); ctx.HasCodeBlock = true; ctx.Before.WriteOpenBraceAndIndent(); @@ -272,7 +271,7 @@ namespace CppSharp.Types.Std textGenerator.UnindentAndWriteCloseBrace(); } - Encoding encoding = GetEncoding(); + string encoding = GetEncoding().Name; string type = GetTypeForCodePoint(encoding); var retPtr = Generator.GeneratedIdentifier($"retPtr{ctx.ParameterIndex}"); var length = Generator.GeneratedIdentifier($"length{ctx.ParameterIndex}"); @@ -281,31 +280,49 @@ namespace CppSharp.Types.Std textGenerator.WriteLine($"while (*({retPtr}++) != 0) {length} += sizeof({type});"); ctx.Return.Write($@"global::System.Text.Encoding.{ - encoding.GetType().Name.Replace( - nameof(Encoding), string.Empty)}.GetString((byte*) {returnVarName}, {length})"); + encoding}.GetString((byte*) {returnVarName}, {length})"); } - private Encoding GetEncoding() + private (Encoding Encoding, string Name) GetEncoding() { switch (GetCharWidth()) { case 8: - return Context.Options.Encoding; + if (Context.Options.Encoding == Encoding.ASCII) + return (Context.Options.Encoding, nameof(Encoding.ASCII)); + if (Context.Options.Encoding == Encoding.UTF8) + return (Context.Options.Encoding, nameof(Encoding.UTF8)); + if (Context.Options.Encoding == Encoding.UTF7) + return (Context.Options.Encoding, nameof(Encoding.UTF7)); + if (Context.Options.Encoding == Encoding.BigEndianUnicode) + return (Context.Options.Encoding, nameof(Encoding.BigEndianUnicode)); + if (Context.Options.Encoding == Encoding.Unicode) + return (Context.Options.Encoding, nameof(Encoding.Unicode)); + if (Context.Options.Encoding == Encoding.UTF32) + return (Context.Options.Encoding, nameof(Encoding.UTF32)); + break; case 16: - return Encoding.Unicode; + return (Encoding.Unicode, nameof(Encoding.Unicode)); case 32: - return Encoding.UTF32; + return (Encoding.UTF32, nameof(Encoding.UTF32)); } throw new System.NotSupportedException( $"{Context.Options.Encoding.EncodingName} is not supported yet."); } - private static string GetTypeForCodePoint(Encoding encoding) + private static string GetTypeForCodePoint(string encoding) { - return encoding == Encoding.UTF32 ? "int" : - encoding == Encoding.Unicode || encoding == Encoding.BigEndianUnicode ? - "short" : "byte"; + switch (encoding) + { + case nameof(Encoding.UTF32): + return "int"; + case nameof(Encoding.Unicode): + case nameof(Encoding.BigEndianUnicode): + return "short"; + default: + return "byte"; + } } }