Added free getopt to contrib.
authorPekka Riikonen <priikone@silcnet.org>
Thu, 28 Apr 2005 12:59:29 +0000 (12:59 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Thu, 28 Apr 2005 12:59:29 +0000 (12:59 +0000)
CHANGES
configure.ad
lib/contrib/Makefile.am
lib/contrib/getopt.c [new file with mode: 0644]
lib/contrib/getopt.h [new file with mode: 0644]
lib/silcutil/tests/test_silcstrutil.c

diff --git a/CHANGES b/CHANGES
index d9ab9bd44ea121541af5f3d0eab8a184209f1eca..24cf42f71f430c29946b6eed93ce8fc12c9d9cef 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+Thu Apr 28 15:57:37 EEST 2005  Pekka Riikonen <priikone@silcnet.org>
+
+       * Added lib/contrib/getopt.[ch] for platforms that don't
+         have it (it is not GPL implementation).
+
 Wed Apr 27 11:49:41 EEST 2005  Pekka Riikonen <priikone@silcnet.org>
 
        * A comma in invite/ban string is invalid, check for it.
index 84006552c1f9941e5e2850ac4b07dd01b7acca8e..26f0dbace8dc0524532a4e20aa6d076c8dc5fe06 100644 (file)
@@ -166,6 +166,13 @@ AC_CHECK_FUNC(getopt_long,
   ], have_getopt_long=0
 )
 
+AC_CHECK_FUNC(getopt,
+  [
+    AC_DEFINE([HAVE_GETOPT], [], [HAVE_GETOPT])
+    have_getopt=1
+  ], have_getopt=0
+)
+
 ##
 ##  Enable/disable checking
 ##
@@ -413,7 +420,7 @@ AC_DEFINE_UNQUOTED([SILC_DOCDIR], "$DOCDIR", [SILC_DOCDIR])
 compile_libs=true
 
 #ifndef SILC_DIST_TOOLKIT
-AC_ARG_WITH(silc-includes, 
+AC_ARG_WITH(silc-includes,
   [  --with-silc-includes=DIR SILC Toolkit includes [search in DIR]],
   [ac_silc_includes="$withval"], [ac_silc_includes="no"])
 AC_ARG_WITH(silc-libs,
@@ -1177,4 +1184,3 @@ echo " Debugging enabled .............: $summary_debug"
 echo ""
 echo "Compile the sources with 'make' or 'gmake' command."
 #endif SILC_DIST_COMPILER
-
index 26ff5751b0377537da03249da35bdb72dfde2866..2ce30bfe18add4ad59eb18c7924febd0618b6f1b 100644 (file)
@@ -28,9 +28,9 @@ endif
 STRINGPREP = nfkc.c rfc3454.c stringprep.c
 
 if SILC_WIN32
-libcontrib_la_SOURCES = $(STRINGPREP)
+libcontrib_la_SOURCES = getopt.c $(STRINGPREP)
 else
-libcontrib_la_SOURCES = $(STRINGPREP) $(REGEX)
+libcontrib_la_SOURCES = getopt.c $(STRINGPREP) $(REGEX)
 endif
 
 EXTRA_DIST = *.c *.h
diff --git a/lib/contrib/getopt.c b/lib/contrib/getopt.c
new file mode 100644 (file)
index 0000000..086cbb0
--- /dev/null
@@ -0,0 +1,70 @@
+/* Our own convenience getopt.  Public Domain. */
+#include "silcincludes.h"
+
+#ifndef SILC_EPOC
+#if !defined(HAVE_GETOPT) && !defined(HAVE_GETOPT_H)
+int    opterr = 1;
+int    optind = 1;
+int    optopt;
+char   *optarg;
+
+#define GETOPT_ERR(s, c)                       \
+do {                                           \
+  if (opterr) {                                        \
+    char errbuf[2];                            \
+    errbuf[0] = c;                             \
+    errbuf[1] = '\n';                          \
+    (void) write(2, argv[0], strlen(argv[0])); \
+    (void) write(2, s, strlen(s));             \
+    (void) write(2, errbuf, 2);                        \
+  }                                            \
+} while(0)
+
+int getopt(int argc, char * const *argv, const char *optstring)
+{
+  static int sp = 1;
+  register int c;
+  register char *cp;
+
+  if (sp == 1) {
+    if (optind >= argc ||
+       argv[optind][0] != '-' || argv[optind][1] == '\0') {
+      return EOF;
+    } else if (strcmp(argv[optind], "--") == 0) {
+      optind++;
+      return EOF;
+    }
+  }
+  optopt = c = argv[optind][sp];
+
+  if (c == ':' || (cp=strchr(optstring, c)) == NULL) {
+    GETOPT_ERR(": illegal option -- ", c);
+    if (argv[optind][++sp] == '\0') {
+      optind++;
+      sp = 1;
+    }
+    return '?';
+  }
+
+  if (*++cp == ':') {
+    if (argv[optind][sp+1] != '\0')
+      optarg = &argv[optind++][sp+1];
+    else if (++optind >= argc) {
+      GETOPT_ERR(": option requires an argument -- ", c);
+      sp = 1;
+      return '?';
+    } else
+      optarg = argv[optind++];
+    sp = 1;
+  } else {
+    if (argv[optind][++sp] == '\0') {
+      sp = 1;
+      optind++;
+    }
+    optarg = NULL;
+  }
+
+  return c;
+}
+#endif /* !HAVE_GETOPT && !HAVE_GETOPT_H */
+#endif /* !SILC_EPOC */
diff --git a/lib/contrib/getopt.h b/lib/contrib/getopt.h
new file mode 100644 (file)
index 0000000..2ef66b2
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef GETOPT_H
+#define GETOPT_H
+
+#ifndef SILC_EPOC
+#if !defined(HAVE_GETOPT) && !defined(HAVE_GETOPT_H)
+/* Our own convenience getopt. */
+extern int opterr;
+extern int optind;
+extern int optopt;
+extern char *optarg;
+int getopt(int argc, char * const *argv, const char *optstring);
+#endif /* !HAVE_GETOPT && !HAVE_GETOPT_H */
+#endif /* !SILC_EPOC */
+
+#endif /* GETOPT_H */
index f7b4faf81078facbe9bf9244cad13d352080ffe5..dcf9466273040b88205fb2f287ca565101e954d2 100644 (file)
@@ -52,12 +52,30 @@ int main(int argc, char **argv)
 {
   bool success = FALSE;
   unsigned char *s1, *s2, *s3, *s4;
-  int l;
-
-  if (argc > 1 && !strcmp(argv[1], "-d")) {
-    silc_debug = 1;
-    silc_debug_hexdump = 1;
-    silc_log_set_debug_string("*strutil*");
+  int l, opt;
+
+  while ((opt = getopt(argc, argv, "hVd")) != EOF) {
+      switch(opt) {
+        case 'h':
+          printf("usage: test_silcstrutil\n");
+         exit(0);
+          break;
+        case 'V':
+          printf("Secure Internet Live Conferencing\n");
+          exit(0);
+          break;
+        case 'd':
+          silc_debug = TRUE;
+         silc_debug_hexdump = TRUE;
+          if (optarg)
+            silc_log_set_debug_string(optarg);
+         else
+           silc_log_set_debug_string("*strutil*");
+          break;
+       default:
+         exit(1);
+         break;
+      }
   }
 
   /* Failure tests */