Ignore:
Timestamp:
Feb 25, 2007, 4:15:10 PM (18 years ago)
Author:
RBRi
Message:

file util refactoring and many more unit tests

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NewView/StringUtilsUnit.pas

    r75 r82  
    4545  //     StrExtractStrings('1x2x3\x4', "x", '\') ->
    4646  //     returns 4 strings: "1", "", "2" and "3x4"
    47   Procedure StrExtractStrings(Var aResult : TStringList; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
     47  Procedure StrExtractStrings(Var aResult : TStrings; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
     48
     49  // same as StrExtractStrings but ignores empty strings
     50  Procedure StrExtractStringsIgnoreEmpty(Var aResult : TStrings; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
     51
     52  // removes all occurences of char from aSetOfChars from the beginning
     53  // of a String.
     54  Function StrTrimLeftChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String;
     55
     56  // removes all occurences of char from aSetOfChars from the end
     57  // of a String.
     58  Function StrTrimRightChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String;
    4859
    4960  // removes all occurences of char from aSetOfChars from the beginning
     
    5364  // removes all blanks from beginning and end
    5465  Function StrTrim(const aReceiver: String): String;
     66
     67  // Returns the aCount leftmost chars of aString
     68  Function StrLeft(const aString : String; const aCount : Integer) : String;
    5569
    5670  // returns true if the String ends with the provides one
     
    114128  begin
    115129    result := '';
    116     for i := 0 To stringList.count-1 do
     130    for i := 0 to stringList.count-1 do
    117131    begin
    118132      if (i > 0) then result := result + '&';
     
    156170
    157171
    158   Procedure StrExtractStrings(Var aResult: TStringList; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
     172  Procedure PrivateStrExtractStrings(   Var aResult: TStrings;
     173                                        const aReceiver: String;
     174                                        const aSetOfChars: TSetOfChars;
     175                                        const anEscapeChar: char;
     176                                        const anIgnoreEmptyFlag : boolean);
    159177  Var
    160178    i : Integer;
     
    189207          if (tmpChar IN aSetOfChars) then
    190208          begin
    191             aResult.add(tmpPart);
     209            if (NOT anIgnoreEmptyFlag) OR ('' <> tmpPart) then
     210            begin
     211              aResult.add(tmpPart);
     212            end;
    192213            tmpPart := '';
    193214            i := i + 1;
     
    199220          end;
    200221    end;
    201     aResult.add(tmpPart);
     222
     223    if (NOT anIgnoreEmptyFlag) OR ('' <> tmpPart) then
     224    begin
     225      aResult.add(tmpPart);
     226    end;
     227  end;
     228
     229
     230  Procedure StrExtractStrings(Var aResult: TStrings; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
     231  Begin
     232    PrivateStrExtractStrings(aResult, aReceiver, aSetOfChars, anEscapeChar, false);
     233  end;
     234
     235
     236  Procedure StrExtractStringsIgnoreEmpty(Var aResult: TStrings; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
     237  Begin
     238    PrivateStrExtractStrings(aResult, aReceiver, aSetOfChars, anEscapeChar, true);
     239  end;
     240
     241
     242  Function StrTrimLeftChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String;
     243  Var
     244    i : Longint;
     245  Begin
     246    i := 1;
     247    // mem optimization
     248    if aReceiver[i] in aSetOfChars then
     249    begin
     250      while i <= Length(aReceiver) do
     251      begin
     252        if aReceiver[i] in aSetOfChars then
     253          inc(i)
     254        else
     255          break;
     256      end;
     257      result := Copy(aReceiver, i, Length(aReceiver)-i+1);
     258    end
     259    else
     260    begin
     261      result := aReceiver;
     262    end;
     263  end;
     264
     265
     266  Function StrTrimRightChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String;
     267  Var
     268    i : Longint;
     269  Begin
     270    i := Length(aReceiver);
     271
     272    // mem optimization
     273    if aReceiver[i] in aSetOfChars then
     274    begin
     275      while i > 0 do
     276      begin
     277        if aReceiver[i] in aSetOfChars then
     278          dec(i)
     279        else
     280          break;
     281      end;
     282      result := Copy(aReceiver, 1, i);
     283    end
     284    else
     285    begin
     286      result := aReceiver;
     287    end;
    202288  end;
    203289
     
    207293    i : Longint;
    208294    j : Longint;
    209   Begin
     295    tmpNeedCopy : boolean;
     296  Begin
     297    tmpNeedCopy := false;
    210298    i := 1;
    211299    while i < Length(aReceiver) do
    212300    begin
    213301      if aReceiver[i] in aSetOfChars then
    214         inc(i)
    215        else
    216          break;
     302      begin
     303        inc(i);
     304        tmpNeedCopy := true;
     305      end
     306      else
     307      begin
     308        break;
     309      end;
    217310    end;
    218311
     
    221314    begin
    222315      if aReceiver[j] in aSetOfChars then
    223         dec(j)
     316      begin
     317        dec(j);
     318        tmpNeedCopy := true;
     319      end
    224320      else
     321      begin
    225322        break;
    226     end;
    227 
    228     result := Copy(aReceiver, i, j-i+1);
     323      end;
     324    end;
     325
     326    if tmpNeedCopy then
     327    begin
     328      result := Copy(aReceiver, i, j-i+1);
     329    end
     330    else
     331    begin
     332      result := aReceiver;
     333    end;
    229334  end;
    230335
     
    233338  Begin
    234339    result := StrTrimChars(aReceiver, [' ']);
     340  end;
     341
     342
     343  Function StrLeft(const aString : String; const aCount : Integer) : String;
     344  Begin
     345    if aCount >= Length(aString) then
     346      Result := aString
     347    else
     348      Result := copy(aString, 1, aCount);
    235349  end;
    236350
Note: See TracChangeset for help on using the changeset viewer.