1 { $O+,F+,I-,S-,R-,V-}
2 Unit MKString;
3 
4 Interface
5 
6 Uses {Objects, }Dos,
7 {$IfDef VirtualPascal}
8 Use32,
9 {$EndIf}
10 GeneralP;
11 
12 const
13   hexChars: array [0..$F] of Char = '0123456789ABCDEF';
14 
15 Procedure MKStrCat(Var St: String; AStr: String);
LoCasenull16 Function LoCase(Chr: Char): Char;
padrightnull17 Function padright(st:string;ch:char;l:integer):string;
PadLeftnull18 Function PadLeft(St:String;Ch:Char;L:Integer): String;
stripleadnull19 function striplead(st:string;ch:char):string;
StripTrailnull20 Function StripTrail(St:String;Ch:Char):String;
StripBothnull21 Function StripBoth(St:String;Ch:Char):String;
Lowernull22 Function Lower(S : string) : string;
Uppernull23 Function Upper(S : string) : string;
WWrapnull24 Function WWrap(St:String; Max:Byte):String;
ExtractWordnull25 function ExtractWord(Str : String; N : Integer) : String;
WordCountnull26 Function WordCount(Str : String) : Integer;
CommaStrnull27 Function CommaStr(Number: LongInt): String;
Long2Strnull28 Function Long2Str(Number: LongInt): String;
Bin2Strnull29 Function Bin2Str(Number: Byte): String;
Str2Binnull30 Function Str2Bin(St: String): Byte;
Str2Longnull31 Function Str2Long(St: String): LongInt;
HexLongnull32 Function HexLong(Number:LongInt): String;
HexStrnull33 Function HexStr(Number: Word): String;
HexBytenull34 Function HexByte(Number: Byte): String;
DateStrnull35 Function DateStr(DosDate: LongInt): String;
TimeStrnull36 Function TimeStr(DosDate: LongInt): String;
37 Procedure AddBackSlash(Var InPath: String);
WithBackSlashnull38 Function WithBackSlash(InPath: String): String;
39 {$IFDEF WINDOWS}
FormattedDatenull40 Function FormattedDate(DT: TDateTime; Mask: String): String;
41 {$ELSE}
FormattedDatenull42 Function FormattedDate(DT: DateTime; Mask: String): String;
43 {$ENDIF}
FormattedDosDatenull44 Function FormattedDosDate(DosDate: LongInt; Mask:String): String;
DOWStrnull45 Function DOWStr(Dow: Word): String;
DOWShortStrnull46 Function DOWShortStr(DOW: Word): String;
ReformatDatenull47 Function ReformatDate(ODate: String; Mask: String): String;
LongDatenull48 Function LongDate(DStr: String): LongInt;
TimeStr2Wordnull49 Function TimeStr2Word(TS: String): Word;
Word2TimeStrnull50 Function Word2TimeStr(CTime: Word): String;
MonthStrnull51 Function MonthStr(MonthNo: Word): String;
Az2Strnull52 Function Az2Str(Var Str: String; MaxLen: Byte): String; {Convert asciiz to string}
53 Procedure Str2Az(Str: String; MaxLen: Byte; Var AZStr); {Convert string to asciiz}
MKDateToStrnull54 Function MKDateToStr(MKD: String): String; {Convert YYMMDD to MM-DD-YY}
StrToMKDatenull55 Function StrToMKDate(Str: String): String; {Convert MM-DD-YY to YYMMDD}
CleanCharnull56 Function CleanChar(InChar: Char): Char;
IsNumericnull57 Function IsNumeric(Str: String): Boolean;
PosLastCharnull58 Function PosLastChar(Ch: Char; St: String): Word;
Propernull59 Function Proper (Str : String) : String;
MakeNamenull60 Function MakeName (Name : String): String;
61 
62 
63 Const
64   CommaChar: Char = ',';
65 
66 Var
67   ExtraString: String;
68 
69 Implementation
70 
71 
LoCasenull72 function LoCase(Chr: Char): Char;
73 begin
74   case chr of
75     'A'..'Z': LoCase:=char(byte(Chr)+32)
76   else
77     LoCase:=Chr;
78   end;
79 end;
80 
81 
82 Procedure AddBackSlash(Var InPath: String);
83   Begin
84   If Length(InPath) > 0 Then
85     Begin
86     If InPath[Length(InPath)] <> DirSep Then
87       Begin
88       InPath[0] := Chr(Length(InPath) + 1);
89       InPath[Length(InPath)] := DirSep;
90       End;
91     End;
92   End;
93 
94 
WithBackSlashnull95 Function WithBackSlash(InPath: String): String;
96   Begin
97   AddBackSlash(InPath);
98   WithBackSlash := InPath;
99   End;
100 
101 
Bin2Strnull102 Function Bin2Str(Number: Byte): String;
103   Var
104     Temp1: Byte;
105     Temp2: Byte;
106     i: Word;
107     TempStr: String[8];
108 
109   Begin
110   Temp1 := 0;
111   Temp2 := $80;
112   For i := 1 to 8 Do
113     Begin
114     If (Number and Temp2) <> 0 Then
115       TempStr[i] := '1'
116     Else
117       TempStr[i] := '0';
118     Temp2 := Temp2 shr 1;
119     End;
120   TempStr[0] := #8;
121   Bin2Str := TempStr;
122   End;
123 
124 
Str2Binnull125 Function Str2Bin(St: String): Byte;
126   Var
127     i: Word;
128     Temp1: Byte;
129     Temp2: Byte;
130 
131   Begin
132   St := StripBoth(St,' ');
133   St := PadLeft(St,'0',8);
134   Temp1 := 0;
135   Temp2 := $80;
136   For i := 1 to 8 Do
137     Begin
138     If St[i] = '1' Then
139       Inc(Temp1,Temp2);
140     Temp2 := Temp2 shr 1;
141     End;
142   Str2Bin := Temp1;
143   End;
144 
Str2Longnull145 function Str2Long(St: String): LongInt;
146 var
147    Temp: LongInt;
148    Code: Integer;
149 begin
150   Val(St,Temp,Code);
151   Str2Long:=Temp;
152 end;
153 
DateStrnull154 Function DateStr(DosDate: LongInt): String;
155   Var
156 {$IFDEF WINDOWS}
157     DT:TDateTime;
158 {$ELSE}
159     DT: DateTime;
160 {$ENDIF}
161     OutStr: String[8];
162     TempStr: String[8];
163 
164   Begin
165     UnPackTime(DosDate,DT);
166     Str(DT.Month:2,TempStr);
167     If TempStr[1] = ' ' Then
168       OutStr[1] := '0'
169     Else
170       OutStr[1] := TempStr[1];
171     OutStr[2] := TempStr[2];
172     OutStr[3] := '-';
173     Str(DT.Day:2,TempStr);
174     If TempStr[1] = ' ' Then
175       OutStr[4] := '0'
176     Else
177       OutStr[4] := TempStr[1];
178     OutStr[5] := TempStr[2];
179     OutStr[6] := '-';
180     Str(DT.Year:4,TempStr);
181     If TempStr[3] = ' ' Then
182       OutStr[7] := '0'
183     Else
184       OutStr[7] := TempStr[3];
185     OutStr[8] := TempStr[4];
186     OutStr[0] := #8;
187     DateStr := OutStr;
188   End;
189 
TimeStrnull190 Function TimeStr(DosDate: LongInt): String;
191   Var
192 {$IFDEF WINDOWS}
193     DT: TDateTime;
194 {$ELSE}
195     DT: DateTime;
196 {$ENDIF}
197     OutStr: String[8];
198     TempStr: String[8];
199 
200   Begin
201     UnPackTime(DosDate,DT);
202     Str(DT.Hour:2,TempStr);
203     If TempStr[1] = ' ' Then
204       OutStr[1] := '0'
205     Else
206       OutStr[1] := TempStr[1];
207     OutStr[2] := TempStr[2];
208     OutStr[3] := ':';
209     Str(DT.Min:2,TempStr);
210     If TempStr[1] = ' ' Then
211       OutStr[4] := '0'
212     Else
213       OutStr[4] := TempStr[1];
214     OutStr[5] := TempStr[2];
215     OutStr[6] := ':';
216     Str(DT.Sec:2,TempStr);
217     If TempStr[1] = ' ' Then
218       OutStr[7] := '0'
219     Else
220       OutStr[7] := TempStr[1];
221     OutStr[8] := TempStr[2];
222     OutStr[0] := #8;
223     TimeStr := OutStr;
224   End;
225 
HexBytenull226 function HexByte(Number: Byte): string;
227 begin
228   HexByte:=hexChars[Number shr 4]+hexChars[Number and $F];
229 end;
230 
HexStrnull231 Function HexStr(Number: Word): String;
232 begin
233   HexStr := HexByte(Number Shr 8) + HexByte(Number And $FF);
234 end;
235 
HexLongnull236 function HexLong(Number: LongInt): String;
237 begin
238   HexLong := HexStr(Number div $FFFF) + HexStr(Number mod $FFFF);
239 end;
240 
241 
Long2Strnull242 function Long2Str(Number: LongInt): String;
243 var
244   TempStr: String;
245 begin
246   Str(Number,TempStr);
247   Long2Str := TempStr;
248 end;
249 
250 
CommaStrnull251 Function CommaStr(Number: LongInt): String;
252   Var
253     StrPos: Integer;
254     NumberStr: String;
255 
256   Begin
257   NumberStr := Long2Str(Number);
258   StrPos := Length(NumberStr) - 2;
259   While StrPos > 1 Do
260     Begin
261     Insert(',',NumberStr,StrPos);
262     StrPos := StrPos - 3;
263     End;
264   CommaStr := NumberStr;
265   End;
266 
267 
268 
269 
270 
wordcountnull271 Function wordcount(str : string) : integer;
272 
273   var
274     count : integer;
275     i : integer;
276     len : integer;
277 
278   begin
279   len := length(str);
280   count := 0;
281   i := 1;
282   while i <= len do
283     begin
284     while ((i <= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
285       inc(i);
286     if i <= len then
287       inc(count);
288     while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
289       inc(i);
290     end;
291   wordcount := count;
292   end;
293 
294 
extractwordnull295 function extractword(str : string; n : integer) : string;
296   Var
297     count : integer;
298     i : integer;
299     len : integer;
300     done : boolean;
301     retstr : string;
302 
303   Begin
304   retstr := '';
305   len := length(str);
306   count := 0;
307   i := 1;
308   done := false;
309   While (i <= len) and (not done) do
310     Begin
311     While ((i <= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
312       inc(i);
313     if i <= len then
314       inc(count);
315     if count = n then
316       begin
317       retstr[0] := #0;
318       If (i > 1) Then
319         If Str[i-1] = ';' Then
320           RetStr := ';';
321       while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
322         begin
323         inc(byte(retstr[0]));
324         retstr[ord(retstr[0])] := str[i];
325         inc(i);
326         end;
327       done := true;
328       end
329     Else
330       while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
331         inc(i);
332     End;
333   extractword := retstr;
334   End;
335 
336 
WWrapnull337 Function WWrap(St:String; Max:Byte):String;
338   Var
339     TempStr: String;
340     TempPos: Byte;
341 
342   Begin
343   ExtraString := '';
344   TempStr := St;
345   If Length(TempStr) > Max Then
346     Begin
347     TempPos := Max;
348     While ((TempStr[TempPos] <> ' ') And (TempPos > (Max - 20))
349       And (TempPos > 1)) Do
350       Dec(TempPos);
351     If (Length(TempStr) > TempPos) Then
352       ExtraString := Copy(TempStr,TempPos + 1,Length(TempStr) - TempPos);
353     TempStr[0] := Chr(TempPos);
354     End;
355   WWrap := TempStr;
356   End;
357 
358 
359 {Function Proper(St:String):String;
360   Var
361     TempStr: String;
362     i: Integer;
363     NextUp: Boolean;
364 
365   Begin
366   If Length(St) = 0 Then
367     Proper := ''
368   Else
369     Begin
370     i := 1;
371     NextUp := True;
372     TempStr := St;
373     While i <= Length(TempStr) Do
374       Begin
375       If ((TempStr[i] < 'A') Or (TempStr[i] > 'z')
376         Or ((TempStr[i] > 'Z') And (TempStr[i] < 'a')) ) Then
377         Begin
378         NextUp := True;
379         End
380       Else
381         Begin
382         If NextUp = True Then
383           Begin
384           NextUp := False;
385           TempStr[i] := UpCase(TempStr[i]);
386           End
387         Else
388           Begin
389           If TempStr[i] < 'a' Then
390             TempStr[i] := Char(Ord(TempStr[i]) + 32);
391           End;
392         End;
393       i := i + 1;
394       End;
395     Proper := TempStr;
396     End;
397   End;}
398 
399 
PadLeftnull400 Function PadLeft(St:String;Ch:Char;L:Integer): String;
401 var
402   TempStr: String;
403   i: Word;
404 begin
405   If Length(St) >= L Then
406     PadLeft := Copy(St,1,L)
407   else begin
408     For i := 1 to (L - Length(St)) Do
409       TempStr[i] := Ch;
410     TempStr[0] := Chr(L - Length(St));
411     PadLeft := TempStr + St;
412   end;
413 end;
414 
415 
padrightnull416 Function padright(st:string;ch:char;l:integer):string;
417 var
418   i:          integer;
419   tempstr:    string;
420 begin
421   tempstr := st;
422   if length(tempstr) > l then
423     tempstr[0] := chr(l)
424   else if length(tempstr) < l then begin
425     for i := length(tempstr)+1 to l do tempstr[i] := ch;
426     tempstr[0] := chr(l);
427   end;
428   padright := tempstr;
429 end;
430 
Lowernull431 function Lower(S : string) : string;
432 var
433   tmp: string;
434   i: integer;
435 begin
436   tmp := '';
437   for i:=1 to length(s) do
438     Case s[i] of
439      'A'..'Z' : tmp := tmp + char(byte(s[i])+32);
440      '�' : tmp := tmp + '�';
441      '�' : tmp := tmp + '�';
442      '�' : tmp := tmp + '�';
443      else
444        tmp := tmp + s[i];
445     end;
446   Lower := tmp;
447 end;
448 
Uppernull449 function Upper(S : string) : string;
450 var
451   tmp: string;
452   i: integer;
453 begin
454   tmp := '';
455   for i:=1 to length(s) do
456     Case s[i] of
457      'a'..'z' : tmp := tmp + char(byte(s[i])-32);
458      '�' : tmp := tmp + '�';
459      '�' : tmp := tmp + '�';
460      '�' : tmp := tmp + '�';
461      else
462        tmp := tmp + s[i];
463     end;
464   Upper := tmp;
465 end;
466 
stripleadnull467 function striplead(st:string;ch:char):string;
468 var
469   tempstr: string;
470 begin
471   tempstr:=st;
472   while ((TempStr[1]=Ch) and (Length(TempStr)>0)) do
473     tempstr:=copy (tempstr,2,length(tempstr));
474   striplead:=tempstr;
475 end;
476 
StripTrailnull477 function StripTrail(St: String; Ch: Char): String;
478 begin
479   while ((length(St)>0) and (St[length(St)]=Ch)) Do Dec(byte(St[0]));
480   StripTrail:=St;
481 end;
482 
StripBothnull483 function StripBoth(St: String; Ch: Char): String;
484 begin
485   StripBoth:=StripTrail(StripLead(St,Ch),Ch);
486 end;
487 
488 
489 {$IFDEF WINDOWS}
FormattedDatenull490 Function FormattedDate(DT: TDateTime; Mask: String): String;
491 {$ELSE}
FormattedDatenull492 Function FormattedDate(DT: DateTime; Mask: String): String;
493 {$ENDIF}
494   Var
495     DStr: String[2];
496     MStr: String[2];
497     MNStr: String[3];
498     YStr: String[4];
499     HourStr: String[2];
500     MinStr: String[2];
501     SecStr: String[2];
502     TmpStr: String;
503     CurrPos: Word;
504     i: Word;
505 
506   Begin
507   TmpStr := Mask;
508   Mask := Upper(Mask);
509   DStr := Copy(PadLeft(Long2Str(Dt.Day),'0',2),1,2);
510   MStr := Copy(PadLeft(Long2Str(Dt.Month),'0',2),1,2);
511   YStr := Copy(PadLeft(Long2Str(Dt.Year),'0',4),1,4);
512   HourStr := Copy(PadLeft(Long2Str(Dt.Hour),' ', 2),1,2);
513   MinStr := Copy(PadLeft(Long2Str(Dt.Min), '0',2),1,2);
514   SecStr := Copy(PadLeft(Long2Str(Dt.Sec), '0',2),1,2);
515   MNStr := MonthStr(Dt.Month);
516   If (Pos('YYYY', Mask) = 0) Then
517     YStr := Copy(YStr,3,2);
518   CurrPos := Pos('DD', Mask);
519   If CurrPos > 0 Then
520     For i := 1 to Length(DStr) Do
521       TmpStr[CurrPos + i - 1] := DStr[i];
522   CurrPos := Pos('YY', Mask);
523   If CurrPos > 0 Then
524     For i := 1 to Length(YStr) Do
525       TmpStr[CurrPos + i - 1] := YStr[i];
526   CurrPos := Pos('MM', Mask);
527   If CurrPos > 0 Then
528     For i := 1 to Length(MStr) Do
529       TmpStr[CurrPos + i - 1] := MStr[i];
530   CurrPos := Pos('HH', Mask);
531   If CurrPos > 0 Then
532     For i := 1 to Length(HourStr) Do
533       TmpStr[CurrPos + i - 1] := HourStr[i];
534   CurrPos := Pos('SS', Mask);
535   If CurrPos > 0 Then
536     For i := 1 to Length(SecStr) Do
537       TmpStr[CurrPos + i - 1] := SecStr[i];
538   CurrPos := Pos('II', Mask);
539   If CurrPos > 0 Then
540     For i := 1 to Length(MinStr) Do
541       TmpStr[CurrPos + i - 1] := MinStr[i];
542   CurrPos := Pos('NNN', Mask);
543   If CurrPos > 0 Then
544     For i := 1 to Length(MNStr) Do
545       TmpStr[CurrPos + i - 1] := MNStr[i];
546   FormattedDate := TmpStr;
547   End;
548 
549 
FormattedDosDatenull550 Function FormattedDosDate(DosDate: LongInt; Mask:String): String;
551   Var
552     {$IFDEF WINDOWS}
553     DT: TDateTime;
554     {$ELSE}
555     DT: DateTime;
556     {$ENDIF}
557 
558   Begin
559   UnPackTime(DosDate, DT);
560   FormattedDosDate := FormattedDate(DT, Mask);
561   End;
562 
DOWStrnull563 function DOWStr(Dow: Word): String;
564 begin
565   Case DOW of
566     0: DOWStr := 'Sunday';
567     1: DOWStr := 'Monday';
568     2: DOWStr := 'Tuesday';
569     3: DOWStr := 'Wednesday';
570     4: DOWStr := 'Thursday';
571     5: DOWStr := 'Friday';
572     6: DOWStr := 'Saturday';
573     else
574       DOWStr := '?????';
575   end;
576 end;
577 
DOWShortStrnull578 function DOWShortStr(DOW: Word): String;
579 begin
580   DOWShortStr := Copy(DOWStr(Dow),1,3);
581 end;
582 
ReformatDatenull583 Function ReformatDate(ODate: String; Mask: String): String;
584   Var
585     Code: Word;
586     {$IFDEF WINDOWS}
587     DT: TDateTime;
588     {$ELSE}
589     DT: DateTime;
590     {$ENDIF}
591 
592   Begin
593   Val(Copy(ODate,7,2), DT.Year, Code);
594   Val(Copy(ODate,1,2), DT.Month, Code);
595   Val(Copy(ODate,4,2), DT.Day, Code);
596   If DT.Year < 80 Then
597     Inc(DT.Year, 2000)
598   Else
599     Inc(DT.Year, 1900);
600   ReformatDate := FormattedDate(DT, Mask);
601   End;
602 
603 
Word2TimeStrnull604 Function Word2TimeStr(CTime: Word): String;
605   Begin
606   Word2TimeStr := PadLeft(Long2Str(Hi(CTime)),'0',2) + ':' +
607     PadLeft(Long2Str(Lo(CTime)),'0',2);
608   End;
609 
610 
TimeStr2Wordnull611 Function TimeStr2Word(TS: String): Word;
612   Var
613     Vr: Word;
614     Vr2: Word;
615     Code: Word;
616 
617   Begin
618   Val(Copy(TS,1,2), Vr, Code);
619   Val(Copy(TS,4,2), Vr2, Code);
620   TimeStr2Word := Vr2 + (Vr shl 8);
621   End;
622 
623 
MonthStrnull624 function MonthStr(MonthNo: Word): String;
625 begin
626   Case MonthNo of
627     01: MonthStr := 'Jan';
628     02: MonthStr := 'Feb';
629     03: MonthStr := 'Mar';
630     04: MonthStr := 'Apr';
631     05: MonthStr := 'May';
632     06: MonthStr := 'Jun';
633     07: MonthStr := 'Jul';
634     08: MonthStr := 'Aug';
635     09: MonthStr := 'Sep';
636     10: MonthStr := 'Oct';
637     11: MonthStr := 'Nov';
638     12: MonthStr := 'Dec';
639     else
640       MonthStr := '???';
641   end;
642 end;
643 
Az2Strnull644 function Az2Str(Var Str: String; MaxLen: Byte): String; {Convert asciiz to string}
645 var
646   i: Word;
647   TmpStr: String;
648 begin
649   For i := 1 to MaxLen do TmpStr[i] := Str[i-1];
650 {  Move(Str, TmpStr[1], MaxLen);}
651   TmpStr[0] := Chr(MaxLen);
652   i := Pos(#0, TmpStr);
653   If i > 0 Then TmpStr[0] := Chr(i - 1);
654   Az2Str := TmpStr;
655 end;
656 
657 procedure Str2Az(Str: String; MaxLen: Byte; Var AZStr); {Convert string to asciiz}
658 begin
659   if Length(Str) >= MaxLen then begin
660     Str[MaxLen] := #0;
661     Move(Str[1], AZStr, MaxLen);
662   end else begin
663     Str[Length(Str) + 1] := #0;
664     Move(Str[1], AZStr, Length(Str) + 1);
665   end;
666 end;
667 
MKDateToStrnull668 Function MKDateToStr(MKD: String): String; {Convert YYMMDD to MM-DD-YY}
669   Begin
670   MKDateToStr := Copy(MKD,3,2) + '-' + Copy(MKD,5,2) + '-' +
671     Copy(MKD,1,2);
672   End;
673 
674 
StrToMKDatenull675 Function StrToMKDate(Str: String): String; {Convert MM-DD-YY to YYMMDD}
676   Begin
677   StrToMKDate := Copy(Str,7,2) + Copy(Str,1,2) + Copy(Str,4,2);
678   End;
679 
680 
CleanCharnull681 Function CleanChar(InChar: Char): Char;
682   Const
683     CtlChars: String[32] = 'oooooooooXoollo><|!Pg*|^v><-^v';
684     HiChars: String[64] = 'CueaaaageeeiiiAAEaaooouuyOUcLYPfarounNao?--//!<>***|||||||||||||';
685     HiChars2: String[64]= '|--|-+||||=+|=++-=--==-||||*****abcnEduto0nd80En=+><fj/~oo.vn2* ';
686 
687   Begin
688   Case InChar of
689     #0..#31: CleanChar := CtlChars[Ord(InChar) + 1];
690     #128..#191: CleanChar := HiChars[Ord(InChar) - 127];
691     #192..#255: CleanChar := HiChars2[Ord(InChar) - 191];
692     Else
693       CleanChar := InChar;
694     End;
695   End;
696 
697 
IsNumericnull698 Function IsNumeric(Str: String): Boolean;
699   Var
700     i: Word;
701 
702 begin
703   IsNumeric := True;
704   for i := 1 To Length(Str) Do
705     If not (Str[i] in ['0'..'9']) Then IsNumeric := False;
706 end;
707 
708 
LongDatenull709 Function LongDate(DStr: String): LongInt;
710   Var
711     {$IFDEF WINDOWS}
712     DT: TDateTime;
713     {$ELSE}
714     DT: DateTime;
715     {$ENDIF}
716     DosDate: LongInt;
717 
718   Begin
719   DT.Year := Str2Long(Copy(DStr,7,2));
720   If Dt.Year < 80 Then
721     Inc(DT.Year, 2000)
722   Else
723     Inc(DT.Year, 1900);
724   DT.Month := Str2Long(Copy(DStr,1,2));
725   DT.Day := Str2Long(Copy(DStr,4,2));
726   DT.Hour := 0;
727   DT.Min := 0;
728   DT.Sec := 0;
729   PackTime(DT, DosDate);
730   LongDate := DosDate;
731   End;
732 
733 
734 Procedure MKStrCat(Var St: String; AStr: String);
735   Var
736     i: Word;
737 
738   Begin
739   i := Length(AStr);
740   If i + Length(St) > 255 Then
741     i := 255 - Length(St);
742   Move(AStr[1], St[Length(St) + 1], i);
743   Inc(byte(St[0]), i);
744   End;
745 
746 
PosLastCharnull747 Function PosLastChar(Ch: Char; St: String): Word;
748   Var
749     i: Word;
750 
751   Begin
752   i := Length(St);
753   While ((i > 0) and (st[i] <> ch)) Do
754     Dec(i);
755   PosLastChar := i;
756   End;
757 
Propernull758 function Proper (Str : String) : String;
759   var
760     I     : Integer;
761     Space : Boolean;
762   begin
763       Space := True;
764       Str := Lower(Str);
765       for I := 1 to Length (Str) do
766         If Space and (Ord (Str [I]) in [97..122]) then begin
767               Space := False;
768               Str[I] := Upcase (Str [I]);
769         end else If (Space = False) and (Str[I] = ' ') then
770               Space := True;
771     Proper := Str;
772   end;
773 
MakeNamenull774 function MakeName (Name : String): String;
775   var
776     Comma : String[2];
777   begin
778     If Pos (' ', Name) > 0 then Comma := ', ' else Comma := '';
779     MakeName := Copy (Name, Pos (' ', Name) + 1, Length (Name) - Pos (' ', Name))
780                 + Comma + Copy (Name, 1, Pos (' ', Name) - 1) + #0;
781   end;
782 
783 End.
784