Contributor: WILLEM DE VRIES
{ Please check below for the WINDOWS version of this code }
{$A+,B-,D+,E+,F-,G+,I+,L+,N+,O-,P-,Q+,R+,S+,T-,V+,X+,Y+}
Unit D4Dos;
{
******************4DOS description functions****************
Written by: W. de Vries, dVELP Services
Target: DOS real-mode
Date: March 1994
Purpose: Reading and modifying the 4DOS file descriptions
************************************************************
Usage: GetDescript(FileName / directoryname): String;
 Returns the description of the filename or directory name.
 Use a full path to specify the exact location of the file.
}
Interface
 Function GetDescript(Name:String):String;
 Function SetDescript(Name, Descript: String): Boolean;
Implementation
Uses DOS;
Function Upper(Str: String): String;
{Replace this function if you've got a faster one}
Var i: Integer;
Begin
 For i := 1 to Length(Str) do
 Str[i] := Upcase(Str[i]);
 Upper := Str;
end;
Function getDescriptFileName(Name: String): String;
{Internal function that gives the complete path of DESCRIPT.ION}
Var D: DirStr;
 N: NameStr;
 E: ExtStr;
 tmp: PathStr;
begin
 If Name='' then
 begin
 getDescriptFileName := '';
 exit;
 end;
 tmp := FExpand(Name);
 FSplit(tmp, D, N, E);
 Tmp:= D;
 getDescriptFileName:= tmp+'DESCRIPT.ION';
end;
Function GetName(Name: String): String;
{Returns only the filename without the path}
Var D: DirStr;
 N: NameStr;
 E: ExtStr;
 tmp: PathStr;
Begin
 If Name='' then
 begin
 getName := '';
 exit;
 end;
 tmp := FExpand(Name);
 FSplit(tmp, D, N, E);
 getName:= N+E;
end;
Function GetDescript(Name:String):String;
{Input: The path/name of a file
output: The 4DOS file description
 or '' if there is no description}
Var
 IOBuf: Array[0..2047] of Char; {2 Kb read-buffer}
 f: text;
 Regel, tmp: String;
 Found : Boolean;
Begin
 Found := False;
 Assign(f,GetDescriptFileName(Name));
 SetTextBuf(F, IOBuf);
 {$I-} Reset(f);{$I+}
 If IOResult  0 then
 begin
 GetDescript := '';
 exit;
 end;
 While (not Found) and (not eof(f)) do
 begin
 ReadLn(f, regel);
 Tmp := Copy(Regel, 1, Pos(' ', regel)-1);
 Found := Upper(Tmp) = Upper(GetName(Name));
 end;
 If Found then
 begin
 GetDescript := Copy(Regel, Pos(' ', Regel)+1, Length(Regel));
 end
 else
 GetDescript := '';
 Close(f);
end;
Function SetDescript(Name, Descript: String): Boolean;
{Input: the path/name of a file, the description of the file. Enter '' for
 the description to remove it.
Output: True if the description has been succesfully set, otherwise
 it is false.}
Type FileInfo=^FileRec;
 FileRec= Record
 FileName: String;
 Str: String;
 Next: FileInfo;
 end;
Var f: Text;
 IOBuf: Array[0..2047] of Char; {2 Kb read-buffer}
 BeginPtr, UsePtr, EndPtr: FileInfo;
 regel, tmp: String;
 FileFound: Boolean;
 Procedure ReadInfo;
 {Read all descriptions in a pointer-array}
 Begin
 {$I-} Reset(f); {$I+}
 FileFound := False;
 BeginPtr := nil;
 UsePtr := nil;
 EndPtr := nil;
 If (IOResult  0) or (eof(f)) then
 begin {The DESCRIPT.ION file does not exist: create a new one}
 {$I-} Rewrite(f);{$I+}
 if IOResult  0 then
 exit;
 BeginPtr := New(FileInfo);{Create a new record}
 BeginPtr^.FileName := Upper(GetName(Name));
 BeginPtr^.Str := Descript;
 BeginPtr^.Next := nil;
 EndPtr := BeginPtr;
 end else
 While not eof(f) do
 begin
 Readln(f, regel);
 UsePtr := New(FileInfo); {just create a new record}
 tmp := Copy(Regel, 1, Pos(' ', regel)-1);
 UsePtr^.FileName := tmp;
 If Upper(tmp)=Upper(GetName(Name)) then
 begin
 FileFound := True;
 If Descript  '' then
 begin
 UsePtr^.FileName := getName(tmp); {File found in list, change it!}
 UsePtr^.Str := Descript;
 UsePtr^.Next := nil;
 end else
 begin
 Dispose(UsePtr); {Description is NIL, remove the new record}
 UsePtr := nil;
 end;
 end else
 begin
 UsePtr^.FileName := GetName(tmp);
 If Regel  '' then
 tmp :=Copy(Regel, Pos(' ', Regel)+1, Length(Regel))
 else
 tmp := '';
 UsePtr^.Str := tmp;
 UsePtr^.Next := nil;
 end;
 If BeginPtr=nil then
 begin
 BeginPtr := UsePtr; {Created a new array}
 EndPtr := BeginPtr; {Point the endpointer to the begin}
 end else
 begin
 EndPtr^.Next := UsePtr; {Stick the new record to the previous one}
 If UsePtr  nil then
 EndPtr := UsePtr; {Point the EndPtr to the last record}
 end;
 end;
 If (not FileFound) and (Descript  '') then
 begin
 UsePtr := New(FileInfo); {Create a new record}
 UsePtr^.FileName := Upper(getName(Name));
 UsePtr^.Str := Descript;
 UsePtr^.Next := nil;
 EndPtr^.Next := UsePtr;
 EndPtr := UsePtr;
 end;
 Close(f); {Close file}
 end;
 Function WriteInfo: Boolean;
 Begin
 SetFAttr(f, Archive); {Unhide the file}
 WriteInfo := True;
 {$I-} Rewrite(f); {$I+}
 If IOResult  0 then
 begin
 WriteInfo := False;
 Exit;
 end;
 If BeginPtr = nil then
 begin
 Close(f); {No descriptions: delete file}
 Erase(f);
 exit;
 end;
 While BeginPtr  nil do
 Begin
 Writeln(f, BeginPtr^.FileName, ' ', BeginPtr^.Str);
 UsePtr := BeginPtr;
 BeginPtr := UsePtr^.Next; {Move the begin-pointer 1 up}
 Dispose(UsePtr); {Delete first record}
 end;
 Close(f);
 SetFAttr(f, Hidden); {Hide the DESCRIPT.ION file}
 end;
Begin
 SetDescript := False;
 If Name='' then
 Exit; {If there's no name specified:
quit}
 Assign(f, GetDescriptFileName(Name)); {Open DESCRIPT.ION}
 SetTextBuf(f, IOBuf); {create a 2Kb buffer}
 ReadInfo; {Read the descriptions}
 SetDescript := WriteInfo; {Write the descriptions}
end;
Begin
end.
{ FOLLOWING IS THE WINDOWS SPECIFIC CODE FOR THIS UNIT !! }
{$A+,B-,D-,F-,G+,I+,K+,L-,N+,P-,Q+,R+,S+,T+,V+,W+,X+,Y-}
Unit W4Dos;
{******************4DOS description functions****************
Written by: W. de Vries, dVELP Services
Target: Windows, DPMI
Date: March 1994
Purpose: Reading and modifying the 4DOS file descriptions
************************************************************}
Interface
 Function GetDescript(Name:PChar):PChar;
 Function SetDescript(Name, Descript: PChar): Boolean;
Implementation
Uses Windos, Strings, WinCrt;
Function getDescriptFileName(Name: PChar): PChar;
{Internal function that gives the complete path of DESCRIPT.ION}
Var D: array[0..fsDirectory] of Char;
 N: Array[0..fsFileName] of Char;
 E: Array[0..fsExtension] of Char;
 tmp: PChar;
begin
 If Name=nil then
 begin
 getDescriptFileName := nil;
 exit;
 end;
 GetMem(tmp, 256);
 FileExpand(tmp, Name);
 FileSplit(tmp, D, N, E);
 StrCopy(Tmp, D);
 StrCat(Tmp, 'DESCRIPT.ION');
 getDescriptFileName:= StrNew(Tmp);
end;
Function GetName(Name: PChar): PChar;
{Returns only the filename without the path}
Var D: Array[0..fsDirectory] of Char;
 N: Array[0..fsFileName] of Char;
 E: Array[0..fsExtension] of Char;
 tmp: PChar;
Begin
 If Name=nil then
 begin
 getName := nil;
 exit;
 end;
 GetMem(tmp, 256);
 FileExpand(tmp, Name);
 FileSplit(tmp, nil, N, E);
 StrCopy(Tmp, N);
 StrCat(tmp, E);
 getName:= StrNew(tmp);
 StrDispose(tmp);
end;
Function GetDescript(Name:PChar):PChar;
{Input: The path/name of a file
output: The 4DOS file description
 or NIL if there is no description}
Var
 IOBuf: Array[0..2047] of Char; {2 Kb read-buffer}
 f: text;
 Regel: String;
 tmp: PChar;
 Found : Boolean;
Begin
 Found := False;
 GetMem(tmp, 256);
 Assign(f,GetDescriptFileName(Name));
 SetTextBuf(F, IOBuf);
 {$I-} Reset(f);{$I+}
 If IOResult  0 then
 begin
 GetDescript := nil;
 StrDispose(Tmp);
 exit;
 end;
 While (not Found) and (not eof(f)) do
 begin
 ReadLn(f, regel);
 StrPCopy(Tmp, Copy(Regel, 1, Pos(' ', regel)-1));
 Found := StrIComp(tmp,GetName(Name))=0;
 end;
 If Found then
 begin
 GetDescript := StrNew(StrPCopy(tmp, Copy(Regel, Pos(' ', Regel)+1, Length(Regel))));
 end
 else
 GetDescript := nil;
 Close(f);
 StrDispose(tmp);
end;
Function SetDescript(Name, Descript: PChar): Boolean;
{Input: the path/name of a file, the description of the file. Enter NIL for
 the description to remove it.
Output: True if the description has been succesfully set, otherwise
 it is false.}
Type FileInfo=^FileRec;
 FileRec= Record
 FileName:PChar;
 Str: PChar;
 Next: FileInfo;
 end;
Var f: Text;
 IOBuf: Array[0..2047] of Char; {2 Kb read-buffer}
 BeginPtr, UsePtr, EndPtr: FileInfo;
 regel: String;
 tmp: Array[0..255] of Char;
 FileFound: Boolean;
 Procedure ReadInfo;
 {Read all descriptions in a pointer-array}
 Begin
 If Descript  nil then
 If StrIComp(Descript, '') = 0 then
 Descript := nil;
 FileFound := False;
 BeginPtr := nil;
 UsePtr := nil;
 EndPtr := nil;
 {$I-} Reset(f); {$I+}
 If (IOResult  0) or (eof(f)) then
 begin {The DESCRIPT.ION file does not exist: create a new one}
 {$I-} Rewrite(f); {$I+}
 If IOResult  0 then
 Exit;
 BeginPtr := New(FileInfo);{Create a new record}
 BeginPtr^.FileName := StrNew(StrUpper(GetName(Name)));
 BeginPtr^.Str := StrNew(Descript);
 BeginPtr^.Next := nil;
 EndPtr := BeginPtr;
 FileFound := True;
 end else
 While not eof(f) do
 begin
 Readln(f, regel);
 UsePtr := New(FileInfo); {just create a new record}
 StrPCopy(tmp, Copy(Regel, 1, Pos(' ', regel)-1));
 UsePtr^.FileName := StrNew(GetName(tmp));
 If StrIComp(tmp, GetName(Name))=0 then
 begin {File found in list, change it!}
 FileFound := True;
 If Descript  nil then
 begin
 UsePtr^.Str := StrNew(Descript);
 UsePtr^.Next := nil;
 end else
 begin
 Dispose(UsePtr); {Description is NIL, remove the new record}
 UsePtr := nil;
 end;
 end else
 begin
 If Regel  '' then
 StrPCopy(tmp, Copy(Regel, Pos(' ', Regel)+1, Length(Regel)))
 else
 tmp[0] := #0;
 UsePtr^.Str := StrNew(tmp);
 UsePtr^.Next := nil;
 end;
 If BeginPtr=nil then
 begin
 BeginPtr := UsePtr; {Created a new array}
 EndPtr := BeginPtr; {Point the endpointer to the begin}
 end else
 begin
 EndPtr^.Next := UsePtr; {Stick the new record to the previous}
 If UsePtr  nil then
 EndPtr := UsePtr; {Point the EndPtr to the last record}
 end;
 end;
 If (not FileFound) and (Descript  nil) then
 begin
 UsePtr := New(FileInfo); {Create a new record}
 UsePtr^.FileName := StrNew(StrUpper(getName(Name)));
 UsePtr^.Str := StrNew(Descript);
 UsePtr^.Next := nil;
 EndPtr^.Next := UsePtr;
 EndPtr := UsePtr;
 end;
 Close(f); {Close file}
 end;
 Function WriteInfo: Boolean;
 Begin
 SetFAttr(f, faArchive); {Unhide the file}
 WriteInfo := True;
 {$I-} Rewrite(f); {$I+}
 If IOResult  0 then
 begin
 WriteInfo := False;
 Exit;
 end;
 If BeginPtr=nil then
 begin
 Close(f); {No descriptions: delete file}
 Erase(f);
 exit;
 end;
 While BeginPtr  nil do
 Begin
 Writeln(f, BeginPtr^.FileName, ' ', BeginPtr^.Str);
 UsePtr := BeginPtr;
 BeginPtr := UsePtr^.Next; {Move the begin-pointer 1 up}
 Dispose(UsePtr); {Delete first record}
 end;
 Close(f);
 SetFAttr(f, faHidden); {Hide the DESCRIPT.ION file}
 end;
Begin
 SetDescript := False;
 If (Name=nil) or (StrIComp(Name, '')=0) then
 Exit; {If there's no name specified: quit}
 Assign(f, GetDescriptFileName(Name)); {Open DESCRIPT.ION}
 SetTextBuf(f, IOBuf); {create a 2Kb buffer}
 ReadInfo; {Read the descriptions}
 SetDescript := WriteInfo; {Write the descriptions}
end;
Begin
end.


AltStyle によって変換されたページ (->オリジナル) /