Changeset 43 for trunk/NewView/StringUtilsUnit.pas
- Timestamp:
- Jan 2, 2007, 8:29:54 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NewView/StringUtilsUnit.pas
r35 r43 12 12 Classes; 13 13 14 TYPE 14 const 15 StrCR = chr(13); 16 StrLF = chr(10); 17 StrCRLF = StrCR + StrLF; 18 19 20 TYPE 15 21 TSerializableStringList = class 16 22 private … … 27 33 end; 28 34 35 TYPE 36 TSetOfChars = set of char; 37 29 38 // prefices all occurences of one of the chars in aStringWithChars with anEscape char 30 39 // 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 32 64 33 65 Implementation … … 71 103 begin 72 104 if (i > 0) then result := result + '&'; 73 result := result + escapeAllCharsBy(stringList[i], '&', '\');105 result := result + StrEscapeAllCharsBy(stringList[i], ['&'], '\'); 74 106 end; 75 107 end; … … 77 109 78 110 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); 79 143 Var 80 144 i : Integer; 81 145 tmpChar,tmpNextChar : Char; 82 146 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 88 150 tmpPart := ''; 89 151 90 152 i := 1; 91 while i <= length(a SerializedString) do92 begin 93 tmpChar := a SerializedString[i];94 if i < length(a SerializedString) then95 tmpNextChar := a SerializedString[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] 96 158 else 97 159 tmpNextChar := #0; 98 160 99 if (tmpChar = '\') and (tmpNextChar = '\') then161 if (tmpChar = anEscapeChar) and (tmpNextChar = anEscapeChar) then 100 162 begin 101 tmpPart := tmpPart + '\';163 tmpPart := tmpPart + anEscapeChar; 102 164 i := i + 2; 103 165 end 104 166 else 105 if (tmpChar = '\') and (tmpNextChar = '&') then167 if (tmpChar = anEscapeChar) and (tmpNextChar IN aSetOfChars) then 106 168 begin 107 tmpPart := tmpPart + '&';169 tmpPart := tmpPart + tmpNextChar; 108 170 i := i + 2; 109 171 end 110 172 else 111 if (tmpChar = '&') then173 if (tmpChar IN aSetOfChars) then 112 174 begin 113 stringList.add(tmpPart);175 aResult.add(tmpPart); 114 176 tmpPart := ''; 115 177 i := i + 1; … … 121 183 end; 122 184 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 138 239 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; 145 242 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; 147 277 end; 148 278
Note:
See TracChangeset
for help on using the changeset viewer.