home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / tcpp / examples / getopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-10  |  4.3 KB  |  138 lines

  1. /*
  2.     getopt.c -- Turbo C
  3.  
  4.     Copyright (c) 1986,1990 by Borland International Inc.
  5.     Alle Rechte vorbehalten.
  6. */
  7.  
  8. #include <errno.h>
  9. #include <string.h>
  10. #include <dos.h>
  11. #include <stdio.h>
  12.  
  13. int    optind    = 1;    /* Index: welches Argument ist das nächste */
  14. char   *optarg;        /* Zeiger auf das Argument der akt. Option */
  15. int    opterr    = 1;    /* erlaubt Fehlermeldungen */
  16.  
  17. static    char   *letP = NULL;    /* Speichert den Ort des Zeichens der
  18.                 /* nächsten Option */
  19. static    char    SW = 0;        /* DOS-Schalter, entweder '-' oder '/' */
  20.  
  21. /*
  22.   Analysiert die Kommandozeilen-Option, System V-Stil.
  23.  
  24.   Standard-Syntax der Optionen ist:
  25.  
  26.     option ::= SW [optLetter]* [argLetter space* argument]
  27.  
  28.   wobei
  29.     - SW ist entweder '/' oder '-', je nach dem aktuellen Wert des
  30.       MSDOS-Schalters (int 21h function 37h).
  31.     - vor optLetter oder argLetter steht niemals ein Leerzeichen.
  32.     - opt/argLetter sind ausschließlich alphabetische Zeichen.
  33.     - optLetters müssen zu Werten in optionS passen.
  34.     - argLetters stehen, gefolgt von ':', in optionS.
  35.     - Argument ist jeder mit Whitespaces begrenzter String. Beachten Sie,
  36.       daß das auch das SW-Zeichen einschließen kann.
  37.     - Groß- und Kleinschreibung wird unterschieden.
  38.  
  39.   In der Kommandozeile können mehrere mit SW beginnende Gruppen von Optionen
  40.   stehen; sie müssen aber vor allen Argmenten erscheinen, die keine SW-
  41.   Optionen sind. Options- und Argumentbuchstaben können sich wiederholen, es
  42.   ist Sache des Aufrufenden zu entscheiden, ob dies ein Fehler ist.
  43.  
  44.   Wenn SW alleine (als letztes Argument) auftritt, dann ist das ein Fehler.
  45.   Die Zeichenfolge SWSW ("--" oder "//") bewirkt, daß sie selbst und alle fol-
  46.   genden Zeichen in der Zeile ignoriert werden (erlaubt Argumente mit einem
  47.   Schalterzeichen beginnend, die nicht Optionen sind).
  48.  
  49.   Über den String *optionS werden gültige Optionen/Argumente erkannt. Den
  50.   argLetters folgt ein ':'. Getopt () gibt den Wert des Buchstabens der
  51.   Option zurück oder EOF, wenn keine weiteren Optionen in der Kommandozeile
  52.   stehen.Wenn die Option ein argLetter ist, dann zeigt optarg (global) auf
  53.   den Argumentstring (Whitespaces werden übergangen).
  54.  
  55.   Optind wird mit 1 initialisiert und zeigt immer als Index auf das nächste
  56.   Argument von argv[], das getopt noch nicht verarbeitet hat. Beachten Sie,
  57.   daß optind auf das nächste Argument zeigt, bevor getopt() EOF zurückgibt.
  58.  
  59.   Wenn ein Fehler auftritt (wenn SW einem unbekannten Buchstaben vorausgeht),
  60.   gibt getopt() ein '?' zurück. Normalerweise wird mit perror() eine Fehler-
  61.   meldung ausgegeben. Die Fehlermeldung wird nicht gedruckt, wenn die
  62.   globale Variable opterror vor dem Aufruf von getopt() mit False (Null)
  63.   initialisiert ist.
  64.  
  65.   Beispiel: Wenn der MSDOS-Schalter '/' verwendet wird (das normale MSDOS-
  66.   Zeichen) und folgende Parameter übergeben werden
  67.  
  68.     *optionS == "A:F:PuU:wXZ:"
  69.  
  70.   dann sind 'P', 'u', 'w' und 'X' Optionen, und  'F', 'U', 'Z' folgen
  71.   Argumente. Hier eine gültige Kommandozeile:
  72.  
  73.     aCommand  /uPFPi /X /A L someFile
  74.  
  75.   wobei:
  76.     - 'u' und 'P' sind Optionen ohne Argumente.
  77.     - 'F' hat das Argument "Pi".
  78.     - 'X' ist eine isolierte Option.
  79.     - 'A' hat das Argument "L".
  80.     - "someFile" ist keine Option und beendet getOpt. Der Aufrufende kann
  81.       übriggebliebene Argumente mit argv-Zeigern abfragen.
  82. */
  83.  
  84. int    getopt(int argc, char *argv[], char *optionS)
  85. {
  86.     unsigned char ch;
  87.     char *optP;
  88.  
  89.     if (SW == 0) {
  90.         /* SW mit DOS-Aufruf 0x37 lesen */
  91.         _AX = 0x3700;
  92.         geninterrupt(0x21);
  93.         SW = _DL;
  94.     }
  95.  
  96.     if (argc > optind) {
  97.         if (letP == NULL) {
  98.             if ((letP = argv[optind]) == NULL || 
  99.                 *(letP++) != SW)  goto gopEOF;
  100.             if (*letP == SW) {
  101.                 optind++;  goto gopEOF;
  102.             }
  103.         }
  104.         if (0 == (ch = *(letP++))) {
  105.             optind++;  goto gopEOF;
  106.         }
  107.         if (':' == ch  ||  (optP = strchr(optionS, ch)) == NULL)  
  108.             goto gopError;
  109.         if (':' == *(++optP)) {
  110.             optind++;
  111.             if (0 == *letP) {
  112.                 if (argc <= optind)  goto  gopError;
  113.                 letP = argv[optind++];
  114.             }
  115.             optarg = letP;
  116.             letP = NULL;
  117.         } else {
  118.             if (0 == *letP) {
  119.                 optind++;
  120.                 letP = NULL;
  121.             }
  122.             optarg = NULL;
  123.         }
  124.         return ch;
  125.     }
  126. gopEOF:
  127.     optarg = letP = NULL;  
  128.     return EOF;
  129.  
  130. gopError:
  131.     optarg = NULL;
  132.     errno  = EINVAL;
  133.     if (opterr)
  134.         perror ("Kommandozeilen-Option lesen");
  135.     return ('?');
  136. }
  137.  
  138.