home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / dosutils / fips15c / source / getopt.c < prev    next >
C/C++ Source or Header  |  1997-12-20  |  3KB  |  206 lines

  1. /*
  2.  *  $Header$
  3.  *
  4.  *  Copyright (C) 1994 Arno Schaefer
  5.  *
  6.  *  AU: Auswertung der Kommandozeile, der POSIX-Version von getopt ()
  7.  *    nachempfunden.
  8.  *
  9.  *  PO: ANSI C
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14.  
  15. #include "getopt.h"
  16.  
  17.  
  18. /* Globale Variablen */
  19.  
  20. char *optarg;
  21. int optind = 1;
  22. int opterr = 1;
  23. int optopt;
  24.  
  25. static char *nextarg = NULL;
  26.  
  27.  
  28. /* Funktion */
  29.  
  30. int getopt (int argc, char *argv[], char *optstring)
  31.  
  32. /*
  33.  *  AU: Auswertung der Kommandozeile
  34.  *
  35.  *  VB: argc und argv sind die Parameter, die an main () uebergeben werden.
  36.  *    optstring ist ein String, der die Zeichen enthaelt, die als
  37.  *    Optionen erkannt werden. Wenn ein Zeichen von einem Doppelpunkt
  38.  *    gefolgt wird, hat die Option ein Argument, das direkt auf das Zeichen
  39.  *    folgt oder durch Space davon getrennt ist. Gueltige Optionszeichen
  40.  *    sind alle druckbaren Zeichen ausser '?', ' ' und ':'.
  41.  *
  42.  *    optind ist der Index auf das naechste Element von argv[], das
  43.  *    bearbeitet wird.
  44.  *
  45.  *    opterr ist ein Flag, das festlegt, ob bei Fehlern Fehlermeldungen
  46.  *    ausgegeben werden.
  47.  *
  48.  *    optarg ist ein Zeiger auf das Argument, wenn eine Option ein
  49.  *    Argument hat.
  50.  *
  51.  *    optopt enthaelt bei Fehlern das Optionszeichen, das den Fehler aus-
  52.  *    geloest hat.
  53.  *
  54.  *  NB: Rueckgabewert ist das jeweils naechste Optionszeichen, oder -1 am
  55.  *    Ende der Optionsliste.
  56.  *
  57.  *    Die Optionsliste ist zu Ende, wenn argv[optind] NULL ist, oder
  58.  *    argv[optind] nicht mit '-' (oder '/') beginnt, oder argv[optind]
  59.  *    ein einzelnes "-" ist. In diesem Fall wird optind nicht erhoeht.
  60.  *    Das Ende der Optionsliste kann mit "--" erzwungen werden, dann ist
  61.  *    argv[optind] das erste Argument nach "--".
  62.  *
  63.  *  FB: Ein '?' wird zurueckgegeben, wenn ein Optionszeichen nicht in
  64.  *    optstring enthalten war oder ein ungueltiges Optionszeichen
  65.  *    uebergeben wurde ('?' oder ':'). Ausserdem bei einem fehlenden
  66.  *    Argument, wenn das erste Zeichen von optstring kein ':' ist.
  67.  *
  68.  *    Ein ':' wird zurueckgegeben bei einem fehlenden Argument, wenn
  69.  *    das erste Zeichen von optstring ein ':' ist.
  70.  */
  71.  
  72. {
  73.     char *search;
  74.  
  75.     optarg = NULL;
  76.     
  77.     if (nextarg == NULL)
  78.     {
  79.         nextarg = argv[optind];
  80.  
  81.         if (nextarg == NULL)
  82.         {
  83.             return (-1);
  84.         }
  85.  
  86. #ifdef __MSDOS__
  87.         if (*nextarg != '-' && *nextarg != '/')
  88. #else
  89.         if (*nextarg != '-')
  90. #endif
  91.         {
  92.             return (-1);
  93.         }
  94.  
  95.         nextarg++;
  96.  
  97.     } /* if */
  98.  
  99.     optopt = *nextarg++;
  100.  
  101.     if (optopt == 0)
  102.     {
  103.         return (-1);
  104.     }
  105.  
  106.     optind++;
  107.  
  108.     if (optopt == '-' && *nextarg == 0)
  109.     {
  110.         return (-1);
  111.     }
  112.  
  113.     if (optopt == ':' || optopt == '?')
  114.     {
  115.         if (opterr)
  116.         {
  117.             fprintf
  118.             (
  119.                 stderr,
  120.                 "%s: illegal option -- %c\n",
  121.                 argv[0],
  122.                 optopt
  123.             );
  124.         }
  125.  
  126.         return ('?');
  127.  
  128.     } /* if */
  129.  
  130.     search = strchr (optstring, optopt);
  131.  
  132.     if (search == NULL)
  133.     {
  134.         if (opterr)
  135.         {
  136.             fprintf
  137.             (
  138.                 stderr,
  139.                 "%s: illegal option -- %c\n",
  140.                 argv[0],
  141.                 optopt
  142.             );
  143.         }
  144.  
  145.         return ('?');
  146.  
  147.     } /* if */
  148.  
  149.     if (*nextarg == 0)
  150.     {
  151.         nextarg = NULL;
  152.     }
  153.  
  154.     if (search[1] != ':')
  155.     {
  156.         if (nextarg != NULL)
  157.         {
  158.             optind--;
  159.         }
  160.  
  161.         return (optopt);
  162.     }
  163.  
  164.     if (nextarg != NULL)
  165.     {
  166.         optarg = nextarg;
  167.         nextarg = NULL;
  168.         return (optopt);
  169.     }
  170.  
  171.     optarg = argv[optind];
  172.  
  173.     if (optind == argc)
  174.     {
  175.         if (opterr)
  176.         {
  177.             fprintf
  178.             (
  179.                 stderr,
  180.                 "%s: option requires an argument -- %c\n",
  181.                 argv[0],
  182.                 optopt
  183.             );
  184.  
  185.         } /* if */
  186.  
  187.         if (optstring[0] == ':')
  188.         {
  189.             return (':');
  190.         }
  191.         else
  192.         {
  193.             return ('?');
  194.         }
  195.  
  196.     } /* if */
  197.  
  198.     else
  199.     {
  200.         optind++;
  201.     }
  202.  
  203.     return (optopt);
  204.  
  205. } /* getopt () */
  206.