home *** CD-ROM | disk | FTP | other *** search
- /* ====================================================== */
- /* WHICH.CMD */
- /* (C) 1993 Thomas Mack & DMV-Verlag */
- /* Sprache: REXX/2 */
- /* ====================================================== */
- /* »which« sucht nach derjenigen ausführbaren Datei, die */
- /* bei Aufruf aus dem aktuellen Pfad ausgeführt würde. */
- /* Das Programm basiert auf dem UNIX-Kommando »which«. */
- /* ====================================================== */
-
- SIGNAL ON HALT NAME ende
-
- IF (RxFuncQuery('SysFileTree') <> 0) THEN
- CALL RxFuncAdd 'SysFileTree', 'RexxUtil', 'SysFileTree'
- PfadListe = (VALUE('PATH',,'OS2ENVIRONMENT'))
- PfadListe = TRANSLATE(PfadListe,' ',';')
-
- PARSE ARG parameter
- CALL ScanOptions(parameter)
-
- IF WORDS(parameter) = 0 THEN /* Pfadeinträge ausgeben */
- DO parcnt = 1 TO WORDS(PfadListe)
- SAY SUBWORD(PfadListe,parcnt,1)
- END
- ELSE DO /* Ausführbare Dateien suchen */
- /* Das aktuelle Verzeichnis wird zuerst durchsucht: */
- IF (STRIP(SUBWORD(PfadListe,1,1),'Trail','\')\='.') THEN
- PfadListe = '. 'PfadListe
- DO parcnt = ArgCnt TO WORDS(parameter)
- dname = SUBWORD(parameter,parcnt,1)
- dname = CheckFilename(dname,parameter,WORDS(parameter))
- erfolg = 'N'
- DO k = 1 TO WORDS(PfadListe)
- Pfad = SUBWORD(PfadListe, k, 1)
- Pfad = STRIP(Pfad, 'Trailing', '\');
- alt_liste.0 = 0;
- IF (SucheDatei(Pfad'\'dname, 'A') ='Q') THEN LEAVE
- IF (SucheDatei(Pfad'\'dname'.COM','S')='Q') THEN LEAVE
- IF (SucheDatei(Pfad'\'dname'.EXE','S')='Q') THEN LEAVE
- IF (SucheDatei(Pfad'\'dname'.CMD','S')='Q') THEN LEAVE
- DROP alt_liste.
- END
- IF erfolg = 'N' THEN DO
- CALL error ''''dname''' nicht gefunden in',
- VALUE('PATH',,'OS2ENVIRONMENT')
- EXIT 1
- END
- END
- END
-
- EXIT 0
-
- /* ====================================================== */
- usage:
- CALL error ''
- CALL error ''
- CALL error 'WHICH.CMD v1.0 (C) 1993 Thomas Mack & DMV'
- CALL error 'Aufruf: which [-?hal] [dateiname...]'
- CALL error ''
- CALL error ' -h, -? gibt diesen Hilfetext aus'
- CALL error ' -a gibt ALLE passenden',
- 'ausführbaren Dateien aus'
- CALL error ' -l Ausgabe im Langformat'
- CALL error ' ohne Dateiname werden die Pfade',
- 'in''PATH'' ausgegeben'
- EXIT 1
-
- /* ====================================================== */
- syntax:
- CALL error 'Aufruf: which [-?hal] [dateiname...]'
- EXIT 1
-
- /* ====================================================== */
- ScanOptions:
- alle = 'N'; lang = 'N'; ArgCnt = 1
- argument=SUBWORD(ARG(1), ArgCnt, 1)
-
- IF (argument = '?') THEN CALL usage
-
- DO WHILE (LEFT(argument, 1) = '-')
- i = 2
- DO UNTIL (i > LENGTH(argument))
- ch = SUBSTR(argument, i, 1)
- SELECT
- WHEN ch = 'a' THEN alle = 'J'
- WHEN ch = 'l' THEN lang = 'J'
- WHEN (ch = 'h') | (ch = '?') THEN CALL usage
- OTHERWISE CALL syntax
- END
- i = i + 1
- END
- ArgCnt = ArgCnt + 1
- argument = SUBWORD(ARG(1), ArgCnt, 1)
- END
- IF (ArgCnt > 1) & (argument = '') THEN CALL syntax
- RETURN
-
- /* ====================================================== */
- /* »SucheVorhanden« schaut nach, ob der gleiche Dateiname */
- /* schon einmal gefunden (d.h. ausgegeben) wurde. */
- /* Dies kann geschehen, wenn ein Name wie *c* angegeben */
- /* wurde, also: */
- /* 1) Dateiname mit Endung '.COM' oder '.CMD' */
- /* 2) Dateiname mit einem 'C' im Dateinamen */
- /* z.B. würde 'which.cmd' in diesem Fall zweimal gefunden.*/
- SucheVorhanden:
- ARG eintrag, type
- IF (alle = 'J') THEN DO
- IF (type = 'S') THEN /* S = Search */
- DO v = 1 TO alt_liste.0
- IF (alt_liste.v = eintrag) THEN
- RETURN 'J'
- END
- ELSE DO /* A = Add */
- alt_liste.0 = alt_liste.0 + 1
- v = alt_liste.0
- alt_liste.v = eintrag
- END
- END
- RETURN 'N'
-
- /* ====================================================== */
- /* »SucheDatei« sucht mit SysFileTree nach passenden */
- /* Dateinamen und gibt diese, falls sie ausführbar sind, */
- /* im gewünschten Format auf StdOut aus. */
- SucheDatei:
- PARSE ARG name, type
-
- ret=SysFileTree(name, found., 'F', '*--**')
- IF (ret \= 0) THEN DO
- CALL error 'Zu wenig Speicher.'
- EXIT 1;
- END
- IF (found.0 > 0) THEN DO
- DO i = 1 TO found.0
- datei = SUBWORD(found.i, 5, WORDS(found.i) - 4)
- ext = TRANSLATE(RIGHT(datei, 4))
- /* Ausführbare Datei gefunden? */
- IF (ext='.COM') | (ext='.EXE') | (ext='.CMD') THEN DO
- /* Hatten wir diese Datei bereits? */
- IF (SucheVorhanden(datei, type) = 'N') THEN DO
- erfolg = 'J'
- IF (lang = 'J') THEN DO
- /* In deutsches Format umsetzen: */
- stde = SUBSTR(found.i, 11, 2)
- IF (SUBSTR(found.i, 16, 1) = 'p') THEN
- stde = stde + 12
- datei=SUBSTR(found.i,4,2)'.'SUBSTR(found.i,1,2)
- datei = datei'.'SUBSTR(found.i, 7, 4)''stde'.'
- datei = datei''SUBSTR(found.i, 14, 2)
- SAY datei''SUBSTR(found.i, 17)
- END
- ELSE
- SAY SUBWORD(found.i, 5, WORDS(found.i) - 4)
- END
- END
- END
- END
-
- IF (erfolg = 'J') & (alle = 'N') THEN /* Quit */
- RETURN 'Q'
- RETURN 'W' /* Weiter */
-
- /* ====================================================== */
- /* CheckFilename erzeugt den blanken Dateinamen aus: */
- /* a) Dateinamen in Anführungszeichen */
- /* b) Dateinamen mit Laufwerksbezeichner */
- /* c) Dateinamen mit Pfadangabe */
- CheckFilename:
- PARSE ARG name, ArgStr, MaxAnzahl
- IF (LEFT(name, 1) = '"') THEN DO
- /* Name in Anführungszeichen */
- start = parcnt
-
- DO WHILE (RIGHT(name, 1) \= '"')
- IF (parcnt >= MaxAnzahl) THEN DO
- CALL error 'which: fehlendes Anführungszeichen'
- EXIT 1
- END
- parcnt = parcnt + 1
- name = SUBWORD(ArgStr, parcnt, 1)
- END
- name = SUBWORD(ArgStr, start, parcnt - start + 1)
- name = RIGHT(name, LENGTH(name) - 1)
- name = LEFT(name, LENGTH(name) - 1)
- END
-
- IF (POS(':', name) = 2) THEN DO
- CALL error ''':'' (Laufwerksbezeichner) gefunden',
- 'im Dateinamen: '''name''''
- name = SUBSTR(name, 3)
- CALL error ' ',
- 'Dateinamen geändert in: '''name''''
- END
- IF (POS('\', name) \= 0) THEN DO
- CALL error '''\'' (Pfadtrennzeichen) gefunden',
- 'im Dateinamen: '''name''''
- name = SUBSTR(name, LASTPOS('\', name) + 1)
- CALL error ' ',
- 'Dateinamen geändert in: '''name''''
- END
- RETURN name
-
- /* ====================================================== */
- /* Textausgabe auf StdErr */
- error:
- PARSE ARG text
- CALL LINEOUT 'StdErr:', text
- RETURN
-
- /* ====================================================== */
- ende:
- CALL error 'Programm abgebrochen...'
- EXIT 1
-
- /**********************************************************/
- /* Ende von WHICH.CMD */
-