]> git.sur5r.net Git - openldap/commitdiff
add public domain getopt(3)
authorKurt Zeilenga <kurt@openldap.org>
Tue, 20 Oct 1998 19:48:10 +0000 (19:48 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 20 Oct 1998 19:48:10 +0000 (19:48 +0000)
libraries/liblutil/getopt.c [new file with mode: 0644]

diff --git a/libraries/liblutil/getopt.c b/libraries/liblutil/getopt.c
new file mode 100644 (file)
index 0000000..a19d9ba
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+       getopt.c
+
+       modified public-domain AT&T getopt(3)
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef _POSIX_SOURCE
+#      include <unistd.h>
+#else
+#      define STDERR_FILENO 2
+#      ifdef __STDC__
+               extern int write (int fildes, char * buf, unsigned nbyte);
+#      else
+               extern int write ();
+#      endif
+#endif
+
+int opterr = 1;
+int optind = 1;
+int optopt;
+char * optarg;
+
+#ifdef __STDC__
+       static void ERR (char ** argv, char * s, char c)
+#else
+       static void ERR (argv, s, c)
+       char ** argv, * s, c;
+#endif
+{
+       char errbuf[2];
+
+#ifdef DF_TRACE_DEBUG
+printf("DF_TRACE_DEBUG:        static void ERR () in getopt.c\n");
+#endif
+       if (opterr)
+       {
+               errbuf[0] = c;
+               errbuf[1] = '\n';
+               (void) write(STDERR_FILENO,argv[0],strlen(argv[0]));
+               (void) write(STDERR_FILENO,s,strlen(s));
+               (void) write(STDERR_FILENO,errbuf,sizeof errbuf);
+       }
+}
+
+#ifdef __STDC__
+       int getopt (int argc, char ** argv, char * opts)
+#else
+       int getopt (argc, argv, opts)
+       int argc;
+       char ** argv, * opts;
+#endif
+{
+       static int sp = 1, error = (int) '?';
+       static char sw = '-', eos = '\0', arg = ':';
+       register char c, * cp;
+
+#ifdef DF_TRACE_DEBUG
+printf("DF_TRACE_DEBUG:        int getopt () in getopt.c\n");
+#endif
+       if (sp == 1)
+               if (optind >= argc || argv[optind][0] != sw
+               || argv[optind][1] == eos)
+                       return EOF;
+               else if (strcmp(argv[optind],"--") == 0)
+               {
+                       optind++;
+                       return EOF;
+               }
+       c = argv[optind][sp];
+       optopt = (int) c;
+       if (c == arg || (cp = strchr(opts,c)) == NULL)
+       {
+               ERR(argv,": illegal option--",c);
+               if (argv[optind][++sp] == eos)
+               {
+                       optind++;
+                       sp = 1;
+               }
+               return error;
+       }
+       else if (*++cp == arg)
+       {
+               if (argv[optind][sp + 1] != eos)
+                       optarg = &argv[optind++][sp + 1];
+               else if (++optind >= argc)
+               {
+                       ERR(argv,": option requires an argument--",c);
+                       sp = 1;
+                       return error;
+               }
+               else
+                       optarg = argv[optind++];
+               sp = 1;
+       }
+       else
+       {
+               if (argv[optind][++sp] == eos)
+               {
+                       sp = 1;
+                       optind++;
+               }
+               optarg = NULL;
+       }
+       return (int) c;
+}