From: <ou...@us...> - 2008-08-17 12:39:39
|
Revision: 2428 http://jcl.svn.sourceforge.net/jcl/?rev=2428&view=rev Author: outchy Date: 2008-08-17 12:39:36 +0000 (Sun, 17 Aug 2008) Log Message: ----------- Added routines to read/write characters to streams. Modified Paths: -------------- trunk/jcl/source/common/JclStreams.pas trunk/jcl/source/common/JclStringConversions.pas Modified: trunk/jcl/source/common/JclStreams.pas =================================================================== --- trunk/jcl/source/common/JclStreams.pas 2008-08-16 19:49:00 UTC (rev 2427) +++ trunk/jcl/source/common/JclStreams.pas 2008-08-17 12:39:36 UTC (rev 2428) @@ -27,7 +27,7 @@ { } {**************************************************************************************************} { } -{ Last modified: $Date:: $ } +{ Last modified: $Date:: $ } { Revision: $Rev:: $ } { Author: $Author:: $ } { } @@ -517,6 +517,15 @@ function WriteString(const Buffer: string; Start, Count: Longint): Longint; function WriteAnsiString(const Buffer: AnsiString; Start, Count: Longint): Longint; function WriteWideString(const Buffer: WideString; Start, Count: Longint): Longint; + function PeekChar(var Buffer: Char): Boolean; + function PeekAnsiChar(var Buffer: AnsiChar): Boolean; + function PeekWideChar(var Buffer: WideChar): Boolean; + function ReadChar(var Buffer: Char): Boolean; + function ReadAnsiChar(var Buffer: AnsiChar): Boolean; + function ReadWideChar(var Buffer: WideChar): Boolean; + function WriteChar(Value: Char): Boolean; + function WriteAnsiChar(Value: AnsiChar): Boolean; + function WriteWideChar(Value: WideChar): Boolean; function SkipBOM: LongInt; function WriteBOM: Longint; end; @@ -2558,6 +2567,42 @@ {$ENDIF ~CLR} end; +function TJclStringStream.PeekAnsiChar(var Buffer: AnsiChar): Boolean; +var + Pos: Int64; + Ch: UCS4; +begin + Pos := FPosition; + Result := FCharacterReader(Self, Ch); + if Result then + Buffer := UCS4ToAnsiChar(Ch); + FPosition := Pos; +end; + +function TJclStringStream.PeekChar(var Buffer: Char): Boolean; +var + Pos: Int64; + Ch: UCS4; +begin + Pos := FPosition; + Result := FCharacterReader(Self, Ch); + if Result then + Buffer := UCS4ToChar(Ch); + FPosition := Pos; +end; + +function TJclStringStream.PeekWideChar(var Buffer: WideChar): Boolean; +var + Pos: Int64; + Ch: UCS4; +begin + Pos := FPosition; + Result := FCharacterReader(Self, Ch); + if Result then + Buffer := UCS4ToWideChar(Ch); + FPosition := Pos; +end; + function TJclStringStream.ReadString(var Buffer: string; Start, Count: Longint): Longint; var Index, StrPos: Integer; @@ -2580,6 +2625,15 @@ Result := Index - Start; end; +function TJclStringStream.ReadAnsiChar(var Buffer: AnsiChar): Boolean; +var + Ch: UCS4; +begin + Result := FCharacterReader(Self, Ch); + if Result then + Buffer := UCS4ToAnsiChar(Ch); +end; + function TJclStringStream.ReadAnsiString(var Buffer: AnsiString; Start, Count: Longint): Longint; var Index, StrPos: Integer; @@ -2602,6 +2656,24 @@ Result := Index - Start; end; +function TJclStringStream.ReadChar(var Buffer: Char): Boolean; +var + Ch: UCS4; +begin + Result := FCharacterReader(Self, Ch); + if Result then + Buffer := UCS4ToChar(Ch); +end; + +function TJclStringStream.ReadWideChar(var Buffer: WideChar): Boolean; +var + Ch: UCS4; +begin + Result := FCharacterReader(Self, Ch); + if Result then + Buffer := UCS4ToWideChar(Ch); +end; + function TJclStringStream.ReadWideString(var Buffer: WideString; Start, Count: Longint): Longint; var Index, StrPos: Integer; @@ -2664,6 +2736,11 @@ Result := 0; end; +function TJclStringStream.WriteChar(Value: Char): Boolean; +begin + Result := FCharacterWriter(Self, CharToUCS4(Value)); +end; + function TJclStringStream.WriteString(const Buffer: string; Start, Count: Longint): Longint; var Index, StrPos: Integer; @@ -2682,6 +2759,11 @@ Result := Index - Start; end; +function TJclStringStream.WriteAnsiChar(Value: AnsiChar): Boolean; +begin + Result := FCharacterWriter(Self, AnsiCharToUCS4(Value)); +end; + function TJclStringStream.WriteAnsiString(const Buffer: AnsiString; Start, Count: Longint): Longint; var Index, StrPos: Integer; @@ -2700,6 +2782,11 @@ Result := Index - Start; end; +function TJclStringStream.WriteWideChar(Value: WideChar): Boolean; +begin + Result := FCharacterWriter(Self, WideCharToUCS4(Value)); +end; + function TJclStringStream.WriteWideString(const Buffer: WideString; Start, Count: Longint): Longint; var Index, StrPos: Integer; Modified: trunk/jcl/source/common/JclStringConversions.pas =================================================================== --- trunk/jcl/source/common/JclStringConversions.pas 2008-08-16 19:49:00 UTC (rev 2427) +++ trunk/jcl/source/common/JclStringConversions.pas 2008-08-17 12:39:36 UTC (rev 2428) @@ -34,7 +34,7 @@ { } {**************************************************************************************************} { } -{ Last modified: $Date:: $ } +{ Last modified: $Date:: $ } { Revision: $Rev:: $ } { Author: $Author:: $ } { } @@ -216,6 +216,14 @@ function GetUCS4CharAt(const WideStr: TUTF16String; Index: Integer; out Value: UCS4; IsUTF16: Boolean = True): Boolean; overload; function GetUCS4CharAt(const UCS4Str: TUCS4Array; Index: Integer; out Value: UCS4): Boolean; overload; +function UCS4ToAnsiChar(Value: UCS4): AnsiChar; +function UCS4ToWideChar(Value: UCS4): WideChar; +function UCS4ToChar(Value: UCS4): Char; {$IFDEF SUPPORTS_INLINE} inline; {$ENDIF SUPPORTS_INLINE} + +function AnsiCharToUCS4(Value: AnsiChar): UCS4; +function WideCharToUCS4(Value: WideChar): UCS4; +function CharToUCS4(Value: Char): UCS4; {$IFDEF SUPPORTS_INLINE} inline; {$ENDIF SUPPORTS_INLINE} + {$IFDEF UNITVERSIONING} const UnitVersioning: TUnitVersionInfo = ( @@ -1037,9 +1045,9 @@ Result := (StrPos > 0) and (StrPos < (StrLength - 1)); if Result then begin - S[StrPos] := AnsiChar($E0 or (ReplacementCharacter shr 12)); // 4 bits - S[StrPos + 1] := AnsiChar(((ReplacementCharacter shr 6) and $3F) or $80); // 6 bits - S[StrPos + 2] := AnsiChar((ReplacementCharacter and $3F) or $80); // 6 bits + S[StrPos] := AnsiChar($E0 or (UCS4ReplacementCharacter shr 12)); // 4 bits + S[StrPos + 1] := AnsiChar(((UCS4ReplacementCharacter shr 6) and $3F) or $80); // 6 bits + S[StrPos + 2] := AnsiChar((UCS4ReplacementCharacter and $3F) or $80); // 6 bits Inc(StrPos, 3); end; {$ELSE ~UNICODE_SILENT_FAILURE} @@ -1092,9 +1100,9 @@ else {$IFDEF UNICOLE_SILENT_FAILURE} // add ReplacementCharacter - Result := StreamWriteByte(S, $E0 or (ReplacementCharacter shr 12)) and // 4 bits - StreamWriteByte(S, ((ReplacementCharacter shr 6) and $3F) or $80) and // 6 bits - StreamWriteByte(S, (ReplacementCharacter and $3F) or $80); // 6 bits + Result := StreamWriteByte(S, $E0 or (UCS4ReplacementCharacter shr 12)) and // 4 bits + StreamWriteByte(S, ((UCS4ReplacementCharacter shr 6) and $3F) or $80) and // 6 bits + StreamWriteByte(S, (UCS4ReplacementCharacter and $3F) or $80); // 6 bits {$ELSE ~UNICODE_SILENT_FAILURE} Result := False; {$ENDIF ~UNICODE_SILENT_FAILURE} @@ -1387,7 +1395,7 @@ Result := (StrPos > 0) and (StrPos <= StrLength); if Result then begin - S[StrPos] := WideChar(ReplacementCharacter); + S[StrPos] := WideChar(UCS4ReplacementCharacter); Inc(StrPos, 1); end; {$ELSE ~UNICODE_SILENT_FAILURE} @@ -1411,7 +1419,7 @@ begin {$IFDEF UNICOLE_SILENT_FAILURE} // add ReplacementCharacter - Result := StreamWriteWord(S, ReplacementCharacter); + Result := StreamWriteWord(S, UCS4ReplacementCharacter); {$ELSE ~UNICODE_SILENT_FAILURE} Result := False; {$ENDIF ~UNICODE_SILENT_FAILURE} @@ -1974,6 +1982,60 @@ Value := UCS4Str[Index]; end; +function UCS4ToAnsiChar(Value: UCS4): AnsiChar; +var + Buf: WideString; + StrPos: Integer; +begin + StrPos := 1; + Buf := #0#0; + if UTF16SetNextChar(Buf, StrPos, Value) then + Result := AnsiString(Buf)[1] + else + Result := AnsiReplacementCharacter; +end; + +function UCS4ToWideChar(Value: UCS4): WideChar; +begin + if Value <= MaximumUCS2 then + Result := WideChar(Value) + else + Result := WideChar(UCS4ReplacementCharacter); +end; + +function UCS4ToChar(Value: UCS4): Char; +begin + {$IFDEF SUPPORTS_UNICODE} + Result := UCS4ToWideChar(Value); + {$ELSE ~SUPPORTS_UNICODE} + Result := UCS4ToAnsiChar(Value); + {$ENDIF ~SUPPORTS_UNICODE} +end; + +function AnsiCharToUCS4(Value: AnsiChar): UCS4; +var + Buf: WideString; + StrPos: Integer; +begin + StrPos := 1; + Buf := AnsiString(Value); + Result := UTF16GetNextChar(Buf, StrPos); +end; + +function WideCharToUCS4(Value: WideChar): UCS4; +begin + Result := UCS4(Value); +end; + +function CharToUCS4(Value: Char): UCS4; +begin + {$IFDEF SUPPORTS_UNICODE} + Result := WideCharToUCS4(Value); + {$ELSE ~SUPPORTS_UNICODE} + Result := AnsiCharToUCS4(Value); + {$ENDIF ~SUPPORTS_UNICODE} +end; + {$IFDEF UNITVERSIONING} initialization RegisterUnitVersion(HInstance, UnitVersioning); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |