From 9c45cd00cc6697c94f41939f754ab1ac19b8672e Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Thu, 28 Apr 2005 12:59:29 +0000 Subject: [PATCH] Added free getopt to contrib. --- CHANGES | 5 ++ configure.ad | 10 +++- lib/contrib/Makefile.am | 4 +- lib/contrib/getopt.c | 70 +++++++++++++++++++++++++++ lib/contrib/getopt.h | 15 ++++++ lib/silcutil/tests/test_silcstrutil.c | 30 +++++++++--- 6 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 lib/contrib/getopt.c create mode 100644 lib/contrib/getopt.h diff --git a/CHANGES b/CHANGES index d9ab9bd4..24cf42f7 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +Thu Apr 28 15:57:37 EEST 2005 Pekka Riikonen + + * 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 * A comma in invite/ban string is invalid, check for it. diff --git a/configure.ad b/configure.ad index 84006552..26f0dbac 100644 --- a/configure.ad +++ b/configure.ad @@ -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 - diff --git a/lib/contrib/Makefile.am b/lib/contrib/Makefile.am index 26ff5751..2ce30bfe 100644 --- a/lib/contrib/Makefile.am +++ b/lib/contrib/Makefile.am @@ -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 index 00000000..086cbb09 --- /dev/null +++ b/lib/contrib/getopt.c @@ -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 index 00000000..2ef66b21 --- /dev/null +++ b/lib/contrib/getopt.h @@ -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 */ diff --git a/lib/silcutil/tests/test_silcstrutil.c b/lib/silcutil/tests/test_silcstrutil.c index f7b4faf8..dcf94662 100644 --- a/lib/silcutil/tests/test_silcstrutil.c +++ b/lib/silcutil/tests/test_silcstrutil.c @@ -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 */ -- 2.24.0