home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
sp15demo.zip
/
libsrc.zip
/
LIBSRC
/
DOS.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-02-25
|
40KB
|
1,570 lines
UNIT Dos;
{**************************************************************************
* General Unit for Speed-Pascal/2 *
* *
* *
* Copyright (C) 1995..96 SpeedSoft *
* *
* *
**************************************************************************}
{$R-,S-}
INTERFACE
{$IFDEF OS2}
USES BseDos,Os2Def;
{$ENDIF}
{$IFDEF Win95}
USES WinNT,WinBase;
{$ENDIF}
CONST
{ Flags bit masks }
FCarry = 1;
FParity = 4;
FAuxiliary = 16;
FZero = 64;
FSign = 128;
FOverflow = 2048;
{ File attribute constants }
{$IFDEF OS2}
ReadOnly = FILE_READONLY;
Hidden = FILE_HIDDEN;
SysFile = FILE_SYSTEM;
VolumeID = 0; //not defined ???
Directory = FILE_DIRECTORY;
Archive = FILE_ARCHIVED;
AnyFile = FILE_READONLY|FILE_HIDDEN|FILE_SYSTEM|FILE_DIRECTORY|FILE_ARCHIVED;
{$ENDIF}
{$IFDEF Win95}
ReadOnly = FILE_ATTRIBUTE_READONLY;
Hidden = FILE_ATTRIBUTE_HIDDEN;
SysFile = FILE_ATTRIBUTE_SYSTEM;
VolumeID = 0; //not defined ???
Directory = FILE_ATTRIBUTE_DIRECTORY;
Archive = FILE_ATTRIBUTE_ARCHIVE;
AnyFile = FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|
FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_DIRECTORY|
FILE_ATTRIBUTE_ARCHIVE;
{$ENDIF}
{Compare File times result codes}
F_EQUAL =0;
F_FIRST_GREATER =1;
F_SECOND_GREATER =2;
F_ERROR =255;
type
CmdStr = STRING; { Command line string }
PathStr = STRING; { File pathname string }
DirStr = STRING; { Drive and directory string }
NameStr = STRING; { File name string }
ExtStr = STRING; { File extension string }
Registers =
record
case integer of
0: (EAX,EBX,ECX,EDX,EBP,ESI,EDI,DS_ES,EFlags:LongWord);
1: (AX,X_AX,BX,X_BX,CX,X_CX,DX,X_DX,BP,X_BP,SI,X_SI,
DI,X_DI,DS,ES,Flags,X_FLAGS: Word);
2: (AL,AH,X_AL,X_AH,BL,BH,X_BL,X_BH,CL,CH,X_CL,X_CH,
DL,DH,X_DL,X_DH: Byte);
end;
{ Search record used by FindFirst and FindNext }
TYPE
SearchRec = record
Fill: array[1..21] of Byte;
Attr: Byte;
Time: Longint;
Size: Longint;
Name: string;
{private}
HDir:LONGWORD;
{$IFDEF OS2}
SearchRecIntern:FILEFINDBUF3;
{$ENDIF}
{$IFDEF Win95}
SearchRecIntern:WIN32_FIND_DATA;
InternalAttr:LONGWORD;
{$ENDIF}
end;
TSearchRec=SearchRec;
{$IFDEF OS2}
ExecResultCode=RESULTCODES;
{$ENDIF}
FileRec = RECORD
Handle : LongWord; {FileHandle }
RecSize : LongWord; {Record size }
Name : STRING; {(Long) file name }
EAS : POINTER; {extended attributes }
Mode : LONGWORD; {Current file mode }
Reserved : POINTER; {for private extensions}
Block : LONGWORD; {current block in file }
LBlock : LONGWORD; {Last block in file }
Offset : LONGWORD; {Current offset in Block}
LOffset : LONGWORD; {Last Offset in LBlock }
Changed : LONGBOOL; {TRUE if Block has changed}
Buffer : POINTER; {I/O Buffer }
MaxCacheMem : LONGWORD; {Size of I/O Buffer }
Flags : LONGWORD; {Assign flags $6666 }
Reserved1 : LONGWORD; {dont use }
{312 byte til here}
END;
TextRec=FileRec;
VAR DosError:LongInt; {DOS unit error status}
CONST
ExecViaSession:BOOLEAN=TRUE; {Set to TRUE if you want to
use Exec on another session.
Then you cannot get the result
code but you can wait via
DosExitCode for the session to
terminate}
AsynchEXEC:BOOLEAN=TRUE; {Standard: asynchronous EXEC}
LastExecResult:LONGWORD=0;
{Time/Date functions}
FUNCTION GetDate(VAR Year,Month,Day,DayOfWeek: Word):LONGINT;
FUNCTION SetDate(Year,Month,Day: Word):LONGINT;
FUNCTION GetTime(VAR Hour,Minute,Second,Sec100: Word):LONGINT;
FUNCTION SetTime(Hour,Minute,Second,Sec100: Word):LONGINT;
FUNCTION GetFAttr(VAR F:FILE; VAR Attr: LongWord):LONGINT;
FUNCTION SetFAttr(VAR F:FILE; Attr: LongWord):LONGINT;
FUNCTION GetFTime(VAR F:FILE;VAR Time:LONGINT):LONGINT;
FUNCTION SetFTime(VAR F:FILE;Time:LONGINT):LONGINT;
FUNCTION GetFTime2(VAR F:FILE; VAR year,month,day,hours,minutes,secs:Word):LONGINT;
FUNCTION SetFTime2(VAR F:FILE; year,month,day,hours,minutes,secs:Word):LONGINT;
PROCEDURE PackTime(VAR T: DateTime; VAR Time: Longint);
PROCEDURE UnpackTime(Time: Longint; VAR DT: DateTime);
{File find functions}
FUNCTION FindFirst(Path: PathStr; Attr: LongWord; var F: SearchRec):LONGINT;
FUNCTION FindNext(var F: SearchRec):LONGINT;
PROCEDURE FindClose(var F: SearchRec);
FUNCTION FSearch(Path: PathStr; DirList: String): PathStr;
{Common functions}
FUNCTION DosVersion:LongWord;
FUNCTION GetVerify(var Verify: Boolean):LONGINT;
FUNCTION SetVerify(Verify: Boolean):LONGINT;
FUNCTION GetEnv(CONST env:STRING):STRING;
FUNCTION EnvStr(Index:LONGINT):STRING;
FUNCTION EnvCount:LONGINT;
PROCEDURE SwapVectors; {ignored}
{Disk functions}
FUNCTION DiskFree(Drive: Byte): LongWord;
FUNCTION DiskSize(Drive: Byte): LongWord;
FUNCTION FExpand(Path: PathStr): PathStr;
FUNCTION FSplit(CONST Path: PathStr;VAR Dir: DirStr;
VAR Name: NameStr;VAR Ext: ExtStr):LONGINT;
FUNCTION CompareFileTimes(First,Second:STRING):BYTE;
{Process functions}
FUNCTION Exec(CONST Path: PathStr; CmdLine: STRING):LONGWORD;
FUNCTION DosExitCode(SessID:LONGWORD):LONGWORD;
FUNCTION ProcessActive(pid:LONGWORD):BOOLEAN;
FUNCTION KillProcess(pid:LONGWORD):LONGINT;
{Thread functions}
FUNCTION StartThread(ThreadAddr:POINTER;StackSize:LONGWORD;
Params:POINTER;VAR Tid:LONGWORD):LONGINT;
FUNCTION SuspendThread(Tid:LONGWORD):LONGINT;
FUNCTION ResumeThread(Tid:LONGWORD):LONGINT;
FUNCTION KillThread(Tid:LONGWORD):LONGINT;
PROCEDURE Flush (VAR F:FILE);
PROCEDURE Delay(ms:LONGWORD);
IMPLEMENTATION
VAR
TempCmdLine:STRING;
PROCEDURE Delay(ms:LONGWORD);
BEGIN
{$IFDEF OS2}
DosSleep(ms);
{$ENDIF}
{$IFDEF Win95}
Sleep(ms);
{$ENDIF}
END;
PROCEDURE SwapVectors;
BEGIN
{This function is ignored}
DosError:=0;
END;
FUNCTION FExpand(Path:PathStr):PathStr;
VAR i,p,t:BYTE;
s:STRING;
LABEL l,l2;
BEGIN
t := pos(';',Path);
IF t <> 0 THEN
BEGIN
s := Path;
delete(s,1,t);
Path[0] := chr(t);
Path := Path + FExpand(s);
END;
GetDir(0,s);
IF length(s)=3 THEN IF s[2]=':' THEN IF s[3] IN ['\','/'] THEN dec(s[0]);
IF pos('\',Path) = 1 THEN Path := copy(s,1,2) + Path;
IF (Length(Path) >= 2) AND (Path[2] = ':') THEN
BEGIN
s := copy(Path,1,2);
delete(Path,1,2);
END;
IF not (Path[1] IN ['\','/']) THEN Path := '\'+ Path;
REPEAT
IF ((pos('\..',Path) = 1)OR(pos('/..',Path) = 1)) THEN
BEGIN
IF (Length(Path) >= 4) AND (not (Path[4] IN ['\','/'])) THEN goto l2;
delete(Path,1,3);
FOR i := Length(s) DOWNTO 3 DO
BEGIN
IF s[i] = ':' THEN break;
dec(s[0]);
IF s[i] IN ['\','/'] THEN break;
END;
END
ELSE
IF ((pos('\.',Path) = 1)OR(pos('/.',Path) =1)) THEN
BEGIN
IF (Length(Path) >= 3) AND (not (Path[3] IN ['\','/'])) THEN goto l2;
delete(Path,1,2);
END
ELSE
IF ((pos('\',Path) = 1)OR(pos('/',Path) = 1)) THEN
BEGIN
l2:
delete(Path,1,1);
s := s + '\';
END
ELSE
BEGIN
l:
p := pos('\',Path);
IF p=0 THEN p := pos('/',Path);
IF p > 0 THEN
BEGIN
s := s + copy(Path,1,p-1);
delete(Path,1,p-1);
END
ELSE
BEGIN
s := s + Path;
Path := '';
END;
END;
UNTIL Path = '';
IF Length(s) = 2 THEN s := s +'\';
Result := s;
END;
FUNCTION KillThread(Tid:LONGWORD):LONGINT;
BEGIN
{$IFDEF OS2}
DosError:=DosKillThread(Tid);
{$ENDIF}
{$IFDEF Win95}
DosError:=BYTE(CloseHandle(Tid)=FALSE);
{$ENDIF}
result:=DosError;
END;
FUNCTION SuspendThread(Tid:LONGWORD):LONGINT;
BEGIN
{$IFDEF OS2}
DosError:=DosSuspendThread(Tid);
{$ENDIF}
{$IFDEF Win95}
DosError:=BYTE(WinBase.SuspendThread(Tid)=$FFFFFFFF);
{$ENDIF}
result:=DosError;
END;
FUNCTION ResumeThread(Tid:LONGWORD):LONGINT;
BEGIN
{$IFDEF OS2}
DosError:=DosResumeThread(Tid);
{$ENDIF}
{$IFDEF Win95}
DosError:=BYTE(WinBase.ResumeThread(Tid)=$FFFFFFFF);
{$ENDIF}
result:=DosError;
END;
FUNCTION StartThread(ThreadAddr:POINTER;StackSize:LONGWORD;
Params:POINTER;VAR Tid:LONGWORD):LONGINT;
VAR id:LONGWORD;
BEGIN
{$IFDEF OS2}
DosError:=DosCreateThread(Tid,ThreadAddr,Params,
STACK_SPARSE,StackSize);
{$ENDIF}
{$IFDEF Win95}
Tid:=WinBase.CreateThread(NIL,StackSize,ThreadAddr,Params,0,id);
IF Tid=0 THEN DosError:=1
ELSE DosError:=0;
{$ENDIF}
result:=DosError;
END;
FUNCTION KillProcess(pid:LONGWORD):LONGINT;
BEGIN
{$IFDEF OS2}
DosError:=DosKillProcess(0,pid);
{$ENDIF}
{$IFDEF Win95}
DosError:=BYTE(TerminateProcess(pid,0)=FALSE);
{$ENDIF}
result:=DosError;
END;
FUNCTION ProcessActive(pid:LONGWORD):BOOLEAN;
VAR r,rpid:LONGWORD;
{$IFDEF OS2}
res:Execresultcode;
{$ENDIF}
BEGIN
{$IFDEF OS2}
r:=DosWaitChild(DCWA_PROCESS,DCWW_NOWAIT,res,rpid,pid);
DosError:=r;
IF r=129 {child not complete} THEN ProcessActive:=TRUE
ELSE ProcessActive:=FALSE; {Child complete or illegal pid}
{$ENDIF}
{$IFDEF Win95}
DosError:=1; //not supported
{$ENDIF}
END;
FUNCTION FSplit(CONST Path: PathStr;
VAR Dir:DirStr;VAR Name:NameStr;VAR Ext:ExtStr):LONGINT;
Var i : Integer ;
Trv : Boolean ;
Begin
Trv:=False ;
For i:=Length(Path) DownTo 1 Do
If (Path[i] IN ['\','/']) Or (Path[i]=':') Then
Begin
Trv:=True ;
Dir:=Copy(Path, 1, i) ; { or i-1 if Path[i]='\' ? }
IF Dir[length(Dir)]='/' THEN Dir[length(Dir)]:='\';
Name:=Copy(Path, i+1, 255) ;
Break ;
End ;
If Not Trv Then
Begin
Dir:='' ;
Name:=Path ;
End ;
Trv:=False ;
For i:=Length(Name) DownTo 1 Do
If Name[i]='.' Then
Begin
Trv:=True ;
Ext:=Copy(Name, i, 255) ;
Name:=Copy(Name, 1, i-1) ;
Break ;
End ;
If Not Trv Then Ext:='' ;
result:=0;
End;
FUNCTION FSearch(Path: PathStr; DirList: String): PathStr;
var
r,c,c1:CSTRING;
p:PChar;
BEGIN
c:=DirList;
c1:=Path;
{$IFDEF OS2}
DosError:=DosSearchPath(0,c,c1,r,255);
{$ENDIF}
{$IFDEF Win95}
DosError:=BYTE(SearchPath(c,c1,NIL,255,r,p)=0);
{$ENDIF}
IF DosError<>0 THEN r:='';
FSearch:=r;
END;
FUNCTION PackTimeIntern(hour,minute,twosec:Word):Word;
VAR time:Word;
BEGIN
ASM
MOV BL,$Hour
SHL BL,3 //multiply with 8
MOV AL,$minute
SHR AL,3 //divide by 8
ADD AL,BL
SHL AX,8 //Shift
MOV $time,AX
MOV BL,$minute
AND BL,7
SHL BL,5 //multiply with 2 and shift
ADD BL,$TwoSec
MOV $time,BL
END;
DosError:=0;
PackTimeIntern:=Time;
END;
FUNCTION PackdateIntern(year,month,day:Word):Word;
VAR Date:Word;
BEGIN
ASM
MOV AL,$month
MOV BL,0
CMP AL,7
JNA !mo1
MOV BL,1
SUB AL,8
!mo1:
MOV CX,$year
SUB CX,1980
SHL CX,1 //multiply with 2
MOVZX BX,BL
ADD CX,BX
SHL CX,8 //Shift
MOV $Date,CX
SHL AL,5 //multiply month with 2 and shift
ADD AL,$Day
MOV $Date,AL
END;
DosError:=0;
PackDateIntern:=Date;
END;
PROCEDURE PackTime(var T: DateTime; var Time: Longint);
VAR year,month,day,hour,min,sec:WORD;
BEGIN
year:=T.year;
month:=T.month;
day:=T.day;
hour:=T.hour;
min:=T.min;
sec:=T.sec;
ASM
MOV AX,$year
SUB AX,1980
MOV CL,9
SHL AX,CL
XCHG AX,DX
MOV AX,$month
MOV CL,5
SHL AX,CL
ADD DX,AX
MOV AX,$day
ADD DX,AX
MOV AX,$hour
MOV CL,11
SHL AX,CL
XCHG AX,BX
MOV AX,$min
MOV CL,5
SHL AX,CL
ADD BX,AX
MOV AX,$sec
SHR AX,1
ADD AX,BX
MOV EDI,$Time
CLD
STOSW
XCHG AX,DX
STOSW
END;
END;
PROCEDURE UnPackTimeIntern(pack:Word;var hour,minute,twosec:Word);
VAR h,min,sec:WORD;
BEGIN
ASM
MOV DX,$pack
MOV AL,DH //Hour/Minute
AND AL,248 //Mask Hour
SHR AL,3 //divide by 8
MOVZX AX,AL
MOV $h,AX
MOV AL,DH //Hour/Minute
AND AL,7 //Mask Minute
SHL AL,3 //multiply with 8
MOV BL,AL
MOV AL,DL //Minute/sec
AND AL,224 //Mask minute
SHR AL,5 //divide by 2 and shift
ADD AL,BL
MOVZX AX,AL
MOV $min,AX
MOV AL,DL //Minute/sec
AND AL,31 //Mask twoseconds
MOVZX AX,AL
MOV $sec,AX
END;
DosError:=0;
Hour:=h;
minute:=min;
twosec:=sec;
END;
PROCEDURE UnPackDateIntern(pack:Word;var year,month,day:Word);
VAR y,m,dy:Word;
BEGIN
ASM
MOV DX,$pack
MOV AL,DH //Year/Month
AND AL,254 //Clear Bit 1
SHR AL,1 //Divide by 2
MOVZX AX,AL
ADD AX,1980
MOV $y,AX //Year
MOV BL,0
MOV AL,DH //Year/Month
AND AL,1 //Mask HSB month
CMP AL,1
JNE !ml7
MOV BL,8
!ml7:
MOV AL,DL //month/Day
AND AL,224 //mask month (upper 3 bits)
SHR AL,5 //divide by 2 and shift
ADD AL,BL
MOVZX AX,AL
MOV $m,AX //Month
MOV AL,DL //Month/day
AND AL,31 //Mask day
MOVZX AX,AL
MOV $dy,AX //day
END;
DosError:=0;
year:=y;
month:=m;
day:=dy;
END;
PROCEDURE UnpackTime(Time: Longint; var DT: DateTime);
VAR
y,m,dy,h,mi,s:WORD;
BEGIN
ASM
MOV AX,$Time+2
MOV CL,9
SHR AX,CL
ADD AX,1980
MOV $y,AX
MOV AX,$Time+2
MOV CL,5
SHR AX,CL
AND AX,15
MOV $m,AX
MOV AX,$Time+2
AND AX,31
MOV $dy,AX
MOV AX,$Time
MOV CL,11
SHR AX,CL
MOV $h,AX
MOV AX,$Time
MOV CL,5
SHR AX,CL
AND AX,63
MOV $mi,AX
MOV AX,$Time
AND AX,31
SHL AX,1
MOV $s,AX
END;
DT.year:=y;
DT.month:=m;
DT.day:=dy;
DT.hour:=h;
DT.min:=mi;
DT.sec:=s;
DT.hundredths:=0;
END;
FUNCTION FindFirst(Path: PathStr; Attr: LongWord; var F: SearchRec):LONGINT;
VAR
count,size,tt:LONGWORD;
t:BYTE;
c:CSTRING;
BEGIN
c:=Path;
DosError:=0;
{$IFDEF OS2}
F.HDir:=-1; {HDIR_CREATE}
count:=1;
DosError:=DosFindFirst(c,F.Hdir,Attr,F.SearchRecIntern,
sizeof(FILEFINDBUF3),count,FIL_STANDARD);
IF ((DosError<>0)or(Count=0)) THEN
BEGIN
IF DosError=0 THEN DosError:=18;
FindClose(F);
result:=DosError;
exit;
END;
tt:=F.SearchRecIntern.fdateLastWrite;
f.Time:=(tt SHL 16)+F.SearchRecIntern.ftimeLastWrite;
f.Size:=F.SearchRecIntern.cbFile;
f.Attr:=F.SearchRecIntern.AttrFile;
f.Name:=F.SearchRecIntern.achName;
{$ENDIF}
{$IFDEF Win95}
F.InternalAttr:=Attr;
F.HDir:=FindFirstFile(c,F.SearchRecIntern);
IF F.HDir=INVALID_HANDLE_VALUE THEN
BEGIN
DosError:=18;
result:=DosError;
exit;
END;
WHILE F.SearchRecIntern.dwFileAttributes AND F.InternalAttr<>F.InternalAttr DO
BEGIN
IF FindNextFile(F.HDir,F.SearchRecIntern)=FALSE THEN
BEGIN
WinBase.FindClose(F.HDir);
DosError:=18;
result:=DosError;
exit;
END;
END;
f.Time:=F.SearchRecIntern.ftLastWriteTime.dwLowDateTime;
f.Size:=F.SearchRecIntern.nFileSizeLow;
f.Attr:=F.SearchRecIntern.dwFileAttributes;
f.Name:=F.SearchRecIntern.cFileName;
{$ENDIF}
result:=DosError;
END;
FUNCTION FindNext(var F: SearchRec):LONGINT;
VAR
Count,size,tt:LONGWORD;
t:BYTE;
BEGIN
DosError:=0;
{$IFDEF OS2}
Count:=1;
DosError:=DosFindNext(F.Hdir,F.SearchRecIntern,
sizeof(FILEFINDBUF3),count);
IF ((DosError<>0)or(Count=0)) THEN
BEGIN
IF DosError=0 THEN DosError:=18;
FindClose(F);
result:=DosError;
exit;
END;
tt:=F.SearchRecIntern.fdateLastWrite;
f.Time:=(tt SHL 16)+F.SearchRecIntern.ftimeLastWrite;
f.Size:=F.SearchRecIntern.cbFile;
f.Attr:=F.SearchRecIntern.AttrFile;
f.Name:=F.SearchRecIntern.achName;
{$ENDIF}
{$IFDEF Win95}
IF FindNextFile(F.HDir,F.SearchRecIntern)=FALSE THEN
BEGIN
WinBase.FindClose(F.HDir);
DosError:=18;
result:=DosError;
exit;
END;
WHILE F.SearchRecIntern.dwFileAttributes AND F.InternalAttr<>F.InternalAttr DO
BEGIN
IF FindNextFile(F.HDir,F.SearchRecIntern)=FALSE THEN
BEGIN
WinBase.FindClose(F.HDir);
DosError:=18;
result:=DosError;
exit;
END;
END;
f.Time:=F.SearchRecIntern.ftLastWriteTime.dwLowDateTime;
f.Size:=F.SearchRecIntern.nFileSizeLow;
f.Attr:=F.SearchRecIntern.dwFileAttributes;
f.Name:=F.SearchRecIntern.cFileName;
{$ENDIF}
result:=DosError;
END;
PROCEDURE FindClose(var F: SearchRec);
BEGIN
{$IFDEF OS2}
DosFindClose(F.HDir);
{$ENDIF}
{$IFDEF Win95}
WinBase.FindClose(F.HDir);
{$ENDIF}
F.HDir:=0;
END;
FUNCTION DosExitCode(SessId:LONGWORD):LONGWORD;
VAR
rc:LONGWORD;
{$IFDEF OS2}
Status:STATUSDATA;
return:ExecResultCode;
{$ENDIF}
BEGIN
{$IFDEF OS2}
IF ExecViaSession THEN
BEGIN
Status.length:=6;
Status.SelectInd:=0;
Status.BondInd:=0;
rc:=DosSelectSession(SessID);
While rc<>371 DO
BEGIN
rc:=DosSetSession(SessID,Status);
END;
DosExitCode:=0;
END
ELSE
BEGIN
IF LastExecResult=0 THEN
BEGIN
DosWaitChild(DCWA_PROCESS,DCWW_WAIT,return,SessId,SessId);
LastExecResult:=return.CodeResult;
DosExitCode:=return.CodeResult;
END
ELSE
BEGIN
DosExitCode:=LastExecResult;
END;
END;
{$ENDIF}
{$IFDEF Win95}
GetExitCodeProcess(SessId,result);
{$ENDIF}
END;
FUNCTION Exec(CONST Path: PathStr; CmdLine: STRING):LONGWORD;
VAR
{$IFDEF OS2}
aStartData:STARTDATA;
ObjectBuffer:STRING;
SessID:LONGWORD;
SessPID:PID;
ExecMode:BYTE;
result:ExecResultCode;
{$ENDIF}
{$IFDEF Win95}
aStartData:StartupInfo;
aProcessInfo:PROCESS_INFORMATION;
{$ENDIF}
c,c1:CSTRING;
BEGIN
c:=Path;
c1:=CmdLine;
{$IFDEF OS2}
IF ExecViaSession THEN
BEGIN
aStartData.Length:=sizeof(STARTDATA);
aStartData.Related:=SSF_RELATED_CHILD;
aStartData.FgBg:=SSF_FGBG_BACK;
aStartData.TraceOpt:=SSF_TRACEOPT_NONE;
aStartData.PgmTitle:=@c;
aStartData.PgmName:=@c;
aStartData.PgmInputs:=@c1;
aStartData.TermQ:=NIL;
aStartData.Environment:=NIL;
aStartData.InheritOpt:=SSF_INHERTOPT_SHELL;
aStartData.SessionType:=SSF_TYPE_DEFAULT;
aStartData.IconFile:=NIL;
aStartData.PgmHandle:=0;
aStartData.PgmControl:=SSF_CONTROL_VISIBLE;
aStartData.InitXPos:=0;
aStartData.InitYPos:=0;
aStartData.InitXSize:=0;
aStartData.InitYSize:=0;
aStartData.Reserved:=0;
aStartData.ObjectBuffer:=@ObjectBuffer;
aStartData.ObjectBuffLen:=256;
DosError:=DosStartSession(aStartData,SessId,SessPid);
DosSelectSession(SessID);
Exec:=SessID;
IF not AsynchExec THEN LastExecResult:=DosExitCode(SessID);
END
ELSE
BEGIN
LastExecResult:=0;
IF AsynchEXEC THEN DosExecPgm(@ObjectBuffer,256,2,c1,
NIL,result,c)
ELSE
BEGIN
c1:=#0+c1;
DosExecPgm(@ObjectBuffer,256,0,c1,
NIL,result,c);
LastExecresult:=result.CodeResult;
END;
END;
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
FillChar(aStartData,sizeof(aStartData),0);
aStartData.cb:=sizeof(aStartData);
IF not CreateProcess(c,c1,NIL,NIL,FALSE,CREATE_NEW_CONSOLE OR
NORMAL_PRIORITY_CLASS,NIL,NIL,
aStartData,aProcessInfo) THEN
BEGIN
DosError:=1;
exit;
END;
Exec:=aProcessInfo.hProcess;
{$ENDIF}
END;
FUNCTION GetFAttr(VAR F:FILE; var Attr: LongWord):LONGINT;
VAR
{$IFDEF OS2}
s:FILESTATUS3;
size:LONGWORD;
savemode:ULONG;
{$ENDIF}
{$IFDEF Win95}
Name:CSTRING;
{$ENDIF}
ff:^FileRec;
b:BOOLEAN;
BEGIN
b:=RaiseIoError;
ff:=@f;
DosError:=0;
{$IFDEF OS2}
savemode:=FileMode;
filemode:=fmInput;
{$i-}
reset(f);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
DosError:=ioresult;
result:=DosError;
exit;
END;
size:=sizeof(FILESTATUS3);
DosError:=DosQueryFileInfo(ff^.Handle,FIL_STANDARD,s,size);
IF DosError=0 THEN
BEGIN
Attr:=s.attrFile;
END
ELSE Attr:=0; {invalid}
{$i-}
close(f);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
DosError:=ioresult;
result:=DosError;
exit;
END;
filemode:=SaveMode;
{$ENDIF}
{$IFDEF Win95}
name:=ff^.Name;
Attr:=GetFileAttributes(Name);
IF Attr=$ffffffff THEN DosError:=GetLastError
ELSE DosError:=0;
{$ENDIF}
RaiseIOError:=b;
result:=DosError;
END;
FUNCTION SetFAttr(VAR F:FILE; Attr: LongWord):LONGINT;
VAR
{$IFDEF OS2}
s:FILESTATUS3;
size:LONGWORD;
savemode:ULONG;
{$ENDIF}
{$IFDEF Win95}
Name:CSTRING;
{$ENDIF}
ff:^FileRec;
b:BOOLEAN;
BEGIN
b:=RaiseIOError;
ff:=@f;
DosError:=0;
{$IFDEF OS2}
savemode:=FileMode;
filemode:=fmInOut;
{$i-}
reset(f);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
DosError:=ioresult;
result:=DosError;
exit;
END;
size:=sizeof(FILESTATUS3);
DosQueryFileInfo(ff^.Handle,FIL_STANDARD,s,size);
IF DosError=0 THEN
BEGIN
s.attrFile:=Attr;
DosError:=DosSetFileInfo(ff^.Handle,FIL_STANDARD,s,size);
END;
{$i-}
close(f);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
DosError:=ioresult;
result:=DosError;
exit;
END;
filemode:=SaveMode;
{$ENDIF}
{$IFDEF Win95}
Name:=ff^.Name;
IF not SetFileAttributes(Name,Attr) THEN DosError:=GetLastError
ELSE DosError:=0;
{$ENDIF}
RaiseIOError:=b;
result:=DosError;
END;
FUNCTION GetFTime2(VAR F:FILE; VAR year,month,day,Hours,Minutes,Secs:WORD):LONGINT;
VAR
{$IFDEF OS2}
s:FILESTATUS3;
size:LONGWORD;
{$ENDIF}
{$IFDEF Win95}
LastAccess,Creation,LastWrite:FILETIME;
{$ENDIF}
y,m,d,h,min,sec:Word;
date,time:WORD;
ff:^FileRec;
BEGIN
ff:=@f;
DosError:=0;
{$IFDEF OS2}
size:=sizeof(FILESTATUS3);
DosError:=DosQueryFileInfo(ff^.Handle,1,s,size);
IF DosError=0 THEN
BEGIN
date:=s.fdateLastWrite;
time:=s.ftimelastwrite;
UnpackDateIntern(Date,year,month,day);
UnpackTimeIntern(Time,hours,minutes,Secs);
Secs:=Secs*2;
END
ELSE
BEGIN
day:=0;
month:=0;
year:=0;
Hours:=0;
Minutes:=0;
Secs:=0;
END;
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
IF not GetFileTime(ff^.Handle,Creation,LastAccess,LastWrite) THEN
BEGIN
day:=0;
month:=0;
year:=0;
Hours:=0;
Minutes:=0;
Secs:=0;
DosError:=GetLastError;
exit;
END;
FileTimeToDosDateTime(Creation,date,time);
UnpackDateIntern(Date,year,month,day);
UnpackTimeIntern(Time,hours,minutes,Secs);
Secs:=Secs*2;
{$ENDIF}
result:=DosError;
END;
FUNCTION SetFTime2(VAR F:FILE; year,month,day,Hours,Minutes,Secs:Word):LONGINT;
VAR
{$IFDEF OS2}
s:FILESTATUS3;
size:LONGWORD;
time,date:Word;
TwoSecs:WORD;
{$ENDIF}
{$IFDEF Win95}
LastAccess,Creation,LastWrite:FILETIME;
time,date:Word;
TwoSecs:WORD;
dt:DateTime;
{$ENDIF}
ff:^FileRec;
label l;
BEGIN
ff:=@f;
DosError:=0;
{$IFDEF OS2}
TwoSecs:=Secs DIV 2;
IF ((Month>12)or(Month=0)) THEN
BEGIN
l:
DosError:=1;
result:=DosError;
exit;
END;
IF ((Day>32)or(day=0)) THEN goto l;
IF Hours>24 THEN goto l;
IF Minutes>60 THEN goto l;
IF TwoSecs>30 THEN goto l;
size:=sizeof(FILESTATUS3);
DosError:=DosQueryFileInfo(ff^.Handle,1,s,size);
IF DosError=0 THEN
BEGIN
Date:=PackDateIntern(year,month,day);
Time:=PackTimeIntern(Hours,Minutes,TwoSecs);
s.fdatelastwrite:=date;
s.ftimeLastWrite:=time;
DosError:=DosSetFileInfo(ff^.Handle,1,s,size);
END;
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
IF not GetFileTime(ff^.Handle,Creation,LastAccess,LastWrite) THEN
BEGIN
DosError:=GetLastError;
result:=DosError;
exit;
END;
TwoSecs:=Secs DIV 2;
IF ((Month>12)or(Month=0)) THEN
BEGIN
l:
DosError:=1;
result:=DosError;
exit;
END;
IF ((Day>32)or(day=0)) THEN goto l;
IF Hours>24 THEN goto l;
IF Minutes>60 THEN goto l;
IF TwoSecs>30 THEN goto l;
Date:=PackDateIntern(year,month,day);
Time:=PackTimeIntern(Hours,Minutes,TwoSecs);
DosDateTimeToFileTime(date,time,Creation);
IF not SetFileTime(ff^.Handle,Creation,LastAccess,LastWrite) THEN
BEGIN
DosError:=GetlastError;
result:=DosError;
exit;
END;
{$ENDIF}
result:=DosError;
END;
FUNCTION GetFTime(VAR f:FILE;VAR Time:LONGINT):LONGINT;
VAR
DT:DateTime;
m,d,h,i,s:WORD;
BEGIN
result:=GetFTime2(f,DT.year,m,d,h,i,s);
DT.month:=m;
DT.day:=d;
DT.hour:=h;
DT.min:=i;
DT.sec:=s;
PackTime(DT,Time);
END;
FUNCTION SetFTime(VAR f:FILE;Time:LONGINT):LONGINT;
VAR
DT:DateTime;
BEGIN
UnpackTime(time,DT);
{DT.sec:=DT.sec DIV 2;}
result:=SetFTime2(f,DT.year,DT.month,DT.day,DT.hour,DT.min,DT.sec);
END;
FUNCTION DiskFree(Drive: Byte): LongWord;
VAR
{$IFDEF OS2}
a:FSALLOCATE;
{$ENDIF}
{$IFDEF Win95}
c:CSTRING;
{$ENDIF}
s,d:LONGWORD;
sec,freesec,clust,freeclust:LONGWORD;
BEGIN
{$IFDEF OS2}
s:=sizeof(FSALLOCATE);
d:=Drive;
DosError:=DosQueryFSInfo(d,1,a,s);
IF DosError=0 THEN s:=a.cSectorUnit*a.cUnitAvail*a.cbSector
ELSE s:=0;
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
IF Drive=0 THEN
BEGIN
IF not GetDiskFreeSpace(NIL,s,sec,freeclust,clust) THEN
BEGIN
DosError:=GetLastError;
result:=0;
exit;
END;
END
ELSE
BEGIN
c:=chr(ord('A')+(Drive-1))+':\';
IF not GetDiskFreeSpace(c,s,sec,freeclust,clust) THEN
BEGIN
DosError:=GetLastError;
result:=0;
exit;
END;
s:=s*sec*freeclust;
END;
{$ENDIF}
DiskFree:=s;
END;
FUNCTION DiskSize(Drive: Byte): LongWord;
VAR
{$IFDEF OS2}
a:FSALLOCATE;
{$ENDIF}
s,d,sec,freesec,clust,freeclust:LONGWORD;
c:CSTRING;
BEGIN
{$IFDEF OS2}
s:=sizeof(FSALLOCATE);
d:=Drive;
DosErrorAPI(0); /* Action flag for disable */
DosError:=DosQueryFSInfo(d,1,a,s);
DosErrorAPI(1); /* Action flag for enable */
IF DosError=0 THEN s:=a.cSectorUnit*a.cUnit*a.cbSector
ELSE s:=$FFFFFFFF;
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
IF Drive=0 THEN
BEGIN
IF not GetDiskFreeSpace(NIL,s,sec,freeclust,clust) THEN
BEGIN
DosError:=GetLastError;
result:=$FFFFFFFF;
exit;
END;
END
ELSE
BEGIN
c:=chr(ord('A')+(Drive-1))+':\';
IF not GetDiskFreeSpace(c,s,sec,freeclust,clust) THEN
BEGIN
DosError:=GetLastError;
result:=$FFFFFFFF;
exit;
END;
s:=s*sec*clust;
END;
{$ENDIF}
DiskSize:=s;
END;
FUNCTION EnvStr(Index:LONGINT):String;
VAR
P:^CSTRING;
Count: Integer;
BEGIN
ASM
MOV EAX,SYSTEM.EnvStart
MOV $P,EAX
END;
result:= '';
IF ((Index>0)AND(P<>NIL)) THEN
BEGIN
Count := 1;
WHILE ((Count<Index)AND(P^[0]<>#0)) DO
BEGIN
WHILE P^[1]<>#0 DO inc(P);
inc(P);
inc(P);
Inc(Count);
END;
EnvStr := P^;
END;
END;
FUNCTION EnvCount:LONGINT;
VAR
P:^CSTRING;
BEGIN
ASM
MOV EAX,SYSTEM.EnvStart
MOV $P,EAX
END;
result:=0;
IF P<>NIL THEN
BEGIN
WHILE P^[0]<>#0 DO
BEGIN
WHILE P^[1]<>#0 DO inc(P);
inc(P);
inc(P);
Inc(Result);
END;
END;
END;
FUNCTION GetEnv(CONST Env:String):String;
VAR
e:PChar;
c,c1:CSTRING;
res:LONGWORD;
BEGIN
c:=Env;
{$IFDEF OS2}
DosError:=DosScanEnv(c,e);
{$ENDIF}
{$IFDEF Win95}
res:=GetEnvironmentVariable(c,c1,255);
IF res=0 THEN DosError:=GetLastError
ELSE e:=@c1;
{$ENDIF}
IF DosError<>0 THEN GetEnv:=''
ELSE GetEnv:=e^;
END;
FUNCTION GetVerify(VAR Verify: Boolean):LONGINT;
VAR
v:LONGWORD;
BEGIN
{$IFDEF OS2}
DosError:=DosQueryVerify(v);
Verify:=v<>0;
{$ENDIF}
{$IFDEF Win95}
DosError:=1; //not supported
{$ENDIF}
result:=DosError;
END;
FUNCTION SetVerify(Verify: Boolean):LONGINT;
VAR
v:LONGWORD;
BEGIN
{$IFDEF OS2}
v:=BYTE(Verify);
DosError:=DosSetVerify(v);
{$ENDIF}
{$IFDEF Win95}
DosError:=1; //not supported
{$ENDIF}
result:=DosError;
END;
FUNCTION DosVersion:LongWord;
VAR
MinorVersion,MajorVersion:LONGWORD;
BEGIN
{$IFDEF OS2}
DosQuerySysInfo(QSV_VERSION_MAJOR,QSV_VERSION_MAJOR,MajorVersion,4);
DosQuerySysInfo(QSV_VERSION_MINOR,QSV_VERSION_MINOR,MinorVersion,4);
DosVersion:=MajorVersion OR MINORVERSION SHL 8;
{$ENDIF}
{$IFDEF Win95}
result:=GetVersion;
{$ENDIF}
END;
FUNCTION GetDate(var Year,Month,Day,DayOfWeek: Word):LONGINT;
{$IFDEF OS2}
VAR d:DateTime;
{$ENDIF}
{$IFDEF Win95}
VAR d:SYSTEMTIME;
{$ENDIF}
BEGIN
{$IFDEF OS2}
DosGetDateTime(d);
DosError:=0;
Year:=d.year;
Month:=d.month;
Day:=d.Day;
DayofWeek:=d.Weekday;
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
GetSystemTime(d);
Year:=d.wYear;
Month:=d.wMonth;
Day:=d.wDay;
DayofWeek:=d.wDayOfWeek;
{$ENDIF}
result:=DosError;
END;
FUNCTION SetDate(Year,Month,Day: Word):LONGINT;
{$IFDEF OS2}
VAR d:DateTime;
{$ENDIF}
{$IFDEF Win95}
VAR d:SYSTEMTIME;
{$ENDIF}
BEGIN
{$IFDEF OS2}
DosGetDateTime(d);
DosError:=0;
d.year:=Year;
d.month:=Month;
d.day:=day;
d.Weekday:=0;
DosSetDateTime(d);
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
GetSystemTime(d);
d.wYear:=Year;
d.wMonth:=Month;
d.wDay:=Day;
d.wDayOfWeek:=0;
SetSystemTime(d);
{$ENDIF}
result:=DosError;
END;
FUNCTION GetTime(var Hour,Minute,Second,Sec100: Word):LONGINT;
{$IFDEF OS2}
VAR d:DateTime;
{$ENDIF}
{$IFDEF Win95}
VAR d:SYSTEMTIME;
{$ENDIF}
BEGIN
{$IFDEF OS2}
DosGetDateTime(d);
DosError:=0;
Hour:=d.hour;
Minute:=d.min;
Second:=d.Sec;
Sec100:=d.Hundredths;
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
GetSystemTime(d);
Hour:=d.wHour;
Minute:=d.wMinute;
Second:=d.wSecond;
Sec100:=d.wMilliseconds;
{$ENDIF}
result:=DosError;
END;
FUNCTION SetTime(Hour,Minute,Second,Sec100: Word):LONGINT;
{$IFDEF OS2}
VAR d:DateTime;
{$ENDIF}
{$IFDEF Win95}
VAR d:SYSTEMTIME;
{$ENDIF}
BEGIN
{$IFDEF OS2}
DosGetDateTime(d);
DosError:=0;
d.Hour:=Hour;
d.Min:=Minute;
d.Sec:=Second;
d.Hundredths:=Sec100;
DosSetDateTime(d);
{$ENDIF}
{$IFDEF Win95}
DosError:=0;
GetSystemTime(d);
d.wHour:=Hour;
d.wMinute:=Minute;
d.wSecond:=Second;
d.wMilliseconds:=sec100;
SetSystemTime(d);
{$ENDIF}
result:=DosError;
END;
FUNCTION CompareFileTimes(First,Second:STRING):BYTE;
VAR f1,f2:FILE;
result:BYTE;
year1,month1,day1,Hours1,Minutes1,Secs1:WORD;
year2,month2,day2,Hours2,Minutes2,Secs2:WORD;
b:BOOLEAN;
Label l;
BEGIN
b:=RaiseIOError;
result:=F_ERROR;
assign(f1,first);
{$i-}
reset(f1,1);
{$i+}
IF IoResult<>0 THEN goto l;
GetFTime2(f1,year1,month1,day1,Hours1,Minutes1,Secs1);
IF DosError<>0 THEN
BEGIN
{$i-}
Close(f1);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
CompareFileTimes:=result;
exit;
END;
goto l;
END;
{$i-}
Close(f1);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
CompareFileTimes:=result;
exit;
END;
assign(f2,second);
{$i-}
reset(f2,1);
{$i+}
IF IOResult<>0 THEN
BEGIN
RaiseIOError:=b;
CompareFileTimes:=result;
exit;
END;
GetFTime2(f2,year2,month2,day2,Hours2,Minutes2,Secs2);
IF DosError<>0 THEN
BEGIN
{$i-}
Close(f2);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
CompareFileTimes:=result;
exit;
END;
goto l;
END;
{$i-}
Close(f2);
{$i+}
IF IoResult<>0 THEN
BEGIN
RaiseIOError:=b;
CompareFileTimes:=result;
exit;
END;
IF year1=year2 THEN
BEGIN
IF month1=month2 THEN
BEGIN
IF Day1=Day2 THEN
BEGIN
IF Hours1=Hours2 THEN
BEGIN
IF Minutes1=Minutes2 THEN
BEGIN
IF Secs1=Secs2 THEN result:=F_EQUAL
ELSE
BEGIN
IF Secs1>Secs2 THEN Result:=F_FIRST_GREATER
ELSE Result:=F_SECOND_GREATER;
END;
END
ELSE
BEGIN
IF Minutes1>Minutes2 THEN Result:=F_FIRST_GREATER
ELSE Result:=F_SECOND_GREATER;
END;
END
ELSE
BEGIN
IF Hours1>Hours2 THEN Result:=F_FIRST_GREATER
ELSE Result:=F_SECOND_GREATER;
END;
END
ELSE
BEGIN
IF day1>day2 THEN Result:=F_FIRST_GREATER
ELSE Result:=F_SECOND_GREATER;
END;
END
ELSE
BEGIN
IF month1>month2 THEN Result:=F_FIRST_GREATER
ELSE Result:=F_SECOND_GREATER;
END;
END
ELSE
BEGIN
IF year1>year2 THEN Result:=F_FIRST_GREATER
ELSE Result:=F_SECOND_GREATER;
END;
l:
CompareFileTimes:=Result;
RaiseIOError:=b;
END;
PROCEDURE Flush (VAR F:FILE);
BEGIN
END;
BEGIN
END.