source: trunk/NewView/StringUtilsUnit.pas@ 75

Last change on this file since 75 was 75, checked in by RBRi, 19 years ago

text changes

  • Property svn:eol-style set to native
File size: 8.1 KB
Line 
1Unit StringUtilsUnit;
2
3// NewView - a new OS/2 Help Viewer
4// Copyright 2006-2007 Ronald Brill (rbri at rbri dot de)
5// This software is released under the GNU Public License - see readme.txt
6
7// Helper functions to work with strings
8
9Interface
10
11uses
12 Classes;
13
14const
15 StrCR = chr(13);
16 StrLF = chr(10);
17 StrCRLF = StrCR + StrLF;
18
19
20 TYPE
21 TSerializableStringList = class
22 private
23 stringList : TStringList;
24
25 public
26 CONSTRUCTOR Create;
27 DESTRUCTOR Destroy; override;
28 FUNCTION getCount : LongInt;
29 PROCEDURE add(const aString : String);
30 FUNCTION get(const anIndex : LongInt) : String;
31 FUNCTION getSerializedString : String;
32 PROCEDURE readValuesFromSerializedString(const aSerializedString : String);
33 end;
34
35 TYPE
36 TSetOfChars = set of char;
37
38 // prefices all occurences of one of the chars in aStringWithChars with anEscape char
39 // if the escapeChar itself is found, then it is doubled
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
64 // the IntToStr generates wrong results
65 // in normal cases IntToStr returns a negative value
66 // and somtimes completly wrong values
67 Function LongWordToStr(const aLongWord: LongWord) : String;
68
69 Function BoolToStr(const aBoolean : boolean ): string;
70
71
72Implementation
73
74 uses
75 DebugUnit;
76
77 constructor TSerializableStringList.Create;
78 begin
79 LogEvent(LogObjConstDest, 'TSerializableStringList createdestroy');
80
81 inherited Create;
82 stringList := TStringList.Create;
83 end;
84
85
86 destructor TSerializableStringList.Destroy;
87 begin
88 LogEvent(LogObjConstDest, 'TSerializableStringList destroy');
89 if Nil <> stringList then stringList.Destroy;
90
91 inherited Destroy;
92 end;
93
94
95 FUNCTION TSerializableStringList.getCount : LongInt;
96 begin
97 result := stringList.count;
98 end;
99
100
101 PROCEDURE TSerializableStringList.add(const aString : String);
102 begin
103 stringList.add(aString);
104 end;
105
106 FUNCTION TSerializableStringList.get(const anIndex : LongInt) : String;
107 begin
108 result := stringList[anIndex];
109 end;
110
111 FUNCTION TSerializableStringList.getSerializedString : String;
112 Var
113 i : Integer;
114 begin
115 result := '';
116 for i := 0 To stringList.count-1 do
117 begin
118 if (i > 0) then result := result + '&';
119 result := result + StrEscapeAllCharsBy(stringList[i], ['&'], '\');
120 end;
121 end;
122
123
124 PROCEDURE TSerializableStringList.readValuesFromSerializedString(const aSerializedString : String);
125 Begin
126 if (length(aSerializedString) < 1) then exit;
127
128 LogEvent(LogObjConstDest, 'readValuesFromSerializedString');
129 stringList.Destroy;
130 LogEvent(LogObjConstDest, 'readValuesFromSerializedString destroy done');
131 stringList := TStringList.Create;
132 StrExtractStrings(stringList, aSerializedString, ['&'], '\');
133 end;
134
135
136 // ----------------------------------------------------------
137
138
139 Function StrEscapeAllCharsBy(Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char): String;
140 Var
141 i : Integer;
142 tmpChar : Char;
143 Begin
144 Result := '';
145
146 for i := 1 To length(aReceiver) do
147 begin
148 tmpChar := aReceiver[i];
149
150 if (tmpChar = anEscapeChar) or (tmpChar IN aSetOfChars) then
151 result := result + anEscapeChar + tmpChar
152 else
153 result := result + tmpChar;
154 end;
155 end;
156
157
158 Procedure StrExtractStrings(Var aResult: TStringList; Const aReceiver: String; const aSetOfChars: TSetOfChars; const anEscapeChar: char);
159 Var
160 i : Integer;
161 tmpChar,tmpNextChar : Char;
162 tmpPart: String;
163 Begin
164 if (length(aReceiver) < 1) then exit;
165
166 tmpPart := '';
167
168 i := 1;
169 while i <= length(aReceiver) do
170 begin
171 tmpChar := aReceiver[i];
172 if i < length(aReceiver) then
173 tmpNextChar := aReceiver[i+1]
174 else
175 tmpNextChar := #0;
176
177 if (tmpChar = anEscapeChar) and (tmpNextChar = anEscapeChar) then
178 begin
179 tmpPart := tmpPart + anEscapeChar;
180 i := i + 2;
181 end
182 else
183 if (tmpChar = anEscapeChar) and (tmpNextChar IN aSetOfChars) then
184 begin
185 tmpPart := tmpPart + tmpNextChar;
186 i := i + 2;
187 end
188 else
189 if (tmpChar IN aSetOfChars) then
190 begin
191 aResult.add(tmpPart);
192 tmpPart := '';
193 i := i + 1;
194 end
195 else
196 begin
197 tmpPart := tmpPart + tmpChar;
198 i := i + 1;
199 end;
200 end;
201 aResult.add(tmpPart);
202 end;
203
204
205 Function StrTrimChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String;
206 Var
207 i : Longint;
208 j : Longint;
209 Begin
210 i := 1;
211 while i < Length(aReceiver) do
212 begin
213 if aReceiver[i] in aSetOfChars then
214 inc(i)
215 else
216 break;
217 end;
218
219 j := Length(aReceiver);
220 while j >= i do
221 begin
222 if aReceiver[j] in aSetOfChars then
223 dec(j)
224 else
225 break;
226 end;
227
228 result := Copy(aReceiver, i, j-i+1);
229 end;
230
231
232 Function StrTrim(const aReceiver: String): String;
233 Begin
234 result := StrTrimChars(aReceiver, [' ']);
235 end;
236
237
238 Function StrEndsWith(const aReceiver: String; const anEndString: String): Boolean;
239 Var
240 tmpStringPos : Longint;
241 tmpMatchPos : Longint;
242 Begin
243 tmpStringPos := length(aReceiver);
244 tmpMatchPos := length(anEndString);
245
246 if tmpMatchPos > tmpStringPos then
247 begin
248 result := false;
249 exit;
250 end;
251
252 while tmpMatchPos > 0 do
253 begin
254 if aReceiver[tmpStringPos] <> anEndString[tmpMatchPos] then
255 begin
256 result := false;
257 exit;
258 end;
259 dec(tmpMatchPos);
260 dec(tmpStringPos);
261 end;
262
263 result := true;
264 end;
265
266
267 Function StrEndsWithIgnoringCase(const aReceiver: String; const anEndString: String): Boolean;
268 Var
269 tmpStringPos : Longint;
270 tmpMatchPos : Longint;
271 Begin
272 tmpStringPos := length(aString);
273 tmpMatchPos := length(anEndString);
274
275 if tmpMatchPos > tmpStringPos then
276 begin
277 result := false;
278 exit;
279 end;
280
281 while tmpMatchPos > 0 do
282 begin
283 if upcase(aString[tmpStringPos]) <> upcase(anEndString[tmpMatchPos]) then
284 begin
285 result := false;
286 exit;
287 end;
288 dec(tmpMatchPos);
289 dec(tmpStringPos);
290 end;
291
292 result := true;
293 end;
294
295 Function LongWordToStr(const aLongWord: LongWord) : String;
296 Var
297 l : LongWord;
298 i : Integer;
299 Begin
300 Result := '';
301 l := aLongWord;
302
303 if l = 0 then
304 begin
305 result := '0';
306 exit;
307 end;
308
309 while l > 0 do
310 begin
311 i := l mod 10;
312 l := l div 10;
313 Case i of
314 0 : result := '0' + result;
315 1 : result := '1' + result;
316 2 : result := '2' + result;
317 3 : result := '3' + result;
318 4 : result := '4' + result;
319 5 : result := '5' + result;
320 6 : result := '6' + result;
321 7 : result := '7' + result;
322 8 : result := '8' + result;
323 9 : result := '9' + result;
324 end;
325 end;
326
327 end;
328
329
330 Function BoolToStr(const aBoolean : boolean ): string;
331 begin
332 if aBoolean then
333 Result := 'True'
334 else
335 Result := 'False';
336 end;
337
338END.
Note: See TracBrowser for help on using the repository browser.