Færdig kode: procedure XStrCatC(var Ref: XStr; const Src: XStr; const Index: XIndex; const Count: XCount); xcc; var SrcFmt: XStrFmt; DstFmt: XStrFmt; begin if not Assigned(Src) or (Count = 0) then Exit; XStrNewRef(Src); SrcFmt := _Src^.Format; if not Assigned(Ref) then begin if XStrAlloc(Ref, SrcFmt) < 0 then Exit; end; DstFmt := _Ref^.Format; case DstFmt of xStrFmt7Bit: case SrcFmt of xStrFmt7Bit: __cat_u7bit_to_u7bit(Ref, nil, Src, nil, Index, Count); xStrFmtUcs2: __cat_uucs2_to_u7bit(Ref, nil, Src, nil, Index, Count); xStrFmtUcs4: __cat_uucs4_to_u7bit(Ref, nil, Src, nil, Index, Count); xStrFmtUtf8: __cat_uutf8_to_u7bit(Ref, nil, Src, nil, Index, Count); xStrFmtUtf16: __cat_uutf6_to_u7bit(Ref, nil, Src, nil, Index, Count); else __cat_ucmap_to_u7bit(Ref, nil, Src, nil, Index, Count); end; xStrFmtUcs2: case SrcFmt of xStrFmt7Bit: __cat_u7bit_to_uucs2(Ref, nil, Src, nil, Index, Count); xStrFmtUcs2: __cat_uucs2_to_uucs2(Ref, nil, Src, nil, Index, Count); xStrFmtUcs4: __cat_uucs4_to_uucs2(Ref, nil, Src, nil, Index, Count); xStrFmtUtf8: __cat_uutf8_to_uucs2(Ref, nil, Src, nil, Index, Count); xStrFmtUtf16: __cat_uutf6_to_uucs2(Ref, nil, Src, nil, Index, Count); else __cat_ucmap_to_uucs2(Ref, nil, Src, nil, Index, Count); end; xStrFmtUcs4: case SrcFmt of xStrFmt7Bit: __cat_u7bit_to_uucs4(Ref, nil, Src, nil, Index, Count); xStrFmtUcs2: __cat_uucs2_to_uucs4(Ref, nil, Src, nil, Index, Count); xStrFmtUcs4: __cat_uucs4_to_uucs4(Ref, nil, Src, nil, Index, Count); xStrFmtUtf8: __cat_uutf8_to_uucs4(Ref, nil, Src, nil, Index, Count); xStrFmtUtf16: __cat_uutf6_to_uucs4(Ref, nil, Src, nil, Index, Count); else __cat_ucmap_to_uucs4(Ref, nil, Src, nil, Index, Count); end; xStrFmtUtf8: case SrcFmt of xStrFmt7Bit: __cat_u7bit_to_uutf8(Ref, nil, Src, nil, Index, Count); xStrFmtUcs2: __cat_uucs2_to_uutf8(Ref, nil, Src, nil, Index, Count); xStrFmtUcs4: __cat_uucs4_to_uutf8(Ref, nil, Src, nil, Index, Count); xStrFmtUtf8: __cat_uutf8_to_uutf8(Ref, nil, Src, nil, Index, Count); xStrFmtUtf16: __cat_uutf6_to_uutf8(Ref, nil, Src, nil, Index, Count); else __cat_ucmap_to_uutf8(Ref, nil, Src, nil, Index, Count); end; xStrFmtUtf16: case SrcFmt of xStrFmt7Bit: __cat_u7bit_to_uutf6(Ref, nil, Src, nil, Index, Count); xStrFmtUcs2: __cat_uucs2_to_uutf6(Ref, nil, Src, nil, Index, Count); xStrFmtUcs4: __cat_uucs4_to_uutf6(Ref, nil, Src, nil, Index, Count); xStrFmtUtf8: __cat_uutf8_to_uutf6(Ref, nil, Src, nil, Index, Count); xStrFmtUtf16: __cat_uutf6_to_uutf6(Ref, nil, Src, nil, Index, Count); else __cat_ucmap_to_uutf6(Ref, nil, Src, nil, Index, Count); end; else case SrcFmt of xStrFmt7Bit: __cat_u7bit_to_ucmap(Ref, nil, Src, nil, Index, Count); xStrFmtUcs2: __cat_uucs2_to_ucmap(Ref, nil, Src, nil, Index, Count); xStrFmtUcs4: __cat_uucs4_to_ucmap(Ref, nil, Src, nil, Index, Count); xStrFmtUtf8: __cat_uutf8_to_ucmap(Ref, nil, Src, nil, Index, Count); xStrFmtUtf16: __cat_uutf6_to_ucmap(Ref, nil, Src, nil, Index, Count); else __cat_ucmap_to_ucmap(Ref, nil, Src, nil, Index, Count); end; end; XStrReleaseRef(Src); end; Metakode: procedure XStrCatC(var Ref: XStr; const Src: XStr; const Index: XIndex; const Count: XCount); xcc; var SrcFmt: XStrFmt; DstFmt: XStrFmt; begin if not Assigned(Src) or (Count = 0) then Exit; XStrNewRef(Src); SrcFmt := _Src^.Format; if not Assigned(Ref) then begin if XStrAlloc(Ref, SrcFmt) < 0 then Exit; end; DstFmt := _Ref^.Format; case DstFmt of #foreach dstfmt in U_STR %str_strfmt_case(dstfmt) case SrcFmt of #foreach srcfmt in U_STR %str_strfmt_case(srcfmt) __cat_%(srcfmt)_to_%(dstfmt)(Ref, nil, Src, nil, Index, Count); #end end; #end end; XStrReleaseRef(Src); end;