Rev 744 | Rev 748 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
733 | daniel-mar | 1 | unit VTSFUNCS; |
2 | |||
3 | (************************************************) |
||
4 | (* VTSFUNCS.PAS *) |
||
5 | (* Author: Daniel Marschall *) |
||
747 | daniel-mar | 6 | (* Revision: 2022-02-16 *) |
733 | daniel-mar | 7 | (* License: Apache 2.0 *) |
8 | (* This file contains: *) |
||
9 | (* - Various functions *) |
||
10 | (************************************************) |
||
11 | |||
12 | interface |
||
13 | |||
739 | daniel-mar | 14 | function Max(a, b: integer): integer; |
15 | function Min(a, b: integer): integer; |
||
16 | |||
733 | daniel-mar | 17 | function CompareEqualLengthString(a, b: string): integer; |
18 | function CompareNumericString(a, b: string): integer; |
||
739 | daniel-mar | 19 | |
733 | daniel-mar | 20 | procedure Beep; |
739 | daniel-mar | 21 | |
733 | daniel-mar | 22 | function Trim(s: string): string; |
740 | daniel-mar | 23 | function TrimLineToWidth(s: string; width: integer): string; |
733 | daniel-mar | 24 | function ZeroPad(i: LongInt; n: integer): string; |
739 | daniel-mar | 25 | function LeftPadStr(s: string; n: integer; ch: char): string; |
26 | function RightPadStr(s: string; n: integer; ch: char): string; |
||
740 | daniel-mar | 27 | function RepeatStr(ch: char; n: integer): string; |
739 | daniel-mar | 28 | |
29 | function DeleteFile(filename: string): boolean; |
||
733 | daniel-mar | 30 | function FileExists(filename: string): boolean; |
739 | daniel-mar | 31 | |
747 | daniel-mar | 32 | function IsPositiveIntegerOrZero(s: string): boolean; |
733 | daniel-mar | 33 | function StrToInt(s: string): Integer; |
34 | function IntToStr(Value: Integer): string; |
||
35 | |||
747 | daniel-mar | 36 | function StringReplace(s, search, replace: string): string; |
37 | |||
733 | daniel-mar | 38 | implementation |
39 | |||
40 | uses |
||
41 | Crt; |
||
42 | |||
739 | daniel-mar | 43 | function Max(a, b: integer): integer; |
44 | begin |
||
45 | if a > b then |
||
46 | Max := a |
||
47 | else |
||
48 | Max := b; |
||
49 | end; |
||
50 | |||
51 | function Min(a, b: integer): integer; |
||
52 | begin |
||
53 | if a < b then |
||
54 | Min := a |
||
55 | else |
||
56 | Min := b; |
||
57 | end; |
||
58 | |||
733 | daniel-mar | 59 | function CompareEqualLengthString(a, b: string): integer; |
60 | var |
||
61 | ao, bo, i: integer; |
||
62 | begin |
||
63 | CompareEqualLengthString := 0; |
||
64 | for i := 1 to Length(a) do |
||
65 | begin |
||
66 | ao := Ord(a[i]); |
||
67 | bo := Ord(b[i]); |
||
68 | if ao > bo then |
||
69 | begin |
||
70 | CompareEqualLengthString := 1; |
||
71 | break; |
||
72 | end; |
||
73 | if ao < bo then |
||
74 | begin |
||
75 | CompareEqualLengthString := -1; |
||
76 | break; |
||
77 | end; |
||
78 | end; |
||
79 | end; |
||
80 | |||
81 | function CompareNumericString(a, b: string): integer; |
||
82 | var |
||
739 | daniel-mar | 83 | EqualLength: integer; |
733 | daniel-mar | 84 | begin |
739 | daniel-mar | 85 | EqualLength := Max(Length(a), Length(b)); |
86 | a := LeftPadStr(a, EqualLength, '0'); |
||
87 | b := LeftPadStr(b, EqualLength, '0'); |
||
88 | CompareNumericString := CompareEqualLengthString(a, b); |
||
733 | daniel-mar | 89 | end; |
90 | |||
91 | procedure Beep; |
||
92 | begin |
||
93 | Sound(220); (*220Hz*) |
||
94 | Delay(200); (*200ms*) |
||
95 | NoSound; |
||
96 | end; |
||
97 | |||
98 | function Trim(s: string): string; |
||
99 | begin |
||
100 | while Length(s) > 0 do |
||
101 | begin |
||
102 | if s[1] in [#9,#10,#13,' '] then |
||
103 | Delete(s,1,1) |
||
104 | else |
||
105 | break; |
||
106 | end; |
||
107 | while Length(s) > 0 do |
||
108 | begin |
||
109 | if s[Length(s)] in [#9,#10,#13,' '] then |
||
110 | Delete(s,Length(s),1) |
||
111 | else |
||
112 | break; |
||
113 | end; |
||
114 | Trim := s; |
||
115 | end; |
||
116 | |||
740 | daniel-mar | 117 | function TrimLineToWidth(s: string; width: integer): string; |
118 | begin |
||
119 | if Length(s) > width then |
||
120 | begin |
||
121 | s := Copy(s, 1, width-3) + '...'; |
||
122 | end; |
||
123 | TrimLineToWidth := s; |
||
124 | end; |
||
125 | |||
739 | daniel-mar | 126 | function ZeroPad(i: LongInt; n: integer): string; |
733 | daniel-mar | 127 | var |
739 | daniel-mar | 128 | s: string; |
733 | daniel-mar | 129 | begin |
739 | daniel-mar | 130 | s := IntToStr(i); |
131 | ZeroPad := LeftPadStr(s, n, '0'); |
||
132 | end; |
||
733 | daniel-mar | 133 | |
739 | daniel-mar | 134 | function LeftPadStr(s: string; n: integer; ch: char): string; |
135 | begin |
||
136 | while Length(s) < n do |
||
733 | daniel-mar | 137 | begin |
739 | daniel-mar | 138 | s := ch + s; |
733 | daniel-mar | 139 | end; |
739 | daniel-mar | 140 | LeftPadStr := s; |
733 | daniel-mar | 141 | end; |
142 | |||
739 | daniel-mar | 143 | function RightPadStr(s: string; n: integer; ch: char): string; |
733 | daniel-mar | 144 | begin |
145 | while Length(s) < n do |
||
146 | begin |
||
739 | daniel-mar | 147 | s := s + ch; |
733 | daniel-mar | 148 | end; |
739 | daniel-mar | 149 | RightPadStr := s; |
733 | daniel-mar | 150 | end; |
151 | |||
740 | daniel-mar | 152 | function RepeatStr(ch: char; n: integer): string; |
153 | var |
||
154 | i: integer; |
||
155 | res: string; |
||
156 | begin |
||
157 | res := ''; |
||
158 | for i := 1 to n do |
||
159 | begin |
||
160 | res := res + ch; |
||
161 | end; |
||
162 | RepeatStr := res; |
||
163 | end; |
||
164 | |||
739 | daniel-mar | 165 | function DeleteFile(filename: string): boolean; |
733 | daniel-mar | 166 | var |
739 | daniel-mar | 167 | F: file; |
168 | Ch: Char; |
||
733 | daniel-mar | 169 | begin |
739 | daniel-mar | 170 | Assign(F, filename); |
171 | {$I-} |
||
172 | Reset(F); |
||
173 | {$I+} |
||
174 | if IOResult <> 0 then |
||
175 | begin |
||
176 | DeleteFile := false; (* cannot find file *) |
||
177 | end |
||
178 | else |
||
179 | begin |
||
180 | Close(F); |
||
181 | {$I-} |
||
182 | Erase(F); |
||
183 | {$I+} |
||
184 | DeleteFile := IOResult = 0; |
||
185 | end; |
||
733 | daniel-mar | 186 | end; |
187 | |||
188 | function FileExists(filename: string): boolean; |
||
189 | var |
||
190 | F: Text; |
||
191 | begin |
||
192 | Assign(F, filename); |
||
193 | {$I-} |
||
194 | Reset(F); |
||
195 | {$I+} |
||
740 | daniel-mar | 196 | if IoResult = 0 then |
197 | begin |
||
198 | Close(F); |
||
199 | FileExists := true; |
||
200 | end |
||
201 | else |
||
202 | begin |
||
203 | FileExists := false; |
||
204 | end; |
||
733 | daniel-mar | 205 | end; |
206 | |||
747 | daniel-mar | 207 | function IsPositiveIntegerOrZero(s: string): boolean; |
739 | daniel-mar | 208 | var |
209 | i: integer; |
||
210 | begin |
||
747 | daniel-mar | 211 | IsPositiveIntegerOrZero := false; |
739 | daniel-mar | 212 | |
213 | if Length(s) = 0 then exit; |
||
214 | if (s[1] = '0') and (s <> '0') then exit; |
||
215 | for i := 1 to Length(s) do |
||
216 | begin |
||
217 | if not (s[i] in ['0'..'9']) then exit; |
||
218 | end; |
||
219 | |||
747 | daniel-mar | 220 | IsPositiveIntegerOrZero := true; |
739 | daniel-mar | 221 | end; |
222 | |||
733 | daniel-mar | 223 | function StrToInt(s: string): Integer; |
224 | var |
||
225 | i, Error: Integer; |
||
226 | begin |
||
227 | Val(s, i, Error); |
||
228 | StrToInt := i; |
||
229 | end; |
||
230 | |||
231 | function IntToStr(Value: Integer): string; |
||
232 | var |
||
233 | s: string; |
||
234 | begin |
||
235 | Str(Value, s); |
||
236 | IntToStr := s; |
||
237 | end; |
||
238 | |||
747 | daniel-mar | 239 | function StringReplace(s, search, replace: string): string; |
240 | var |
||
241 | i: integer; |
||
242 | output: string; |
||
243 | begin |
||
244 | if s = '' then exit; |
||
245 | if search = '' then exit; (* invalid arg *) |
||
246 | |||
247 | output := ''; |
||
248 | while s <> '' do |
||
249 | begin |
||
250 | if Copy(s, 1, Length(search)) = search then |
||
251 | begin |
||
252 | output := output + replace; |
||
253 | Delete(s, 1, Length(search)); |
||
254 | end |
||
255 | else |
||
256 | begin |
||
257 | output := output + Copy(s, 1, 1); |
||
258 | Delete(s, 1, 1); |
||
259 | end; |
||
260 | end; |
||
261 | |||
262 | StringReplace := output; |
||
263 | end; |
||
264 | |||
733 | daniel-mar | 265 | end. |