{$MODE OBJFPC} { -*- delphi -*- } {$INCLUDE blank.inc} {$CODEPAGE UTF8} {$MODESWITCH ADVANCEDRECORDS+} {$ASSERTIONS ON} unit unit1; interface uses unit2; type TUTF8SequenceLength = 1..4; TUTF8Sequence = packed record case Byte of 0: (Length: TUTF8SequenceLength; case Byte of 0: (Byte1, Byte2, Byte3, Byte4: Byte)); 1: (AsString: String[4]); end; function UTF8To(const Data: PUTF8String; const Position: Cardinal; out BytesRead: TUTF8SequenceLength): TTest2; inline; function ToUTF8(const Value: TTest2): TUTF8Sequence; inline; implementation uses unit3; function IntToStr(const Value: Integer): AnsiString; begin end; operator := (const Value: TUTF8Sequence): UTF8String; begin end; operator + (const Op1: TUTF8Sequence; const Op2: UTF8String): UTF8String; begin end; operator + (const Op1: UTF8String; const Op2: TUTF8Sequence): UTF8String; begin Writeln(Op1 + Op1); end; operator + (const Op1, Op2: TUTF8Sequence): UTF8String; begin end; function IsValidUTF8(const Value: RawByteString): Boolean; begin Result := True; end; function UTF8To(const Data: PByte; out BytesRead: TUTF8SequenceLength): TTest2; procedure Return(const Param1: TTest2; const Length: Integer); inline; begin Result := Param1; BytesRead := Length; end; begin if ((Data+1)^ in [$80..$8F]) then begin if ((Data+2)^ in [$80..$BF]) then Return(0, 0); end; Return(0, 0); Writeln('A'); Writeln('B'); Writeln(Result.Field1 < 0); end; function UTF8To(const Data: PUTF8String; const Position: Cardinal; out BytesRead: TUTF8SequenceLength): TTest2; begin end; function UTF8ToUTF8Length(const Data: PByte): TUTF8SequenceLength; inline; begin end; function UTF8ToUTF8Length(const Data: PUTF8String; const Position: Cardinal): TUTF8SequenceLength; begin end; function ToUTF8(const Value: TTest2): TUTF8Sequence; begin Writeln(''); Writeln('A'); Writeln('B'); Writeln('C' + IntToStr(0)); end; function ToUTF8Length(const Value: TTest2): TUTF8SequenceLength; begin end; procedure TestUTF8Decoder(); var S: UTF8String; Incrementor: TUTF8SequenceLength; Index: Integer; begin Writeln(UTF8To(PByte(@S[Index]), Incrementor) = $FFFD); Writeln(Incrementor = 1); Inc(Index, Incrementor); Writeln(UTF8To(PByte(@S[Index]), Incrementor) = $FFFD); Writeln(Incrementor = 1); Inc(Index, Incrementor); Writeln(UTF8To(PByte(@S[Index]), Incrementor) = $FFFD); Writeln(Incrementor = 1); Inc(Index, Incrementor); Writeln(UTF8To(PByte(@S[Index]), Incrementor) = $FFFD); Writeln(Incrementor = 1); Inc(Index, Incrementor); Writeln(UTF8To(PByte(@S[Index]), Incrementor) = $FFFD); Writeln(Incrementor = 1); Inc(Index, Incrementor); end; end.