GETOPT.C
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:4k
- /*
- * $Header$
- *
- * Copyright (C) 1994 Arno Schaefer
- *
- * AU: Auswertung der Kommandozeile, der POSIX-Version von getopt ()
- * nachempfunden.
- *
- * PO: ANSI C
- */
-
- #include <stdio.h>
- #include <string.h>
-
- #include "getopt.h"
-
-
- /* Globale Variablen */
-
- char *optarg;
- int optind = 1;
- int opterr = 1;
- int optopt;
-
- static char *nextarg = NULL;
-
-
- /* Funktion */
-
- int getopt (int argc, char *argv[], char *optstring)
-
- /*
- * AU: Auswertung der Kommandozeile
- *
- * VB: argc und argv sind die Parameter, die an main () uebergeben werden.
- * optstring ist ein String, der die Zeichen enthaelt, die als
- * Optionen erkannt werden. Wenn ein Zeichen von einem Doppelpunkt
- * gefolgt wird, hat die Option ein Argument, das direkt auf das Zeichen
- * folgt oder durch Space davon getrennt ist. Gueltige Optionszeichen
- * sind alle druckbaren Zeichen ausser '?', ' ' und ':'.
- *
- * optind ist der Index auf das naechste Element von argv[], das
- * bearbeitet wird.
- *
- * opterr ist ein Flag, das festlegt, ob bei Fehlern Fehlermeldungen
- * ausgegeben werden.
- *
- * optarg ist ein Zeiger auf das Argument, wenn eine Option ein
- * Argument hat.
- *
- * optopt enthaelt bei Fehlern das Optionszeichen, das den Fehler aus-
- * geloest hat.
- *
- * NB: Rueckgabewert ist das jeweils naechste Optionszeichen, oder -1 am
- * Ende der Optionsliste.
- *
- * Die Optionsliste ist zu Ende, wenn argv[optind] NULL ist, oder
- * argv[optind] nicht mit '-' (oder '/') beginnt, oder argv[optind]
- * ein einzelnes "-" ist. In diesem Fall wird optind nicht erhoeht.
- * Das Ende der Optionsliste kann mit "--" erzwungen werden, dann ist
- * argv[optind] das erste Argument nach "--".
- *
- * FB: Ein '?' wird zurueckgegeben, wenn ein Optionszeichen nicht in
- * optstring enthalten war oder ein ungueltiges Optionszeichen
- * uebergeben wurde ('?' oder ':'). Ausserdem bei einem fehlenden
- * Argument, wenn das erste Zeichen von optstring kein ':' ist.
- *
- * Ein ':' wird zurueckgegeben bei einem fehlenden Argument, wenn
- * das erste Zeichen von optstring ein ':' ist.
- */
-
- {
- char *search;
-
- optarg = NULL;
-
- if (nextarg == NULL)
- {
- nextarg = argv[optind];
-
- if (nextarg == NULL)
- {
- return (-1);
- }
-
- #ifdef __MSDOS__
- if (*nextarg != '-' && *nextarg != '/')
- #else
- if (*nextarg != '-')
- #endif
- {
- return (-1);
- }
-
- nextarg++;
-
- } /* if */
-
- optopt = *nextarg++;
-
- if (optopt == 0)
- {
- return (-1);
- }
-
- optind++;
-
- if (optopt == '-' && *nextarg == 0)
- {
- return (-1);
- }
-
- if (optopt == ':' || optopt == '?')
- {
- if (opterr)
- {
- fprintf
- (
- stderr,
- "%s: illegal option -- %cn",
- argv[0],
- optopt
- );
- }
-
- return ('?');
-
- } /* if */
-
- search = strchr (optstring, optopt);
-
- if (search == NULL)
- {
- if (opterr)
- {
- fprintf
- (
- stderr,
- "%s: illegal option -- %cn",
- argv[0],
- optopt
- );
- }
-
- return ('?');
-
- } /* if */
-
- if (*nextarg == 0)
- {
- nextarg = NULL;
- }
-
- if (search[1] != ':')
- {
- if (nextarg != NULL)
- {
- optind--;
- }
-
- return (optopt);
- }
-
- if (nextarg != NULL)
- {
- optarg = nextarg;
- nextarg = NULL;
- return (optopt);
- }
-
- optarg = argv[optind];
-
- if (optind == argc)
- {
- if (opterr)
- {
- fprintf
- (
- stderr,
- "%s: option requires an argument -- %cn",
- argv[0],
- optopt
- );
-
- } /* if */
-
- if (optstring[0] == ':')
- {
- return (':');
- }
- else
- {
- return ('?');
- }
-
- } /* if */
-
- else
- {
- optind++;
- }
-
- return (optopt);
-
- } /* getopt () */