home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / os2 / which.cmd < prev   
Encoding:
Text File  |  1993-03-10  |  7.6 KB  |  218 lines

  1. /* ====================================================== */
  2. /*                      WHICH.CMD                         */
  3. /*           (C) 1993 Thomas Mack & DMV-Verlag            */
  4. /*                   Sprache: REXX/2                      */
  5. /* ====================================================== */  
  6. /* »which« sucht nach derjenigen ausführbaren Datei, die  */
  7. /* bei Aufruf aus dem aktuellen Pfad ausgeführt würde.    */
  8. /* Das Programm basiert auf dem UNIX-Kommando »which«.    */
  9. /* ====================================================== */
  10.  
  11. SIGNAL ON HALT NAME ende
  12.  
  13. IF (RxFuncQuery('SysFileTree') <> 0) THEN
  14.   CALL RxFuncAdd 'SysFileTree', 'RexxUtil', 'SysFileTree'
  15. PfadListe = (VALUE('PATH',,'OS2ENVIRONMENT'))
  16. PfadListe = TRANSLATE(PfadListe,' ',';')
  17.  
  18. PARSE ARG parameter
  19. CALL ScanOptions(parameter)
  20.  
  21. IF WORDS(parameter) = 0 THEN     /* Pfadeinträge ausgeben */
  22.   DO parcnt = 1 TO WORDS(PfadListe)
  23.     SAY SUBWORD(PfadListe,parcnt,1)
  24.   END
  25. ELSE DO                     /* Ausführbare Dateien suchen */
  26.   /* Das aktuelle Verzeichnis wird zuerst durchsucht: */
  27.   IF (STRIP(SUBWORD(PfadListe,1,1),'Trail','\')\='.') THEN
  28.     PfadListe = '. 'PfadListe
  29.   DO parcnt = ArgCnt TO WORDS(parameter)
  30.     dname = SUBWORD(parameter,parcnt,1)
  31.     dname = CheckFilename(dname,parameter,WORDS(parameter))
  32.     erfolg = 'N'
  33.     DO k = 1 TO WORDS(PfadListe)
  34.       Pfad = SUBWORD(PfadListe, k, 1)
  35.       Pfad = STRIP(Pfad, 'Trailing', '\');
  36.       alt_liste.0 = 0;
  37.       IF (SucheDatei(Pfad'\'dname, 'A')     ='Q') THEN LEAVE
  38.       IF (SucheDatei(Pfad'\'dname'.COM','S')='Q') THEN LEAVE
  39.       IF (SucheDatei(Pfad'\'dname'.EXE','S')='Q') THEN LEAVE
  40.       IF (SucheDatei(Pfad'\'dname'.CMD','S')='Q') THEN LEAVE
  41.       DROP alt_liste.
  42.     END
  43.     IF erfolg = 'N' THEN DO
  44.       CALL error ''''dname''' nicht gefunden in',
  45.                              VALUE('PATH',,'OS2ENVIRONMENT') 
  46.       EXIT 1
  47.     END
  48.   END
  49. END
  50.  
  51. EXIT 0
  52.  
  53. /* ====================================================== */
  54. usage:
  55.   CALL error ''
  56.   CALL error ''
  57.   CALL error 'WHICH.CMD v1.0 (C) 1993 Thomas Mack & DMV'
  58.   CALL error 'Aufruf: which [-?hal] [dateiname...]'
  59.   CALL error ''
  60.   CALL error '        -h, -? gibt diesen Hilfetext aus'
  61.   CALL error '        -a gibt ALLE passenden',
  62.                                  'ausführbaren Dateien aus'
  63.   CALL error '        -l Ausgabe im Langformat'
  64.   CALL error '        ohne Dateiname werden die Pfade',
  65.                                      'in''PATH'' ausgegeben'
  66.   EXIT 1
  67.  
  68. /* ====================================================== */
  69. syntax:
  70.   CALL error 'Aufruf: which [-?hal] [dateiname...]'
  71.   EXIT 1
  72.  
  73. /* ====================================================== */
  74. ScanOptions:
  75.   alle = 'N'; lang = 'N'; ArgCnt = 1
  76.   argument=SUBWORD(ARG(1), ArgCnt, 1)
  77.  
  78.   IF (argument = '?') THEN CALL usage
  79.  
  80.   DO WHILE (LEFT(argument, 1) = '-')
  81.     i = 2
  82.     DO UNTIL (i > LENGTH(argument))
  83.       ch = SUBSTR(argument, i, 1)
  84.       SELECT
  85.         WHEN ch = 'a' THEN alle = 'J'
  86.         WHEN ch = 'l' THEN lang = 'J'
  87.         WHEN (ch = 'h') | (ch = '?') THEN CALL usage
  88.         OTHERWISE CALL syntax
  89.       END
  90.       i = i + 1
  91.     END
  92.     ArgCnt = ArgCnt + 1
  93.     argument = SUBWORD(ARG(1), ArgCnt, 1)
  94.   END
  95.   IF (ArgCnt > 1) & (argument = '') THEN CALL syntax
  96.   RETURN
  97.  
  98. /* ====================================================== */
  99. /* »SucheVorhanden« schaut nach, ob der gleiche Dateiname */
  100. /* schon einmal gefunden (d.h. ausgegeben) wurde.         */
  101. /* Dies kann geschehen, wenn ein Name wie *c* angegeben   */
  102. /* wurde, also:                                           */
  103. /* 1) Dateiname mit Endung '.COM' oder '.CMD'             */
  104. /* 2) Dateiname mit einem 'C' im Dateinamen               */
  105. /* z.B. würde 'which.cmd' in diesem Fall zweimal gefunden.*/
  106. SucheVorhanden:
  107.   ARG eintrag, type
  108.   IF (alle = 'J') THEN DO
  109.     IF (type = 'S') THEN                    /* S = Search */
  110.       DO v = 1 TO alt_liste.0
  111.         IF (alt_liste.v = eintrag) THEN
  112.           RETURN 'J'
  113.       END
  114.     ELSE DO                                   /* A = Add  */
  115.       alt_liste.0 = alt_liste.0 + 1
  116.       v = alt_liste.0
  117.       alt_liste.v = eintrag
  118.     END
  119.   END
  120.   RETURN 'N'
  121.  
  122. /* ====================================================== */
  123. /* »SucheDatei« sucht mit SysFileTree nach passenden      */
  124. /* Dateinamen und gibt diese, falls sie ausführbar sind,  */
  125. /* im gewünschten Format auf StdOut aus.                  */
  126. SucheDatei:
  127.   PARSE ARG name, type
  128.  
  129.   ret=SysFileTree(name, found., 'F', '*--**')
  130.   IF (ret \= 0) THEN DO
  131.     CALL error 'Zu wenig Speicher.'
  132.     EXIT 1;
  133.   END
  134.   IF (found.0 > 0) THEN DO
  135.     DO i = 1 TO found.0
  136.       datei = SUBWORD(found.i, 5, WORDS(found.i) - 4)
  137.       ext = TRANSLATE(RIGHT(datei, 4))
  138.                            /* Ausführbare Datei gefunden? */
  139.       IF (ext='.COM') | (ext='.EXE') | (ext='.CMD') THEN DO
  140.                        /* Hatten wir diese Datei bereits? */
  141.         IF (SucheVorhanden(datei, type) = 'N') THEN DO
  142.           erfolg = 'J'
  143.           IF (lang = 'J') THEN DO
  144.                          /* In deutsches Format umsetzen: */
  145.             stde = SUBSTR(found.i, 11, 2)
  146.             IF (SUBSTR(found.i, 16, 1) = 'p') THEN
  147.               stde = stde + 12
  148.             datei=SUBSTR(found.i,4,2)'.'SUBSTR(found.i,1,2)
  149.             datei = datei'.'SUBSTR(found.i, 7, 4)''stde'.'
  150.             datei = datei''SUBSTR(found.i, 14, 2)
  151.             SAY datei''SUBSTR(found.i, 17)
  152.           END
  153.           ELSE
  154.             SAY SUBWORD(found.i, 5, WORDS(found.i) - 4)
  155.         END
  156.       END
  157.     END
  158.   END
  159.  
  160.   IF (erfolg = 'J') & (alle = 'N') THEN         /* Quit   */
  161.     RETURN 'Q'                                  
  162.   RETURN 'W'                                    /* Weiter */
  163.  
  164. /* ====================================================== */
  165. /* CheckFilename erzeugt den blanken Dateinamen aus:      */
  166. /* a) Dateinamen in Anführungszeichen                     */
  167. /* b) Dateinamen mit Laufwerksbezeichner                  */
  168. /* c) Dateinamen mit Pfadangabe                           */
  169. CheckFilename:
  170.   PARSE ARG name, ArgStr, MaxAnzahl
  171.   IF (LEFT(name, 1) = '"') THEN DO
  172.                              /* Name in Anführungszeichen */
  173.     start = parcnt
  174.  
  175.     DO WHILE (RIGHT(name, 1) \= '"')
  176.       IF (parcnt >= MaxAnzahl) THEN DO
  177.         CALL error 'which: fehlendes Anführungszeichen'
  178.         EXIT 1
  179.       END
  180.       parcnt = parcnt + 1
  181.       name = SUBWORD(ArgStr, parcnt, 1)
  182.     END
  183.     name = SUBWORD(ArgStr, start, parcnt - start + 1)
  184.     name = RIGHT(name, LENGTH(name) - 1)
  185.     name = LEFT(name, LENGTH(name) - 1)
  186.   END
  187.  
  188.   IF (POS(':', name) = 2) THEN DO
  189.     CALL error ''':'' (Laufwerksbezeichner) gefunden',
  190.                                  'im Dateinamen: '''name''''
  191.     name = SUBSTR(name, 3)
  192.     CALL error '                         ',
  193.                         'Dateinamen geändert in: '''name''''
  194.   END
  195.   IF (POS('\', name) \= 0) THEN DO
  196.     CALL error '''\'' (Pfadtrennzeichen) gefunden',
  197.                                  'im Dateinamen: '''name''''
  198.     name = SUBSTR(name, LASTPOS('\', name) + 1)
  199.     CALL error '                      ',
  200.                         'Dateinamen geändert in: '''name''''
  201.   END
  202.   RETURN name
  203.  
  204. /* ====================================================== */
  205. /* Textausgabe auf StdErr                                 */
  206. error:
  207.   PARSE ARG text
  208.   CALL LINEOUT 'StdErr:', text
  209.   RETURN
  210.  
  211. /* ====================================================== */
  212. ende:
  213.   CALL error 'Programm abgebrochen...'
  214.   EXIT 1
  215.  
  216. /**********************************************************/
  217. /*                    Ende von WHICH.CMD                  */
  218.