non-AT&T implementations of frexp.c in machine/gen/frexp.c
[unix-history] / usr / src / lib / libc / stdlib / getopt.c
index 48df549..a184fb1 100644 (file)
@@ -1,14 +1,17 @@
 /*
 /*
- * Copyright (c) 1985 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getopt.c   4.4 (Berkeley) %G%";
-#endif LIBC_SCCS and not lint
+static char sccsid[] = "@(#)getopt.c   4.13 (Berkeley) %G%";
+#endif /* LIBC_SCCS and not lint */
 
 #include <stdio.h>
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
 /*
  * get option letter from argument vector
 
 /*
  * get option letter from argument vector
@@ -18,40 +21,49 @@ int opterr = 1,             /* if error message should be printed */
        optopt;                 /* character checked for validity */
 char   *optarg;                /* argument associated with option */
 
        optopt;                 /* character checked for validity */
 char   *optarg;                /* argument associated with option */
 
-#define BADCH  (int)'?'
-#define EMSG   ""
-#define tell(s)        { \
-       if (opterr) { \
-               fputs(*nargv, stderr); \
-               fputs(s, stderr); \
-               fputc(optopt, stderr); \
-               fputc((int)'\n', stderr); \
-       } \
-       return(BADCH); \
-}
+#define        BADCH   (int)'?'
+#define        EMSG    ""
 
 
+int
 getopt(nargc, nargv, ostr)
 getopt(nargc, nargv, ostr)
-       int     nargc;
-       char    **nargv, *ostr;
+       int nargc;
+       char * const *nargv;
+       const char *ostr;
 {
 {
-       static char     *place = EMSG;          /* option letter processing */
-       register char   *oli;                   /* option letter list index */
-       char    *index();
+       static char *place = EMSG;              /* option letter processing */
+       register char *oli;                     /* option letter list index */
+       char *p;
 
        if (!*place) {                          /* update scanning pointer */
 
        if (!*place) {                          /* update scanning pointer */
-               if (optind >= nargc || *(place = nargv[optind]) != '-' ||
-                   !*++place)
+               if (optind >= nargc || *(place = nargv[optind]) != '-') {
+                       place = EMSG;
                        return(EOF);
                        return(EOF);
-               if (*place == '-') {            /* found "--" */
+               }
+               if (place[1] && *++place == '-') {      /* found "--" */
                        ++optind;
                        ++optind;
+                       place = EMSG;
                        return(EOF);
                }
        }                                       /* option letter okay? */
        if ((optopt = (int)*place++) == (int)':' ||
            !(oli = index(ostr, optopt))) {
                        return(EOF);
                }
        }                                       /* option letter okay? */
        if ((optopt = (int)*place++) == (int)':' ||
            !(oli = index(ostr, optopt))) {
+               /*
+                * if the user didn't specify '-' as an option,
+                * assume it means EOF.
+                */
+               if (optopt == (int)'-')
+                       return(EOF);
                if (!*place)
                        ++optind;
                if (!*place)
                        ++optind;
-               tell(": illegal option -- ");
+               if (opterr) {
+                       if (!(p = rindex(*nargv, '/')))
+                               p = *nargv;
+                       else
+                               ++p;
+                       (void)fprintf(stderr, "%s: illegal option -- %c\n",
+                           p, optopt);
+               }
+               return(BADCH);
        }
        if (*++oli != ':') {                    /* don't need argument */
                optarg = NULL;
        }
        if (*++oli != ':') {                    /* don't need argument */
                optarg = NULL;
@@ -63,7 +75,15 @@ getopt(nargc, nargv, ostr)
                        optarg = place;
                else if (nargc <= ++optind) {   /* no arg */
                        place = EMSG;
                        optarg = place;
                else if (nargc <= ++optind) {   /* no arg */
                        place = EMSG;
-                       tell(": option requires an argument -- ");
+                       if (!(p = rindex(*nargv, '/')))
+                               p = *nargv;
+                       else
+                               ++p;
+                       if (opterr)
+                               (void)fprintf(stderr,
+                                   "%s: option requires an argument -- %c\n",
+                                   p, optopt);
+                       return(BADCH);
                }
                else                            /* white space */
                        optarg = nargv[optind];
                }
                else                            /* white space */
                        optarg = nargv[optind];