1 { $O+,F+,I-,S-,R-,V-}
2 Unit MKGlobT;
3
4 {$IfDef FPC}
5 {$PackRecords 1}
6 {$EndIf}
7
8 Interface
9
10 {$ifndef GPC}
11 Uses Dos;
12 {$endif}
13
14 type
15 OldAddrType = record
16 zone,
17 net,
18 node,
19 point : word;
20 end;
21
22 PAddr = ^AddrType;
23 AddrType = record {Used for Fido style addresses}
24 zone,
25 net,
26 node,
27 point : word;
28 domain : string[20];
29 end;
30 Type SecType = Record
31 Level: Word; {Security level}
32 Flags: LongInt; {32 bitmapped flags}
33 End;
34
35 Type MKDateType = Record
36 Year: Word;
37 Month: Word;
38 Day: Word;
39 End;
40
41 Type MKDateTime = Record
42 Year: Word;
43 Month: Word;
44 Day: Word;
45 Hour: Word;
46 Min: Word;
47 Sec: Word;
48 End;
49
50 Const
51 uoNotAvail = 0;
52 uoBrowse = 1;
53 uoXfer = 2;
54 uoMsg = 3;
55 uoDoor = 4;
56 uoChat = 5;
57 uoQuest = 6;
58 uoReady = 7;
59 uoMail = 8;
60 uoWait = 9;
61 uoLogIn = 10;
62
AddrStrnull63 Function AddrStr(Addr: AddrType): String;
64 procedure ParseAddr(AStr: String; Var DestAddr: AddrType);
DomainlessAddrStrnull65 Function DomainlessAddrStr(Addr: AddrType): String;
PointlessAddrStrnull66 Function PointlessAddrStr(Var Addr: AddrType): String;
CompAddrnull67 function CompAddr(a1, a2: addrtype): byte;
IsValidAddrnull68 Function IsValidAddr(Addr: AddrType): Boolean;
Accessnull69 Function Access(USec: SecType; RSec: SecType): Boolean;
EstimateXferTimenull70 Function EstimateXferTime(FS: LongInt; BaudRate: Word; Effic: Word): LongInt;
71 {Result in seconds}
NameCrcCodenull72 Function NameCrcCode(Str: String): LongInt; {Get CRC code for name}
Flag2Strnull73 Function Flag2Str(Number: Byte): String;
Str2Flagnull74 Function Str2Flag(St: String): Byte;
ValidMKDatenull75 Function ValidMKDate(DT: MKDateTime): Boolean;
76 {$IFDEF WINDOWS}
77 Procedure DT2MKDT(Var DT: TDateTime; Var DT2: MKDateTime);
78 Procedure MKDT2DT(Var DT: MKDateTime; Var DT2: TDateTime);
79 {$ELSE}
80 Procedure DT2MKDT(Var DT: DateTime; Var DT2: MKDateTime);
81 Procedure MKDT2DT(Var DT: MKDateTime; Var DT2: DateTime);
82 {$ENDIF}
83 Procedure Str2MKD(St: String; Var MKD: MKDateType);
MKD2Strnull84 Function MKD2Str(MKD: MKDateType): String;
AddrEqualnull85 Function AddrEqual(Addr1: AddrType; Addr2: AddrType):Boolean;
86
87 Var
88 StartUpPath: String[128];
89
90 Const
91 UseEms: Boolean = True;
92 LocalMode: Boolean = False;
93 LogToPrinter: Boolean = False;
94 ReLoad: Boolean = False;
95 NodeNumber: Byte = 1;
96 OverRidePort: Byte = 0;
97 OverRideBaud: Word = 0;
98 UserBaud: Word = 0;
99 ExitErrorLevel: Byte = 0;
100 TimeToEvent: LongInt = 0;
101 ShellToMailer: Boolean = False;
102
103 Implementation
104
105 Uses MKString, Crc32, MKMisc;
106
107
Flag2Strnull108 Function Flag2Str(Number: Byte): String;
109 Var
110 Temp1: Byte;
111 Temp2: Byte;
112 i: Word;
113 TempStr: String[8];
114
115 Begin
116 Temp1 := 0;
117 Temp2 := $01;
118 For i := 1 to 8 Do
119 Begin
120 If (Number and Temp2) <> 0 Then
121 TempStr[i] := 'X'
122 Else
123 TempStr[i] := '-';
124 Temp2 := Temp2 shl 1;
125 End;
126 TempStr[0] := #8;
127 Flag2Str := TempStr;
128 End;
129
130
Str2Flagnull131 Function Str2Flag(St: String): Byte;
132 Var
133 i: Word;
134 Temp1: Byte;
135 Temp2: Byte;
136
137 Begin
138 St := StripBoth(St,' ');
139 St := PadLeft(St,'-',8);
140 Temp1 := 0;
141 Temp2 := $01;
142 For i := 1 to 8 Do
143 Begin
144 If UpCase(St[i]) = 'X' Then
145 Inc(Temp1,Temp2);
146 Temp2 := Temp2 shl 1;
147 End;
148 Str2Flag := Temp1;
149 End;
150
151
152
153 { vergleich zweier adressen (wilcars "*" erlaubt!) - (c)sl }
CompAddrnull154 function CompAddr(a1, a2: addrtype): byte;
155 var
156 e : byte;
157 begin
158 e := 0;
159 if a1.zone = 0 then
160 begin
161 a1.zone := a2.zone;
162 inc(e);
163 end;
164 if a1.net = 0 then
165 begin
166 a1.net := a2.net;
167 inc(e);
168 end;
169 if a1.node = 0 then
170 begin
171 a1.node := a2.node;
172 inc(e);
173 end;
174 if a1.point = 0 then
175 begin
176 a1.point := a2.point;
177 inc(e);
178 end;
179 if not ((a1.zone = a2.zone) and
180 (a1.node = a2.node) and
181 (a1.net = a2.net) and
182 (a1.point = a2.point)) then e := 255;
183 CompAddr := e;
184 end;
185
AddrStrnull186 Function AddrStr(Addr: AddrType): String;
187 var
188 temp : string[40];
189 begin
190 if Addr.Point = 0 then
191 begin
192 temp := Long2Str(Addr.Zone) + ':' + Long2Str(Addr.Net) + '/' + Long2Str(Addr.Node)
193 end
194 else
195 begin
196 temp := Long2Str(Addr.Zone) + ':' + Long2Str(Addr.Net) + '/' + Long2Str(Addr.Node) + '.' + Long2Str(Addr.Point);
197 end;
198 if Addr.domain <> '' then temp := temp + '@' + Addr.domain;
199 AddrStr := temp;
200 end;
201
DomainlessAddrStrnull202 Function DomainlessAddrStr(Addr: AddrType): String;
203 begin
204 if Addr.Point = 0 then
205 begin
206 DomainlessAddrStr := Long2Str(Addr.Zone) + ':' + Long2Str(Addr.Net) + '/' + Long2Str(Addr.Node)
207 end
208 else
209 begin
210 DomainlessAddrStr :=
211 Long2Str(Addr.Zone) + ':' + Long2Str(Addr.Net) + '/' + Long2Str(Addr.Node) + '.' + Long2Str(Addr.Point);
212 end;
213 end;
214
PointlessAddrStrnull215 Function PointlessAddrStr(Var Addr: AddrType): String;
216 begin
217 PointlessAddrStr := Long2Str(Addr.Zone) + ':' + Long2Str(Addr.Net) + '/' + Long2Str(Addr.Node);
218 end;
219
Accessnull220 Function Access(USec: SecType; RSec: SecType): Boolean;
221 Begin
222 If (USec.Level >= RSec.Level) Then
223 Access := ((RSec.Flags and Not(USec.Flags)) = 0)
224 Else
225 Access := False;
226 End;
227
228
EstimateXferTimenull229 Function EstimateXferTime(FS: LongInt; BaudRate: Word; Effic: Word): LongInt;
230 Begin
231 If BaudRate > 0 Then
232 EstimateXferTime := ((FS * 100) Div Effic) Div (BaudRate Div 10)
233 Else
234 EstimateXferTime := ((FS * 100) Div Effic) Div (960);
235 End;
236
237
NameCrcCodenull238 Function NameCrcCode(Str: String): LongInt;
239 Var
240 NCode: LongInt;
241 i: WOrd;
242
243 Begin
244 NCode := UpdC32(Length(Str),$ffffffff);
245 i := 1;
246 While i < Length(Str) Do
247 Begin
248 NCode := Updc32(Ord(UpCase(Str[i])), NCode);
249 Inc(i);
250 End;
251 NameCrcCode := NCode;
252 End;
253
254
255 procedure ParseAddr(AStr: String; Var DestAddr: AddrType);
256 var
257 p: byte;
258 begin
259 fillchar(destaddr, sizeof(destaddr), 0);
260 AStr := StripBoth(AStr, ' ');
261
262 p := pos('@', AStr);
263 if p > 0 then
264 begin
265 DestAddr.domain := copy(astr, p + 1, 255);
266 astr := copy(astr, 1, p - 1);
267 end;
268
269 p := pos(':', astr);
270 if p > 0 then
271 begin
272 destaddr.zone := str2long(copy(astr, 1, p - 1));
273 astr := copy(astr, p + 1, 255)
274 end;
275
276 p := pos('/', astr);
277 if p > 0 then
278 begin
279 destaddr.net := str2long(copy(astr, 1, p - 1));
280 astr := copy(astr, p + 1, 255)
281 end;
282
283 p := pos('.', astr);
284
285 if p = 0 then p := 255;
286 destaddr.node := str2long(copy(astr, 1, p - 1));
287 astr := copy(astr, p + 1, 255);
288
289 if p <> 255 then
290 begin
291 destaddr.point := str2long(copy(astr, 1, 255));
292 end;
293
294 end;
295
296
297 {$IFDEF WINDOWS}
298 Procedure DT2MKDT(Var DT: TDateTime; Var DT2: MKDateTime);
299 {$ELSE}
300 Procedure DT2MKDT(Var DT: DateTime; Var DT2: MKDateTime);
301 {$ENDIF}
302
303 Begin
304 DT2.Year := DT.Year;
305 DT2.Month := DT.Month;
306 DT2.Day := DT.Day;
307 DT2.Hour := DT.Hour;
308 DT2.Min := DT.Min;
309 DT2.Sec := DT.Sec;
310 End;
311
312
313 {$IFDEF WINDOWS}
314 Procedure MKDT2DT(Var DT: MKDateTime; Var DT2: TDateTime);
315 {$ELSE}
316 Procedure MKDT2DT(Var DT: MKDateTime; Var DT2: DateTime);
317 {$ENDIF}
318
319 Begin
320 DT2.Year := DT.Year;
321 DT2.Month := DT.Month;
322 DT2.Day := DT.Day;
323 DT2.Hour := DT.Hour;
324 DT2.Min := DT.Min;
325 DT2.Sec := DT.Sec;
326 End;
327
328
ValidMKDatenull329 Function ValidMKDate(DT: MKDateTime): Boolean;
330 Var
331 {$IFDEF WINDOWS}
332 DT2: TDateTime;
333 {$ELSE}
334 DT2: DateTime;
335 {$ENDIF}
336
337 Begin
338 MKDT2DT(DT, DT2);
339 ValidMKDate := ValidDate(DT2);
340 End;
341
342
343 Procedure Str2MKD(St: String; Var MKD: MKDateType);
344 Begin
345 FillChar(MKD, SizeOf(MKD), #0);
346 MKD.Year := Str2Long(Copy(St, 7, 2));
347 MKD.Month := Str2Long(Copy(St, 1, 2));
348 MKD.Day := Str2Long(Copy(St, 4, 2));
349 If MKD.Year < 80 Then
350 Inc(MKD.Year, 2000)
351 Else
352 Inc(MKD.Year, 1900);
353 End;
354
355
MKD2Strnull356 Function MKD2Str(MKD: MKDateType): String;
357 Begin
358 MKD2Str := PadLeft(Long2Str(MKD.Month),'0',2) + '-' +
359 PadLeft(Long2Str(MKD.Day), '0',2) + '-' +
360 PadLeft(Long2Str(MKD.Year Mod 100), '0', 2);
361 End;
362
363
AddrEqualnull364 Function AddrEqual(Addr1: AddrType; Addr2: AddrType):Boolean;
365 Begin
366 AddrEqual := ((Addr1.Zone = Addr2.Zone) and (Addr1.Net = Addr2.Net)
367 and (Addr1.Node = Addr2.Node) and (Addr1.Point = Addr2.Point));
368 End;
369
370
371
IsValidAddrnull372 Function IsValidAddr(Addr: AddrType): Boolean;
373 Begin
374 IsValidAddr := ((Addr.Zone = 0) And (Addr.Net = 0));
375 { We have to skip administrative '/0' addresses}
376 End;
377
378
379 End.
380