Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/packages/uucpbb/src/getopt.c @ 2855:e126b9acab32 lwtools-port
rules.mak: Do not hardcode path for "echo"
It is basically the only tool with full path here and I don't see any
reason for it. We don't use special echo options that would fail
on the shell built-in echo.
Also don't hardcode path for losetup. sudo should make sure you
have the relevant location in your path, and that the path is sanitized,
otherwise your sudo setup is broken.
author | Tormod Volden <debian.tormod@gmail.com> |
---|---|
date | Sat, 13 Jul 2013 11:30:31 +0200 |
parents | a51439f6b206 |
children |
line wrap: on
line source
/****************************************************************************** From: The C Users Journal - June 1991 p.75-87 New GETOPT(3) getopt() Function GETOPT gets the next option letter from the command line. GETOPT is an enhanced version of the C library function, GETOPT(3). Innvocation: option = getopt (argc, argv, optstring); where <argc> is the number of arguments in the argument value array. <argv> is the argument value array, i.e., an array of pointers to the "words" extracted from the command line. <optstring> is the set of recognized options. Each character in the string is a legal option; any other characters encountered as an option in the command line is an illegal option and an error message is displayed. If a character is followed by a colon in OPTSTRING, the option expects an argument. <option> returns the next option letter from the command line. If the option expects an argument, OPTARG is set to point to the argument. '?' is returned in the cases of an illegal option letter or a missing option argument. Constant NONOPT is returned if a non-option argument is encountered or the command line scan is complete (also see OPTARG below for both cases.) Public Variables: OPTARG - returns the text of an option's argument or of a non-option argument. NULL is returned if an option has no argument or if the command line scan is complete. For illegal options or missing option arguments, OPTARG returns a pointer to the trailing portion of the defective ARGV. OPTERR - controls whether or not GETOPT prints out an error message upon detecting an illegal option or a missing option argument. A non-zero value enables error messages; zero disables them. OPTIND - is the index in ARGV of the command line argument that GETOPT will examine next. GETOPT recognizes changes to this variable. Arguments can be skipped by incrementing OPTIND outside of GETOPT and the command line scan can be restarted by resetting OPTIND to either 0 or 1. **************************************************************************/ #include <stdio.h> /* standard I/O definitions */ #ifdef _UCC #undef USE_INDEX /* Set to 1 if your C library uses */ #else /* "index" instead of "strchr" */ #define USE_INDEX 1 #endif #ifdef _UCC #include <string.h> #endif #ifdef USE_INDEX #include <string.h> /* C library string functions */ #define strchr index #else #include <string.h> /* C library string functions */ #endif #include "getopt.h" /* GETOPT(3) definitions */ /* Public variables */ char *optarg = NULL; int opterr = -1, optind = 0; /* Private variables */ static int end_optind = 0, last_optind = 0, offset_in_group = 1; int getopt (argc, argv, optstring) int argc; char **argv; char *optstring; { /* Local variables */ char *group, option, *s; /* Did the caller restart or advance the scan by modifying OPTIND? */ if (optind <= 0) { end_optind = 0; last_optind = 0; optind = 1; } if (optind != last_optind) offset_in_group = 1; /************************************************************************* Scan the command line and return the next option or, if none, the next non-option argument. At the start of each loop iteration, OPTIND is the index of the command line argument currently under examination and OFFSET_IN_GROUP is the offset within the current ARGV string of the next option (i.e. to be examined in this iteration.) ************************************************************************/ for (option = ' ', optarg = NULL; optind < argc; optind++, offset_in_group = 1, option = ' ') { group = argv[optind]; /* Is this a non-option argument? If it is and it's the same one GETOPT returned on the last call, then loop and try the next command line argument. If it's a new, non-option argument, then return the argument to the calling routine. */ if ( (group[0] != '-') || ((end_optind > 0) && (optind > end_optind))) { if (optind == last_optind) continue; optarg = group; /* Return NONOPT and argument */ break; } /* Are we at the end of the current options group? If so, loop and try the next command line argument. */ if (offset_in_group >= strlen (group)) continue; /* If the current option is the end-of-option indicator, remember its position and move on to the next command line argument. */ option = group[offset_in_group++]; if (option == '-') { end_optind = optind; /* Mark end-of-options positon */ continue; } /* If the current option is an illegal option, print an error message and return '?' to the calling routine. */ s = strchr (optstring, option); if (s == NULL) { if (opterr) fprintf (stderr, "%s: illegal option -- %c\n", argv[0], option); option = '?'; optarg = &group[offset_in_group-1]; break; } /* Does the option expect an argument? If yes, return the option and its argument to the calling routine. The option's argument may be flush up against the option (i.e., the argument is the remainder of the current ARGV) or it may be separated from the option by white space (i.e., the argument is the whole of the next ARGV). */ if (*++s == ':') { if (offset_in_group < strlen (group)) { optarg = &group[offset_in_group]; offset_in_group = strlen (group); } else { if ((++optind < argc) && (*argv[optind] != '-')) { optarg = argv[optind]; } else { if (opterr) fprintf (stderr, "%s: option requires an argument -- %c\n", argv[0], option); option = '?'; optarg = &group[offset_in_group-1]; offset_in_group = 1; } } break; } /* It must be a single-letter option without an argument */ break; } /* Return the option and (optionally) its argument */ last_optind = optind; return ((option == ' ') ? NONOPT : (int) option); } /* End of file */