home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* ALIAS.MOD *)
- (* *)
- (* DOS-Erweiterung in TopSpeed Modula-2 *)
- (* Aufruf: alias [/d] [name] [Befehl {' #' [' '] Befehl}] *)
- (* *)
- (* (c) 1989 Rüdiger Stobbe & TOOLBOX *)
- (* ------------------------------------------------------ *)
- MODULE Alias;
-
- IMPORT IO;
- FROM SYSTEM IMPORT Registers;
- FROM FIO IMPORT File, Create, Close, Erase, FileAttr,
- readonly, archive, hidden, PathTail,
- DirEntry, ReadFirstEntry,
- ReadNextEntry, WrStr, IOcheck,
- IOresult, GetDir, ChDir;
- FROM Str IMPORT Concat, Compare, Delete, Copy, Pos,
- Length, Caps, ItemS;
- FROM Lib IMPORT Dos, ParamStr, ParamCount,
- CommandType, Environment;
-
- CONST
- MaxLineLength = 100;
- VersionMessage = "alias version 1.02 27.02.1989";
-
- TYPE
- SetOfChar = SET OF CHAR;
-
- CONST
- PossibleNew = SetOfChar{'0'..'9','A'..'Z',
- 'a'..'z','$'};
- PossibleList = PossibleNew + SetOfChar{'*','?'};
- DefaultDirectory = "C:\ALIASLST";
-
- VAR
- parameter : ARRAY [0..MaxLineLength] OF CHAR;
- NumberOfParams,
- len, i : CARDINAL;
- Drv, DefDrv : SHORTCARD;
- AliasDirectory,
- SaveDirectory,
- EnvironmentString : ARRAY [0..63] OF CHAR;
- DriveString : ARRAY [0..1] OF CHAR;
-
-
- PROCEDURE FindEnvVariable(Variable : ARRAY OF CHAR;
- VAR Result : ARRAY OF CHAR);
- VAR
- i : CARDINAL;
- EnvVar, EnvStr : ARRAY [0..80] OF CHAR;
- EnvPtr : CommandType;
-
- BEGIN
- Caps(Variable);
- i := 0;
- LOOP
- EnvPtr := Environment(i);
- Copy(EnvStr, EnvPtr^);
- IF Length(EnvStr[0]) = 0 THEN
- Result[0] := CHAR (0);
- RETURN;
- END;
- ItemS(EnvVar, EnvStr, " =", 0);
- IF Compare(EnvVar, Variable) = 0 THEN
- ItemS(Result, EnvStr, " =", 1);
- RETURN;
- END;
- INC(i);
- END;
- END FindEnvVariable;
-
-
- PROCEDURE GetDefaultDrive() : SHORTCARD;
- (* Gibt die Nummer (A = 0, B = 1, ...) des *)
- (* aktuellen Laufwerks zurück *)
- VAR
- Regs : Registers;
-
- BEGIN
- Regs.AH := 19H;
- Dos(Regs);
- RETURN(Regs.AL);
- END GetDefaultDrive;
-
-
- PROCEDURE AliasList(listname : ARRAY OF CHAR);
- (* AliasList listet alle Kommandos aus \ALIASLST *)
- (* auf, die dem Suchmuster ('*','?' erlaubt) in *)
- (* listname entsprechen *)
- CONST
- Attributes = FileAttr{readonly, hidden, archive};
- VAR
- matchcode : ARRAY [0..63] OF CHAR;
- Output : PathTail;
- directory : DirEntry;
- len, i, p : CARDINAL;
- found : BOOLEAN;
-
- BEGIN
- IO.WrLn; IO.WrStr(VersionMessage); IO.WrLn; IO.WrLn;
- Caps(listname);
- len := Length(listname);
- IF len > 8 THEN len := 7; ELSE DEC(len); END;
- i := 0;
- REPEAT
- INC(i);
- UNTIL NOT (listname[i-1] IN PossibleList) OR (i > len);
- listname[i] := 0C;
- Concat(matchcode, AliasDirectory, listname);
- Concat(matchcode, matchcode, ".BAT");
- (* Suche ersten Eintrag entsprechend Suchmuster *)
- found := ReadFirstEntry(matchcode, Attributes, directory);
- WHILE found DO
- (* gebe alle gefundenen Einträge aus - ohne .BAT *)
- Copy(Output, directory.Name);
- p := Pos(Output, ".");
- IF p # MAX (CARDINAL) THEN Output[p] := 0C; END;
- IO.WrStr(Output); IO.WrLn;
- found := ReadNextEntry(directory);
- END;
- END AliasList;
-
-
- PROCEDURE AliasDelete(deletename : ARRAY OF CHAR);
- (* AliasDelete löscht alle bestehenden Einträge *)
- (* in \ALIASLST die dem Suchmuster in deletename *)
- (* entsprechen, auch hier sind wie bei AliasList *)
- (* wildcards ('*' und '?') erlaubt *)
- CONST
- Attributes = FileAttr{hidden, archive};
- VAR
- matchcode, delname : ARRAY [0..63] OF CHAR;
- directory : DirEntry;
- len, i : CARDINAL;
- found : BOOLEAN;
-
- BEGIN
- Caps (deletename);
- len := Length (deletename);
- IF len > 8 THEN len := 7; ELSE DEC (len) END;
- i := 0;
- REPEAT
- INC (i);
- UNTIL NOT (deletename [i-1] IN PossibleList) OR (i > len);
- deletename [i] := 0C;
- Concat (matchcode, AliasDirectory, deletename);
- Concat (matchcode, matchcode, ".BAT");
- (* Suche den ersten Eintrag *)
- found := ReadFirstEntry(matchcode, Attributes, directory);
- WHILE found DO
- Concat (delname, AliasDirectory, directory.Name);
- found := ReadNextEntry (directory);
- Erase (delname);
- END;
- END AliasDelete;
-
-
- PROCEDURE AliasInsert(insertname : ARRAY OF CHAR) : BOOLEAN;
- (* AliasInsert erzeugt ein neues Kommando *)
- VAR
- filename : ARRAY [0..63] OF CHAR;
- help, Line : ARRAY [0..MaxLineLength] OF CHAR;
- batchfile : File;
- found, error : BOOLEAN;
- len, i : CARDINAL;
- crlf : ARRAY [0..1] OF CHAR;
-
- BEGIN
- Concat(crlf, CHR(13), CHR(10));
- Caps(insertname);
- (* kürze insertname auf maximal 8 Zeichen, die *)
- (* alle gültig sind der Name wird ab dem ersten *)
- (* ungültigen Zeichen abgeschnitten *)
- len := Length(insertname);
- IF len > 8 THEN len := 7; ELSE DEC(len) END;
- i := 0;
- REPEAT
- INC(i);
- UNTIL NOT (insertname[i] IN PossibleNew) OR (i > len);
- IF i = 0 THEN RETURN(FALSE); END;
- insertname[i] := 0C;
- (* Erstelle Pfadnamen und erzeuge die *)
- (* entsprechende Datei *)
- Concat(filename, AliasDirectory, insertname);
- Concat(filename, filename, ".BAT");
- batchfile := Create(filename);
- IF IOresult() # 0 THEN RETURN(FALSE); END;
- (* Schreibe Batchkommandos zunächst nach Line *)
- Concat(Line, "@echo off", crlf); (* DOS 3.3 *)
- FOR i := 2 TO NumberOfParams DO
- ParamStr(help, i);
- IF Pos(help, "#") = 0 THEN (* neue Zeile beginnt *)
- Concat(Line, Line, crlf);
- IF Length(help) > 1 THEN
- (* nach # stand kein Leerzeichen *)
- Delete(help, 0, 1);
- Concat(Line, Line, help);
- Concat(Line, Line, ' ');
- END;
- ELSE
- (* keine neue Zeile, also Befehl an die *)
- (* bestehende anhängen *)
- Concat(Line, Line, help);
- Concat(Line, Line, ' ');
- END;
- END; (* Datei beschreiben *)
- WrStr(batchfile, Line);
- error := IOresult() # 0;
- Close(batchfile);
- RETURN(NOT error);
- END AliasInsert;
-
-
- BEGIN
- IOcheck := FALSE;
- DriveString := "C:";
- DefDrv := GetDefaultDrive();
- FindEnvVariable("ALIAS", AliasDirectory);
- Caps(AliasDirectory);
- IF AliasDirectory[0] = CHR(0) THEN
- AliasDirectory := DefaultDirectory;
- END;
- (* prüfe ob das angegebene Verzeichnis existiert *)
- IF len > 1 THEN
- IF AliasDirectory [1] = ':' THEN
- (* Pfad enthält Laufwerksangabe *)
- Drv := SHORTCARD(AliasDirectory[0]) - SHORTCARD ('A');
- ELSE
- Drv := DefDrv;
- DriveString[0] := CHR(Drv + SHORTCARD('A'));
- Concat(AliasDirectory, DriveString, AliasDirectory);
- END;
- END;
- GetDir(DefDrv + 1, SaveDirectory);
- ChDir(AliasDirectory);
- IF IOresult() # 0 THEN
- IO.WrStr("directory ");
- IO.WrStr(AliasDirectory);
- IO.WrStr(" not found");
- HALT;
- END;
- DriveString[0] := CHAR(DefDrv + SHORTCARD('A'));
- Concat(SaveDirectory, "\", SaveDirectory);
- Concat(SaveDirectory, DriveString, SaveDirectory);
- ChDir(SaveDirectory);
- IF IOresult() # 0 THEN
- IO.WrStr(SaveDirectory);
- IO.WrStr(" xxxxxx");
- END;
- Concat(AliasDirectory, AliasDirectory, '\');
- (* Anzahl der Parameter feststellen *)
- NumberOfParams := ParamCount();
- IF NumberOfParams = 0 THEN
- (* alle Kommandos anzeigen *)
- AliasList("*");
- ELSIF NumberOfParams = 1 THEN
- ParamStr(parameter, 1);
- Caps(parameter);
- IF Compare(parameter, "/D") = 0 THEN
- (* alle Kommandos löschen *)
- AliasDelete("*");
- ELSE
- (* bestimmtes Kommando anzeigen *)
- AliasList(parameter);
- END;
- ELSE (* mehr als 1 Parameter *)
- ParamStr(parameter, 1);
- Caps(parameter);
- IF Compare(parameter, "/D") = 0 THEN
- (* bestimmte Kommandos löschen *)
- FOR i := 2 TO NumberOfParams DO
- ParamStr(parameter, i);
- AliasDelete(parameter);
- END;
- ELSE (* neues Kommando erzeugen *)
- IF NOT AliasInsert (parameter) THEN
- IO.WrStr ("file error"); IO.WrLn;
- END;
- END;
- END;
- END Alias.
- (* ------------------------------------------------------ *)
- (* Ende von ALIAS.MOD *)