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