Ignore:
Timestamp:
Jan 2, 2007, 8:29:54 PM (19 years ago)
Author:
RBRi
Message:

% use new debug unit

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NewView/StringUtilsUnit.pas

    r35 r43  
    1212 Classes;
    1313
    14  TYPE
     14const
     15  StrCR = chr(13);
     16  StrLF = chr(10);
     17  StrCRLF = StrCR + StrLF;
     18
     19
     20  TYPE
    1521     TSerializableStringList = class
    1622     private
     
    2733  end;
    2834
     35  TYPE
     36    TSetOfChars = set of char;
     37
    2938  // prefices all occurences of one of the chars in aStringWithChars with anEscape char
    3039  // if the escapeChar itself is found, then it is doubled
    31   Function escapeAllCharsBy(Const aReceiver: String; const aStringWithChars: String; const anEscapeChar: char): String;
     40  Function StrEscapeAllCharsBy(Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char): String;
     41
     42  // Extract all fields in a String given a set of delimiter characters and
     43  // an optional escape character usable to escape field delimits.
     44  // Example:
     45  //     StrExtractStrings('1x2x3\x4', "x", '\') ->
     46  //     returns 4 strings: "1", "", "2" and "3x4"
     47  Procedure StrExtractStrings(Var aResult : TStringList; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
     48
     49  // removes all occurences of char from aSetOfChars from the beginning
     50  // end the end of a String.
     51  Function StrTrimChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String;
     52
     53  // removes all blanks from beginning and end
     54  Function StrTrim(const aReceiver: String): String;
     55
     56  // returns true if the String ends with the provides one
     57  // this is case SENSITIVE
     58  Function StrEndsWith(const aReceiver: String; const anEndString: String): Boolean;
     59
     60  // returns true if the String ends with the provides one
     61  // this is case INsensitive
     62  Function StrEndsWithIgnoringCase(const aString: String; const anEndString: String): Boolean;
     63
    3264
    3365Implementation
     
    71103    begin
    72104      if (i > 0) then result := result + '&';
    73       result := result + escapeAllCharsBy(stringList[i], '&', '\');
     105      result := result + StrEscapeAllCharsBy(stringList[i], ['&'], '\');
    74106    end;
    75107  end;
     
    77109
    78110  PROCEDURE TSerializableStringList.readValuesFromSerializedString(const aSerializedString : String);
     111  Begin
     112    if (length(aSerializedString) < 1) then exit;
     113
     114    stringList.destroy;
     115    stringList := TStringList.Create;
     116    StrExtractStrings(stringList, aSerializedString, ['&'], '\');
     117  end;
     118
     119
     120  // ----------------------------------------------------------
     121
     122
     123  Function StrEscapeAllCharsBy(Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char): String;
     124  Var
     125    i : Integer;
     126    tmpChar : Char;
     127  Begin
     128    Result := '';
     129
     130    for i := 1 To length(aReceiver) do
     131    begin
     132      tmpChar := aReceiver[i];
     133
     134      if (tmpChar = anEscapeChar) or (tmpChar IN aSetOfChars) then
     135        result := result + anEscapeChar + tmpChar
     136      else
     137        result := result + tmpChar;
     138    end;
     139  end;
     140
     141
     142  Procedure StrExtractStrings(Var aResult: TStringList; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
    79143  Var
    80144    i : Integer;
    81145    tmpChar,tmpNextChar : Char;
    82146    tmpPart: String;
    83   begin
    84     if (length(aSerializedString) < 1) then exit;
    85 
    86     stringList.destroy;
    87     stringList := TStringList.Create;
     147  Begin
     148    if (length(aReceiver) < 1) then exit;
     149
    88150    tmpPart := '';
    89151
    90152    i := 1;
    91     while i <= length(aSerializedString) do
    92     begin
    93       tmpChar := aSerializedString[i];
    94       if i < length(aSerializedString) then
    95         tmpNextChar := aSerializedString[i+1]
     153    while i <= length(aReceiver) do
     154    begin
     155      tmpChar := aReceiver[i];
     156      if i < length(aReceiver) then
     157        tmpNextChar := aReceiver[i+1]
    96158      else
    97159        tmpNextChar := #0;
    98160
    99       if (tmpChar = '\') and (tmpNextChar = '\') then
     161      if (tmpChar = anEscapeChar) and (tmpNextChar = anEscapeChar) then
    100162      begin
    101         tmpPart := tmpPart + '\';
     163        tmpPart := tmpPart + anEscapeChar;
    102164        i := i + 2;
    103165      end
    104166      else
    105         if (tmpChar = '\') and (tmpNextChar = '&') then
     167        if (tmpChar = anEscapeChar) and (tmpNextChar IN aSetOfChars) then
    106168        begin
    107           tmpPart := tmpPart + '&';
     169          tmpPart := tmpPart + tmpNextChar;
    108170          i := i + 2;
    109171        end
    110172        else
    111           if (tmpChar = '&') then
     173          if (tmpChar IN aSetOfChars) then
    112174          begin
    113             stringList.add(tmpPart);
     175            aResult.add(tmpPart);
    114176            tmpPart := '';
    115177            i := i + 1;
     
    121183          end;
    122184    end;
    123     stringList.add(tmpPart);
    124   end;
    125 
    126   // ----------------------------------------------------------
    127 
    128   Function escapeAllCharsBy(Const aReceiver: String; const aStringWithChars: String; const anEscapeChar: char): String;
    129   Var
    130     i : Integer;
    131     tmpChar : Char;
    132   Begin
    133     Result := '';
    134 
    135     if (length(aStringWithChars) > 0) then
    136     begin
    137       for i := 1 To length(aReceiver) do
     185    aResult.add(tmpPart);
     186  end;
     187
     188
     189  Function StrTrimChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String;
     190  Var
     191    i : Longint;
     192    j : Longint;
     193  Begin
     194    i := 1;
     195    while i < Length(aReceiver) do
     196    begin
     197      if aReceiver[i] in aSetOfChars then
     198        inc(i)
     199       else
     200         break;
     201    end;
     202
     203    j := Length(aReceiver);
     204    while j >= i do
     205    begin
     206      if aReceiver[j] in aSetOfChars then
     207        dec(j)
     208      else
     209        break;
     210    end;
     211
     212    result := Copy(aReceiver, i, j-i+1);
     213  end;
     214
     215
     216  Function StrTrim(const aReceiver: String): String;
     217  Begin
     218    result := StrTrimChars(aReceiver, [' ']);
     219  end;
     220
     221
     222  Function StrEndsWith(const aReceiver: String; const anEndString: String): Boolean;
     223  Var
     224    tmpStringPos : Longint;
     225    tmpMatchPos : Longint;
     226  Begin
     227    tmpStringPos := length(aReceiver);
     228    tmpMatchPos := length(anEndString);
     229
     230    if tmpMatchPos > tmpStringPos then
     231    begin
     232      result := false;
     233      exit;
     234    end;
     235
     236    while tmpMatchPos > 0 do
     237    begin
     238      if aReceiver[tmpStringPos] <> anEndString[tmpMatchPos] then
    138239      begin
    139         tmpChar := aReceiver[i];
    140 
    141         if ((tmpChar = anEscapeChar) or (pos(tmpChar, aStringWithChars) > 0)) then
    142           result := result + anEscapeChar + tmpChar
    143         else
    144           result := result + tmpChar;
     240        result := false;
     241        exit;
    145242      end;
    146     end;
     243      dec(tmpMatchPos);
     244      dec(tmpStringPos);
     245    end;
     246
     247    result := true;
     248  end;
     249
     250
     251  Function StrEndsWithIgnoringCase(const aReceiver: String; const anEndString: String): Boolean;
     252  Var
     253    tmpStringPos : Longint;
     254    tmpMatchPos : Longint;
     255  Begin
     256    tmpStringPos := length(aString);
     257    tmpMatchPos := length(anEndString);
     258
     259    if tmpMatchPos > tmpStringPos then
     260    begin
     261      result := false;
     262      exit;
     263    end;
     264
     265    while tmpMatchPos > 0 do
     266    begin
     267      if upcase(aString[tmpStringPos]) <> upcase(anEndString[tmpMatchPos]) then
     268      begin
     269        result := false;
     270        exit;
     271      end;
     272      dec(tmpMatchPos);
     273      dec(tmpStringPos);
     274    end;
     275
     276    result := true;
    147277  end;
    148278
Note: See TracChangeset for help on using the changeset viewer.