home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
turbo4
/
dos_50.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1989-08-15
|
11KB
|
382 lines
(*--------------------------------------------------------*)
(* DOS_50.PAS *)
(* Die zusätzlichen Routinen der Turbo 5.0 - Unit DOS *)
(* für die Version 4.0 . *)
(* (c) 1989 Roland Geier & TOOLBOX *)
(*--------------------------------------------------------*)
{$B-,D-,R-,S-,V-}
UNIT DOS_50;
INTERFACE
USES Dos; { Turbo 4.0 DOS-Unit }
TYPE
PathStr = STRING[79]; { zusätzliche String-Typen }
DirStr = STRING[67];
NameStr = STRING[8];
ExtStr = STRING[4];
PROCEDURE SwapVectors;
{ vertauscht die von System belegten Interrupt-Vektoren }
{ mit den entsprechenden Variablen des Units System. }
FUNCTION DOSVersion : WORD;
{ übergibt im Lo-Byte die Hauptversionsnummer, im Hi- }
{ Byte die Unterversionsnummer der DOS-Version. }
PROCEDURE GetVerify(VAR verify : BOOLEAN);
{ ermittelt, ob das DOS-Verify-Flag gesetzt ist. }
PROCEDURE SetVerify(verify : BOOLEAN);
{ setzt (Verify=True) bzw. löscht (Verify = False) das }
{ DOS-Verify-Flag. }
PROCEDURE GetCBreak(VAR break : BOOLEAN);
{ ermittelt, bei welchen Operationen DOS auf CTRL-Break }
{ prüft: }
{ Break = True : bei jedem Funktionsaufruf }
{ Break = False: nur bei Ein-/Ausgaben über Tasta- }
{ tur, Drucker, serielle Schnitt- }
{ stelle und Bildschirm }
PROCEDURE SetCBreak(break : BOOLEAN);
{ setzt (Break=True) bzw. löscht (Break=False) das DOS- }
{ Breakflag. }
FUNCTION GetEnv(EnvStr : STRING) : STRING;
{ liest einen Eintrag aus dem Environment. }
FUNCTION EnvCount : INTEGER;
{ liefert die Anzahl der Environmenteinträge. }
FUNCTION EnvStr(index : INTEGER) : STRING;
{ liefert den Environmenteintrag mit der Nummer Index }
{ als kompletten Eintrag zurück. }
PROCEDURE FSplit(path : PathStr; VAR dir : DirStr;
VAR Name : NameStr; VAR Ext : ExtStr);
{ zerlegt einen vollständigen Dateinamen in die Kompo- }
{ nenten Suchweg, Name und Suffix. }
FUNCTION FExpand(path : PathStr) : PathStr;
{ erweitert einen unvollständig angegebenen Dateinamen }
{ um den dazugehörigen Suchweg. }
FUNCTION FSearch(path : PathStr;
DirList : STRING) : PathStr;
{ sucht das aktuelle Directory und die Directoryliste }
{ DirList nach einem Dateinamen ab. }
IMPLEMENTATION
CONST
OddCall : BOOLEAN = TRUE;
VAR
Int00Save : POINTER;
Int02Save : POINTER;
Int23Save : POINTER;
Int24Save : POINTER;
Int75Save : POINTER;
PROCEDURE SwapVectors;
BEGIN
IF OddCall THEN BEGIN
{ n-facher Aufruf mit n ungerade }
GetIntVec($00, Int00Save);
SetIntVec($00, SaveInt00);
GetIntVec($02, Int02Save);
SetIntVec($02, SaveInt02);
GetIntVec($23, Int23Save);
SetIntVec($23, SaveInt23);
GetIntVec($24, Int24Save);
SetIntVec($24, SaveInt24);
GetIntVec($75, Int75Save);
SetIntVec($75, SaveInt75);
END ELSE BEGIN { n-facher Aufruf mit n gerade }
SetIntVec($00, Int00Save);
SetIntVec($02, Int02Save);
SetIntVec($23, Int23Save);
SetIntVec($24, Int24Save);
SetIntVec($75, Int75Save);
END;
OddCall := NOT(OddCall);
END;
FUNCTION DOSVersion : WORD;
VAR
Regs : Registers;
BEGIN
Regs.ah := $30;
MsDos(Regs);
DosVersion := Regs.ax;
END;
PROCEDURE GetVerify(VAR verify : BOOLEAN);
VAR
Regs : Registers;
BEGIN
Regs.ah := $54;
MsDos(Regs);
IF Regs.al = 0 THEN verify := FALSE
ELSE verify := TRUE;
END;
PROCEDURE SetVerify(verify : BOOLEAN);
VAR
Regs: Registers;
BEGIN
Regs.ah := $2E; Regs.dl := 0;
IF verify THEN Regs.al := 1
ELSE Regs.al := 0;
MsDos(Regs);
END;
PROCEDURE GetCBreak(VAR break : BOOLEAN);
VAR
Regs : Registers;
BEGIN
Regs.ah := $33; Regs.al := 0;
MsDos(Regs);
IF Regs.dl = 1 THEN break := TRUE
ELSE break := FALSE;
END;
PROCEDURE SetCBreak(break : BOOLEAN);
VAR
Regs : Registers;
BEGIN
Regs.ah := $33; Regs.al := 1;
IF break THEN Regs.dl := 1
ELSE Regs.dl := 0;
MsDos(Regs);
END;
Procedure UpString(Var St: String);
{ Umwandlung eines Strings in Großbuchstaben }
VAR
i : ShortInt;
BEGIN
FOR i := 1 TO Length(St) DO BEGIN
IF (St[i] = 'ä') OR (St[i] = 'ö') OR
(St[i] = 'ü') THEN BEGIN
CASE St[i] OF
'ä': St[i] := 'Ä';
'ö': St[i] := 'Ö';
'ü': St[i] := 'Ü';
END;
END ELSE
St[i] := UpCase(St[i]);
END;
END;
FUNCTION GetEnv(EnvStr : STRING) : STRING;
VAR
Eintrag : STRING;
Equal : BOOLEAN;
EnvCh : CHAR;
i : BYTE;
BEGIN
Equal := FALSE; i := 0;
UpString(EnvStr);
REPEAT
Eintrag := UpCase
(Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i]));
WHILE UpCase
(Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i])) <> #0
DO BEGIN
Inc(i);
Eintrag := Eintrag +
UpCase(Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i]));
END;
Inc(i);
Equal := POS(EnvStr, Eintrag) = 1;
UNTIL Equal OR (UpCase
(Chr(Mem[MemW[PrefixSeg:$002C]:$0000+(i+1)]))=#0);
IF NOT(Equal) THEN
GetEnv := ''
ELSE BEGIN
Delete(Eintrag,1,Succ(Length(EnvStr)));
{ EnvStr+'='aus Eintrag entfernen }
GetEnv := Eintrag;
END;
END;
FUNCTION EnvCount : INTEGER;
VAR
EnvCh : CHAR;
EnvNr : INTEGER;
i : ShortInt;
BEGIN
EnvNr := 0; i := 0;
REPEAT
EnvCh := Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i]);
IF (EnvCh = #0) THEN Inc(EnvNr);
Inc(i);
UNTIL (EnvCh = #0) AND
(Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i]) = #0);
EnvCount := EnvNr;
END;
FUNCTION EnvStr(index : INTEGER) : STRING;
CONST
EnvAnz : INTEGER = 0;
VAR
EnvCh : CHAR;
TmpStr : STRING;
i : ShortInt;
BEGIN
EnvAnz := EnvCount; TmpStr := ''; i := 0;
IF (index = 0) OR (index > EnvAnz) THEN
EnvStr := ''
ELSE BEGIN
EnvAnz := 0;
IF index > 1 THEN
REPEAT
EnvCh := Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i]);
IF EnvCh = #0 THEN Inc(EnvAnz);
Inc(i);
UNTIL EnvAnz = Pred(index);
REPEAT
TmpStr := TmpStr +
Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i]);
Inc(i);
UNTIL Chr(Mem[MemW[PrefixSeg:$002C]:$0000+i]) = #0;
EnvStr := TmpStr;
END;
END;
PROCEDURE FSplit(path : PathStr; VAR dir : DirStr;
VAR name : NameStr; VAR ext: ExtStr );
VAR
pl, i, k, Marker : ShortInt;
WorkPath : PathStr ;
DCh : CHAR;
CpyNr : INTEGER;
ExtFound, NameFound : BOOLEAN;
BEGIN
i := 8; k := 1;
ExtFound := FALSE; NameFound := FALSE;
IF Length(Path) = 0 THEN BEGIN
Dir := ''; Name := ''; Ext := '';
END ELSE BEGIN
WorkPath := Path; pl := Length(WorkPath);
Marker := pl;
REPEAT
DCh := WorkPath[pl];
IF (DCh = '.') AND NOT(ExtFound) AND
(WorkPath[Pred(pl)] <> '.') THEN BEGIN
Ext := Copy(WorkPath, pl, 4);
Delete(WorkPath, pl, Succ(Marker-pl));
ExtFound := TRUE;
END;
Dec(pl);
UNTIL ExtFound OR (pl = 0);
pl := Length(WorkPath);
IF WorkPath[pl] = '\' THEN
name := ''
ELSE
REPEAT
DCh := WorkPath[pl];
IF (DCh = '\') OR (Pred(pl) = 0) THEN BEGIN
CpyNr := Length(WorkPath) - pl + 1;
IF CpyNr > 8 THEN CpyNr := 8;
IF DCh = '\' THEN Inc(pl);
Name := Copy(WorkPath, pl, CpyNr);
NameFound := TRUE;
Delete(WorkPath, pl, Marker-pl);
END;
Dec(pl);
UNTIL NameFound OR (pl = 0);
IF NOT(NameFound) THEN Name := '';
Dir := WorkPath;
END;
END;
FUNCTION FExpand(Path : PathStr) : PathStr;
VAR
CurrentDir : DirStr;
WorkStr : DirStr;
DirSt : DirStr;
NameSt : NameStr;
ExtSt : ExtStr;
pl : ShortInt;
BEGIN
IF Length(Path) > 0 THEN BEGIN
UpString(Path);
{$I-} GetDir(0, CurrentDir); {$I-}
IF IOResult = 0 THEN CurrentDir := CurrentDir + '\';
IF IOResult > 0 THEN Exit;
IF (Pos('\', Path) = 0) AND (Path[2] <> ':') THEN
FExpand := CurrentDir + Path
ELSE BEGIN
FSplit(Path, DirSt, NameSt, ExtSt);
WorkStr := DirSt; pl := Length(WorkStr);
IF WorkStr = CurrentDir THEN
FExpand := Path
ELSE BEGIN
IF Pos(':', WorkStr) <> 2 THEN
WorkStr := CurrentDir + WorkStr;
IF Pos('\..\', WorkStr) > 0 THEN
REPEAT
pl := Pos('\..\', WorkStr);
Delete(WorkStr, pl, 3);
IF pl > 3 THEN { Bei <Laufwerk>:\..\ nicht }
REPEAT
Delete(WorkStr, pl, 1); Dec(pl);
UNTIL (WorkStr[pl] = '\') OR
((Length(WorkStr)=2) AND (WorkStr[2]=':'));
UNTIL Pos('\..\', WorkStr) = 0;
IF Pos('\.\', WorkStr) > 0 THEN
REPEAT
pl := Pos('\.\', WorkStr);
Delete(WorkStr, pl, 2);
UNTIL Pos('\.\', WorkStr) = 0;
FExpand := WorkStr + NameSt + ExtSt;
END;
END;
END;
END;
FUNCTION FSearch(path : PathStr;
DirList : STRING) : PathStr;
VAR
CurrentDir : DirStr;
SearchDir : DirStr;
pl : ShortInt;
SR : SearchRec;
BEGIN
FindFirst(Path, Archive, SR);
IF DOSError = 0 THEN
FSearch := Path
ELSE BEGIN
IF Length(DirList) = 0 THEN
FSearch := ''
ELSE BEGIN
REPEAT
pl := 0; SearchDir := '';
REPEAT
Inc(pl); SearchDir := SearchDir + DirList[pl];
UNTIL (DirList[pl] = ';') OR
(pl >= Length(DirList));
IF SearchDir[pl] = ';' THEN
Delete(SearchDir, pl, 1);
IF SearchDir[Length(SearchDir)] <> '\' THEN
SearchDir := SearchDir + '\';
FindFirst(SearchDir + Path, Archive, SR);
IF DOSError = 0 THEN BEGIN
FSearch := SearchDir + Path; Exit;
END;
Delete(DirList, 1, Succ(Length(SearchDir)));
UNTIL Length(DirList) = 0;
FSearch := '';
END;
END;
END;
END.
(* ------------------------------------------------------ *)
(* Ende von DOS_50.PAS *)