Преглед на файлове

* Patch from Ondrej Pokorny to add GetAnsiBytes/GetAnsiString

git-svn-id: trunk@34474 -
michael преди 9 години
родител
ревизия
de7e5d73c0
променени са 2 файла, в които са добавени 111 реда и са изтрити 0 реда
  1. 98 0
      rtl/objpas/sysutils/sysencoding.inc
  2. 13 0
      rtl/objpas/sysutils/sysencodingh.inc

+ 98 - 0
rtl/objpas/sysutils/sysencoding.inc

@@ -22,6 +22,29 @@ begin
   Result := FStandardEncodings[seAnsi];
 end;
 
+function TEncoding.GetAnsiBytes(const S: string): TBytes;
+begin
+  Result := GetAnsiBytes(S, 1, Length(S));
+end;
+
+function TEncoding.GetAnsiBytes(const S: string; CharIndex, CharCount: Integer
+  ): TBytes;
+begin
+  Result := GetAnsiBytes(Pointer(@S[CharIndex]), CharCount);
+end;
+
+function TEncoding.GetAnsiString(const Bytes: TBytes): string;
+begin
+  Result := GetAnsiString(Bytes, 0, Length(Bytes));
+end;
+
+function TEncoding.GetAnsiString(const Bytes: TBytes; ByteIndex,
+  ByteCount: Integer): string;
+begin
+  Result := GetAnsiString(Pointer(@Bytes[ByteIndex]), ByteCount);
+  SetCodePage(RawByteString(Result), DefaultSystemCodePage, False);
+end;
+
 class function TEncoding.GetASCII: TEncoding;
 begin
   if not Assigned(FStandardEncodings[seAscii]) then
@@ -393,6 +416,25 @@ begin
   Result := TMBCSEncoding.Create(FCodePage, FMBToWCharFlags, FWCharToMBFlags);
 end;
 
+function TMBCSEncoding.GetAnsiBytes(Chars: PChar; CharCount: Integer): TBytes;
+var
+  S: RawByteString;
+begin
+  SetString(S, Chars, CharCount);
+  SetCodePage(S, DefaultSystemCodePage, False);
+  SetCodePage(S, GetCodePage, True);
+  SetLength(Result, Length(S));
+  if Length(S)>0 then
+    Move(S[1], Result[0], Length(S));
+end;
+
+function TMBCSEncoding.GetAnsiString(Bytes: PByte; ByteCount: Integer): string;
+begin
+  SetString(Result, Pointer(Bytes), ByteCount);
+  SetCodePage(RawByteString(Result), GetCodePage, False);
+  SetCodePage(RawByteString(Result), DefaultSystemCodePage, True);
+end;
+
 function TMBCSEncoding.GetMaxByteCount(CharCount: Integer): Integer;
 begin
   Result := CharCount;
@@ -515,6 +557,23 @@ begin
   Result := TUnicodeEncoding.Create;
 end;
 
+function TUnicodeEncoding.GetAnsiBytes(Chars: PChar; CharCount: Integer
+  ): TBytes;
+var
+  U: UnicodeString;
+begin
+  widestringmanager.Ansi2UnicodeMoveProc(Chars, DefaultSystemCodePage, U, CharCount);
+  SetLength(Result, Length(U)*SizeOf(UnicodeChar));
+  if Length(Result)>0 then
+    Move(U[1], Result[0], Length(Result));
+end;
+
+function TUnicodeEncoding.GetAnsiString(Bytes: PByte; ByteCount: Integer
+  ): string;
+begin
+  widestringmanager.Unicode2AnsiMoveProc(PUnicodeChar(Bytes), RawByteString(Result), DefaultSystemCodePage, ByteCount div SizeOf(UnicodeChar));
+end;
+
 function TUnicodeEncoding.GetMaxByteCount(CharCount: Integer): Integer;
 begin
   Result := CharCount * SizeOf(UnicodeChar);
@@ -586,10 +645,49 @@ begin
   Result := TBigEndianUnicodeEncoding.Create;
 end;
 
+function TBigEndianUnicodeEncoding.GetAnsiBytes(Chars: PChar; CharCount: Integer
+  ): TBytes;
+begin
+  Result := TEncoding.Unicode.GetAnsiBytes(Chars, CharCount);
+  Swap(Result);
+end;
+
+function TBigEndianUnicodeEncoding.GetAnsiString(Bytes: PByte;
+  ByteCount: Integer): string;
+var
+  B: TBytes;
+begin
+  if ByteCount=0 then
+    Exit('');
+
+  SetLength(B, ByteCount);
+  Move(Bytes^, B[0], ByteCount);
+  Swap(B);
+
+  Result := TEncoding.Unicode.GetAnsiString(PByte(@B[0]), ByteCount);
+end;
+
 function TBigEndianUnicodeEncoding.GetPreamble: TBytes;
 begin
   SetLength(Result, 2);
   Result[0] := $FE;
   Result[1] := $FF;
 end;
+
+procedure TBigEndianUnicodeEncoding.Swap(var B: TBytes);
+var
+  LastB, I: Integer;
+  C: Byte;
+begin
+  LastB := Length(B)-1;
+  I := 0;
+  while I < LastB do
+    begin
+      C := B[I];
+      B[I] := B[I+1];
+      B[I+1] := C;
+      Inc(I, 2);
+    end;
+end;
+
 {$endif VER2_4}

+ 13 - 0
rtl/objpas/sysutils/sysencodingh.inc

@@ -48,6 +48,8 @@ type
     function GetBytes(Chars: PUnicodeChar; CharCount: Integer; Bytes: PByte; ByteCount: Integer): Integer; overload; virtual; abstract;
     function GetCharCount(Bytes: PByte; ByteCount: Integer): Integer; overload; virtual; abstract;
     function GetChars(Bytes: PByte; ByteCount: Integer; Chars: PUnicodeChar; CharCount: Integer): Integer; overload; virtual; abstract;
+    function GetAnsiBytes(Chars: PChar; CharCount: Integer): TBytes; virtual; abstract;
+    function GetAnsiString(Bytes: PByte; ByteCount: Integer): string; virtual; abstract;
     function GetCodePage: Cardinal; virtual; abstract;
     function GetEncodingName: UnicodeString; virtual; abstract;
   public
@@ -83,6 +85,10 @@ type
     function GetPreamble: TBytes; virtual; abstract;
     function GetString(const Bytes: TBytes): UnicodeString; overload;
     function GetString(const Bytes: TBytes; ByteIndex, ByteCount: Integer): UnicodeString; overload;
+    function GetAnsiBytes(const S: string): TBytes; overload;
+    function GetAnsiBytes(const S: string; CharIndex, CharCount: Integer): TBytes; overload;
+    function GetAnsiString(const Bytes: TBytes): string; overload;
+    function GetAnsiString(const Bytes: TBytes; ByteIndex, ByteCount: Integer): string; overload;
 
     property CodePage: Cardinal read GetCodePage;
     property EncodingName: UnicodeString read GetEncodingName;
@@ -109,6 +115,8 @@ type
     function GetBytes(Chars: PUnicodeChar; CharCount: Integer; Bytes: PByte; ByteCount: Integer): Integer; overload; override;
     function GetCharCount(Bytes: PByte; ByteCount: Integer): Integer; overload; override;
     function GetChars(Bytes: PByte; ByteCount: Integer; Chars: PUnicodeChar; CharCount: Integer): Integer; overload; override;
+    function GetAnsiBytes(Chars: PChar; CharCount: Integer): TBytes; override;
+    function GetAnsiString(Bytes: PByte; ByteCount: Integer): string; override;
     function GetCodePage: Cardinal; override;
     function GetEncodingName: UnicodeString; override;
   public
@@ -150,6 +158,8 @@ type
     function GetBytes(Chars: PUnicodeChar; CharCount: Integer; Bytes: PByte; ByteCount: Integer): Integer; overload; override;
     function GetCharCount(Bytes: PByte; ByteCount: Integer): Integer; overload; override;
     function GetChars(Bytes: PByte; ByteCount: Integer; Chars: PUnicodeChar; CharCount: Integer): Integer; overload; override;
+    function GetAnsiBytes(Chars: PChar; CharCount: Integer): TBytes; override;
+    function GetAnsiString(Bytes: PByte; ByteCount: Integer): string; override;
     function GetCodePage: Cardinal; override;
     function GetEncodingName: UnicodeString; override;
   public
@@ -164,8 +174,11 @@ type
 
   TBigEndianUnicodeEncoding = class(TUnicodeEncoding)
   strict protected
+    procedure Swap(var B: TBytes);
     function GetBytes(Chars: PUnicodeChar; CharCount: Integer; Bytes: PByte; ByteCount: Integer): Integer; overload; override;
     function GetChars(Bytes: PByte; ByteCount: Integer; Chars: PUnicodeChar; CharCount: Integer): Integer; overload; override;
+    function GetAnsiBytes(Chars: PChar; CharCount: Integer): TBytes; override;
+    function GetAnsiString(Bytes: PByte; ByteCount: Integer): string; override;
     function GetCodePage: Cardinal; override;
     function GetEncodingName: UnicodeString; override;
   public