Browse Source

Merge branch 'upstream_ccan' into bfgminer

Luke Dashjr 12 years ago
parent
commit
0ff4ca362d
48 changed files with 60 additions and 4840 deletions
  1. 1 1
      .gitignore
  2. 3 0
      .gitmodules
  3. 5 4
      Makefile.am
  4. 1 0
      ccan-upstream
  5. 14 0
      ccan.bfg/Makefile.am
  6. 0 4
      ccan/Makefile.am
  7. 0 165
      ccan/compiler/LICENSE
  8. 0 73
      ccan/compiler/_info
  9. 0 225
      ccan/compiler/compiler.h
  10. 0 31
      ccan/compiler/test/compile_fail-printf.c
  11. 0 24
      ccan/compiler/test/run-is_compile_constant.c
  12. 0 339
      ccan/opt/LICENSE
  13. 0 76
      ccan/opt/_info
  14. 0 203
      ccan/opt/helpers.c
  15. 0 266
      ccan/opt/opt.c
  16. 0 357
      ccan/opt/opt.h
  17. 0 139
      ccan/opt/parse.c
  18. 0 28
      ccan/opt/private.h
  19. 0 22
      ccan/opt/test/compile_ok-const-arg.c
  20. 0 153
      ccan/opt/test/run-checkopt.c
  21. 0 58
      ccan/opt/test/run-correct-reporting.c
  22. 0 449
      ccan/opt/test/run-helpers.c
  23. 0 97
      ccan/opt/test/run-iter.c
  24. 0 42
      ccan/opt/test/run-no-options.c
  25. 0 121
      ccan/opt/test/run-usage.c
  26. 0 306
      ccan/opt/test/run.c
  27. 0 119
      ccan/opt/test/utils.c
  28. 0 19
      ccan/opt/test/utils.h
  29. 0 120
      ccan/opt/usage.c
  30. 0 510
      ccan/typesafe_cb/LICENSE
  31. 0 160
      ccan/typesafe_cb/_info
  32. 0 32
      ccan/typesafe_cb/test/compile_fail-cast_if_type-promotable.c
  33. 0 36
      ccan/typesafe_cb/test/compile_fail-typesafe_cb-int.c
  34. 0 43
      ccan/typesafe_cb/test/compile_fail-typesafe_cb.c
  35. 0 52
      ccan/typesafe_cb/test/compile_fail-typesafe_cb_cast-multi.c
  36. 0 34
      ccan/typesafe_cb/test/compile_fail-typesafe_cb_cast.c
  37. 0 36
      ccan/typesafe_cb/test/compile_fail-typesafe_cb_postargs.c
  38. 0 37
      ccan/typesafe_cb/test/compile_fail-typesafe_cb_preargs.c
  39. 0 26
      ccan/typesafe_cb/test/compile_ok-typesafe_cb-NULL.c
  40. 0 58
      ccan/typesafe_cb/test/compile_ok-typesafe_cb-undefined.c
  41. 0 61
      ccan/typesafe_cb/test/compile_ok-typesafe_cb-vars.c
  42. 0 50
      ccan/typesafe_cb/test/compile_ok-typesafe_cb_cast.c
  43. 0 118
      ccan/typesafe_cb/test/run.c
  44. 0 142
      ccan/typesafe_cb/typesafe_cb.h
  45. 2 1
      configure.ac
  46. 0 1
      driver-opencl.c
  47. 5 1
      make-release
  48. 29 1
      miner.c

+ 1 - 1
.gitignore

@@ -42,7 +42,7 @@ ext_deps
 config.h.in
 config.h
 
-ccan/libccan.a
+ccan*/libccan.a
 lib/arg-nonnull.h
 lib/c++defs.h
 lib/libgnu.a

+ 3 - 0
.gitmodules

@@ -1,3 +1,6 @@
 [submodule "libblkmaker"]
 	path = libblkmaker
 	url = git://gitorious.org/bitcoin/libblkmaker.git
+[submodule "ccan"]
+	path = ccan-upstream
+	url = git://git.ozlabs.org/~ccan/ccan

+ 5 - 4
Makefile.am

@@ -26,15 +26,15 @@ dist_rpcexamples_DATA = \
 		  api-example.c \
                   api-example.py
 
-SUBDIRS		= lib ccan
+SUBDIRS		= lib ccan.bfg
 
 # Without a redirected rule, code depending on different lib/*.h files may try to build dependencies of that in parallel, which can fail
 lib/%: lib_directory
 	@test -e $@
 lib_directory:
 	$(MAKE) -C lib
-ccan/libccan.a:
-	$(MAKE) -C ccan $*
+ccan.bfg/libccan.a:
+	$(MAKE) -C ccan.bfg $*
 
 INCLUDES	= -fno-strict-aliasing
 
@@ -44,11 +44,12 @@ bfgminer_LDFLAGS	= $(PTHREAD_FLAGS)
 bfgminer_LDADD	= $(DLOPEN_FLAGS) @LIBCURL_LIBS@ @JANSSON_LIBS@ @PTHREAD_LIBS@ \
 		  @NCURSES_LIBS@ @PDCURSES_LIBS@ @WS2_LIBS@ \
 		  @UDEV_LIBS@ @LIBUSB_LIBS@ @MM_LIBS@ @RT_LIBS@ \
-		  @MATH_LIBS@ lib/libgnu.a ccan/libccan.a
+		  @MATH_LIBS@ lib/libgnu.a ccan.bfg/libccan.a
 bfgminer_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib @LIBUSB_CFLAGS@ @LIBCURL_CFLAGS@
 
 bfgminer_CPPFLAGS += -DCGMINER_PREFIX='"$(pkgdatadir)"'
 
+bfgminer_CPPFLAGS += -I$(top_srcdir)/ccan-upstream
 bfgminer_CPPFLAGS += @JANSSON_CFLAGS@
 bfgminer_CPPFLAGS += $(PTHREAD_FLAGS)
 bfgminer_CPPFLAGS += $(NCURSES_CPPFLAGS)

+ 1 - 0
ccan-upstream

@@ -0,0 +1 @@
+Subproject commit 7471ecd79174306ee976a4ecc09cc2b9ebb4b501

+ 14 - 0
ccan.bfg/Makefile.am

@@ -0,0 +1,14 @@
+noinst_LIBRARIES	= libccan.a
+
+libccan_a_SOURCES = \
+	../ccan-upstream/ccan/build_assert/build_assert.h  \
+	../ccan-upstream/ccan/cast/cast.h  \
+	../ccan-upstream/ccan/compiler/compiler.h  \
+	../ccan-upstream/ccan/opt/helpers.c  \
+	../ccan-upstream/ccan/opt/opt.c  \
+	../ccan-upstream/ccan/opt/opt.h  \
+	../ccan-upstream/ccan/opt/parse.c  \
+	../ccan-upstream/ccan/opt/private.h  \
+	../ccan-upstream/ccan/opt/usage.c  \
+	../ccan-upstream/ccan/typesafe_cb/typesafe_cb.h
+libccan_a_CPPFLAGS = -I$(top_srcdir)/ccan

+ 0 - 4
ccan/Makefile.am

@@ -1,4 +0,0 @@
-noinst_LIBRARIES	= libccan.a
-
-libccan_a_SOURCES	= compiler/compiler.h opt/helpers.c opt/opt.c opt/opt.h opt/parse.c opt/private.h opt/usage.c typesafe_cb/typesafe_cb.h
-libccan_a_CPPFLAGS	= -I$(top_srcdir)

+ 0 - 165
ccan/compiler/LICENSE

@@ -1,165 +0,0 @@
-		   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions. 
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version. 
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.

+ 0 - 73
ccan/compiler/_info

@@ -1,73 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option) any
- * later version.  See LICENSE for more details.
- */
-
-#include <string.h>
-#include <stdio.h>
-#include "config.h"
-
-/**
- * compiler - macros for common compiler extensions
- *
- * Abstracts away some compiler hints.  Currently these include:
- * - COLD
- *	For functions not called in fast paths (aka. cold functions)
- * - PRINTF_FMT
- *	For functions which take printf-style parameters.
- * - IDEMPOTENT
- *	For functions which return the same value for same parameters.
- * - NEEDED
- *	For functions and variables which must be emitted even if unused.
- * - UNNEEDED
- *	For functions and variables which need not be emitted if unused.
- * - UNUSED
- *	For parameters which are not used.
- * - IS_COMPILE_CONSTANT
- *	For using different tradeoffs for compiletime vs runtime evaluation.
- *
- * License: LGPL (3 or any later version)
- * Author: Rusty Russell <rusty@rustcorp.com.au>
- *
- * Example:
- *	#include <ccan/compiler/compiler.h>
- *	#include <stdio.h>
- *	#include <stdarg.h>
- *
- *	// Example of a (slow-path) logging function.
- *	static int log_threshold = 2;
- *	static void COLD PRINTF_FMT(2,3)
- *		logger(int level, const char *fmt, ...)
- *	{
- *		va_list ap;
- *		va_start(ap, fmt);
- *		if (level >= log_threshold)
- *			vfprintf(stderr, fmt, ap);
- *		va_end(ap);
- *	}
- *
- *	int main(int argc, char *argv[])
- *	{
- *		if (argc != 1) {
- *			logger(3, "Don't want %i arguments!\n", argc-1);
- *			return 1;
- *		}
- *		return 0;
- *	}
- */
-int main(int argc, char *argv[])
-{
-	/* Expect exactly one argument */
-	if (argc != 2)
-		return 1;
-
-	if (strcmp(argv[1], "depends") == 0) {
-		return 0;
-	}
-
-	return 1;
-}

+ 0 - 225
ccan/compiler/compiler.h

@@ -1,225 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option) any
- * later version.  See LICENSE for more details.
- */
-
-#ifndef CCAN_COMPILER_H
-#define CCAN_COMPILER_H
-#include "config.h"
-
-#ifndef COLD
-#if HAVE_ATTRIBUTE_COLD
-/**
- * COLD - a function is unlikely to be called.
- *
- * Used to mark an unlikely code path and optimize appropriately.
- * It is usually used on logging or error routines.
- *
- * Example:
- * static void COLD moan(const char *reason)
- * {
- *	fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno));
- * }
- */
-#define COLD __attribute__((cold))
-#else
-#define COLD
-#endif
-#endif
-
-#ifndef NORETURN
-#if HAVE_ATTRIBUTE_NORETURN
-/**
- * NORETURN - a function does not return
- *
- * Used to mark a function which exits; useful for suppressing warnings.
- *
- * Example:
- * static void NORETURN fail(const char *reason)
- * {
- *	fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno));
- *	exit(1);
- * }
- */
-#define NORETURN __attribute__((noreturn))
-#else
-#define NORETURN
-#endif
-#endif
-
-#ifndef PRINTF_FMT
-#if HAVE_ATTRIBUTE_PRINTF
-/**
- * PRINTF_FMT - a function takes printf-style arguments
- * @nfmt: the 1-based number of the function's format argument.
- * @narg: the 1-based number of the function's first variable argument.
- *
- * This allows the compiler to check your parameters as it does for printf().
- *
- * Example:
- * void PRINTF_FMT(2,3) my_printf(const char *prefix, const char *fmt, ...);
- */
-#define PRINTF_FMT(nfmt, narg) \
-	__attribute__((format(__printf__, nfmt, narg)))
-#else
-#define PRINTF_FMT(nfmt, narg)
-#endif
-#endif
-
-#ifndef IDEMPOTENT
-#if HAVE_ATTRIBUTE_CONST
-/**
- * IDEMPOTENT - a function's return depends only on its argument
- *
- * This allows the compiler to assume that the function will return the exact
- * same value for the exact same arguments.  This implies that the function
- * must not use global variables, or dereference pointer arguments.
- */
-#define IDEMPOTENT __attribute__((const))
-#else
-#define IDEMPOTENT
-#endif
-#endif
-
-#if HAVE_ATTRIBUTE_UNUSED
-#ifndef UNNEEDED
-/**
- * UNNEEDED - a variable/function may not be needed
- *
- * This suppresses warnings about unused variables or functions, but tells
- * the compiler that if it is unused it need not emit it into the source code.
- *
- * Example:
- * // With some preprocessor options, this is unnecessary.
- * static UNNEEDED int counter;
- *
- * // With some preprocessor options, this is unnecessary.
- * static UNNEEDED void add_to_counter(int add)
- * {
- *	counter += add;
- * }
- */
-#define UNNEEDED __attribute__((unused))
-#endif
-
-#ifndef NEEDED
-#if HAVE_ATTRIBUTE_USED
-/**
- * NEEDED - a variable/function is needed
- *
- * This suppresses warnings about unused variables or functions, but tells
- * the compiler that it must exist even if it (seems) unused.
- *
- * Example:
- *	// Even if this is unused, these are vital for debugging.
- *	static NEEDED int counter;
- *	static NEEDED void dump_counter(void)
- *	{
- *		printf("Counter is %i\n", counter);
- *	}
- */
-#define NEEDED __attribute__((used))
-#else
-/* Before used, unused functions and vars were always emitted. */
-#define NEEDED __attribute__((unused))
-#endif
-#endif
-
-#ifndef UNUSED
-/**
- * UNUSED - a parameter is unused
- *
- * Some compilers (eg. gcc with -W or -Wunused) warn about unused
- * function parameters.  This suppresses such warnings and indicates
- * to the reader that it's deliberate.
- *
- * Example:
- *	// This is used as a callback, so needs to have this prototype.
- *	static int some_callback(void *unused UNUSED)
- *	{
- *		return 0;
- *	}
- */
-#define UNUSED __attribute__((unused))
-#endif
-#else
-#ifndef UNNEEDED
-#define UNNEEDED
-#endif
-#ifndef NEEDED
-#define NEEDED
-#endif
-#ifndef UNUSED
-#define UNUSED
-#endif
-#endif
-
-#ifndef IS_COMPILE_CONSTANT
-#if HAVE_BUILTIN_CONSTANT_P
-/**
- * IS_COMPILE_CONSTANT - does the compiler know the value of this expression?
- * @expr: the expression to evaluate
- *
- * When an expression manipulation is complicated, it is usually better to
- * implement it in a function.  However, if the expression being manipulated is
- * known at compile time, it is better to have the compiler see the entire
- * expression so it can simply substitute the result.
- *
- * This can be done using the IS_COMPILE_CONSTANT() macro.
- *
- * Example:
- *	enum greek { ALPHA, BETA, GAMMA, DELTA, EPSILON };
- *
- *	// Out-of-line version.
- *	const char *greek_name(enum greek greek);
- *
- *	// Inline version.
- *	static inline const char *_greek_name(enum greek greek)
- *	{
- *		switch (greek) {
- *		case ALPHA: return "alpha";
- *		case BETA: return "beta";
- *		case GAMMA: return "gamma";
- *		case DELTA: return "delta";
- *		case EPSILON: return "epsilon";
- *		default: return "**INVALID**";
- *		}
- *	}
- *
- *	// Use inline if compiler knows answer.  Otherwise call function
- *	// to avoid copies of the same code everywhere.
- *	#define greek_name(g)						\
- *		 (IS_COMPILE_CONSTANT(greek) ? _greek_name(g) : greek_name(g))
- */
-#define IS_COMPILE_CONSTANT(expr) __builtin_constant_p(expr)
-#else
-/* If we don't know, assume it's not. */
-#define IS_COMPILE_CONSTANT(expr) 0
-#endif
-#endif
-
-#ifndef WARN_UNUSED_RESULT
-#if HAVE_WARN_UNUSED_RESULT
-/**
- * WARN_UNUSED_RESULT - warn if a function return value is unused.
- *
- * Used to mark a function where it is extremely unlikely that the caller
- * can ignore the result, eg realloc().
- *
- * Example:
- * // buf param may be freed by this; need return value!
- * static char *WARN_UNUSED_RESULT enlarge(char *buf, unsigned *size)
- * {
- *	return realloc(buf, (*size) *= 2);
- * }
- */
-#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-#else
-#define WARN_UNUSED_RESULT
-#endif
-#endif
-#endif /* CCAN_COMPILER_H */

+ 0 - 31
ccan/compiler/test/compile_fail-printf.c

@@ -1,31 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option) any
- * later version.  See LICENSE for more details.
- */
-
-#include <ccan/compiler/compiler.h>
-
-static void PRINTF_FMT(2,3) my_printf(int x, const char *fmt, ...)
-{
-}
-
-int main(int argc, char *argv[])
-{
-	unsigned int i = 0;
-
-	my_printf(1, "Not a pointer "
-#ifdef FAIL
-		  "%p",
-#if !HAVE_ATTRIBUTE_PRINTF
-#error "Unfortunately we don't fail if !HAVE_ATTRIBUTE_PRINTF."
-#endif
-#else
-		  "%i",
-#endif
-		  i);
-	return 0;
-}

+ 0 - 24
ccan/compiler/test/run-is_compile_constant.c

@@ -1,24 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option) any
- * later version.  See LICENSE for more details.
- */
-
-#include <ccan/compiler/compiler.h>
-#include <ccan/tap/tap.h>
-
-int main(int argc, char *argv[])
-{
-	plan_tests(2);
-
-	ok1(!IS_COMPILE_CONSTANT(argc));
-#if HAVE_BUILTIN_CONSTANT_P
-	ok1(IS_COMPILE_CONSTANT(7));
-#else
-	pass("If !HAVE_BUILTIN_CONSTANT_P, IS_COMPILE_CONSTANT always false");
-#endif
-	return exit_status();
-}

+ 0 - 339
ccan/opt/LICENSE

@@ -1,339 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.

+ 0 - 76
ccan/opt/_info

@@ -1,76 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include "config.h"
-
-/**
- * opt - simple command line parsing
- *
- * Simple but powerful command line parsing.
- *
- * Example:
- * #include <ccan/opt/opt.h>
- * #include <stdio.h>
- * #include <stdlib.h>
- * 
- * static bool someflag;
- * static int verbose;
- * static char *somestring;
- * 
- * static struct opt_table opts[] = {
- * 	OPT_WITHOUT_ARG("--verbose|-v", opt_inc_intval, &verbose,
- *			"Verbose mode (can be specified more than once)"),
- * 	OPT_WITHOUT_ARG("--someflag", opt_set_bool, &someflag,
- *			"Set someflag"),
- * 	OPT_WITH_ARG("--somefile=<filename>", opt_set_charp, opt_show_charp,
- *		     &somestring, "Set somefile to <filename>"),
- * 	OPT_WITHOUT_ARG("--usage|--help|-h", opt_usage_and_exit,
- * 			"args...\nA silly test program.",
- *			"Print this message."),
- * 	OPT_ENDTABLE
- * };
- * 
- * int main(int argc, char *argv[])
- * {
- * 	int i;
- * 
- * 	opt_register_table(opts, NULL);
- * 	// For fun, register an extra one.
- * 	opt_register_noarg("--no-someflag", opt_set_invbool, &someflag,
- * 			   "Unset someflag");
- * 	if (!opt_parse(&argc, argv, opt_log_stderr))
- * 		exit(1);
- * 
- * 	printf("someflag = %i, verbose = %i, somestring = %s\n",
- * 	       someflag, verbose, somestring);
- * 	printf("%u args left over:", argc - 1);
- * 	for (i = 1; i < argc; i++)
- * 		printf(" %s", argv[i]);
- * 	printf("\n");
- * 	return 0;
- * }
- *
- * License: GPL (2 or any later version)
- * Author: Rusty Russell <rusty@rustcorp.com.au>
- */
-int main(int argc, char *argv[])
-{
-	if (argc != 2)
-		return 1;
-
-	if (strcmp(argv[1], "depends") == 0) {
-		printf("ccan/typesafe_cb\n");
-		printf("ccan/compiler\n");
-		return 0;
-	}
-
-	return 1;
-}

+ 0 - 203
ccan/opt/helpers.c

@@ -1,203 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- * Copyright 2011 Con Kolivas
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <ccan/opt/opt.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <stdio.h>
-#include "private.h"
-
-/* Upper bound to sprintf this simple type?  Each 3 bits < 1 digit. */
-#define CHAR_SIZE(type) (((sizeof(type)*CHAR_BIT + 2) / 3) + 1)
-
-/* FIXME: asprintf module? */
-static char *arg_bad(const char *fmt, const char *arg)
-{
-	char *str = malloc(strlen(fmt) + strlen(arg));
-	sprintf(str, fmt, arg);
-	return str;
-}
-
-char *opt_set_bool(bool *b)
-{
-	*b = true;
-	return NULL;
-}
-
-char *opt_set_invbool(bool *b)
-{
-	*b = false;
-	return NULL;
-}
-
-char *opt_set_bool_arg(const char *arg, bool *b)
-{
-	if (!strcasecmp(arg, "yes") || !strcasecmp(arg, "true"))
-		return opt_set_bool(b);
-	if (!strcasecmp(arg, "no") || !strcasecmp(arg, "false"))
-		return opt_set_invbool(b);
-
-	return opt_invalid_argument(arg);
-}
-
-char *opt_set_invbool_arg(const char *arg, bool *b)
-{
-	char *err = opt_set_bool_arg(arg, b);
-
-	if (!err)
-		*b = !*b;
-	return err;
-}
-
-/* Set a char *. */
-char *opt_set_charp(const char *arg, char **p)
-{
-	*p = (char *)arg;
-	return NULL;
-}
-
-/* Set an integer value, various forms.  Sets to 1 on arg == NULL. */
-char *opt_set_intval(const char *arg, int *i)
-{
-	long l;
-	char *err = opt_set_longval(arg, &l);
-
-	if (err)
-		return err;
-	*i = l;
-	/* Beware truncation... */
-	if (*i != l)
-		return arg_bad("value '%s' does not fit into an integer", arg);
-	return err;
-}
-
-char *opt_set_floatval(const char *arg, float *f)
-{
-	char *endp;
-
-	errno = 0;
-	*f = strtof(arg, &endp);
-	if (*endp || !arg[0])
-		return arg_bad("'%s' is not a number", arg);
-	if (errno)
-		return arg_bad("'%s' is out of range", arg);
-	return NULL;
-}
-
-char *opt_set_uintval(const char *arg, unsigned int *ui)
-{
-	int i;
-	char *err = opt_set_intval(arg, &i);
-
-	if (err)
-		return err;
-	if (i < 0)
-		return arg_bad("'%s' is negative", arg);
-	*ui = i;
-	return NULL;
-}
-
-char *opt_set_longval(const char *arg, long *l)
-{
-	char *endp;
-
-	/* This is how the manpage says to do it.  Yech. */
-	errno = 0;
-	*l = strtol(arg, &endp, 0);
-	if (*endp || !arg[0])
-		return arg_bad("'%s' is not a number", arg);
-	if (errno)
-		return arg_bad("'%s' is out of range", arg);
-	return NULL;
-}
-
-char *opt_set_ulongval(const char *arg, unsigned long *ul)
-{
-	long int l;
-	char *err;
-	
-	err = opt_set_longval(arg, &l);
-	if (err)
-		return err;
-	*ul = l;
-	if (l < 0)
-		return arg_bad("'%s' is negative", arg);
-	return NULL;
-}
-
-char *opt_inc_intval(int *i)
-{
-	(*i)++;
-	return NULL;
-}
-
-/* Display version string. */
-char *opt_version_and_exit(const char *version)
-{
-	printf("%s\n", version);
-	fflush(stdout);
-	exit(0);
-}
-
-char *opt_usage_and_exit(const char *extra)
-{
-	printf("%s", opt_usage(opt_argv0, extra));
-	fflush(stdout);
-	exit(0);
-}
-
-void opt_show_bool(char buf[OPT_SHOW_LEN], const bool *b)
-{
-	strncpy(buf, *b ? "true" : "false", OPT_SHOW_LEN);
-}
-
-void opt_show_invbool(char buf[OPT_SHOW_LEN], const bool *b)
-{
-	strncpy(buf, *b ? "false" : "true", OPT_SHOW_LEN);
-}
-
-void opt_show_charp(char buf[OPT_SHOW_LEN], char *const *p)
-{
-	size_t len = strlen(*p);
-	buf[0] = '"';
-	if (len > OPT_SHOW_LEN - 2)
-		len = OPT_SHOW_LEN - 2;
-	strncpy(buf+1, *p, len);
-	buf[1+len] = '"';
-	if (len < OPT_SHOW_LEN - 2)
-		buf[2+len] = '\0';
-}
-
-/* Set an integer value, various forms.  Sets to 1 on arg == NULL. */
-void opt_show_intval(char buf[OPT_SHOW_LEN], const int *i)
-{
-	snprintf(buf, OPT_SHOW_LEN, "%i", *i);
-}
-
-void opt_show_floatval(char buf[OPT_SHOW_LEN], const float *f)
-{
-	snprintf(buf, OPT_SHOW_LEN, "%.1f", *f);
-}
-
-void opt_show_uintval(char buf[OPT_SHOW_LEN], const unsigned int *ui)
-{
-	snprintf(buf, OPT_SHOW_LEN, "%u", *ui);
-}
-
-void opt_show_longval(char buf[OPT_SHOW_LEN], const long *l)
-{
-	snprintf(buf, OPT_SHOW_LEN, "%li", *l);
-}
-
-void opt_show_ulongval(char buf[OPT_SHOW_LEN], const unsigned long *ul)
-{
-	snprintf(buf, OPT_SHOW_LEN, "%lu", *ul);
-}

+ 0 - 266
ccan/opt/opt.c

@@ -1,266 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- * Copyright 2011 Ycros
- * Copyright 2011 Con Kolivas
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <ccan/opt/opt.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#ifndef WIN32
-	#include <err.h>
-#else
-#include <libgen.h>
-	#define errx(status, fmt, ...) { \
-			fprintf(stderr, fmt, __VA_ARGS__); \
-			fprintf(stderr, "\n"); \
-			exit(status); }
-#endif
-
-#include <assert.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include "private.h"
-
-struct opt_table *opt_table;
-unsigned int opt_count, opt_num_short, opt_num_short_arg, opt_num_long;
-const char *opt_argv0;
-
-/* Returns string after first '-'. */
-static const char *first_name(const char *names, unsigned *len)
-{
-	*len = strcspn(names + 1, "|= ");
-	return names + 1;
-}
-
-static const char *next_name(const char *names, unsigned *len)
-{
-	names += *len;
-	if (names[0] == ' ' || names[0] == '=' || names[0] == '\0')
-		return NULL;
-	return first_name(names + 1, len);
-}
-
-static const char *first_opt(unsigned *i, unsigned *len)
-{
-	for (*i = 0; *i < opt_count; (*i)++) {
-		if (opt_table[*i].type == OPT_SUBTABLE)
-			continue;
-		return first_name(opt_table[*i].names, len);
-	}
-	return NULL;
-}
-
-static const char *next_opt(const char *p, unsigned *i, unsigned *len)
-{
-	for (; *i < opt_count; (*i)++) {
-		if (opt_table[*i].type == OPT_SUBTABLE)
-			continue;
-		if (!p)
-			return first_name(opt_table[*i].names, len);
-		p = next_name(p, len);
-		if (p)
-			return p;
-	}
-	return NULL;
-}
-
-const char *first_lopt(unsigned *i, unsigned *len)
-{
-	const char *p;
-	for (p = first_opt(i, len); p; p = next_opt(p, i, len)) {
-		if (p[0] == '-') {
-			/* Skip leading "-" */
-			(*len)--;
-			p++;
-			break;
-		}
-	}
-	return p;
-}
-
-const char *next_lopt(const char *p, unsigned *i, unsigned *len)
-{
-	for (p = next_opt(p, i, len); p; p = next_opt(p, i, len)) {
-		if (p[0] == '-') {
-			/* Skip leading "-" */
-			(*len)--;
-			p++;
-			break;
-		}
-	}
-	return p;
-}
-
-const char *first_sopt(unsigned *i)
-{
-	const char *p;
-	unsigned int len = 0 /* GCC bogus warning */;
-
-	for (p = first_opt(i, &len); p; p = next_opt(p, i, &len)) {
-		if (p[0] != '-')
-			break;
-	}
-	return p;
-}
-
-const char *next_sopt(const char *p, unsigned *i)
-{
-	unsigned int len = 1;
-	for (p = next_opt(p, i, &len); p; p = next_opt(p, i, &len)) {
-		if (p[0] != '-')
-			break;
-	}
-	return p;
-}
-
-static void check_opt(const struct opt_table *entry)
-{
-	const char *p;
-	unsigned len;
-
-	if (entry->type != OPT_HASARG && entry->type != OPT_NOARG)
-		errx(1, "Option %s: unknown entry type %u",
-		     entry->names, entry->type);
-
-	if (!entry->desc)
-		errx(1, "Option %s: description cannot be NULL", entry->names);
-
-
-	if (entry->names[0] != '-')
-		errx(1, "Option %s: does not begin with '-'", entry->names);
-
-	for (p = first_name(entry->names, &len); p; p = next_name(p, &len)) {
-		if (*p == '-') {
-			if (len == 1)
-				errx(1, "Option %s: invalid long option '--'",
-				     entry->names);
-			opt_num_long++;
-		} else {
-			if (len != 1)
-				errx(1, "Option %s: invalid short option"
-				     " '%.*s'", entry->names, len+1, p-1);
-			opt_num_short++;
-			if (entry->type == OPT_HASARG)
-				opt_num_short_arg++;
-		}
-		/* Don't document args unless there are some. */
-		if (entry->type == OPT_NOARG) {
-			if (p[len] == ' ' || p[len] == '=')
-				errx(1, "Option %s: does not take arguments"
-				     " '%s'", entry->names, p+len+1);
-		}
-	}
-}
-
-static void add_opt(const struct opt_table *entry)
-{
-	opt_table = realloc(opt_table, sizeof(opt_table[0]) * (opt_count+1));
-	opt_table[opt_count++] = *entry;
-}
-
-void _opt_register(const char *names, enum opt_type type,
-		   char *(*cb)(void *arg),
-		   char *(*cb_arg)(const char *optarg, void *arg),
-		   void (*show)(char buf[OPT_SHOW_LEN], const void *arg),
-		   const void *arg, const char *desc)
-{
-	struct opt_table opt;
-	opt.names = names;
-	opt.type = type;
-	opt.cb = cb;
-	opt.cb_arg = cb_arg;
-	opt.show = show;
-	opt.u.carg = arg;
-	opt.desc = desc;
-	check_opt(&opt);
-	add_opt(&opt);
-}
-
-void opt_register_table(const struct opt_table entry[], const char *desc)
-{
-	unsigned int i, start = opt_count;
-
-	if (desc) {
-		struct opt_table heading = OPT_SUBTABLE(NULL, desc);
-		add_opt(&heading);
-	}
-	for (i = 0; entry[i].type != OPT_END; i++) {
-		if (entry[i].type == OPT_SUBTABLE)
-			opt_register_table(subtable_of(&entry[i]),
-					   entry[i].desc);
-		else {
-			check_opt(&entry[i]);
-			add_opt(&entry[i]);
-		}
-	}
-	/* We store the table length in arg ptr. */
-	if (desc)
-		opt_table[start].u.tlen = (opt_count - start);
-}
-
-/* Parse your arguments. */
-bool opt_parse(int *argc, char *argv[], void (*errlog)(const char *fmt, ...))
-{
-	int ret;
-	unsigned offset = 0;
-	
-	#ifdef WIN32
-	char *original_argv0 = argv[0];
-	argv[0] = (char*)basename(argv[0]);
-	#endif
-
-	/* This helps opt_usage. */
-	opt_argv0 = argv[0];
-
-	while ((ret = parse_one(argc, argv, &offset, errlog)) == 1);
-	
-	#ifdef WIN32
-	argv[0] = original_argv0;
-	#endif
-
-	/* parse_one returns 0 on finish, -1 on error */
-	return (ret == 0);
-}
-
-void opt_free_table(void)
-{
-	free(opt_table);
-	opt_table=0;
-}
-
-void opt_log_stderr(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
-	fprintf(stderr, "\n");
-	va_end(ap);
-}
-
-void opt_log_stderr_exit(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
-	fprintf(stderr, "\n");
-	va_end(ap);
-	exit(1);
-}
-
-char *opt_invalid_argument(const char *arg)
-{
-	char *str = malloc(sizeof("Invalid argument '%s'") + strlen(arg));
-	sprintf(str, "Invalid argument '%s'", arg);
-	return str;
-}

+ 0 - 357
ccan/opt/opt.h

@@ -1,357 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- * Copyright 2011 Con Kolivas
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#ifndef CCAN_OPT_H
-#define CCAN_OPT_H
-#include <ccan/compiler/compiler.h>
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdbool.h>
-#include <stdlib.h>
-
-struct opt_table;
-
-/**
- * OPT_WITHOUT_ARG() - macro for initializing an opt_table entry (without arg)
- * @names: the names of the option eg. "--foo", "-f" or "--foo|-f|--foobar".
- * @cb: the callback when the option is found.
- * @arg: the argument to hand to @cb.
- * @desc: the description for opt_usage(), or opt_hidden.
- *
- * This is a typesafe wrapper for initializing a struct opt_table.  The callback
- * of type "char *cb(type *)", "char *cb(const type *)" or "char *cb(void *)",
- * where "type" is the type of the @arg argument.
- *
- * If the @cb returns non-NULL, opt_parse() will stop parsing, use the
- * returned string to form an error message for errlog(), free() the
- * string and return false.
- *
- * Any number of equivalent short or long options can be listed in @names,
- * separated by '|'.  Short options are a single hyphen followed by a single
- * character, long options are two hyphens followed by one or more characters.
- *
- * See Also:
- *	OPT_WITH_ARG()
- */
-#define OPT_WITHOUT_ARG(names, cb, arg, desc)	\
-	{ (names), OPT_CB_NOARG((cb), (arg)), { (arg) }, (desc) }
-
-/**
- * OPT_WITH_ARG() - macro for initializing long and short option (with arg)
- * @names: the option names eg. "--foo=<arg>", "-f" or "-f|--foo <arg>".
- * @cb: the callback when the option is found (along with <arg>).
- * @show: the callback to print the value in get_usage (or NULL)
- * @arg: the argument to hand to @cb and @show
- * @desc: the description for opt_usage(), or opt_hidden.
- *
- * This is a typesafe wrapper for initializing a struct opt_table.  The callback
- * is of type "char *cb(const char *, type *)",
- * "char *cb(const char *, const type *)" or "char *cb(const char *, void *)",
- * where "type" is the type of the @arg argument.  The first argument to the
- * @cb is the argument found on the commandline.
- *
- * Similarly, if @show is not NULL, it should be of type "void *show(char *,
- * const type *)".  It should write up to OPT_SHOW_LEN bytes into the first
- * argument; unless it uses the entire OPT_SHOW_LEN bytes it should
- * nul-terminate that buffer.
- *
- * Any number of equivalent short or long options can be listed in @names,
- * separated by '|'.  Short options are a single hyphen followed by a single
- * character, long options are two hyphens followed by one or more characters.
- * A space or equals in @names is ignored for parsing, and only used
- * for printing the usage.
- *
- * If the @cb returns non-NULL, opt_parse() will stop parsing, use the
- * returned string to form an error message for errlog(), free() the
- * string and return false.
- *
- * See Also:
- *	OPT_WITHOUT_ARG()
- */
-#define OPT_WITH_ARG(name, cb, show, arg, desc)	\
-	{ (name), OPT_CB_ARG((cb), (show), (arg)), { (arg) }, (desc) }
-
-/**
- * OPT_SUBTABLE() - macro for including another table inside a table.
- * @table: the table to include in this table.
- * @desc: description of this subtable (for opt_usage()) or NULL.
- */
-#define OPT_SUBTABLE(table, desc)					\
-	{ (const char *)(table), OPT_SUBTABLE,				\
-	  sizeof(_check_is_entry(table)) ? NULL : NULL, NULL, NULL,	\
-	  { NULL }, (desc) }
-
-/**
- * OPT_ENDTABLE - macro to create final entry in table.
- *
- * This must be the final element in the opt_table array.
- */
-#define OPT_ENDTABLE { NULL, OPT_END, NULL, NULL, NULL, { NULL }, NULL }
-
-/**
- * opt_register_table - register a table of options
- * @table: the table of options
- * @desc: description of this subtable (for opt_usage()) or NULL.
- *
- * The table must be terminated by OPT_ENDTABLE.
- *
- * Example:
- * static int verbose = 0;
- * static struct opt_table opts[] = {
- * 	OPT_WITHOUT_ARG("--verbose", opt_inc_intval, &verbose,
- *			"Verbose mode (can be specified more than once)"),
- * 	OPT_WITHOUT_ARG("-v", opt_inc_intval, &verbose,
- *			"Verbose mode (can be specified more than once)"),
- * 	OPT_WITHOUT_ARG("--usage", opt_usage_and_exit,
- * 			"args...\nA silly test program.",
- *			"Print this message."),
- * 	OPT_ENDTABLE
- * };
- *
- * ...
- *	opt_register_table(opts, NULL);
- */
-void opt_register_table(const struct opt_table *table, const char *desc);
-
-/**
- * opt_register_noarg - register an option with no arguments
- * @names: the names of the option eg. "--foo", "-f" or "--foo|-f|--foobar".
- * @cb: the callback when the option is found.
- * @arg: the argument to hand to @cb.
- * @desc: the verbose description of the option (for opt_usage()), or NULL.
- *
- * This is used for registering a single commandline option which takes
- * no argument.
- *
- * The callback is of type "char *cb(type *)", "char *cb(const type *)"
- * or "char *cb(void *)", where "type" is the type of the @arg
- * argument.
- *
- * If the @cb returns non-NULL, opt_parse() will stop parsing, use the
- * returned string to form an error message for errlog(), free() the
- * string and return false.
- */
-#define opt_register_noarg(names, cb, arg, desc)			\
-	_opt_register((names), OPT_CB_NOARG((cb), (arg)), (arg), (desc))
-
-/**
- * opt_register_arg - register an option with an arguments
- * @names: the names of the option eg. "--foo", "-f" or "--foo|-f|--foobar".
- * @cb: the callback when the option is found.
- * @show: the callback to print the value in get_usage (or NULL)
- * @arg: the argument to hand to @cb.
- * @desc: the verbose description of the option (for opt_usage()), or NULL.
- *
- * This is used for registering a single commandline option which takes
- * an argument.
- *
- * The callback is of type "char *cb(const char *, type *)",
- * "char *cb(const char *, const type *)" or "char *cb(const char *, void *)",
- * where "type" is the type of the @arg argument.  The first argument to the
- * @cb is the argument found on the commandline.
- *
- * At least one of @longopt and @shortopt must be non-zero.  If the
- * @cb returns false, opt_parse() will stop parsing and return false.
- *
- * Example:
- * static char *explode(const char *optarg, void *unused)
- * {
- *	errx(1, "BOOM! %s", optarg);
- * }
- * ...
- *	opt_register_arg("--explode|--boom", explode, NULL, NULL, opt_hidden);
- */
-#define opt_register_arg(names, cb, show, arg, desc)			\
-	_opt_register((names), OPT_CB_ARG((cb), (show), (arg)), (arg), (desc))
-
-/**
- * opt_parse - parse arguments.
- * @argc: pointer to argc
- * @argv: argv array.
- * @errlog: the function to print errors
- *
- * This iterates through the command line and calls callbacks registered with
- * opt_register_table()/opt_register_arg()/opt_register_noarg().  If there
- * are unknown options, missing arguments or a callback returns false, then
- * an error message is printed and false is returned.
- *
- * On success, argc and argv are adjusted so only the non-option elements
- * remain, and true is returned.
- *
- * Example:
- *	if (!opt_parse(&argc, argv, opt_log_stderr)) {
- *		printf("You screwed up, aborting!\n");
- *		exit(1);
- *	}
- *
- * See Also:
- *	opt_log_stderr, opt_log_stderr_exit
- */
-bool opt_parse(int *argc, char *argv[], void (*errlog)(const char *fmt, ...));
-
-/**
- * opt_free_table - free the table.
- *
- * This frees the internal memory. Call this as the last
- * opt function.
- */
-void opt_free_table(void);
-
-/**
- * opt_log_stderr - print message to stderr.
- * @fmt: printf-style format.
- *
- * This is a helper for opt_parse, to print errors to stderr.
- *
- * See Also:
- *	opt_log_stderr_exit
- */
-void opt_log_stderr(const char *fmt, ...);
-
-/**
- * opt_log_stderr_exit - print message to stderr, then exit(1)
- * @fmt: printf-style format.
- *
- * Just like opt_log_stderr, only then does exit(1).  This means that
- * when handed to opt_parse, opt_parse will never return false.
- *
- * Example:
- *	// This never returns false; just exits if there's an erorr.
- *	opt_parse(&argc, argv, opt_log_stderr_exit);
- */
-void opt_log_stderr_exit(const char *fmt, ...);
-
-/**
- * opt_invalid_argument - helper to allocate an "Invalid argument '%s'" string
- * @arg: the argument which was invalid.
- *
- * This is a helper for callbacks to return a simple error string.
- */
-char *opt_invalid_argument(const char *arg);
-
-/**
- * opt_usage - create usage message
- * @argv0: the program name
- * @extra: extra details to print after the initial command, or NULL.
- *
- * Creates a usage message, with the program name, arguments, some extra details
- * and a table of all the options with their descriptions.  If an option has
- * description opt_hidden, it is not shown here.
- *
- * If "extra" is NULL, then the extra information is taken from any
- * registered option which calls opt_usage_and_exit().  This avoids duplicating
- * that string in the common case.
- *
- * The result should be passed to free().
- */
-char *opt_usage(const char *argv0, const char *extra);
-
-/**
- * opt_hidden - string for undocumented options.
- *
- * This can be used as the desc parameter if you want an option not to be
- * shown by opt_usage().
- */
-extern const char opt_hidden[];
-
-/* Maximum length of arg to show in opt_usage */
-#define OPT_SHOW_LEN 80
-
-/* Standard helpers.  You can write your own: */
-/* Sets the @b to true. */
-char *opt_set_bool(bool *b);
-/* Sets @b based on arg: (yes/no/true/false). */
-char *opt_set_bool_arg(const char *arg, bool *b);
-void opt_show_bool(char buf[OPT_SHOW_LEN], const bool *b);
-/* The inverse */
-char *opt_set_invbool(bool *b);
-void opt_show_invbool(char buf[OPT_SHOW_LEN], const bool *b);
-/* Sets @b based on !arg: (yes/no/true/false). */
-char *opt_set_invbool_arg(const char *arg, bool *b);
-
-/* Set a char *. */
-char *opt_set_charp(const char *arg, char **p);
-void opt_show_charp(char buf[OPT_SHOW_LEN], char *const *p);
-
-/* Set an integer value, various forms.  Sets to 1 on arg == NULL. */
-char *opt_set_intval(const char *arg, int *i);
-void opt_show_intval(char buf[OPT_SHOW_LEN], const int *i);
-char *opt_set_floatval(const char *arg, float *f);
-void opt_show_floatval(char buf[OPT_SHOW_LEN], const float *f);
-char *opt_set_uintval(const char *arg, unsigned int *ui);
-void opt_show_uintval(char buf[OPT_SHOW_LEN], const unsigned int *ui);
-char *opt_set_longval(const char *arg, long *l);
-void opt_show_longval(char buf[OPT_SHOW_LEN], const long *l);
-char *opt_set_ulongval(const char *arg, unsigned long *ul);
-void opt_show_ulongval(char buf[OPT_SHOW_LEN], const unsigned long *ul);
-
-/* Increment. */
-char *opt_inc_intval(int *i);
-
-/* Display version string to stdout, exit(0). */
-char *opt_version_and_exit(const char *version);
-
-/* Display usage string to stdout, exit(0). */
-char *opt_usage_and_exit(const char *extra);
-
-/* Below here are private declarations. */
-/* You can use this directly to build tables, but the macros will ensure
- * consistency and type safety. */
-enum opt_type {
-	OPT_NOARG = 1,		/* -f|--foo */
-	OPT_HASARG = 2,		/* -f arg|--foo=arg|--foo arg */
-	OPT_SUBTABLE = 4,	/* Actually, longopt points to a subtable... */
-	OPT_END = 8,		/* End of the table. */
-};
-
-struct opt_table {
-	const char *names; /* pipe-separated names, --longopt or -s */
-	enum opt_type type;
-	char *(*cb)(void *arg); /* OPT_NOARG */
-	char *(*cb_arg)(const char *optarg, void *arg); /* OPT_HASARG */
-	void (*show)(char buf[OPT_SHOW_LEN], const void *arg);
-	union {
-		const void *carg;
-		void *arg;
-		size_t tlen;
-	} u;
-	const char *desc;
-};
-
-/* Resolves to the four parameters for non-arg callbacks. */
-#define OPT_CB_NOARG(cb, arg)				\
-	OPT_NOARG,					\
-	typesafe_cb_cast3(char *(*)(void *),	\
-			  char *(*)(typeof(*(arg))*),	\
-			  char *(*)(const typeof(*(arg))*),	\
-			  char *(*)(const void *), (cb)),	\
-	NULL, NULL
-
-/* Resolves to the four parameters for arg callbacks. */
-#define OPT_CB_ARG(cb, show, arg)					\
-	OPT_HASARG, NULL,						\
-	typesafe_cb_cast3(char *(*)(const char *,void *),	\
-			  char *(*)(const char *, typeof(*(arg))*),	\
-			  char *(*)(const char *, const typeof(*(arg))*), \
-			  char *(*)(const char *, const void *),	\
-			  (cb)),					\
-	typesafe_cb_cast(void (*)(char buf[], const void *),		\
-			 void (*)(char buf[], const typeof(*(arg))*), (show))
-
-/* Non-typesafe register function. */
-void _opt_register(const char *names, enum opt_type type,
-		   char *(*cb)(void *arg),
-		   char *(*cb_arg)(const char *optarg, void *arg),
-		   void (*show)(char buf[OPT_SHOW_LEN], const void *arg),
-		   const void *arg, const char *desc);
-
-/* We use this to get typechecking for OPT_SUBTABLE */
-static inline int _check_is_entry(struct opt_table *e UNUSED) { return 0; }
-
-#endif /* CCAN_OPT_H */

+ 0 - 139
ccan/opt/parse.c

@@ -1,139 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-/* Actual code to parse commandline. */
-#include <ccan/opt/opt.h>
-#include <string.h>
-#include <stdlib.h>
-#include <assert.h>
-#include "private.h"
-
-/* glibc does this as:
-/tmp/opt-example: invalid option -- 'x'
-/tmp/opt-example: unrecognized option '--long'
-/tmp/opt-example: option '--someflag' doesn't allow an argument
-/tmp/opt-example: option '--s' is ambiguous
-/tmp/opt-example: option requires an argument -- 's'
-*/
-static int parse_err(void (*errlog)(const char *fmt, ...),
-		     const char *argv0, const char *arg, unsigned len,
-		     const char *problem)
-{
-	errlog("%s: %.*s: %s", argv0, len, arg, problem);
-	return -1;
-}
-
-static void consume_option(int *argc, char *argv[], unsigned optnum)
-{
-	memmove(&argv[optnum], &argv[optnum+1],
-		sizeof(argv[optnum]) * (*argc-optnum));
-	(*argc)--;
-}
-
-/* Returns 1 if argument consumed, 0 if all done, -1 on error. */
-int parse_one(int *argc, char *argv[], unsigned *offset,
-	      void (*errlog)(const char *fmt, ...))
-{
-	unsigned i, arg, len;
-	const char *o, *optarg = NULL;
-	char *problem;
-
-	if (getenv("POSIXLY_CORRECT")) {
-		/* Don't find options after non-options. */
-		arg = 1;
-	} else {
-		for (arg = 1; argv[arg]; arg++) {
-			if (argv[arg][0] == '-')
-				break;
-		}
-	}
-
-	if (!argv[arg] || argv[arg][0] != '-')
-		return 0;
-
-	/* Special arg terminator option. */
-	if (strcmp(argv[arg], "--") == 0) {
-		consume_option(argc, argv, arg);
-		return 0;
-	}
-
-	/* Long options start with -- */
-	if (argv[arg][1] == '-') {
-		assert(*offset == 0);
-		for (o = first_lopt(&i, &len); o; o = next_lopt(o, &i, &len)) {
-			if (strncmp(argv[arg] + 2, o, len) != 0)
-				continue;
-			if (argv[arg][2 + len] == '=')
-				optarg = argv[arg] + 2 + len + 1;
-			else if (argv[arg][2 + len] != '\0')
-				continue;
-			break;
-		}
-		if (!o)
-			return parse_err(errlog, argv[0],
-					 argv[arg], strlen(argv[arg]),
-					 "unrecognized option");
-		/* For error messages, we include the leading '--' */
-		o -= 2;
-		len += 2;
-	} else {
-		/* offset allows us to handle -abc */
-		for (o = first_sopt(&i); o; o = next_sopt(o, &i)) {
-			if (argv[arg][*offset + 1] != *o)
-				continue;
-			(*offset)++;
-			break;
-		}
-		if (!o)
-			return parse_err(errlog, argv[0],
-					 argv[arg], strlen(argv[arg]),
-					 "unrecognized option");
-		/* For error messages, we include the leading '-' */
-		o--;
-		len = 2;
-	}
-
-	if (opt_table[i].type == OPT_NOARG) {
-		if (optarg)
-			return parse_err(errlog, argv[0], o, len,
-					 "doesn't allow an argument");
-		problem = opt_table[i].cb(opt_table[i].u.arg);
-	} else {
-		if (!optarg) {
-			/* Swallow any short options as optarg, eg -afile */
-			if (*offset && argv[arg][*offset + 1]) {
-				optarg = argv[arg] + *offset + 1;
-				*offset = 0;
-			} else
-				optarg = argv[arg+1];
-		}
-		if (!optarg)
-			return parse_err(errlog, argv[0], o, len,
-					 "requires an argument");
-		problem = opt_table[i].cb_arg(optarg, opt_table[i].u.arg);
-	}
-
-	if (problem) {
-		parse_err(errlog, argv[0], o, len, problem);
-		free(problem);
-		return -1;
-	}
-
-	/* If no more letters in that short opt, reset offset. */
-	if (*offset && !argv[arg][*offset + 1])
-		*offset = 0;
-
-	/* All finished with that option? */
-	if (*offset == 0) {
-		consume_option(argc, argv, arg);
-		if (optarg && optarg == argv[arg])
-			consume_option(argc, argv, arg);
-	}
-	return 1;
-}

+ 0 - 28
ccan/opt/private.h

@@ -1,28 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#ifndef CCAN_OPT_PRIVATE_H
-#define CCAN_OPT_PRIVATE_H
-
-extern struct opt_table *opt_table;
-extern unsigned int opt_count, opt_num_short, opt_num_short_arg, opt_num_long;
-
-extern const char *opt_argv0;
-
-#define subtable_of(entry) ((struct opt_table *)((entry)->names))
-
-const char *first_sopt(unsigned *i);
-const char *next_sopt(const char *names, unsigned *i);
-const char *first_lopt(unsigned *i, unsigned *len);
-const char *next_lopt(const char *p, unsigned *i, unsigned *len);
-
-int parse_one(int *argc, char *argv[], unsigned *offset,
-	      void (*errlog)(const char *fmt, ...));
-
-#endif /* CCAN_OPT_PRIVATE_H */

+ 0 - 22
ccan/opt/test/compile_ok-const-arg.c

@@ -1,22 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <ccan/opt/opt.h>
-#include <ccan/opt/opt.c>
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/parse.c>
-#include <ccan/opt/usage.c>
-
-int main(int argc, char *argv[])
-{
-	opt_register_noarg("-v", opt_version_and_exit,
-			   (const char *)"1.2.3",
-			   (const char *)"Print version");
-	return 0;
-}

+ 0 - 153
ccan/opt/test/run-checkopt.c

@@ -1,153 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include "config.h"
-#include <stdio.h>
-#include <ccan/tap/tap.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <err.h>
-#include "utils.h"
-
-/* We don't actually want it to exit... */
-static jmp_buf exited;
-#define errx save_and_jump
-
-static void save_and_jump(int ecode, const char *fmt, ...);
-
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/opt.c>
-#include <ccan/opt/usage.c>
-#include <ccan/opt/parse.c>
-
-static char *output = NULL;
-
-static int saved_vprintf(const char *fmt, va_list ap)
-{
-	char *p;
-	int ret = vasprintf(&p, fmt, ap);
-
-	if (output) {
-		output = realloc(output, strlen(output) + strlen(p) + 1);
-		strcat(output, p);
-		free(p);
-	} else
-		output = p;
-	return ret;
-}
-
-static void save_and_jump(int ecode, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	saved_vprintf(fmt, ap);
-	va_end(ap);
-	longjmp(exited, ecode + 1);
-}
-
-static void reset(void)
-{
-	free(output);
-	output = NULL;
-	free(opt_table);
-	opt_table = NULL;
-	opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
-}
-
-int main(int argc, char *argv[])
-{
-	int exitval;
-
-	plan_tests(14);
-
-	exitval = setjmp(exited);
-	if (exitval == 0) {
-		/* Bad type. */
-		_opt_register("-a", OPT_SUBTABLE, (void *)opt_version_and_exit,
-			      NULL, NULL, "1.2.3", "");
-		fail("_opt_register returned?");
-	} else {
-		ok1(exitval - 1 == 1);
-		ok1(strstr(output, "Option -a: unknown entry type"));
-	}
-	reset();
-
-	exitval = setjmp(exited);
-	if (exitval == 0) {
-		/* NULL description. */
-		opt_register_noarg("-a", test_noarg, "", NULL);
-		fail("_opt_register returned?");
-	} else {
-		ok1(exitval - 1 == 1);
-		ok1(strstr(output, "Option -a: description cannot be NULL"));
-	}
-	reset();
-
-	exitval = setjmp(exited);
-	if (exitval == 0) {
-		/* Bad option name. */
-		opt_register_noarg("a", test_noarg, "", "");
-		fail("_opt_register returned?");
-	} else {
-		ok1(exitval - 1 == 1);
-		ok1(strstr(output, "Option a: does not begin with '-'"));
-	}
-
-	reset();
-
-	exitval = setjmp(exited);
-	if (exitval == 0) {
-		/* Bad option name. */
-		opt_register_noarg("--", test_noarg, "", "");
-		fail("_opt_register returned?");
-	} else {
-		ok1(exitval - 1 == 1);
-		ok1(strstr(output, "Option --: invalid long option '--'"));
-	}
-
-	reset();
-
-	exitval = setjmp(exited);
-	if (exitval == 0) {
-		/* Bad option name. */
-		opt_register_noarg("--a|-aaa", test_noarg, "", "");
-		fail("_opt_register returned?");
-	} else {
-		ok1(exitval - 1 == 1);
-		ok1(strstr(output,
-			   "Option --a|-aaa: invalid short option '-aaa'"));
-	}
-	reset();
-
-	exitval = setjmp(exited);
-	if (exitval == 0) {
-		/* Documentation for non-optios. */
-		opt_register_noarg("--a foo", test_noarg, "", "");
-		fail("_opt_register returned?");
-	} else {
-		ok1(exitval - 1 == 1);
-		ok1(strstr(output,
-			   "Option --a foo: does not take arguments 'foo'"));
-	}
-	reset();
-
-	exitval = setjmp(exited);
-	if (exitval == 0) {
-		/* Documentation for non-optios. */
-		opt_register_noarg("--a=foo", test_noarg, "", "");
-		fail("_opt_register returned?");
-	} else {
-		ok1(exitval - 1 == 1);
-		ok1(strstr(output,
-			   "Option --a=foo: does not take arguments 'foo'"));
-	}
-	return exit_status();
-}

+ 0 - 58
ccan/opt/test/run-correct-reporting.c

@@ -1,58 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-/* Make sure when multiple equivalent options, correct one is used for errors */
-
-#include <ccan/tap/tap.h>
-#include <stdlib.h>
-#include <ccan/opt/opt.c>
-#include <ccan/opt/usage.c>
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/parse.c>
-#include "utils.h"
-
-int main(int argc, char *argv[])
-{
-	plan_tests(12);
-
-	/* --aaa without args. */
-	opt_register_arg("-a|--aaa", test_arg, NULL, "aaa", "");
-	ok1(!parse_args(&argc, &argv, "--aaa", NULL));
-	ok1(strstr(err_output, ": --aaa: requires an argument"));
-	free(err_output);
-	err_output = NULL;
-	ok1(!parse_args(&argc, &argv, "-a", NULL));
-	ok1(strstr(err_output, ": -a: requires an argument"));
-	free(err_output);
-	err_output = NULL;
-
-	/* Multiple */
-	opt_register_arg("--bbb|-b|-c|--ccc", test_arg, NULL, "aaa", "");
-	ok1(!parse_args(&argc, &argv, "--bbb", NULL));
-	ok1(strstr(err_output, ": --bbb: requires an argument"));
-	free(err_output);
-	err_output = NULL;
-	ok1(!parse_args(&argc, &argv, "-b", NULL));
-	ok1(strstr(err_output, ": -b: requires an argument"));
-	free(err_output);
-	err_output = NULL;
-	ok1(!parse_args(&argc, &argv, "-c", NULL));
-	ok1(strstr(err_output, ": -c: requires an argument"));
-	free(err_output);
-	err_output = NULL;
-	ok1(!parse_args(&argc, &argv, "--ccc", NULL));
-	ok1(strstr(err_output, ": --ccc: requires an argument"));
-	free(err_output);
-	err_output = NULL;
-
-	/* parse_args allocates argv */
-	free(argv);
-	return exit_status();
-}
-

+ 0 - 449
ccan/opt/test/run-helpers.c

@@ -1,449 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include "config.h"
-#include <stdio.h>
-#include <ccan/tap/tap.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <limits.h>
-#include "utils.h"
-
-/* We don't actually want it to exit... */
-static jmp_buf exited;
-#define exit(status) longjmp(exited, (status) + 1)
-
-#define printf saved_printf
-static int saved_printf(const char *fmt, ...);
-
-#define fprintf saved_fprintf
-static int saved_fprintf(FILE *ignored, const char *fmt, ...);
-
-#define vfprintf(f, fmt, ap) saved_vprintf(fmt, ap)
-static int saved_vprintf(const char *fmt, va_list ap);
-
-#define malloc(size) saved_malloc(size)
-static void *saved_malloc(size_t size);
-
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/opt.c>
-#include <ccan/opt/usage.c>
-#include <ccan/opt/parse.c>
-
-static void reset_options(void)
-{
-	free(opt_table);
-	opt_table = NULL;
-	opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
-}
-
-static char *output = NULL;
-
-static int saved_vprintf(const char *fmt, va_list ap)
-{
-	char *p;
-	int ret = vasprintf(&p, fmt, ap);
-
-	if (output) {
-		output = realloc(output, strlen(output) + strlen(p) + 1);
-		strcat(output, p);
-		free(p);
-	} else
-		output = p;
-	return ret;
-}
-
-static int saved_printf(const char *fmt, ...)
-{
-	va_list ap;
-	int ret;
-
-	va_start(ap, fmt);
-	ret = saved_vprintf(fmt, ap);
-	va_end(ap);
-	return ret;
-}	
-
-static int saved_fprintf(FILE *ignored, const char *fmt, ...)
-{
-	va_list ap;
-	int ret;
-
-	va_start(ap, fmt);
-	ret = saved_vprintf(fmt, ap);
-	va_end(ap);
-	return ret;
-}	
-
-#undef malloc
-static void *last_allocation;
-static void *saved_malloc(size_t size)
-{
-	return last_allocation = malloc(size);
-}
-
-/* Test helpers. */
-int main(int argc, char *argv[])
-{
-	plan_tests(100);
-
-	/* opt_set_bool */
-	{
-		bool arg = false;
-		reset_options();
-		opt_register_noarg("-a", opt_set_bool, &arg, "");
-		ok1(parse_args(&argc, &argv, "-a", NULL));
-		ok1(arg);
-		opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
-		ok1(parse_args(&argc, &argv, "-b", "no", NULL));
-		ok1(!arg);
-		ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
-		ok1(arg);
-		ok1(parse_args(&argc, &argv, "-b", "false", NULL));
-		ok1(!arg);
-		ok1(parse_args(&argc, &argv, "-b", "true", NULL));
-		ok1(arg);
-		ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
-		ok1(arg);
-		ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
-	}
-	/* opt_set_invbool */
-	{
-		bool arg = true;
-		reset_options();
-		opt_register_noarg("-a", opt_set_invbool, &arg, "");
-		ok1(parse_args(&argc, &argv, "-a", NULL));
-		ok1(!arg);
-		opt_register_arg("-b", opt_set_invbool_arg, NULL,
-				 &arg, "");
-		ok1(parse_args(&argc, &argv, "-b", "no", NULL));
-		ok1(arg);
-		ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
-		ok1(!arg);
-		ok1(parse_args(&argc, &argv, "-b", "false", NULL));
-		ok1(arg);
-		ok1(parse_args(&argc, &argv, "-b", "true", NULL));
-		ok1(!arg);
-		ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
-		ok1(!arg);
-		ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
-	}
-	/* opt_set_charp */
-	{
-		char *arg = (char *)"wrong";
-		reset_options();
-		opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
-		ok1(parse_args(&argc, &argv, "-a", "string", NULL));
-		ok1(strcmp(arg, "string") == 0);
-	}
-	/* opt_set_intval */
-	{
-		int arg = 1000;
-		reset_options();
-		opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
-		ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
-		ok1(arg == 9999);
-		ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
-		ok1(arg == -9999);
-		ok1(parse_args(&argc, &argv, "-a", "0", NULL));
-		ok1(arg == 0);
-		ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
-		if (sizeof(int) == 4)
-			ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
-		else
-			fail("Handle other int sizes");
-	}
-	/* opt_set_uintval */
-	{
-		unsigned int arg = 1000;
-		reset_options();
-		opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
-		ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
-		ok1(arg == 9999);
-		ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
-		ok1(parse_args(&argc, &argv, "-a", "0", NULL));
-		ok1(arg == 0);
-		ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
-		ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
-		if (ULONG_MAX == UINT_MAX) {
-			pass("Can't test overflow");
-			pass("Can't test error message");
-		} else {
-			char buf[30];
-			sprintf(buf, "%lu", ULONG_MAX);
-			ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
-			ok1(strstr(err_output, ": -a: value '")
-			    && strstr(err_output, buf)
-			    && strstr(err_output, "' does not fit into an integer"));
-		}
-	}
-	/* opt_set_longval */
-	{
-		long int arg = 1000;
-		reset_options();
-		opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
-		ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
-		ok1(arg == 9999);
-		ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
-		ok1(arg == -9999);
-		ok1(parse_args(&argc, &argv, "-a", "0", NULL));
-		ok1(arg == 0);
-		ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
-		if (sizeof(long) == 4)
-			ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
-		else if (sizeof(long)== 8)
-			ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
-		else
-			fail("FIXME: Handle other long sizes");
-	}
-	/* opt_set_ulongval */
-	{
-		unsigned long int arg = 1000;
-		reset_options();
-		opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
-		ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
-		ok1(arg == 9999);
-		ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
-		ok1(parse_args(&argc, &argv, "-a", "0", NULL));
-		ok1(arg == 0);
-		ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
-		if (sizeof(long) == 4)
-			ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
-		else if (sizeof(long)== 8)
-			ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
-		else
-			fail("FIXME: Handle other long sizes");
-	}
-	/* opt_inc_intval */
-	{
-		int arg = 1000;
-		reset_options();
-		opt_register_noarg("-a", opt_inc_intval, &arg, "");
-		ok1(parse_args(&argc, &argv, "-a", NULL));
-		ok1(arg == 1001);
-		ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
-		ok1(arg == 1003);
-		ok1(parse_args(&argc, &argv, "-aa", NULL));
-		ok1(arg == 1005);
-	}
-
-	/* opt_show_version_and_exit. */
-	{
-		int exitval;
-		reset_options();
-		opt_register_noarg("-a",
-				   opt_version_and_exit, "1.2.3", "");
-		/* parse_args allocates argv */
-		free(argv);
-
-		argc = 2;
-		argv = malloc(sizeof(argv[0]) * 3);
-		argv[0] = "thisprog";
-		argv[1] = "-a";
-		argv[2] = NULL;
-
-		exitval = setjmp(exited);
-		if (exitval == 0) {
-			opt_parse(&argc, argv, save_err_output);
-			fail("opt_show_version_and_exit returned?");
-		} else {
-			ok1(exitval - 1 == 0);
-		}
-		ok1(strcmp(output, "1.2.3\n") == 0);
-		free(output);
-		free(argv);
-		output = NULL;
-	}
-
-	/* opt_usage_and_exit. */
-	{
-		int exitval;
-		reset_options();
-		opt_register_noarg("-a",
-				   opt_usage_and_exit, "[args]", "");
-
-		argc = 2;
-		argv = malloc(sizeof(argv[0]) * 3);
-		argv[0] = "thisprog";
-		argv[1] = "-a";
-		argv[2] = NULL;
-
-		exitval = setjmp(exited);
-		if (exitval == 0) {
-			opt_parse(&argc, argv, save_err_output);
-			fail("opt_usage_and_exit returned?");
-		} else {
-			ok1(exitval - 1 == 0);
-		}
-		ok1(strstr(output, "[args]"));
-		ok1(strstr(output, argv[0]));
-		ok1(strstr(output, "[-a]"));
-		free(output);
-		free(argv);
-		/* It exits without freeing usage string. */
-		free(last_allocation);
-		output = NULL;
-	}
-
-	/* opt_show_bool */
-	{
-		bool b;
-		char buf[OPT_SHOW_LEN+2] = { 0 };
-		buf[OPT_SHOW_LEN] = '!';
-
-		b = true;
-		opt_show_bool(buf, &b);
-		ok1(strcmp(buf, "true") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-
-		b = false;
-		opt_show_bool(buf, &b);
-		ok1(strcmp(buf, "false") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-	}
-
-	/* opt_show_invbool */
-	{
-		bool b;
-		char buf[OPT_SHOW_LEN+2] = { 0 };
-		buf[OPT_SHOW_LEN] = '!';
-
-		b = true;
-		opt_show_invbool(buf, &b);
-		ok1(strcmp(buf, "false") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-
-		b = false;
-		opt_show_invbool(buf, &b);
-		ok1(strcmp(buf, "true") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-	}
-
-	/* opt_show_charp */
-	{
-		char str[OPT_SHOW_LEN*2], *p;
-		char buf[OPT_SHOW_LEN+2] = { 0 };
-		buf[OPT_SHOW_LEN] = '!';
-
-		/* Short test. */
-		p = str;
-		strcpy(p, "short");
-		opt_show_charp(buf, &p);
-		ok1(strcmp(buf, "\"short\"") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-
-		/* Truncate test. */
-		memset(p, 'x', OPT_SHOW_LEN*2);
-		p[OPT_SHOW_LEN*2-1] = '\0';
-		opt_show_charp(buf, &p);
-		ok1(buf[0] == '"');
-		ok1(buf[OPT_SHOW_LEN-1] == '"');
-		ok1(buf[OPT_SHOW_LEN] == '!');
-		ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
-	}
-
-	/* opt_show_intval */
-	{
-		int i;
-		char buf[OPT_SHOW_LEN+2] = { 0 };
-		buf[OPT_SHOW_LEN] = '!';
-
-		i = -77;
-		opt_show_intval(buf, &i);
-		ok1(strcmp(buf, "-77") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-
-		i = 77;
-		opt_show_intval(buf, &i);
-		ok1(strcmp(buf, "77") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-	}
-
-	/* opt_show_uintval */
-	{
-		unsigned int ui;
-		char buf[OPT_SHOW_LEN+2] = { 0 };
-		buf[OPT_SHOW_LEN] = '!';
-
-		ui = 4294967295U;
-		opt_show_uintval(buf, &ui);
-		ok1(strcmp(buf, "4294967295") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-	}
-
-	/* opt_show_longval */
-	{
-		long l;
-		char buf[OPT_SHOW_LEN+2] = { 0 };
-		buf[OPT_SHOW_LEN] = '!';
-
-		l = 1234567890L;
-		opt_show_longval(buf, &l);
-		ok1(strcmp(buf, "1234567890") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-	}
-
-	/* opt_show_ulongval */
-	{
-		unsigned long ul;
-		char buf[OPT_SHOW_LEN+2] = { 0 };
-		buf[OPT_SHOW_LEN] = '!';
-
-		ul = 4294967295UL;
-		opt_show_ulongval(buf, &ul);
-		ok1(strcmp(buf, "4294967295") == 0);
-		ok1(buf[OPT_SHOW_LEN] == '!');
-	}
-
-	/* opt_log_stderr. */
-	{
-		reset_options();
-		opt_register_noarg("-a",
-				   opt_usage_and_exit, "[args]", "");
-
-		argc = 2;
-		argv = malloc(sizeof(argv[0]) * 3);
-		argv[0] = "thisprog";
-		argv[1] = "--garbage";
-		argv[2] = NULL;
-		ok1(!opt_parse(&argc, argv, opt_log_stderr));
-		ok1(!strcmp(output,
-			    "thisprog: --garbage: unrecognized option\n"));
-		free(output);
-		free(argv);
-		output = NULL;
-	}
-
-	/* opt_log_stderr_exit. */
-	{
-		int exitval;
-		reset_options();
-		opt_register_noarg("-a",
-				   opt_usage_and_exit, "[args]", "");
-		argc = 2;
-		argv = malloc(sizeof(argv[0]) * 3);
-		argv[0] = "thisprog";
-		argv[1] = "--garbage";
-		argv[2] = NULL;
-		exitval = setjmp(exited);
-		if (exitval == 0) {
-			opt_parse(&argc, argv, opt_log_stderr_exit);
-			fail("opt_log_stderr_exit returned?");
-		} else {
-			ok1(exitval - 1 == 1);
-		}
-		free(argv);
-		ok1(!strcmp(output,
-			    "thisprog: --garbage: unrecognized option\n"));
-		free(output);
-		output = NULL;
-	}
-
-	return exit_status();
-}

+ 0 - 97
ccan/opt/test/run-iter.c

@@ -1,97 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <ccan/tap/tap.h>
-#include <stdarg.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include "utils.h"
-#include <ccan/opt/opt.c>
-#include <ccan/opt/usage.c>
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/parse.c>
-
-static void reset_options(void)
-{
-	free(opt_table);
-	opt_table = NULL;
-	opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
-}
-
-/* Test iterators. */
-int main(int argc, char *argv[])
-{
-	unsigned j, i, len = 0;
-	const char *p;
-
-	plan_tests(37 * 2);
-	for (j = 0; j < 2; j ++) {
-		reset_options();
-		/* Giving subtable a title makes an extra entry! */
-		opt_register_table(subtables, j == 0 ? NULL : "subtable");
-
-		p = first_lopt(&i, &len);
-		ok1(i == j + 0);
-		ok1(len == 3);
-		ok1(strncmp(p, "jjj", len) == 0);
-		p = next_lopt(p, &i, &len);
-		ok1(i == j + 0);
-		ok1(len == 3);
-		ok1(strncmp(p, "lll", len) == 0);
-		p = next_lopt(p, &i, &len);
-		ok1(i == j + 1);
-		ok1(len == 3);
-		ok1(strncmp(p, "mmm", len) == 0);
-		p = next_lopt(p, &i, &len);
-		ok1(i == j + 5);
-		ok1(len == 3);
-		ok1(strncmp(p, "ddd", len) == 0);
-		p = next_lopt(p, &i, &len);
-		ok1(i == j + 6);
-		ok1(len == 3);
-		ok1(strncmp(p, "eee", len) == 0);
-		p = next_lopt(p, &i, &len);
-		ok1(i == j + 7);
-		ok1(len == 3);
-		ok1(strncmp(p, "ggg", len) == 0);
-		p = next_lopt(p, &i, &len);
-		ok1(i == j + 8);
-		ok1(len == 3);
-		ok1(strncmp(p, "hhh", len) == 0);
-		p = next_lopt(p, &i, &len);
-		ok1(!p);
-
-		p = first_sopt(&i);
-		ok1(i == j + 0);
-		ok1(*p == 'j');
-		p = next_sopt(p, &i);
-		ok1(i == j + 0);
-		ok1(*p == 'l');
-		p = next_sopt(p, &i);
-		ok1(i == j + 1);
-		ok1(*p == 'm');
-		p = next_sopt(p, &i);
-		ok1(i == j + 2);
-		ok1(*p == 'a');
-		p = next_sopt(p, &i);
-		ok1(i == j + 3);
-		ok1(*p == 'b');
-		p = next_sopt(p, &i);
-		ok1(i == j + 7);
-		ok1(*p == 'g');
-		p = next_sopt(p, &i);
-		ok1(i == j + 8);
-		ok1(*p == 'h');
-		p = next_sopt(p, &i);
-		ok1(!p);
-	}
-
-	return exit_status();
-}

+ 0 - 42
ccan/opt/test/run-no-options.c

@@ -1,42 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-/* Make sure we still work with no options registered */
-#include <ccan/tap/tap.h>
-#include <stdlib.h>
-#include <ccan/opt/opt.c>
-#include <ccan/opt/usage.c>
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/parse.c>
-#include "utils.h"
-
-int main(int argc, char *argv[])
-{
-	const char *myname = argv[0];
-
-	plan_tests(7);
-
-	/* Simple short arg.*/
-	ok1(!parse_args(&argc, &argv, "-a", NULL));
-	/* Simple long arg.*/
-	ok1(!parse_args(&argc, &argv, "--aaa", NULL));
-
-	/* Extra arguments preserved. */
-	ok1(parse_args(&argc, &argv, "extra", "args", NULL));
-	ok1(argc == 3);
-	ok1(argv[0] == myname);
-	ok1(strcmp(argv[1], "extra") == 0);
-	ok1(strcmp(argv[2], "args") == 0);
-
-	/* parse_args allocates argv */
-	free(argv);
-
-	return exit_status();
-}
-

+ 0 - 121
ccan/opt/test/run-usage.c

@@ -1,121 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <ccan/tap/tap.h>
-#include <stdarg.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include "utils.h"
-#include <ccan/opt/opt.c>
-#include <ccan/opt/usage.c>
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/parse.c>
-
-static char *my_cb(void *p)
-{
-	return NULL;
-}
-
-static void reset_options(void)
-{
-	free(opt_table);
-	opt_table = NULL;
-	opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
-}
-
-/* Test helpers. */
-int main(int argc, char *argv[])
-{
-	char *output;
-	char *longname = strdup("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
-	char *shortname = strdup("shortname");
-
-	plan_tests(48);
-	opt_register_table(subtables, NULL);
-	opt_register_noarg("--kkk|-k", my_cb, NULL, "magic kkk option");
-	opt_register_noarg("-?", opt_usage_and_exit, "<MyArgs>...",
-			   "This message");
-	opt_register_arg("--longname", opt_set_charp, opt_show_charp,
-			 &longname, "a really long option default");
-	opt_register_arg("--shortname", opt_set_charp, opt_show_charp,
-			 &shortname, "a short option default");
-	output = opt_usage("my name", "ExTrA Args");
-	diag("%s", output);
-	ok1(strstr(output, "Usage: my name"));
-	ok1(strstr(output, "--jjj|-j|--lll|-l <arg>"));
-	ok1(strstr(output, "ExTrA Args"));
-	ok1(strstr(output, "-a "));
-	ok1(strstr(output, " Description of a\n"));
-	ok1(strstr(output, "-b <arg>"));
-	ok1(strstr(output, " Description of b (default: b)\n"));
-	ok1(strstr(output, "--ddd "));
-	ok1(strstr(output, " Description of ddd\n"));
-	ok1(strstr(output, "--eee <filename> "));
-	ok1(strstr(output, " (default: eee)\n"));
-	ok1(strstr(output, "long table options:\n"));
-	ok1(strstr(output, "--ggg|-g "));
-	ok1(strstr(output, " Description of ggg\n"));
-	ok1(strstr(output, "-h|--hhh <arg>"));
-	ok1(strstr(output, " Description of hhh\n"));
-	ok1(strstr(output, "--kkk|-k"));
-	ok1(strstr(output, "magic kkk option"));
-	/* This entry is hidden. */
-	ok1(!strstr(output, "--mmm|-m"));
-	free(output);
-
-	/* NULL should use string from registered options. */
-	output = opt_usage("my name", NULL);
-	diag("%s", output);
-	ok1(strstr(output, "Usage: my name"));
-	ok1(strstr(output, "--jjj|-j|--lll|-l <arg>"));
-	ok1(strstr(output, "<MyArgs>..."));
-	ok1(strstr(output, "-a "));
-	ok1(strstr(output, " Description of a\n"));
-	ok1(strstr(output, "-b <arg>"));
-	ok1(strstr(output, " Description of b (default: b)\n"));
-	ok1(strstr(output, "--ddd "));
-	ok1(strstr(output, " Description of ddd\n"));
-	ok1(strstr(output, "--eee <filename> "));
-	ok1(strstr(output, " (default: eee)\n"));
-	ok1(strstr(output, "long table options:\n"));
-	ok1(strstr(output, "--ggg|-g "));
-	ok1(strstr(output, " Description of ggg\n"));
-	ok1(strstr(output, "-h|--hhh <arg>"));
-	ok1(strstr(output, " Description of hhh\n"));
-	ok1(strstr(output, "--kkk|-k"));
-	ok1(strstr(output, "magic kkk option"));
-	ok1(strstr(output, "--longname"));
-	ok1(strstr(output, "a really long option default"));
-	ok1(strstr(output, "(default: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"...)"));
-	ok1(strstr(output, "--shortname"));
-	ok1(strstr(output, "a short option default"));
-	ok1(strstr(output, "(default: \"shortname\")"));
-	/* This entry is hidden. */
-	ok1(!strstr(output, "--mmm|-m"));
-	free(output);
-
-	reset_options();
-	/* Empty table test. */
-	output = opt_usage("nothing", NULL);
-	ok1(strstr(output, "Usage: nothing \n"));
-	free(output);
-
-	/* No short args. */
-	opt_register_noarg("--aaa", test_noarg, NULL, "AAAAll");
-	output = opt_usage("onearg", NULL);
-	ok1(strstr(output, "Usage: onearg \n"));
-	ok1(strstr(output, "--aaa"));
-	ok1(strstr(output, "AAAAll"));
-	free(output);
-
-	free(shortname);
-	free(longname);
-	return exit_status();
-}

+ 0 - 306
ccan/opt/test/run.c

@@ -1,306 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <ccan/tap/tap.h>
-#include <stdlib.h>
-#include <ccan/opt/opt.c>
-#include <ccan/opt/usage.c>
-#include <ccan/opt/helpers.c>
-#include <ccan/opt/parse.c>
-#include "utils.h"
-
-static void reset_options(void)
-{
-	free(opt_table);
-	opt_table = NULL;
-	opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
-	free(err_output);
-	err_output = NULL;
-}
-
-int main(int argc, char *argv[])
-{
-	const char *myname = argv[0];
-
-	plan_tests(215);
-
-	/* Simple short arg.*/
-	opt_register_noarg("-a", test_noarg, NULL, "All");
-	ok1(parse_args(&argc, &argv, "-a", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 1);
-
-	/* Simple long arg. */
-	opt_register_noarg("--aaa", test_noarg, NULL, "AAAAll");
-	ok1(parse_args(&argc, &argv, "--aaa", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 2);
-
-	/* Both long and short args. */
-	opt_register_noarg("--aaa|-a", test_noarg, NULL, "AAAAAAll");
-	ok1(parse_args(&argc, &argv, "--aaa", "-a", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 4);
-
-	/* Extra arguments preserved. */
-	ok1(parse_args(&argc, &argv, "--aaa", "-a", "extra", "args", NULL));
-	ok1(argc == 3);
-	ok1(argv[0] == myname);
-	ok1(strcmp(argv[1], "extra") == 0);
-	ok1(strcmp(argv[2], "args") == 0);
-	ok1(test_cb_called == 6);
-
-	/* Malformed versions. */
-	ok1(!parse_args(&argc, &argv, "--aaa=arg", NULL));
-	ok1(strstr(err_output, ": --aaa: doesn't allow an argument"));
-	ok1(!parse_args(&argc, &argv, "--aa", NULL));
-	ok1(strstr(err_output, ": --aa: unrecognized option"));
-	ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
-	ok1(strstr(err_output, ": --aaargh: unrecognized option"));
-
-	/* Argument variants. */
-	reset_options();
-	test_cb_called = 0;
-	opt_register_arg("-a|--aaa", test_arg, NULL, "aaa", "AAAAAAll");
-	ok1(parse_args(&argc, &argv, "--aaa", "aaa", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(test_cb_called == 1);
-
-	ok1(parse_args(&argc, &argv, "--aaa=aaa", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(test_cb_called == 2);
-
-	ok1(parse_args(&argc, &argv, "-a", "aaa", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(test_cb_called == 3);
-
-	/* Malformed versions. */
-	ok1(!parse_args(&argc, &argv, "-a", NULL));
-	ok1(strstr(err_output, ": -a: requires an argument"));
-	ok1(!parse_args(&argc, &argv, "--aaa", NULL));
-	ok1(strstr(err_output, ": --aaa: requires an argument"));
-	ok1(!parse_args(&argc, &argv, "--aa", NULL));
-	ok1(strstr(err_output, ": --aa: unrecognized option"));
-	ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
-	ok1(strstr(err_output, ": --aaargh: unrecognized option"));
-
-	/* Now, tables. */
-	/* Short table: */
-	reset_options();
-	test_cb_called = 0;
-	opt_register_table(short_table, NULL);
-	ok1(parse_args(&argc, &argv, "-a", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 1);
-	/* This one needs an arg. */
-	ok1(parse_args(&argc, &argv, "-b", NULL) == false);
-	ok1(test_cb_called == 1);
-	ok1(parse_args(&argc, &argv, "-b", "b", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 2);
-
-	/* Long table: */
-	reset_options();
-	test_cb_called = 0;
-	opt_register_table(long_table, NULL);
-	ok1(parse_args(&argc, &argv, "--ddd", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 1);
-	/* This one needs an arg. */
-	ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
-	ok1(test_cb_called == 1);
-	ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 2);
-
-	/* Short and long, both. */
-	reset_options();
-	test_cb_called = 0;
-	opt_register_table(long_and_short_table, NULL);
-	ok1(parse_args(&argc, &argv, "-g", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 1);
-	ok1(parse_args(&argc, &argv, "--ggg", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 2);
-	/* This one needs an arg. */
-	ok1(parse_args(&argc, &argv, "-h", NULL) == false);
-	ok1(test_cb_called == 2);
-	ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 3);
-	ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
-	ok1(test_cb_called == 3);
-	ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 4);
-
-	/* Those will all work as tables. */
-	test_cb_called = 0;
-	reset_options();
-	opt_register_table(subtables, NULL);
-	ok1(parse_args(&argc, &argv, "-a", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 1);
-	/* This one needs an arg. */
-	ok1(parse_args(&argc, &argv, "-b", NULL) == false);
-	ok1(test_cb_called == 1);
-	ok1(parse_args(&argc, &argv, "-b", "b", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 2);
-
-	ok1(parse_args(&argc, &argv, "--ddd", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 3);
-	/* This one needs an arg. */
-	ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
-	ok1(test_cb_called == 3);
-	ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 4);
-
-	/* Short and long, both. */
-	ok1(parse_args(&argc, &argv, "-g", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 5);
-	ok1(parse_args(&argc, &argv, "--ggg", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 6);
-	/* This one needs an arg. */
-	ok1(parse_args(&argc, &argv, "-h", NULL) == false);
-	ok1(test_cb_called == 6);
-	ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 7);
-	ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
-	ok1(test_cb_called == 7);
-	ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
-	ok1(argc == 1);
-	ok1(argv[0] == myname);
-	ok1(argv[1] == NULL);
-	ok1(test_cb_called == 8);
-
-	/* Now the tricky one: -? must not be confused with an unknown option */
-	test_cb_called = 0;
-	reset_options();
-
-	/* glibc's getopt does not handle ? with arguments. */
-	opt_register_noarg("-?", test_noarg, NULL, "Help");
-	ok1(parse_args(&argc, &argv, "-?", NULL));
-	ok1(test_cb_called == 1);
-	ok1(parse_args(&argc, &argv, "-a", NULL) == false);
-	ok1(test_cb_called == 1);
-	ok1(strstr(err_output, ": -a: unrecognized option"));
-	ok1(parse_args(&argc, &argv, "--aaaa", NULL) == false);
-	ok1(test_cb_called == 1);
-	ok1(strstr(err_output, ": --aaaa: unrecognized option"));
-
-	test_cb_called = 0;
-	reset_options();
-
-	/* Corner cases involving short arg parsing weirdness. */
-	opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
-	opt_register_arg("-b|--bbb", test_arg, NULL, "bbb", "b");
-	opt_register_arg("-c|--ccc", test_arg, NULL, "aaa", "c");
-	/* -aa == -a -a */
-	ok1(parse_args(&argc, &argv, "-aa", NULL));
-	ok1(test_cb_called == 2);
-	ok1(parse_args(&argc, &argv, "-aab", NULL) == false);
-	ok1(test_cb_called == 4);
-	ok1(strstr(err_output, ": -b: requires an argument"));
-	ok1(parse_args(&argc, &argv, "-bbbb", NULL));
-	ok1(test_cb_called == 5);
-	ok1(parse_args(&argc, &argv, "-aabbbb", NULL));
-	ok1(test_cb_called == 8);
-	ok1(parse_args(&argc, &argv, "-aabbbb", "-b", "bbb", NULL));
-	ok1(test_cb_called == 12);
-	ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb", "bbb", NULL));
-	ok1(test_cb_called == 16);
-	ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb=bbb", NULL));
-	ok1(test_cb_called == 20);
-	ok1(parse_args(&argc, &argv, "-aacaaa", NULL));
-	ok1(test_cb_called == 23);
-	ok1(parse_args(&argc, &argv, "-aacaaa", "-a", NULL));
-	ok1(test_cb_called == 27);
-	ok1(parse_args(&argc, &argv, "-aacaaa", "--bbb", "bbb", "-aacaaa",
-		       NULL));
-	ok1(test_cb_called == 34);
-
-	test_cb_called = 0;
-	reset_options();
-
-	/* -- and POSIXLY_CORRECT */
-	opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
-	ok1(parse_args(&argc, &argv, "-a", "--", "-a", NULL));
-	ok1(test_cb_called == 1);
-	ok1(argc == 2);
-	ok1(strcmp(argv[1], "-a") == 0);
-	ok1(!argv[2]);
-
-	unsetenv("POSIXLY_CORRECT");
-	ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
-	ok1(test_cb_called == 3);
-	ok1(argc == 3);
-	ok1(strcmp(argv[1], "somearg") == 0);
-	ok1(strcmp(argv[2], "-a") == 0);
-	ok1(!argv[3]);
-
-	setenv("POSIXLY_CORRECT", "1", 1);
-	ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
-	ok1(test_cb_called == 4);
-	ok1(argc == 5);
-	ok1(strcmp(argv[1], "somearg") == 0);
-	ok1(strcmp(argv[2], "-a") == 0);
-	ok1(strcmp(argv[3], "--") == 0);
-	ok1(strcmp(argv[4], "-a") == 0);
-	ok1(!argv[5]);
-
-	/* parse_args allocates argv */
-	free(argv);
-	return exit_status();
-}

+ 0 - 119
ccan/opt/test/utils.c

@@ -1,119 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include "config.h"
-#include <ccan/tap/tap.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <ccan/opt/opt.h>
-#include <getopt.h>
-#include <string.h>
-#include <stdio.h>
-#include "utils.h"
-
-unsigned int test_cb_called;
-char *test_noarg(void *arg)
-{
-	test_cb_called++;
-	return NULL;
-}
-
-char *test_arg(const char *optarg, const char *arg)
-{
-	test_cb_called++;
-	ok1(strcmp(optarg, arg) == 0);
-	return NULL;
-}
-
-void show_arg(char buf[OPT_SHOW_LEN], const char *arg)
-{
-	strncpy(buf, arg, OPT_SHOW_LEN);
-}
-
-char *err_output = NULL;
-
-void save_err_output(const char *fmt, ...)
-{
-	va_list ap;
-	char *p;
-
-	va_start(ap, fmt);
-	/* Check return, for fascist gcc */
-	if (vasprintf(&p, fmt, ap) == -1)
-		p = NULL;
-	va_end(ap);
-
-	if (err_output) {
-		err_output = realloc(err_output,
-				     strlen(err_output) + strlen(p) + 1);
-		strcat(err_output, p);
-		free(p);
-	} else
-		err_output = p;
-}	
-
-static bool allocated = false;
-
-bool parse_args(int *argc, char ***argv, ...)
-{
-	char **a;
-	va_list ap;
-
-	va_start(ap, argv);
-	*argc = 1;
-	a = malloc(sizeof(*a) * (*argc + 1));
-	a[0] = (*argv)[0];
-	while ((a[*argc] = va_arg(ap, char *)) != NULL) {
-		(*argc)++;
-		a = realloc(a, sizeof(*a) * (*argc + 1));
-	}
-
-	if (allocated)
-		free(*argv);
-
-	*argv = a;
-	allocated = true;
-	/* Re-set before parsing. */
-	optind = 0;
-
-	return opt_parse(argc, *argv, save_err_output);
-}
-
-struct opt_table short_table[] = {
-	/* Short opts, different args. */
-	OPT_WITHOUT_ARG("-a", test_noarg, "a", "Description of a"),
-	OPT_WITH_ARG("-b", test_arg, show_arg, "b", "Description of b"),
-	OPT_ENDTABLE
-};
-
-struct opt_table long_table[] = {
-	/* Long opts, different args. */
-	OPT_WITHOUT_ARG("--ddd", test_noarg, "ddd", "Description of ddd"),
-	OPT_WITH_ARG("--eee <filename>", test_arg, show_arg, "eee", ""),
-	OPT_ENDTABLE
-};
-
-struct opt_table long_and_short_table[] = {
-	/* Short and long, different args. */
-	OPT_WITHOUT_ARG("--ggg|-g", test_noarg, "ggg", "Description of ggg"),
-	OPT_WITH_ARG("-h|--hhh", test_arg, NULL, "hhh", "Description of hhh"),
-	OPT_ENDTABLE
-};
-
-/* Sub-table test. */
-struct opt_table subtables[] = {
-	/* Two short, and two long long, no description */
-	OPT_WITH_ARG("--jjj|-j|--lll|-l", test_arg, show_arg, "jjj", ""),
-	/* Hidden option */
-	OPT_WITH_ARG("--mmm|-m", test_arg, show_arg, "mmm", opt_hidden),
-	OPT_SUBTABLE(short_table, NULL),
-	OPT_SUBTABLE(long_table, "long table options"),
-	OPT_SUBTABLE(long_and_short_table, NULL),
-	OPT_ENDTABLE
-};

+ 0 - 19
ccan/opt/test/utils.h

@@ -1,19 +0,0 @@
-#ifndef CCAN_OPT_TEST_UTILS_H
-#define CCAN_OPT_TEST_UTILS_H
-#include <ccan/opt/opt.h>
-#include <stdbool.h>
-
-bool parse_args(int *argc, char ***argv, ...);
-extern char *err_output;
-void save_err_output(const char *fmt, ...);
-
-extern unsigned int test_cb_called;
-char *test_noarg(void *arg);
-char *test_arg(const char *optarg, const char *arg);
-void show_arg(char buf[OPT_SHOW_LEN], const char *arg);
-
-extern struct opt_table short_table[];
-extern struct opt_table long_table[];
-extern struct opt_table long_and_short_table[];
-extern struct opt_table subtables[];
-#endif /* CCAN_OPT_TEST_UTILS_H */

+ 0 - 120
ccan/opt/usage.c

@@ -1,120 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.  See LICENSE for more details.
- */
-
-#include <ccan/opt/opt.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include "private.h"
-
-/* We only use this for pointer comparisons. */
-const char opt_hidden[1];
-
-static unsigned write_short_options(char *str)
-{
-	unsigned int i, num = 0;
-	const char *p;
-
-	for (p = first_sopt(&i); p; p = next_sopt(p, &i)) {
-		if (opt_table[i].desc != opt_hidden)
-			str[num++] = *p;
-	}
-	return num;
-}
-
-#define OPT_SPACE_PAD "                    "
-
-/* FIXME: Get all purdy. */
-char *opt_usage(const char *argv0, const char *extra)
-{
-	unsigned int i, num, len;
-	char *ret, *p;
-
-	if (!extra) {
-		extra = "";
-		for (i = 0; i < opt_count; i++) {
-			if (opt_table[i].cb == (void *)opt_usage_and_exit
-			    && opt_table[i].u.carg) {
-				extra = opt_table[i].u.carg;
-				break;
-			}
-		}
-	}
-
-	/* An overestimate of our length. */
-	len = strlen("Usage: %s ") + strlen(argv0)
-		+ strlen("[-%.*s]") + opt_num_short + 1
-		+ strlen(" ") + strlen(extra)
-		+ strlen("\n");
-
-	for (i = 0; i < opt_count; i++) {
-		if (opt_table[i].type == OPT_SUBTABLE) {
-			len += strlen("\n") + strlen(opt_table[i].desc)
-				+ strlen(":\n");
-		} else if (opt_table[i].desc != opt_hidden) {
-			len += strlen(opt_table[i].names) + strlen(" <arg>");
-			len += strlen(OPT_SPACE_PAD)
-				+ strlen(opt_table[i].desc) + 1;
-			if (opt_table[i].show) {
-				len += strlen("(default: %s)")
-					+ OPT_SHOW_LEN + sizeof("...");
-			}
-			len += strlen("\n");
-		}
-	}
-
-	p = ret = malloc(len);
-	if (!ret)
-		return NULL;
-
-	p += sprintf(p, "Usage: %s", argv0);
-	p += sprintf(p, " [-");
-	num = write_short_options(p);
-	if (num) {
-		p += num;
-		p += sprintf(p, "]");
-	} else {
-		/* Remove start of single-entry options */
-		p -= 3;
-	}
-	if (extra)
-		p += sprintf(p, " %s", extra);
-	p += sprintf(p, "\n");
-
-	for (i = 0; i < opt_count; i++) {
-		if (opt_table[i].desc == opt_hidden)
-			continue;
-		if (opt_table[i].type == OPT_SUBTABLE) {
-			p += sprintf(p, "%s:\n", opt_table[i].desc);
-			continue;
-		}
-		len = sprintf(p, "%s", opt_table[i].names);
-		if (opt_table[i].type == OPT_HASARG
-		    && !strchr(opt_table[i].names, ' ')
-		    && !strchr(opt_table[i].names, '='))
-			len += sprintf(p + len, " <arg>");
-		len += sprintf(p + len, "%.*s",
-			       len < strlen(OPT_SPACE_PAD)
-			       ? (unsigned)strlen(OPT_SPACE_PAD) - len : 1,
-			       OPT_SPACE_PAD);
-
-		len += sprintf(p + len, "%s", opt_table[i].desc);
-		if (opt_table[i].show) {
-			char buf[OPT_SHOW_LEN + sizeof("...")];
-			strcpy(buf + OPT_SHOW_LEN, "...");
-			opt_table[i].show(buf, opt_table[i].u.arg);
-			len += sprintf(p + len, " (default: %s)", buf);
-		}
-		p += len;
-		p += sprintf(p, "\n");
-	}
-	*p = '\0';
-	return ret;
-}

+ 0 - 510
ccan/typesafe_cb/LICENSE

@@ -1,510 +0,0 @@
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-	51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations
-below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it
-becomes a de-facto standard.  To achieve this, non-free programs must
-be allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control
-compilation and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at least
-    three years, to give the same user the materials specified in
-    Subsection 6a, above, for a charge no more than the cost of
-    performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply, and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License
-may add an explicit geographical distribution limitation excluding those
-countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                            NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms
-of the ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.
-It is safest to attach them to the start of each source file to most
-effectively convey the exclusion of warranty; and each file should
-have at least the "copyright" line and a pointer to where the full
-notice is found.
-
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or
-your school, if any, to sign a "copyright disclaimer" for the library,
-if necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James
-  Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-

+ 0 - 160
ccan/typesafe_cb/_info

@@ -1,160 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include "config.h"
-
-/**
- * typesafe_cb - macros for safe callbacks.
- *
- * The basis of the typesafe_cb header is typesafe_cb_cast(): a
- * conditional cast macro.   If an expression exactly matches a given
- * type, it is cast to the target type, otherwise it is left alone.
- *
- * This allows us to create functions which take a small number of
- * specific types, rather than being forced to use a void *.  In
- * particular, it is useful for creating typesafe callbacks as the
- * helpers typesafe_cb(), typesafe_cb_preargs() and
- * typesafe_cb_postargs() demonstrate.
- * 
- * The standard way of passing arguments to callback functions in C is
- * to use a void pointer, which the callback then casts back to the
- * expected type.  This unfortunately subverts the type checking the
- * compiler would perform if it were a direct call.  Here's an example:
- *
- *	static void my_callback(void *_obj)
- *	{
- *		struct obj *obj = _obj;
- *		...
- *	}
- *	...
- *		register_callback(my_callback, &my_obj);
- *
- * If we wanted to use the natural type for my_callback (ie. "void
- * my_callback(struct obj *obj)"), we could make register_callback()
- * take a void * as its first argument, but this would subvert all
- * type checking.  We really want register_callback() to accept only
- * the exactly correct function type to match the argument, or a
- * function which takes a void *.
- *
- * This is where typesafe_cb() comes in: it uses typesafe_cb_cast() to
- * cast the callback function if it matches the argument type:
- *
- *	void _register_callback(void (*cb)(void *arg), void *arg);
- *	#define register_callback(cb, arg)				\
- *		_register_callback(typesafe_cb(void, void *, (cb), (arg)), \
- *				   (arg))
- *
- * On compilers which don't support the extensions required
- * typesafe_cb_cast() and friend become an unconditional cast, so your
- * code will compile but you won't get type checking.
- *
- * Example:
- *	#include <ccan/typesafe_cb/typesafe_cb.h>
- *	#include <stdlib.h>
- *	#include <stdio.h>
- *
- *	// Generic callback infrastructure.
- *	struct callback {
- *		struct callback *next;
- *		int value;
- *		int (*callback)(int value, void *arg);
- *		void *arg;
- *	};
- *	static struct callback *callbacks;
- *	
- *	static void _register_callback(int value, int (*cb)(int, void *),
- *				       void *arg)
- *	{
- *		struct callback *new = malloc(sizeof(*new));
- *		new->next = callbacks;
- *		new->value = value;
- *		new->callback = cb;
- *		new->arg = arg;
- *		callbacks = new;
- *	}
- *	#define register_callback(value, cb, arg)			\
- *		_register_callback(value,				\
- *				   typesafe_cb_preargs(int, void *,	\
- *						       (cb), (arg), int),\
- *				   (arg))
- *	
- *	static struct callback *find_callback(int value)
- *	{
- *		struct callback *i;
- *	
- *		for (i = callbacks; i; i = i->next)
- *			if (i->value == value)
- *				return i;
- *		return NULL;
- *	}   
- *
- *	// Define several silly callbacks.  Note they don't use void *!
- *	#define DEF_CALLBACK(name, op)			\
- *		static int name(int val, int *arg)	\
- *		{					\
- *			printf("%s", #op);		\
- *			return val op *arg;		\
- *		}
- *	DEF_CALLBACK(multiply, *);
- *	DEF_CALLBACK(add, +);
- *	DEF_CALLBACK(divide, /);
- *	DEF_CALLBACK(sub, -);
- *	DEF_CALLBACK(or, |);
- *	DEF_CALLBACK(and, &);
- *	DEF_CALLBACK(xor, ^);
- *	DEF_CALLBACK(assign, =);
- *
- *	// Silly game to find the longest chain of values.
- *	int main(int argc, char *argv[])
- *	{
- *		int i, run = 1, num = argv[1] ? atoi(argv[1]) : 0;
- *	
- *		for (i = 1; i < 1024;) {
- *			// Since run is an int, compiler checks "add" does too.
- *			register_callback(i++, add, &run);
- *			register_callback(i++, divide, &run);
- *			register_callback(i++, sub, &run);
- *			register_callback(i++, multiply, &run);
- *			register_callback(i++, or, &run);
- *			register_callback(i++, and, &run);
- *			register_callback(i++, xor, &run);
- *			register_callback(i++, assign, &run);
- *		}
- *	
- *		printf("%i ", num);
- *		while (run < 56) {
- *			struct callback *cb = find_callback(num % i);
- *			if (!cb) {
- *				printf("-> STOP\n");
- *				return 1;
- *			}
- *			num = cb->callback(num, cb->arg);
- *			printf("->%i ", num);
- *			run++;
- *		}
- *		printf("-> Winner!\n");
- *		return 0;
- *	}
- *
- * License: LGPL (2 or any later version)
- * Author: Rusty Russell <rusty@rustcorp.com.au>
- */
-int main(int argc, char *argv[])
-{
-	if (argc != 2)
-		return 1;
-
-	if (strcmp(argv[1], "depends") == 0) {
-		return 0;
-	}
-
-	return 1;
-}

+ 0 - 32
ccan/typesafe_cb/test/compile_fail-cast_if_type-promotable.c

@@ -1,32 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdbool.h>
-
-static void _set_some_value(void *val)
-{
-}
-
-#define set_some_value(expr)						\
-	_set_some_value(typesafe_cb_cast(void *, long, (expr)))
-
-int main(int argc, char *argv[])
-{
-#ifdef FAIL
-	bool x = 0;
-#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
-#error "Unfortunately we don't fail if typesafe_cb_cast is a noop."
-#endif
-#else
-	long x = 0;
-#endif
-	set_some_value(x);
-	return 0;
-}

+ 0 - 36
ccan/typesafe_cb/test/compile_fail-typesafe_cb-int.c

@@ -1,36 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-void _callback(void (*fn)(void *arg), void *arg);
-void _callback(void (*fn)(void *arg), void *arg)
-{
-	fn(arg);
-}
-
-/* Callback is set up to warn if arg isn't a pointer (since it won't
- * pass cleanly to _callback's second arg. */
-#define callback(fn, arg)						\
-	_callback(typesafe_cb(void, (fn), (arg)), (arg))
-
-void my_callback(int something);
-void my_callback(int something)
-{
-}
-
-int main(int argc, char *argv[])
-{
-#ifdef FAIL
-	/* This fails due to arg, not due to cast. */
-	callback(my_callback, 100);
-#endif
-	return 0;
-}

+ 0 - 43
ccan/typesafe_cb/test/compile_fail-typesafe_cb.c

@@ -1,43 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-static void _register_callback(void (*cb)(void *arg), void *arg)
-{
-}
-
-#define register_callback(cb, arg)				\
-	_register_callback(typesafe_cb(void, void *, (cb), (arg)), (arg))
-
-static void my_callback(char *p)
-{
-}
-
-int main(int argc, char *argv[])
-{
-	char str[] = "hello world";
-#ifdef FAIL
-	int *p;
-#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
-#error "Unfortunately we don't fail if typesafe_cb_cast is a noop."
-#endif
-#else
-	char *p;
-#endif
-	p = NULL;
-
-	/* This should work always. */
-	register_callback(my_callback, str);
-
-	/* This will fail with FAIL defined */
-	register_callback(my_callback, p);
-	return 0;
-}

+ 0 - 52
ccan/typesafe_cb/test/compile_fail-typesafe_cb_cast-multi.c

@@ -1,52 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-struct foo {
-	int x;
-};
-
-struct bar {
-	int x;
-};
-
-struct baz {
-	int x;
-};
-
-struct any {
-	int x;
-};
-
-struct other {
-	int x;
-};
-
-static void take_any(struct any *any)
-{
-}
-
-int main(int argc, char *argv[])
-{
-#ifdef FAIL
-	struct other
-#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
-#error "Unfortunately we don't fail if typesafe_cb_cast is a noop."
-#endif
-#else
-	struct foo
-#endif
-		*arg = NULL;
-	take_any(typesafe_cb_cast3(struct any *,
-				   struct foo *, struct bar *, struct baz *,
-				   arg));
-	return 0;
-}

+ 0 - 34
ccan/typesafe_cb/test/compile_fail-typesafe_cb_cast.c

@@ -1,34 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-
-void _set_some_value(void *val);
-
-void _set_some_value(void *val)
-{
-}
-
-#define set_some_value(expr)						\
-	_set_some_value(typesafe_cb_cast(void *, unsigned long, (expr)))
-
-int main(int argc, char *argv[])
-{
-#ifdef FAIL
-	int x = 0;
-	set_some_value(x);
-#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
-#error "Unfortunately we don't fail if typesafe_cb_cast is a noop."
-#endif
-#else
-	void *p = 0;
-	set_some_value(p);
-#endif
-	return 0;
-}

+ 0 - 36
ccan/typesafe_cb/test/compile_fail-typesafe_cb_postargs.c

@@ -1,36 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-static void _register_callback(void (*cb)(void *arg, int x), void *arg)
-{
-}
-#define register_callback(cb, arg)				\
-	_register_callback(typesafe_cb_postargs(void, void *, (cb), (arg), int), (arg))
-
-static void my_callback(char *p, int x)
-{
-}
-
-int main(int argc, char *argv[])
-{
-#ifdef FAIL
-	int *p;
-#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
-#error "Unfortunately we don't fail if typesafe_cb_cast is a noop."
-#endif
-#else
-	char *p;
-#endif
-	p = NULL;
-	register_callback(my_callback, p);
-	return 0;
-}

+ 0 - 37
ccan/typesafe_cb/test/compile_fail-typesafe_cb_preargs.c

@@ -1,37 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-static void _register_callback(void (*cb)(int x, void *arg), void *arg)
-{
-}
-
-#define register_callback(cb, arg)				\
-	_register_callback(typesafe_cb_preargs(void, void *, (cb), (arg), int), (arg))
-
-static void my_callback(int x, char *p)
-{
-}
-
-int main(int argc, char *argv[])
-{
-#ifdef FAIL
-	int *p;
-#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
-#error "Unfortunately we don't fail if typesafe_cb_cast is a noop."
-#endif
-#else
-	char *p;
-#endif
-	p = NULL;
-	register_callback(my_callback, p);
-	return 0;
-}

+ 0 - 26
ccan/typesafe_cb/test/compile_ok-typesafe_cb-NULL.c

@@ -1,26 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-/* NULL args for callback function should be OK for normal and _def. */
-
-static void _register_callback(void (*cb)(const void *arg), const void *arg)
-{
-}
-
-#define register_callback(cb, arg)				\
-	_register_callback(typesafe_cb(void, const void *, (cb), (arg)), (arg))
-
-int main(int argc, char *argv[])
-{
-	register_callback(NULL, "hello world");
-	return 0;
-}

+ 0 - 58
ccan/typesafe_cb/test/compile_ok-typesafe_cb-undefined.c

@@ -1,58 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-/* const args in callbacks should be OK. */
-
-static void _register_callback(void (*cb)(void *arg), void *arg)
-{
-}
-
-#define register_callback(cb, arg)				\
-	_register_callback(typesafe_cb(void, void *, (cb), (arg)), (arg))
-
-static void _register_callback_pre(void (*cb)(int x, void *arg), void *arg)
-{
-}
-
-#define register_callback_pre(cb, arg)					\
-	_register_callback_pre(typesafe_cb_preargs(void, void *, (cb), (arg), int), (arg))
-
-static void _register_callback_post(void (*cb)(void *arg, int x), void *arg)
-{
-}
-
-#define register_callback_post(cb, arg)					\
-	_register_callback_post(typesafe_cb_postargs(void, void *, (cb), (arg), int), (arg))
-
-struct undefined;
-
-static void my_callback(struct undefined *undef)
-{
-}
-
-static void my_callback_pre(int x, struct undefined *undef)
-{
-}
-
-static void my_callback_post(struct undefined *undef, int x)
-{
-}
-
-int main(int argc, char *argv[])
-{
-	struct undefined *handle = NULL;
-
-	register_callback(my_callback, handle);
-	register_callback_pre(my_callback_pre, handle);
-	register_callback_post(my_callback_post, handle);
-	return 0;
-}

+ 0 - 61
ccan/typesafe_cb/test/compile_ok-typesafe_cb-vars.c

@@ -1,61 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-/* const args in callbacks should be OK. */
-
-static void _register_callback(void (*cb)(void *arg), void *arg)
-{
-}
-
-#define register_callback(cb, arg)				\
-	_register_callback(typesafe_cb(void, void *, (cb), (arg)), (arg))
-
-static void _register_callback_pre(void (*cb)(int x, void *arg), void *arg)
-{
-}
-
-#define register_callback_pre(cb, arg)					\
-	_register_callback_pre(typesafe_cb_preargs(void, void *, (cb), (arg), int), (arg))
-
-static void _register_callback_post(void (*cb)(void *arg, int x), void *arg)
-{
-}
-
-#define register_callback_post(cb, arg)					\
-	_register_callback_post(typesafe_cb_postargs(void, void *, (cb), (arg), int), (arg))
-
-struct undefined;
-
-static void my_callback(struct undefined *undef)
-{
-}
-
-static void my_callback_pre(int x, struct undefined *undef)
-{
-}
-
-static void my_callback_post(struct undefined *undef, int x)
-{
-}
-
-int main(int argc, char *argv[])
-{
-	struct undefined *handle = NULL;
-	void (*cb)(struct undefined *undef) = my_callback;
-	void (*pre)(int x, struct undefined *undef) = my_callback_pre;
-	void (*post)(struct undefined *undef, int x) = my_callback_post;
-
-	register_callback(cb, handle);
-	register_callback_pre(pre, handle);
-	register_callback_post(post, handle);
-	return 0;
-}

+ 0 - 50
ccan/typesafe_cb/test/compile_ok-typesafe_cb_cast.c

@@ -1,50 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <stdlib.h>
-
-struct foo {
-	int x;
-};
-
-struct bar {
-	int x;
-};
-
-struct baz {
-	int x;
-};
-
-struct any {
-	int x;
-};
-
-static void take_any(struct any *any)
-{
-}
-
-int main(int argc, char *argv[])
-{
-	/* Otherwise we get unused warnings for these. */
-	struct foo *foo = NULL;
-	struct bar *bar = NULL;
-	struct baz *baz = NULL;
-
-	take_any(typesafe_cb_cast3(struct any *,
-				   struct foo *, struct bar *, struct baz *,
-				   foo));
-	take_any(typesafe_cb_cast3(struct any *, 
-				   struct foo *, struct bar *, struct baz *,
-				   bar));
-	take_any(typesafe_cb_cast3(struct any *, 
-				   struct foo *, struct bar *, struct baz *,
-				   baz));
-	return 0;
-}

+ 0 - 118
ccan/typesafe_cb/test/run.c

@@ -1,118 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#include <ccan/typesafe_cb/typesafe_cb.h>
-#include <string.h>
-#include <stdint.h>
-#include <ccan/tap/tap.h>
-
-static char dummy = 0;
-
-/* The example usage. */
-static void _set_some_value(void *val)
-{
-	ok1(val == &dummy);
-}
-
-#define set_some_value(expr)						\
-	_set_some_value(typesafe_cb_cast(void *, unsigned long, (expr)))
-
-static void _callback_onearg(void (*fn)(void *arg), void *arg)
-{
-	fn(arg);
-}
-
-static void _callback_preargs(void (*fn)(int a, int b, void *arg), void *arg)
-{
-	fn(1, 2, arg);
-}
-
-static void _callback_postargs(void (*fn)(void *arg, int a, int b), void *arg)
-{
-	fn(arg, 1, 2);
-}
-
-#define callback_onearg(cb, arg)					\
-	_callback_onearg(typesafe_cb(void, void *, (cb), (arg)), (arg))
-
-#define callback_preargs(cb, arg)					\
-	_callback_preargs(typesafe_cb_preargs(void, void *, (cb), (arg), int, int), (arg))
-
-#define callback_postargs(cb, arg)					\
-	_callback_postargs(typesafe_cb_postargs(void, void *, (cb), (arg), int, int), (arg))
-
-static void my_callback_onearg(char *p)
-{
-	ok1(strcmp(p, "hello world") == 0);
-}
-
-static void my_callback_preargs(int a, int b, char *p)
-{
-	ok1(a == 1);
-	ok1(b == 2);
-	ok1(strcmp(p, "hello world") == 0);
-}
-
-static void my_callback_postargs(char *p, int a, int b)
-{
-	ok1(a == 1);
-	ok1(b == 2);
-	ok1(strcmp(p, "hello world") == 0);
-}
-
-/* This is simply a compile test; we promised typesafe_cb_cast can be in a
- * static initializer. */
-struct callback_onearg
-{
-	void (*fn)(void *arg);
-	const void *arg;
-};
-
-struct callback_onearg cb_onearg
-= { typesafe_cb(void, void *, my_callback_onearg, (char *)(intptr_t)"hello world"),
-    "hello world" };
-
-struct callback_preargs
-{
-	void (*fn)(int a, int b, void *arg);
-	const void *arg;
-};
-
-struct callback_preargs cb_preargs
-= { typesafe_cb_preargs(void, void *, my_callback_preargs,
-			(char *)(intptr_t)"hi", int, int), "hi" };
-
-struct callback_postargs
-{
-	void (*fn)(void *arg, int a, int b);
-	const void *arg;
-};
-
-struct callback_postargs cb_postargs
-= { typesafe_cb_postargs(void, void *, my_callback_postargs, 
-			 (char *)(intptr_t)"hi", int, int), "hi" };
-
-int main(int argc, char *argv[])
-{
-	void *p = &dummy;
-	unsigned long l = (unsigned long)p;
-	char str[] = "hello world";
-
-	plan_tests(2 + 1 + 3 + 3);
-	set_some_value(p);
-	set_some_value(l);
-
-	callback_onearg(my_callback_onearg, str);
-
-	callback_preargs(my_callback_preargs, str);
-
-	callback_postargs(my_callback_postargs, str);
-
-	return exit_status();
-}

+ 0 - 142
ccan/typesafe_cb/typesafe_cb.h

@@ -1,142 +0,0 @@
-/*
- * Copyright 2011 Rusty Russell
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.  See LICENSE for more details.
- */
-
-#ifndef CCAN_TYPESAFE_CB_H
-#define CCAN_TYPESAFE_CB_H
-#include "config.h"
-
-#if HAVE_TYPEOF && HAVE_BUILTIN_CHOOSE_EXPR && HAVE_BUILTIN_TYPES_COMPATIBLE_P
-/**
- * typesafe_cb_cast - only cast an expression if it matches a given type
- * @desttype: the type to cast to
- * @oktype: the type we allow
- * @expr: the expression to cast
- *
- * This macro is used to create functions which allow multiple types.
- * The result of this macro is used somewhere that a @desttype type is
- * expected: if @expr is exactly of type @oktype, then it will be
- * cast to @desttype type, otherwise left alone.
- *
- * This macro can be used in static initializers.
- *
- * This is merely useful for warnings: if the compiler does not
- * support the primitives required for typesafe_cb_cast(), it becomes an
- * unconditional cast, and the @oktype argument is not used.  In
- * particular, this means that @oktype can be a type which uses the
- * "typeof": it will not be evaluated if typeof is not supported.
- *
- * Example:
- *	// We can take either an unsigned long or a void *.
- *	void _set_some_value(void *val);
- *	#define set_some_value(e)			\
- *		_set_some_value(typesafe_cb_cast(void *, (e), unsigned long))
- */
-#define typesafe_cb_cast(desttype, oktype, expr)			\
-	__builtin_choose_expr(						\
-		__builtin_types_compatible_p(__typeof__(0?(expr):(expr)), \
-					     oktype),			\
-		(desttype)(expr), (expr))
-#else
-#define typesafe_cb_cast(desttype, oktype, expr) ((desttype)(expr))
-#endif
-
-/**
- * typesafe_cb_cast3 - only cast an expression if it matches given types
- * @desttype: the type to cast to
- * @ok1: the first type we allow
- * @ok2: the second type we allow
- * @ok3: the third type we allow
- * @expr: the expression to cast
- *
- * This is a convenient wrapper for multiple typesafe_cb_cast() calls.
- * You can chain them inside each other (ie. use typesafe_cb_cast()
- * for expr) if you need more than 3 arguments.
- *
- * Example:
- *	// We can take either a long, unsigned long, void * or a const void *.
- *	void _set_some_value(void *val);
- *	#define set_some_value(expr)					\
- *		_set_some_value(typesafe_cb_cast3(void *,,		\
- *					    long, unsigned long, const void *,\
- *					    (expr)))
- */
-#define typesafe_cb_cast3(desttype, ok1, ok2, ok3, expr)		\
-	typesafe_cb_cast(desttype, ok1,					\
-			 typesafe_cb_cast(desttype, ok2,		\
-					  typesafe_cb_cast(desttype, ok3, \
-							   (expr))))
-
-/**
- * typesafe_cb - cast a callback function if it matches the arg
- * @rtype: the return type of the callback function
- * @atype: the (pointer) type which the callback function expects.
- * @fn: the callback function to cast
- * @arg: the (pointer) argument to hand to the callback function.
- *
- * If a callback function takes a single argument, this macro does
- * appropriate casts to a function which takes a single atype argument if the
- * callback provided matches the @arg.
- *
- * It is assumed that @arg is of pointer type: usually @arg is passed
- * or assigned to a void * elsewhere anyway.
- *
- * Example:
- *	void _register_callback(void (*fn)(void *arg), void *arg);
- *	#define register_callback(fn, arg) \
- *		_register_callback(typesafe_cb(void, (fn), void*, (arg)), (arg))
- */
-#define typesafe_cb(rtype, atype, fn, arg)			\
-	typesafe_cb_cast(rtype (*)(atype),			\
-			 rtype (*)(__typeof__(arg)),		\
-			 (fn))
-
-/**
- * typesafe_cb_preargs - cast a callback function if it matches the arg
- * @rtype: the return type of the callback function
- * @atype: the (pointer) type which the callback function expects.
- * @fn: the callback function to cast
- * @arg: the (pointer) argument to hand to the callback function.
- *
- * This is a version of typesafe_cb() for callbacks that take other arguments
- * before the @arg.
- *
- * Example:
- *	void _register_callback(void (*fn)(int, void *arg), void *arg);
- *	#define register_callback(fn, arg)				   \
- *		_register_callback(typesafe_cb_preargs(void, (fn), void *, \
- *				   (arg), int),				   \
- *				   (arg))
- */
-#define typesafe_cb_preargs(rtype, atype, fn, arg, ...)			\
-	typesafe_cb_cast(rtype (*)(__VA_ARGS__, atype),			\
-			 rtype (*)(__VA_ARGS__, __typeof__(arg)),	\
-			 (fn))
-
-/**
- * typesafe_cb_postargs - cast a callback function if it matches the arg
- * @rtype: the return type of the callback function
- * @atype: the (pointer) type which the callback function expects.
- * @fn: the callback function to cast
- * @arg: the (pointer) argument to hand to the callback function.
- *
- * This is a version of typesafe_cb() for callbacks that take other arguments
- * after the @arg.
- *
- * Example:
- *	void _register_callback(void (*fn)(void *arg, int), void *arg);
- *	#define register_callback(fn, arg) \
- *		_register_callback(typesafe_cb_postargs(void, (fn), void *, \
- *				   (arg), int),				    \
- *				   (arg))
- */
-#define typesafe_cb_postargs(rtype, atype, fn, arg, ...)		\
-	typesafe_cb_cast(rtype (*)(atype, __VA_ARGS__),			\
-			 rtype (*)(__typeof__(arg), __VA_ARGS__),	\
-			 (fn))
-#endif /* CCAN_CAST_IF_TYPE_H */

+ 2 - 1
configure.ac

@@ -82,6 +82,7 @@ AC_CHECK_HEADERS([sys/epoll.h])
 AC_CHECK_HEADERS([sys/mman.h])
 AC_CHECK_HEADERS([sys/prctl.h])
 AC_CHECK_HEADERS([sys/file.h])
+AC_CHECK_HEADERS([sys/termios.h])
 AC_CHECK_HEADERS([linux/spi/spidev.h])
 
 AC_CHECK_MEMBER([struct i2c_msg.buf],[
@@ -1611,7 +1612,7 @@ AC_CONFIG_FILES([
 	Makefile
 	x86_64/Makefile
 	x86_32/Makefile
-	ccan/Makefile
+	ccan.bfg/Makefile
 	lib/Makefile
 	])
 

+ 0 - 1
driver-opencl.c

@@ -31,7 +31,6 @@
 #ifndef WIN32
 #include <sys/resource.h>
 #endif
-#include <ccan/opt/opt.h>
 
 #define OMIT_OPENCL_API
 

+ 5 - 1
make-release

@@ -38,7 +38,11 @@ cd "$TMPDIR"
 git submodule update --init
 {
 	git archive --prefix "$sw"/ --format tar "$tag"
-	git submodule --quiet foreach --recursive 'git archive --prefix "'"$sw"'/$path/" --format tar HEAD'
+	git submodule --quiet foreach --recursive 'test x$name = xccan-upstream || git archive --prefix "'"$sw"'/$path/" --format tar HEAD'
+	(
+		cd ccan-upstream
+		git archive --prefix "'"$sw"'/$path/" --format tar HEAD ccan/{build_assert,cast,compiler,opt,typesafe_cb}
+	)
 } | tar -xivp
 cd "$sw"
 NOSUBMODULES=1 \

+ 29 - 1
miner.c

@@ -59,7 +59,7 @@
 #include <dbt.h>
 #define HAVE_BFG_HOTPLUG
 #endif
-#include <ccan/opt/opt.h>
+#include <ccan/ccan/opt/opt.h>
 #include <jansson.h>
 #include <curl/curl.h>
 #include <libgen.h>
@@ -1104,6 +1104,34 @@ struct pool *current_pool(void)
 	return pool;
 }
 
+// Copied from ccan/opt/helpers.c
+static char *arg_bad(const char *fmt, const char *arg)
+{
+	char *str = malloc(strlen(fmt) + strlen(arg));
+	sprintf(str, fmt, arg);
+	return str;
+}
+
+static
+char *opt_set_floatval(const char *arg, float *f)
+{
+	char *endp;
+
+	errno = 0;
+	*f = strtof(arg, &endp);
+	if (*endp || !arg[0])
+		return arg_bad("'%s' is not a number", arg);
+	if (errno)
+		return arg_bad("'%s' is out of range", arg);
+	return NULL;
+}
+
+static
+void opt_show_floatval(char buf[OPT_SHOW_LEN], const float *f)
+{
+	snprintf(buf, OPT_SHOW_LEN, "%.1f", *f);
+}
+
 char *set_int_range(const char *arg, int *i, int min, int max)
 {
 	char *err = opt_set_intval(arg, i);