Browse Source

add local copy of getopt() for win32 build

Now all commandline utilities have a platform-independent
syntax.

Signed-off-by: Steve Markgraf <steve@steve-m.de>
Steve Markgraf 13 years ago
parent
commit
d08c4770ab
6 changed files with 1257 additions and 49 deletions
  1. 9 0
      src/CMakeLists.txt
  2. 1059 0
      src/getopt/getopt.c
  3. 180 0
      src/getopt/getopt.h
  4. 3 16
      src/rtl_sdr.c
  5. 5 17
      src/rtl_tcp.c
  6. 1 16
      src/rtl_test.c

+ 9 - 0
src/CMakeLists.txt

@@ -44,6 +44,12 @@ add_library(rtlsdr_static STATIC
     tuner_fc2580.c
 )
 
+if(WIN32)
+add_library(libgetopt_static STATIC
+    getopt/getopt.c
+)
+endif()
+
 target_link_libraries(rtlsdr_static
     ${LIBUSB_LIBRARIES}
 )
@@ -75,6 +81,9 @@ target_link_libraries(rtl_test rtlsdr_static
 )
 
 if(WIN32)
+target_link_libraries(rtl_sdr libgetopt_static)
+target_link_libraries(rtl_tcp libgetopt_static)
+target_link_libraries(rtl_test libgetopt_static)
 set_property(TARGET rtl_sdr APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" )
 set_property(TARGET rtl_tcp APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" )
 set_property(TARGET rtl_test APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" )

File diff suppressed because it is too large
+ 1059 - 0
src/getopt/getopt.c


+ 180 - 0
src/getopt/getopt.h

@@ -0,0 +1,180 @@
+/* Declarations for getopt.
+   Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C 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.
+
+   The GNU C 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 the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+   standalone, or this is the first header included in the source file.
+   If we are being used with glibc, we need to include <features.h>, but
+   that does not exist if we are standalone.  So: if __GNU_LIBRARY__ is
+   not defined, include <ctype.h>, which will pull in <features.h> for us
+   if it's from glibc.  (Why ctype.h?  It's guaranteed to exist and it
+   doesn't flood the namespace with stuff the way some other headers do.)  */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument		(or 0) if the option does not take an argument,
+   required_argument	(or 1) if the option requires an argument,
+   optional_argument 	(or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+# if (defined __STDC__ && __STDC__) || defined __cplusplus
+  const char *name;
+# else
+  char *name;
+# endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+# define no_argument		0
+# define required_argument	1
+# define optional_argument	2
+#endif	/* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+   arguments in ARGV (ARGC of them, minus the program name) for
+   options given in OPTS.
+
+   Return the option character from OPTS just read.  Return -1 when
+   there are no more options.  For unrecognized options, or options
+   missing arguments, `optopt' is set to the option letter, and '?' is
+   returned.
+
+   The OPTS string is a list of characters which are recognized option
+   letters, optionally followed by colons, specifying that that letter
+   takes an argument, to be placed in `optarg'.
+
+   If a letter in OPTS is followed by two colons, its argument is
+   optional.  This behavior is specific to the GNU `getopt'.
+
+   The argument `--' causes premature termination of argument
+   scanning, explicitly telling `getopt' that there are no more
+   options.
+
+   If OPTS begins with `--', then non-option arguments are treated as
+   arguments to the option '\0'.  This behavior is specific to the GNU
+   `getopt'.  */
+
+#if (defined __STDC__ && __STDC__) || defined __cplusplus
+# ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
+# else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+# endif /* __GNU_LIBRARY__ */
+
+# ifndef __need_getopt
+extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts,
+		        const struct option *__longopts, int *__longind);
+extern int getopt_long_only (int __argc, char *const *__argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int __argc, char *const *__argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind,
+			     int __long_only);
+# endif
+#else /* not __STDC__ */
+extern int getopt ();
+# ifndef __need_getopt
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+# endif
+#endif /* __STDC__ */
+
+#ifdef	__cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations.  */
+#undef __need_getopt
+
+#endif /* getopt.h */

+ 3 - 16
src/rtl_sdr.c

@@ -26,6 +26,7 @@
 #include <unistd.h>
 #else
 #include <Windows.h>
+#include "getopt/getopt.h"
 #endif
 
 #include "rtl-sdr.h"
@@ -41,11 +42,6 @@ static rtlsdr_dev_t *dev = NULL;
 
 void usage(void)
 {
-	#ifdef _WIN32
-	fprintf(stderr,"rtl_sdr, an I/Q recorder for RTL2832 based DVB-T receivers\n\n"
-		"Usage:\t rtl_sdr.exe [device_index] [samplerate in kHz] "
-		"[gain (0 for auto)] [frequency in Hz] [filename]\n");
-	#else
 	fprintf(stderr,
 		"rtl_sdr, an I/Q recorder for RTL2832 based DVB-T receivers\n\n"
 		"Usage:\t -f frequency_to_tune_to [Hz]\n"
@@ -55,7 +51,6 @@ void usage(void)
 		"\t[-b output_block_size (default: 16 * 16384)]\n"
 		"\t[-S force sync output (default: async)]\n"
 		"\tfilename (a '-' dumps samples to stdout)\n\n");
-#endif
 	exit(1);
 }
 
@@ -108,7 +103,7 @@ int main(int argc, char **argv)
 	uint32_t out_block_size = DEFAULT_BUF_LENGTH;
 	int device_count;
 	char vendor[256], product[256], serial[256];
-#ifndef _WIN32
+
 	while ((opt = getopt(argc, argv, "d:f:g:s:b:S::")) != -1) {
 		switch (opt) {
 		case 'd':
@@ -140,15 +135,7 @@ int main(int argc, char **argv)
 	} else {
 		filename = argv[optind];
 	}
-#else
-	if(argc < 6)
-		usage();
-	dev_index = atoi(argv[1]);
-	samp_rate = atoi(argv[2])*1000; /* kHz */
-	gain = (int)(atof(argv[3]) * 10); /* tenths of a dB */
-	frequency = atoi(argv[4]);
-	filename = argv[5];
-#endif
+
 	if(out_block_size < MINIMAL_BUF_LENGTH ||
 	   out_block_size > MAXIMAL_BUF_LENGTH ){
 		fprintf(stderr,

+ 5 - 17
src/rtl_tcp.c

@@ -34,6 +34,7 @@
 #include <fcntl.h>
 #else
 #include <WinSock2.h>
+#include "getopt/getopt.h"
 #endif
 
 #include <pthread.h>
@@ -78,11 +79,6 @@ static int do_exit = 0;
 
 void usage(void)
 {
-	#ifdef _WIN32
-	printf("rtl_tcp, an I/Q spectrum server for RTL2832 based DVB-T receivers\n\n"
-		"Usage:\t rtl_tcp.exe [listen addr] [listen port] "
-		"[samplerate in kHz] [frequency in Hz] [device index]\n");
-	#else
 	printf("rtl_tcp, an I/Q spectrum server for RTL2832 based DVB-T receivers\n\n"
 		"Usage:\t[-a listen address]\n"
 		"\t[-p listen port (default: 1234)]\n"
@@ -90,7 +86,6 @@ void usage(void)
 		"\t[-g gain (default: 0 for auto)]\n"
 		"\t[-s samplerate in Hz (default: 2048000 Hz)]\n"
 		"\t[-d device index (default: 0)]\n");
-	#endif
 	exit(1);
 }
 
@@ -327,9 +322,10 @@ int main(int argc, char **argv)
 #ifdef _WIN32
 	WSADATA wsd;
 	i = WSAStartup(MAKEWORD(2,2), &wsd);
-#endif
-#ifndef _WIN32
+#else
 	struct sigaction sigact;
+#endif
+
 	while ((opt = getopt(argc, argv, "a:p:f:g:s:d:")) != -1) {
 		switch (opt) {
 		case 'd':
@@ -358,15 +354,7 @@ int main(int argc, char **argv)
 
 	if (argc < optind)
 		usage();
-#else
-	if(argc < 6)
-		usage();
-	dev_index = atoi(argv[5]);
-	frequency = atoi(argv[4]);
-	samp_rate = atoi(argv[3])*1000; /* kHz */
-	port = atoi(argv[2]);
-	addr = argv[1];
-#endif
+
 	device_count = rtlsdr_get_device_count();
 	if (!device_count) {
 		fprintf(stderr, "No supported devices found.\n");

+ 1 - 16
src/rtl_test.c

@@ -26,6 +26,7 @@
 #include <unistd.h>
 #else
 #include <Windows.h>
+#include "getopt/getopt.h"
 #endif
 
 #include "rtl-sdr.h"
@@ -43,11 +44,6 @@ static rtlsdr_dev_t *dev = NULL;
 
 void usage(void)
 {
-	#ifdef _WIN32
-	fprintf(stderr,"rtl_test, a benchmark tool for RTL2832 based DVB-T receivers\n\n"
-		"Usage:\t rtl_test.exe [device_index] [samplerate in kHz] [e4k test mode]\n"
-		"\ti.e. rtl_test.exe 0 2048 1\n");
-	#else
 	fprintf(stderr,
 		"rtl_test, a benchmark tool for RTL2832 based DVB-T receivers\n\n"
 		"Usage:\n"
@@ -56,7 +52,6 @@ void usage(void)
 		"\t[-t enable Elonics E4000 tuner benchmark]\n"
 		"\t[-b output_block_size (default: 16 * 16384)]\n"
 		"\t[-S force sync output (default: async)]\n");
-	#endif
 	exit(1);
 }
 
@@ -166,7 +161,6 @@ int main(int argc, char **argv)
 	uint32_t out_block_size = DEFAULT_BUF_LENGTH;
 	int device_count;
 
-#ifndef _WIN32
 	while ((opt = getopt(argc, argv, "d:s:b:tS::")) != -1) {
 		switch (opt) {
 		case 'd':
@@ -190,15 +184,6 @@ int main(int argc, char **argv)
 		}
 	}
 
-#else
-/* TODO fix win usage */
-	if (argc < 3)
-		usage();
-	dev_index = atoi(argv[1]);
-	samp_rate = atoi(argv[2])*1000;
-	if (argc >3 && argv[3][0] == '1')
-		tuner_benchmark = 1;
-#endif
 	if(out_block_size < MINIMAL_BUF_LENGTH ||
 	   out_block_size > MAXIMAL_BUF_LENGTH ){
 		fprintf(stderr,