home *** CD-ROM | disk | FTP | other *** search
- (*--------------------------------------------------------*)
- (* 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 *)
-
-