Category : Pascal Source Code
Archive   : CRUNCH10.ZIP
Filename : STRPROCS.PAS

 
Output of file : STRPROCS.PAS contained in archive : CRUNCH10.ZIP
Unit StrProcs;

{ ***** Misc. String Functions ******************************************** }

Interface

Uses Dos;

Function Upper(StrIn : String) : String;
{ Convert a string to upper case }

Function PathOnly(FileName : String) : String;
{ Strip any filename information from a file specification }

Function NameOnly(FileName : String) : String;
{ Strip any path information from a file specification }

Function BaseNameOnly(FileName : String) : String;
{ Strip any path and extension information from a file specification }

Function ExtOnly(FileName : String) : String;
{ Return only the extension portion of a filename }

Function IntStr(Int : LongInt; Form : Integer) : String;
{ Convert an Integer variable to a string }

Function SameFile(File1, File2 : String) : Boolean;
{ Call to find out if File1 has a name equivalent to File2. Both filespecs }
{ may contain wildcards. }

{ ************************************************************************** }

Implementation

Function Upper(StrIn : String) : String;
Begin
Inline( { Thanks to Phil Burns for this routine }

$1E/ { PUSH DS ; Save DS}
$C5/$76/$06/ { LDS SI,[BP+6] ; Get source string address}
$C4/$7E/$0A/ { LES DI,[BP+10] ; Get result string address}
$FC/ { CLD ; Forward direction for strings}
$AC/ { LODSB ; Get length of source string}
$AA/ { STOSB ; Copy to result string}
$30/$ED/ { XOR CH,CH}
$88/$C1/ { MOV CL,AL ; Move string length to CL}
$E3/$0E/ { JCXZ Exit ; Skip if null string}
{;}
$AC/ {UpCase1: LODSB ; Get next source character}
$3C/$61/ { CMP AL,'a' ; Check if lower-case letter}
$72/$06/ { JB UpCase2}
$3C/$7A/ { CMP AL,'z'}
$77/$02/ { JA UpCase2}
$2C/$20/ { SUB AL,'a'-'A' ; Convert to uppercase}
{;}
$AA/ {UpCase2: STOSB ; Store in result}
$E2/$F2/ { LOOP UpCase1}
{;}
$1F); {Exit: POP DS ; Restore DS}

end {Upper};

{ -------------------------------------------------------------------------- }

Function PathOnly(FileName : String) : String;
Var
Dir : DirStr;
Name : NameStr;
Ext : ExtStr;
Begin
FSplit(FileName, Dir, Name, Ext);
PathOnly := Dir;
End {PathOnly};

{ --------------------------------------------------------------------------- }

Function NameOnly(FileName : String) : String;
{ Strip any path information from a file specification }
Var
Dir : DirStr;
Name : NameStr;
Ext : ExtStr;
Begin
FSplit(FileName, Dir, Name, Ext);
NameOnly := Name + Ext;
End {NameOnly};

{ --------------------------------------------------------------------------- }

Function BaseNameOnly(FileName : String) : String;
{ Strip any path and extension from a file specification }
Var
Dir : DirStr;
Name : NameStr;
Ext : ExtStr;
Begin
FSplit(FileName, Dir, Name, Ext);
BaseNameOnly := Name;
End {BaseNameOnly};

{ --------------------------------------------------------------------------- }

Function ExtOnly(FileName : String) : String;
{ Strip the path and name from a file specification. Return only the }
{ filename extension. }
Var
Dir : DirStr;
Name : NameStr;
Ext : ExtStr;
Begin
FSplit(FileName, Dir, Name, Ext);
If Pos('.', Ext) <> 0 then
Delete(Ext, 1, 1);
ExtOnly := Ext;
End {ExtOnly};

{ --------------------------------------------------------------------------- }

Function IntStr(Int : LongInt; Form : Integer) : String;
Var
S : String;
Begin
If Form = 0 then
Str(Int, S)
else
Str(Int:Form, S);
IntStr := S;
End {IntStr};

{ --------------------------------------------------------------------------- }

Function SameName(N1, N2 : String) : Boolean;
{
Function to compare filespecs.

Wildcards allowed in either name.
Filenames should be compared seperately from filename extensions by using
seperate calls to this function
e.g. FName1.Ex1
FName2.Ex2
are they the same?
they are if SameName(FName1, FName2) AND SameName(Ex1, Ex2)

Wildcards work the way DOS should've let them work (eg. *XX.DAT doesn't
match just any file...only those with 'XX' as the last two characters of
the name portion and 'DAT' as the extension).

This routine calls itself recursively to resolve wildcard matches.

}
Var
P1, P2 : Integer;
Match : Boolean;
Begin
P1 := 1;
P2 := 1;
Match := TRUE;

If (Length(N1) = 0) and (Length(N2) = 0) then
Match := True
else
If Length(N1) = 0 then
If N2[1] = '*' then
Match := TRUE
else
Match := FALSE
else
If Length(N2) = 0 then
If N1[1] = '*' then
Match := TRUE
else
Match := FALSE;

While (Match = TRUE) and (P1 <= Length(N1)) and (P2 <= Length(N2)) do
If (N1[P1] = '?') or (N2[P2] = '?') then begin
Inc(P1);
Inc(P2);
end {then}
else
If N1[P1] = '*' then begin
Inc(P1);
If P1 <= Length(N1) then begin
While (P2 <= Length(N2)) and Not SameName(Copy(N1,P1,Length(N1)-P1+1), Copy(N2,P2,Length(N2)-P2+1)) do
Inc(P2);
If P2 > Length(N2) then
Match := FALSE
else begin
P1 := Succ(Length(N1));
P2 := Succ(Length(N2));
end {if};
end {then}
else
P2 := Succ(Length(N2));
end {then}
else
If N2[P2] = '*' then begin
Inc(P2);
If P2 <= Length(N2) then begin
While (P1 <= Length(N1)) and Not SameName(Copy(N1,P1,Length(N1)-P1+1), Copy(N2,P2,Length(N2)-P2+1)) do
Inc(P1);
If P1 > Length(N1) then
Match := FALSE
else begin
P1 := Succ(Length(N1));
P2 := Succ(Length(N2));
end {if};
end {then}
else
P1 := Succ(Length(N1));
end {then}
else
If UpCase(N1[P1]) = UpCase(N2[P2]) then begin
Inc(P1);
Inc(P2);
end {then}
else
Match := FALSE;

If P1 > Length(N1) then begin
While (P2 <= Length(N2)) and (N2[P2] = '*') do
Inc(P2);
If P2 <= Length(N2) then
Match := FALSE;
end {if};

If P2 > Length(N2) then begin
While (P1 <= Length(N1)) and (N1[P1] = '*') do
Inc(P1);
If P1 <= Length(N1) then
Match := FALSE;
end {if};

SameName := Match;

End {SameName};

{ ---------------------------------------------------------------------------- }

Function SameFile(File1, File2 : String) : Boolean;
Var
Path1, Path2 : String;
Begin

File1 := FExpand(File1);
File2 := FExpand(File2);
Path1 := PathOnly(File1);
Path2 := PathOnly(File2);

SameFile := SameName(BaseNameOnly(File1), BaseNameOnly(File2)) AND
SameName(ExtOnly(File1), ExtOnly(File2)) AND
(Path1 = Path2);

End {SameFile};

{ ---------------------------------------------------------------------------- }

End {Unit StrProcs}.



  3 Responses to “Category : Pascal Source Code
Archive   : CRUNCH10.ZIP
Filename : STRPROCS.PAS

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/