206 lines
3.5 KiB
C
206 lines
3.5 KiB
C
/*
|
|
* $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 -- %c\n",
|
|
argv[0],
|
|
optopt
|
|
);
|
|
}
|
|
|
|
return ('?');
|
|
|
|
} /* if */
|
|
|
|
search = strchr (optstring, optopt);
|
|
|
|
if (search == NULL)
|
|
{
|
|
if (opterr)
|
|
{
|
|
fprintf
|
|
(
|
|
stderr,
|
|
"%s: illegal option -- %c\n",
|
|
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 -- %c\n",
|
|
argv[0],
|
|
optopt
|
|
);
|
|
|
|
} /* if */
|
|
|
|
if (optstring[0] == ':')
|
|
{
|
|
return (':');
|
|
}
|
|
else
|
|
{
|
|
return ('?');
|
|
}
|
|
|
|
} /* if */
|
|
|
|
else
|
|
{
|
|
optind++;
|
|
}
|
|
|
|
return (optopt);
|
|
|
|
} /* getopt () */
|