1 { $O+,F+,I-,S-,R-,V-}
2 Unit MKString;
3 
4 Interface
5 
6 Uses
7 {$ifndef __GPC__}
8 Dos,
9 {$endif}
10 {$IfDef VirtualPascal}
11 Use32,
12 {$EndIf}
13 GeneralP;
14 
15 const
16   hexChars: array [0..$F] of Char = '0123456789ABCDEF';
17 
18 Procedure MKStrCat(Var St: String; AStr: String);
LoCasenull19 Function LoCase(Chr: Char): Char;
padrightnull20 Function padright(st:string;ch:char;l:integer):string;
PadLeftnull21 Function PadLeft(St:String;Ch:Char;L:Integer): String;
stripleadnull22 function striplead(st:string;ch:char):string;
StripTrailnull23 Function StripTrail(St:String;Ch:Char):String;
StripBothnull24 Function StripBoth(St:String;Ch:Char):String;
Lowernull25 Function Lower(S : string) : string;
Uppernull26 Function Upper(S : string) : string;
WWrapnull27 Function WWrap(St:String; Max:Byte):String;
ExtractWordnull28 function ExtractWord(Str : String; N : Integer) : String;
WordCountnull29 Function WordCount(Str : String) : Integer;
CommaStrnull30 Function CommaStr(Number: LongInt): String;
Long2Strnull31 Function Long2Str(Number: LongInt): String;
Bin2Strnull32 Function Bin2Str(Number: Byte): String;
Str2Binnull33 Function Str2Bin(St: String): Byte;
Str2Longnull34 Function Str2Long(St: String): LongInt;
HexLongnull35 Function HexLong(Number:LongInt): String;
HexStrnull36 Function HexStr(Number: Word): String;
HexBytenull37 Function HexByte(Number: Byte): String;
DateStrnull38 Function DateStr(DosDate: LongInt): String;
TimeStrnull39 Function TimeStr(DosDate: LongInt): String;
40 Procedure AddBackSlash(Var InPath: String);
WithBackSlashnull41 Function WithBackSlash(InPath: String): String;
42 {$IFDEF WINDOWS}
FormattedDatenull43 Function FormattedDate(DT: TDateTime; Mask: String): String;
44 {$ELSE}
FormattedDatenull45 Function FormattedDate(DT: DateTime; Mask: String): String;
46 {$ENDIF}
FormattedDosDatenull47 Function FormattedDosDate(DosDate: LongInt; Mask:String): String;
DOWStrnull48 Function DOWStr(Dow: Word): String;
DOWShortStrnull49 Function DOWShortStr(DOW: Word): String;
ReformatDatenull50 Function ReformatDate(ODate: String; Mask: String): String;
LongDatenull51 Function LongDate(DStr: String): LongInt;
TimeStr2Wordnull52 Function TimeStr2Word(TS: String): Word;
Word2TimeStrnull53 Function Word2TimeStr(CTime: Word): String;
MonthStrnull54 Function MonthStr(MonthNo: Word): String;
Az2Strnull55 Function Az2Str(Var Str: String; MaxLen: Byte): String; {Convert asciiz to string}
56 Procedure Str2Az(Str: String; MaxLen: Byte; Var AZStr); {Convert string to asciiz}
MKDateToStrnull57 Function MKDateToStr(MKD: String): String; {Convert YYMMDD to MM-DD-YY}
StrToMKDatenull58 Function StrToMKDate(Str: String): String; {Convert MM-DD-YY to YYMMDD}
CleanCharnull59 Function CleanChar(InChar: Char): Char;
IsNumericnull60 Function IsNumeric(Str: String): Boolean;
PosLastCharnull61 Function PosLastChar(Ch: Char; St: String): Word;
Propernull62 Function Proper (Str : String) : String;
MakeNamenull63 Function MakeName (Name : String): String;
64 
65 
66 Const
67   CommaChar: Char = ',';
68 
69 Var
70   ExtraString: String;
71 
72 Implementation
73 
74 
LoCasenull75 function LoCase(Chr: Char): Char;
76 begin
77   case chr of
78     'A'..'Z': LoCase:=char(byte(Chr)+32)
79   else
80     LoCase:=Chr;
81   end;
82 end;
83 
84 
85 Procedure AddBackSlash(Var InPath: String);
86   Begin
87   If Length(InPath) > 0 Then
88     Begin
89     If InPath[Length(InPath)] <> DirSep Then
90       Begin
91       InPath[0] := Chr(Length(InPath) + 1);
92       InPath[Length(InPath)] := DirSep;
93       End;
94     End;
95   End;
96 
97 
WithBackSlashnull98 Function WithBackSlash(InPath: String): String;
99   Begin
100   AddBackSlash(InPath);
101   WithBackSlash := InPath;
102   End;
103 
104 
Bin2Strnull105 Function Bin2Str(Number: Byte): String;
106   Var
107     Temp1: Byte;
108     Temp2: Byte;
109     i: Word;
110     TempStr: String[8];
111 
112   Begin
113   Temp1 := 0;
114   Temp2 := $80;
115   For i := 1 to 8 Do
116     Begin
117     If (Number and Temp2) <> 0 Then
118       TempStr[i] := '1'
119     Else
120       TempStr[i] := '0';
121     Temp2 := Temp2 shr 1;
122     End;
123   TempStr[0] := #8;
124   Bin2Str := TempStr;
125   End;
126 
127 
Str2Binnull128 Function Str2Bin(St: String): Byte;
129   Var
130     i: Word;
131     Temp1: Byte;
132     Temp2: Byte;
133 
134   Begin
135   St := StripBoth(St,' ');
136   St := PadLeft(St,'0',8);
137   Temp1 := 0;
138   Temp2 := $80;
139   For i := 1 to 8 Do
140     Begin
141     If St[i] = '1' Then
142       Inc(Temp1,Temp2);
143     Temp2 := Temp2 shr 1;
144     End;
145   Str2Bin := Temp1;
146   End;
147 
Str2Longnull148 function Str2Long(St: String): LongInt;
149 var
150    Temp: LongInt;
151    Code: Integer;
152 begin
153   Val(St,Temp,Code);
154   Str2Long:=Temp;
155 end;
156 
DateStrnull157 Function DateStr(DosDate: LongInt): String;
158   Var
159 {$IFDEF WINDOWS}
160     DT:TDateTime;
161 {$ELSE}
162     DT: DateTime;
163 {$ENDIF}
164     OutStr: String[8];
165     TempStr: String[8];
166 
167   Begin
168     UnPackTime(DosDate,DT);
169     Str(DT.Month:2,TempStr);
170     If TempStr[1] = ' ' Then
171       OutStr[1] := '0'
172     Else
173       OutStr[1] := TempStr[1];
174     OutStr[2] := TempStr[2];
175     OutStr[3] := '-';
176     Str(DT.Day:2,TempStr);
177     If TempStr[1] = ' ' Then
178       OutStr[4] := '0'
179     Else
180       OutStr[4] := TempStr[1];
181     OutStr[5] := TempStr[2];
182     OutStr[6] := '-';
183     Str(DT.Year:4,TempStr);
184     If TempStr[3] = ' ' Then
185       OutStr[7] := '0'
186     Else
187       OutStr[7] := TempStr[3];
188     OutStr[8] := TempStr[4];
189     OutStr[0] := #8;
190     DateStr := OutStr;
191   End;
192 
TimeStrnull193 Function TimeStr(DosDate: LongInt): String;
194   Var
195 {$IFDEF WINDOWS}
196     DT: TDateTime;
197 {$ELSE}
198     DT: DateTime;
199 {$ENDIF}
200     OutStr: String[8];
201     TempStr: String[8];
202 
203   Begin
204     UnPackTime(DosDate,DT);
205     Str(DT.Hour:2,TempStr);
206     If TempStr[1] = ' ' Then
207       OutStr[1] := '0'
208     Else
209       OutStr[1] := TempStr[1];
210     OutStr[2] := TempStr[2];
211     OutStr[3] := ':';
212     Str(DT.Min:2,TempStr);
213     If TempStr[1] = ' ' Then
214       OutStr[4] := '0'
215     Else
216       OutStr[4] := TempStr[1];
217     OutStr[5] := TempStr[2];
218     OutStr[6] := ':';
219     Str(DT.Sec:2,TempStr);
220     If TempStr[1] = ' ' Then
221       OutStr[7] := '0'
222     Else
223       OutStr[7] := TempStr[1];
224     OutStr[8] := TempStr[2];
225     OutStr[0] := #8;
226     TimeStr := OutStr;
227   End;
228 
HexBytenull229 function HexByte(Number: Byte): string;
230 begin
231   HexByte:=hexChars[Number shr 4]+hexChars[Number and $F];
232 end;
233 
HexStrnull234 Function HexStr(Number: Word): String;
235 begin
236   HexStr := HexByte(Number Shr 8) + HexByte(Number And $FF);
237 end;
238 
HexLongnull239 function HexLong(Number: LongInt): String;
240 begin
241   HexLong := HexStr(Number div $FFFF) + HexStr(Number mod $FFFF);
242 end;
243 
244 
Long2Strnull245 function Long2Str(Number: LongInt): String;
246 var
247   TempStr: String;
248 begin
249   Str(Number,TempStr);
250   Long2Str := TempStr;
251 end;
252 
253 
CommaStrnull254 Function CommaStr(Number: LongInt): String;
255   Var
256     StrPos: Integer;
257     NumberStr: String;
258 
259   Begin
260   NumberStr := Long2Str(Number);
261   StrPos := Length(NumberStr) - 2;
262   While StrPos > 1 Do
263     Begin
264     Insert(',',NumberStr,StrPos);
265     StrPos := StrPos - 3;
266     End;
267   CommaStr := NumberStr;
268   End;
269 
270 
271 
272 
273 
wordcountnull274 Function wordcount(str : string) : integer;
275 
276   var
277     count : integer;
278     i : integer;
279     len : integer;
280 
281   begin
282   len := length(str);
283   count := 0;
284   i := 1;
285   while i <= len do
286     begin
287     while ((i <= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
288       inc(i);
289     if i <= len then
290       inc(count);
291     while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
292       inc(i);
293     end;
294   wordcount := count;
295   end;
296 
297 
extractwordnull298 function extractword(str : string; n : integer) : string;
299   Var
300     count : integer;
301     i : integer;
302     len : integer;
303     done : boolean;
304     retstr : string;
305 
306   Begin
307   retstr := '';
308   len := length(str);
309   count := 0;
310   i := 1;
311   done := false;
312   While (i <= len) and (not done) do
313     Begin
314     While ((i <= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
315       inc(i);
316     if i <= len then
317       inc(count);
318     if count = n then
319       begin
320       retstr[0] := #0;
321       If (i > 1) Then
322         If Str[i-1] = ';' Then
323           RetStr := ';';
324       while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
325         begin
326         inc(byte(retstr[0]));
327         retstr[ord(retstr[0])] := str[i];
328         inc(i);
329         end;
330       done := true;
331       end
332     Else
333       while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
334         inc(i);
335     End;
336   extractword := retstr;
337   End;
338 
339 
WWrapnull340 Function WWrap(St:String; Max:Byte):String;
341   Var
342     TempStr: String;
343     TempPos: Byte;
344 
345   Begin
346   ExtraString := '';
347   TempStr := St;
348   If Length(TempStr) > Max Then
349     Begin
350     TempPos := Max;
351     While ((TempStr[TempPos] <> ' ') And (TempPos > (Max - 20))
352       And (TempPos > 1)) Do
353       Dec(TempPos);
354     If (Length(TempStr) > TempPos) Then
355       ExtraString := Copy(TempStr,TempPos + 1,Length(TempStr) - TempPos);
356     TempStr[0] := Chr(TempPos);
357     End;
358   WWrap := TempStr;
359   End;
360 
361 
362 {Function Proper(St:String):String;
363   Var
364     TempStr: String;
365     i: Integer;
366     NextUp: Boolean;
367 
368   Begin
369   If Length(St) = 0 Then
370     Proper := ''
371   Else
372     Begin
373     i := 1;
374     NextUp := True;
375     TempStr := St;
376     While i <= Length(TempStr) Do
377       Begin
378       If ((TempStr[i] < 'A') Or (TempStr[i] > 'z')
379         Or ((TempStr[i] > 'Z') And (TempStr[i] < 'a')) ) Then
380         Begin
381         NextUp := True;
382         End
383       Else
384         Begin
385         If NextUp = True Then
386           Begin
387           NextUp := False;
388           TempStr[i] := UpCase(TempStr[i]);
389           End
390         Else
391           Begin
392           If TempStr[i] < 'a' Then
393             TempStr[i] := Char(Ord(TempStr[i]) + 32);
394           End;
395         End;
396       i := i + 1;
397       End;
398     Proper := TempStr;
399     End;
400   End;}
401 
402 
PadLeftnull403 Function PadLeft(St:String;Ch:Char;L:Integer): String;
404 var
405   TempStr: String;
406   i: Word;
407 begin
408   If Length(St) >= L Then
409     PadLeft := Copy(St,1,L)
410   else begin
411     For i := 1 to (L - Length(St)) Do
412       TempStr[i] := Ch;
413     TempStr[0] := Chr(L - Length(St));
414     PadLeft := TempStr + St;
415   end;
416 end;
417 
418 
padrightnull419 Function padright(st:string;ch:char;l:integer):string;
420 var
421   i:          integer;
422   tempstr:    string;
423 begin
424   tempstr := st;
425   if length(tempstr) > l then
426     tempstr[0] := chr(l)
427   else if length(tempstr) < l then begin
428     for i := length(tempstr)+1 to l do tempstr[i] := ch;
429     tempstr[0] := chr(l);
430   end;
431   padright := tempstr;
432 end;
433 
Lowernull434 function Lower(S : string) : string;
435 var
436   tmp: string;
437   i: integer;
438 begin
439   tmp := '';
440   for i:=1 to length(s) do
441     Case s[i] of
442      'A'..'Z' : tmp := tmp + char(byte(s[i])+32);
443      '�' : tmp := tmp + '�';
444      '�' : tmp := tmp + '�';
445      '�' : tmp := tmp + '�';
446      else
447        tmp := tmp + s[i];
448     end;
449   Lower := tmp;
450 end;
451 
Uppernull452 function Upper(S : string) : string;
453 var
454   tmp: string;
455   i: integer;
456 begin
457   tmp := '';
458   for i:=1 to length(s) do
459     Case s[i] of
460      'a'..'z' : tmp := tmp + char(byte(s[i])-32);
461      '�' : tmp := tmp + '�';
462      '�' : tmp := tmp + '�';
463      '�' : tmp := tmp + '�';
464      else
465        tmp := tmp + s[i];
466     end;
467   Upper := tmp;
468 end;
469 
stripleadnull470 function striplead(st:string;ch:char):string;
471 var
472   tempstr: string;
473 begin
474   tempstr:=st;
475   while ((TempStr[1]=Ch) and (Length(TempStr)>0)) do
476     tempstr:=copy (tempstr,2,length(tempstr));
477   striplead:=tempstr;
478 end;
479 
StripTrailnull480 function StripTrail(St: String; Ch: Char): String;
481 begin
482   while ((length(St)>0) and (St[length(St)]=Ch)) Do Dec(byte(St[0]));
483   StripTrail:=St;
484 end;
485 
StripBothnull486 function StripBoth(St: String; Ch: Char): String;
487 begin
488   StripBoth:=StripTrail(StripLead(St,Ch),Ch);
489 end;
490 
491 
492 {$IFDEF WINDOWS}
FormattedDatenull493 Function FormattedDate(DT: TDateTime; Mask: String): String;
494 {$ELSE}
FormattedDatenull495 Function FormattedDate(DT: DateTime; Mask: String): String;
496 {$ENDIF}
497   Var
498     DStr: String[2];
499     MStr: String[2];
500     MNStr: String[3];
501     YStr: String[4];
502     HourStr: String[2];
503     MinStr: String[2];
504     SecStr: String[2];
505     TmpStr: String;
506     CurrPos: Word;
507     i: Word;
508 
509   Begin
510   TmpStr := Mask;
511   Mask := Upper(Mask);
512   DStr := Copy(PadLeft(Long2Str(Dt.Day),'0',2),1,2);
513   MStr := Copy(PadLeft(Long2Str(Dt.Month),'0',2),1,2);
514   YStr := Copy(PadLeft(Long2Str(Dt.Year),'0',4),1,4);
515   HourStr := Copy(PadLeft(Long2Str(Dt.Hour),' ', 2),1,2);
516   MinStr := Copy(PadLeft(Long2Str(Dt.Min), '0',2),1,2);
517   SecStr := Copy(PadLeft(Long2Str(Dt.Sec), '0',2),1,2);
518   MNStr := MonthStr(Dt.Month);
519   If (Pos('YYYY', Mask) = 0) Then
520     YStr := Copy(YStr,3,2);
521   CurrPos := Pos('DD', Mask);
522   If CurrPos > 0 Then
523     For i := 1 to Length(DStr) Do
524       TmpStr[CurrPos + i - 1] := DStr[i];
525   CurrPos := Pos('YY', Mask);
526   If CurrPos > 0 Then
527     For i := 1 to Length(YStr) Do
528       TmpStr[CurrPos + i - 1] := YStr[i];
529   CurrPos := Pos('MM', Mask);
530   If CurrPos > 0 Then
531     For i := 1 to Length(MStr) Do
532       TmpStr[CurrPos + i - 1] := MStr[i];
533   CurrPos := Pos('HH', Mask);
534   If CurrPos > 0 Then
535     For i := 1 to Length(HourStr) Do
536       TmpStr[CurrPos + i - 1] := HourStr[i];
537   CurrPos := Pos('SS', Mask);
538   If CurrPos > 0 Then
539     For i := 1 to Length(SecStr) Do
540       TmpStr[CurrPos + i - 1] := SecStr[i];
541   CurrPos := Pos('II', Mask);
542   If CurrPos > 0 Then
543     For i := 1 to Length(MinStr) Do
544       TmpStr[CurrPos + i - 1] := MinStr[i];
545   CurrPos := Pos('NNN', Mask);
546   If CurrPos > 0 Then
547     For i := 1 to Length(MNStr) Do
548       TmpStr[CurrPos + i - 1] := MNStr[i];
549   FormattedDate := TmpStr;
550   End;
551 
552 
FormattedDosDatenull553 Function FormattedDosDate(DosDate: LongInt; Mask:String): String;
554   Var
555     {$IFDEF WINDOWS}
556     DT: TDateTime;
557     {$ELSE}
558     DT: DateTime;
559     {$ENDIF}
560 
561   Begin
562   UnPackTime(DosDate, DT);
563   FormattedDosDate := FormattedDate(DT, Mask);
564   End;
565 
DOWStrnull566 function DOWStr(Dow: Word): String;
567 begin
568   Case DOW of
569     0: DOWStr := 'Sunday';
570     1: DOWStr := 'Monday';
571     2: DOWStr := 'Tuesday';
572     3: DOWStr := 'Wednesday';
573     4: DOWStr := 'Thursday';
574     5: DOWStr := 'Friday';
575     6: DOWStr := 'Saturday';
576     else
577       DOWStr := '?????';
578   end;
579 end;
580 
DOWShortStrnull581 function DOWShortStr(DOW: Word): String;
582 begin
583   DOWShortStr := Copy(DOWStr(Dow),1,3);
584 end;
585 
ReformatDatenull586 Function ReformatDate(ODate: String; Mask: String): String;
587   Var
588     Code: Word;
589     {$IFDEF WINDOWS}
590     DT: TDateTime;
591     {$ELSE}
592     DT: DateTime;
593     {$ENDIF}
594 
595   Begin
596   Val(Copy(ODate,7,2), DT.Year, Code);
597   Val(Copy(ODate,1,2), DT.Month, Code);
598   Val(Copy(ODate,4,2), DT.Day, Code);
599   If DT.Year < 80 Then
600     Inc(DT.Year, 2000)
601   Else
602     Inc(DT.Year, 1900);
603   ReformatDate := FormattedDate(DT, Mask);
604   End;
605 
606 
Word2TimeStrnull607 Function Word2TimeStr(CTime: Word): String;
608   Begin
609   Word2TimeStr := PadLeft(Long2Str(Hi(CTime)),'0',2) + ':' +
610     PadLeft(Long2Str(Lo(CTime)),'0',2);
611   End;
612 
613 
TimeStr2Wordnull614 Function TimeStr2Word(TS: String): Word;
615   Var
616     Vr: Word;
617     Vr2: Word;
618     Code: Word;
619 
620   Begin
621   Val(Copy(TS,1,2), Vr, Code);
622   Val(Copy(TS,4,2), Vr2, Code);
623   TimeStr2Word := Vr2 + (Vr shl 8);
624   End;
625 
626 
MonthStrnull627 function MonthStr(MonthNo: Word): String;
628 begin
629   Case MonthNo of
630     01: MonthStr := 'Jan';
631     02: MonthStr := 'Feb';
632     03: MonthStr := 'Mar';
633     04: MonthStr := 'Apr';
634     05: MonthStr := 'May';
635     06: MonthStr := 'Jun';
636     07: MonthStr := 'Jul';
637     08: MonthStr := 'Aug';
638     09: MonthStr := 'Sep';
639     10: MonthStr := 'Oct';
640     11: MonthStr := 'Nov';
641     12: MonthStr := 'Dec';
642     else
643       MonthStr := '???';
644   end;
645 end;
646 
Az2Strnull647 function Az2Str(Var Str: String; MaxLen: Byte): String; {Convert asciiz to string}
648 var
649   i: Word;
650   TmpStr: String;
651 begin
652   For i := 1 to MaxLen do TmpStr[i] := Str[i-1];
653 {  Move(Str, TmpStr[1], MaxLen);}
654   TmpStr[0] := Chr(MaxLen);
655   i := Pos(#0, TmpStr);
656   If i > 0 Then TmpStr[0] := Chr(i - 1);
657   Az2Str := TmpStr;
658 end;
659 
660 procedure Str2Az(Str: String; MaxLen: Byte; Var AZStr); {Convert string to asciiz}
661 begin
662   if Length(Str) >= MaxLen then begin
663     Str[MaxLen] := #0;
664     Move(Str[1], AZStr, MaxLen);
665   end else begin
666     Str[Length(Str) + 1] := #0;
667     Move(Str[1], AZStr, Length(Str) + 1);
668   end;
669 end;
670 
MKDateToStrnull671 Function MKDateToStr(MKD: String): String; {Convert YYMMDD to MM-DD-YY}
672   Begin
673   MKDateToStr := Copy(MKD,3,2) + '-' + Copy(MKD,5,2) + '-' +
674     Copy(MKD,1,2);
675   End;
676 
677 
StrToMKDatenull678 Function StrToMKDate(Str: String): String; {Convert MM-DD-YY to YYMMDD}
679   Begin
680   StrToMKDate := Copy(Str,7,2) + Copy(Str,1,2) + Copy(Str,4,2);
681   End;
682 
683 
CleanCharnull684 Function CleanChar(InChar: Char): Char;
685   Const
686     CtlChars: String[32] = 'oooooooooXoollo><|!Pg*|^v><-^v';
687     HiChars: String[64] = 'CueaaaageeeiiiAAEaaooouuyOUcLYPfarounNao?--//!<>***|||||||||||||';
688     HiChars2: String[64]= '|--|-+||||=+|=++-=--==-||||*****abcnEduto0nd80En=+><fj/~oo.vn2* ';
689 
690   Begin
691   Case InChar of
692     #0..#31: CleanChar := CtlChars[Ord(InChar) + 1];
693     #128..#191: CleanChar := HiChars[Ord(InChar) - 127];
694     #192..#255: CleanChar := HiChars2[Ord(InChar) - 191];
695     Else
696       CleanChar := InChar;
697     End;
698   End;
699 
700 
IsNumericnull701 Function IsNumeric(Str: String): Boolean;
702   Var
703     i: Word;
704 
705 begin
706   IsNumeric := True;
707   for i := 1 To Length(Str) Do
708     If not (Str[i] in ['0'..'9']) Then IsNumeric := False;
709 end;
710 
711 
LongDatenull712 Function LongDate(DStr: String): LongInt;
713   Var
714     {$IFDEF WINDOWS}
715     DT: TDateTime;
716     {$ELSE}
717     DT: DateTime;
718     {$ENDIF}
719     DosDate: LongInt;
720 
721   Begin
722   DT.Year := Str2Long(Copy(DStr,7,2));
723   If Dt.Year < 80 Then
724     Inc(DT.Year, 2000)
725   Else
726     Inc(DT.Year, 1900);
727   DT.Month := Str2Long(Copy(DStr,1,2));
728   DT.Day := Str2Long(Copy(DStr,4,2));
729   DT.Hour := 0;
730   DT.Min := 0;
731   DT.Sec := 0;
732   PackTime(DT, DosDate);
733   LongDate := DosDate;
734   End;
735 
736 
737 Procedure MKStrCat(Var St: String; AStr: String);
738   Var
739     i: Word;
740 
741   Begin
742   i := Length(AStr);
743   If i + Length(St) > 255 Then
744     i := 255 - Length(St);
745   Move(AStr[1], St[Length(St) + 1], i);
746   Inc(byte(St[0]), i);
747   End;
748 
749 
PosLastCharnull750 Function PosLastChar(Ch: Char; St: String): Word;
751   Var
752     i: Word;
753 
754   Begin
755   i := Length(St);
756   While ((i > 0) and (st[i] <> ch)) Do
757     Dec(i);
758   PosLastChar := i;
759   End;
760 
Propernull761 function Proper (Str : String) : String;
762   var
763     I     : Integer;
764     Space : Boolean;
765   begin
766       Space := True;
767       Str := Lower(Str);
768       for I := 1 to Length (Str) do
769         If Space and (Ord (Str [I]) in [97..122]) then begin
770               Space := False;
771               Str[I] := Upcase (Str [I]);
772         end else If (Space = False) and (Str[I] = ' ') then
773               Space := True;
774     Proper := Str;
775   end;
776 
MakeNamenull777 function MakeName (Name : String): String;
778   var
779     Comma : String[2];
780   begin
781     If Pos (' ', Name) > 0 then Comma := ', ' else Comma := '';
782     MakeName := Copy (Name, Pos (' ', Name) + 1, Length (Name) - Pos (' ', Name))
783                 + Comma + Copy (Name, 1, Pos (' ', Name) - 1) + #0;
784   end;
785 
786 End.
787