All pastes #349782 Raw Edit

Flawless

public text v1 · immutable
·published 2007-02-11 01:21 UTC
rendered paste body
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;