pull/3/merge
OgreTransporter 6 years ago committed by GitHub
commit 4c0fa2c221
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -6,8 +6,8 @@ include(InstallHeadersWithDirectory)
include(LinkResources) include(LinkResources)
OPTION(BUILD_EXAMPLES "Build examples" OFF) OPTION(BUILD_EXAMPLES "Build examples" OFF)
OPTION(BUILD_UNIT_TESTS "Build unit tests" OFF)
OPTION(BUILD_COMMANDLINETOOL "Build command line tool" ON) OPTION(BUILD_COMMANDLINETOOL "Build command line tool" ON)
option(BUILD_DOC "Build documentation" OFF)
SET(libsdr_VERSION_MAJOR "0") SET(libsdr_VERSION_MAJOR "0")
SET(libsdr_VERSION_MINOR "1") SET(libsdr_VERSION_MINOR "1")
@ -17,15 +17,24 @@ find_package(FFTW)
find_package(FFTWSingle) find_package(FFTWSingle)
find_package(PortAudio) find_package(PortAudio)
find_package(RTLSDR) find_package(RTLSDR)
if(WIN32)
find_package(PTHREAD REQUIRED)
endif()
if(BUILD_DOC)
find_package(Doxygen REQUIRED)
endif()
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src) INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src)
INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR}/src) INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR}/src)
INCLUDE_DIRECTORIES(${PORTAUDIO_INCLUDE_DIRS}) if(WIN32)
include_directories(${PTHREAD_INCLUDE_DIR})
endif()
INCLUDE_DIRECTORIES(${GETOPT_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${GETOPT_INCLUDE_DIRS})
# Set some variables for the configuration file # Set some variables for the configuration file
IF(FFTW_FOUND) IF(FFTW_FOUND)
set(SDR_WITH_FFTW ON) set(SDR_WITH_FFTW ON)
include_directories(${FFTW_INCLUDES})
ELSE(FFTW_FOUND) ELSE(FFTW_FOUND)
set(FFTW_LIBRARIES) set(FFTW_LIBRARIES)
set(FFTWSingle_LIBRARIES) set(FFTWSingle_LIBRARIES)
@ -33,32 +42,52 @@ ENDIF(FFTW_FOUND)
IF(PORTAUDIO_FOUND) IF(PORTAUDIO_FOUND)
set(SDR_WITH_PORTAUDIO ON) set(SDR_WITH_PORTAUDIO ON)
include_directories(${PORTAUDIO_INCLUDE_DIRS})
ELSE(PORTAUDIO_FOUND) ELSE(PORTAUDIO_FOUND)
set(PORTAUDIO_LIBRARIES) set(PORTAUDIO_LIBRARIES)
ENDIF(PORTAUDIO_FOUND) ENDIF(PORTAUDIO_FOUND)
IF(RTLSDR_FOUND) IF(RTLSDR_FOUND)
set(SDR_WITH_RTLSDR ON) set(SDR_WITH_RTLSDR ON)
ELSE(TRLSDR_FOUND) include_directories(${RTLSDR_INCLUDES})
option(RTLSDR_STATIC "Use static librtlsdr library" OFF)
if(RTLSDR_STATIC)
add_definitions(-Drtlsdr_STATIC)
endif()
ELSE(RTLSDR_FOUND)
set(RTLSDR_LIBRARIES) set(RTLSDR_LIBRARIES)
ENDIF(RTLSDR_FOUND) ENDIF(RTLSDR_FOUND)
set(LIBS ${FFTW_LIBRARIES} ${FFTWSingle_LIBRARIES} ${PORTAUDIO_LIBRARIES} ${RTLSDR_LIBRARIES} set(LIBS ${FFTW_LIBRARIES} ${FFTWSingle_LIBRARIES} ${PORTAUDIO_LIBRARIES} ${RTLSDR_LIBRARIES})
"pthread") if(WIN32)
list(APPEND LIBS ${PTHREAD_LIBRARY})
else()
list(APPEND LIBS "pthread")
endif()
# Set compiler flags # Set compiler flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC") if(NOT MSVC)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ggdb") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ggdb") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ggdb") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ggdb")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4514 /wd4267")
add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS)
endif()
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/src) LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/src)
IF(CMAKE_BUILD_TYPE MATCHES DEBUG) if(WIN32)
SET(SDR_DEBUG ON) include (TestBigEndian)
ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG) TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
if(IS_BIG_ENDIAN)
add_definitions(-D__BIG_ENDIAN__)
else()
add_definitions(-D__LITTLE_ENDIAN__)
endif()
endif()
# Create config.hh # Create config.hh
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/config.hh.in CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/config.hh.in
@ -87,9 +116,11 @@ ENDIF(UNIX AND APPLE)
# Add core library, and unit tests # Add core library, and unit tests
add_subdirectory(src) add_subdirectory(src)
IF(BUILD_UNIT_TESTS) include(CTest)
IF(BUILD_TESTING)
enable_testing()
add_subdirectory(test) add_subdirectory(test)
ENDIF(BUILD_UNIT_TESTS) ENDIF(BUILD_TESTING)
IF(BUILD_EXAMPLES) IF(BUILD_EXAMPLES)
add_subdirectory(examples) add_subdirectory(examples)
@ -99,6 +130,21 @@ IF(BUILD_COMMANDLINETOOL)
add_subdirectory(cmd) add_subdirectory(cmd)
endif(BUILD_COMMANDLINETOOL) endif(BUILD_COMMANDLINETOOL)
if(BUILD_DOC)
if(DOXYGEN_DOT_FOUND)
set(HAVE_DOT "YES")
else()
set(HAVE_DOT "NO")
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
add_custom_target(doc_doxygen ALL
COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating API documentation with Doxygen"
VERBATIM)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc TYPE DATA PATTERN "*.md5" EXCLUDE PATTERN "*.map" EXCLUDE)
endif()
# Source distribution packages: # Source distribution packages:
set(CPACK_PACKAGE_VERSION_MAJOR ${libsdr_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MAJOR ${libsdr_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${libsdr_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_MINOR ${libsdr_VERSION_MINOR})

File diff suppressed because it is too large Load Diff

@ -0,0 +1,45 @@
#---
# File: FindPTHREAD.cmake
#
# Find the native pthread-win32 includes and libraries.
#
# This module defines:
#
# PTHREAD_INCLUDE_DIR, where to find pthread.h, etc.
# PTHREAD_LIBRARY, libraries to link against to use pthread.
# PTHREAD_FOUND, True if found, false if one of the above are not found.
#
#---
find_path(PTHREAD_INCLUDE_DIR pthread.h PATHS
${CMAKE_INSTALL_PREFIX}/include
$ENV{PTHREAD_DIR}/include
${PTHREAD_DIR}/include
C:/pthread-win32/include
C:/pthread-win64/include
${PTHREAD_PACKAGE_INCLUDE_HINT}
)
foreach(EXHAND C CE SE)
foreach(COMPAT 1 2 3)
list(APPEND PTHREAD_W32_LIBRARY "pthreadV${EXHAND}${COMPAT}")
endforeach()
endforeach()
find_library(PTHREAD_LIBRARY NAMES ${PTHREAD_W32_LIBRARY} pthread pthread_dll pthread_lib PATHS
${CMAKE_INSTALL_PREFIX}/lib
${CMAKE_INSTALL_PREFIX}/lib64
$ENV{PTHREAD_DIR}/lib
$ENV{PTHREAD_DIR}/lib64
${PTHREAD_DIR}/lib
${PTHREAD_DIR}/lib64
C:/pthread-win32/lib
C:/pthread-win64/lib
${PTHREAD_PACKAGE_INCLUDE_HINT}
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PTHREAD DEFAULT_MSG
PTHREAD_LIBRARY
PTHREAD_INCLUDE_DIR)
add_library(PTHREAD::PTHREAD INTERFACE IMPORTED)

@ -6,3 +6,4 @@ link_resources(sdr_cmd_resources shared/index.html)
add_executable(sdr_cmd main.cc aprsapplication.cc) add_executable(sdr_cmd main.cc aprsapplication.cc)
add_dependencies(sdr_cmd sdr_cmd_resources) add_dependencies(sdr_cmd sdr_cmd_resources)
target_link_libraries(sdr_cmd ${LIBS} libsdr ) target_link_libraries(sdr_cmd ${LIBS} libsdr )
install(TARGETS sdr_cmd)

@ -24,20 +24,25 @@ if(SDR_WITH_RTLSDR)
set(LIBSDR_HEADERS ${LIBSDR_HEADERS} rtlsource.hh) set(LIBSDR_HEADERS ${LIBSDR_HEADERS} rtlsource.hh)
endif(SDR_WITH_RTLSDR) endif(SDR_WITH_RTLSDR)
add_custom_target(libsdr_hdrs SOURCES ${LIBSDR_HEADERS}) if(WIN32)
set(LIBSDR_SOURCES ${LIBSDR_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/win/getopt.c)
#set(LIBSDR_HEADERS ${LIBSDR_HEADERS} ${CMAKE_CURRENT_SOURCE_DIR}/win/getopt.h)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/win)
endif()
add_library(libsdr SHARED ${LIBSDR_SOURCES}) add_library(libsdr STATIC ${LIBSDR_SOURCES} ${LIBSDR_HEADERS} "${CMAKE_CURRENT_BINARY_DIR}/config.hh")
set_target_properties(libsdr PROPERTIES OUTPUT_NAME sdr) set_target_properties(libsdr PROPERTIES OUTPUT_NAME sdr)
set_target_properties(libsdr PROPERTIES DEPENDS libsdr_hdrs)
set_target_properties(libsdr PROPERTIES VERSION set_target_properties(libsdr PROPERTIES VERSION
"${libsdr_VERSION_MAJOR}.${libsdr_VERSION_MINOR}.${libsdr_VERSION_PATCH}") "${libsdr_VERSION_MAJOR}.${libsdr_VERSION_MINOR}.${libsdr_VERSION_PATCH}")
set_target_properties(libsdr PROPERTIES SOVERION "${libsdr_VERSION_MAJOR}") set_target_properties(libsdr PROPERTIES SOVERION "${libsdr_VERSION_MAJOR}")
set_target_properties(libsdr PROPERTIES MACOSX_RPATH "${CMAKE_INSTALL_RPATH}") set_target_properties(libsdr PROPERTIES MACOSX_RPATH "${CMAKE_INSTALL_RPATH}")
set_target_properties(libsdr PROPERTIES INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR}) set_target_properties(libsdr PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}")
target_link_libraries(libsdr ${LIBS}) target_link_libraries(libsdr ${LIBS})
install(TARGETS libsdr DESTINATION ${CMAKE_INSTALL_LIBDIR}) if(NOT CMAKE_INSTALL_INCLUDEDIR)
INSTALL_HEADERS_WITH_DIRECTORY("${LIBSDR_HEADERS}" "${CMAKE_INSTALL_INCLUDEDIR}/libsdr") set(CMAKE_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/config.hh" endif()
install(TARGETS libsdr)
install(FILES ${LIBSDR_HEADERS} "${CMAKE_CURRENT_BINARY_DIR}/config.hh"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/libsdr") DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/libsdr")

@ -9,6 +9,11 @@
#include <inttypes.h> #include <inttypes.h>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#ifdef _MSC_VER
#undef min
#undef max
#include <algorithm>
#endif
#include "config.hh" #include "config.hh"
#include "exception.hh" #include "exception.hh"

@ -1,5 +1,3 @@
#cmakedefine SDR_DEBUG 1
#cmakedefine SDR_WITH_FFTW 1 #cmakedefine SDR_WITH_FFTW 1
#cmakedefine SDR_WITH_PORTAUDIO 1 #cmakedefine SDR_WITH_PORTAUDIO 1
#cmakedefine SDR_WITH_RTLSDR 1 #cmakedefine SDR_WITH_RTLSDR 1
@ -8,3 +6,12 @@
#define SDR_VERSION_MINOR ${libsdr_VERSION_MINOR} #define SDR_VERSION_MINOR ${libsdr_VERSION_MINOR}
#define SDR_VERSION_PATCH ${libsdr_VERSION_PATCH} #define SDR_VERSION_PATCH ${libsdr_VERSION_PATCH}
#define SDR_VERSION_STRING "${libsdr_VERSION_MAJOR}.${libsdr_VERSION_MINOR}.${libsdr_VERSION_PATCH}" #define SDR_VERSION_STRING "${libsdr_VERSION_MAJOR}.${libsdr_VERSION_MINOR}.${libsdr_VERSION_PATCH}"
#ifndef M_PI
#define _USE_MATH_DEFINES
#include <math.h>
#endif
#ifndef NDEBUG
#define SDR_DEBUG 1
#endif

@ -2,14 +2,47 @@
#include "exception.hh" #include "exception.hh"
#include "logger.hh" #include "logger.hh"
#ifndef _WIN32
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#else
#define socklen_t int
#undef min
#include <algorithm>
#endif
#include <iomanip> #include <iomanip>
using namespace sdr; using namespace sdr;
using namespace sdr::http; using namespace sdr::http;
#ifdef _WIN32
class WinsockWrapper
{
public:
WinsockWrapper() { WSAStartup(MAKEWORD(2, 2), &wsa); }
~WinsockWrapper() { WSACleanup(); }
private:
WSADATA wsa;
};
WinsockWrapper ww;
// Workarround for pthread for Windows
#if defined(__PTW32_LEVEL) || defined(__PTW32_VERSION)
inline bool operator< (const pthread_t& lhs, const pthread_t& rhs) { return pthread_getw32threadid_np(lhs) < pthread_getw32threadid_np(rhs); }
inline bool operator> (const pthread_t& lhs, const pthread_t& rhs) { return rhs < lhs; }
inline bool operator<=(const pthread_t& lhs, const pthread_t& rhs) { return !(lhs > rhs); }
inline bool operator>=(const pthread_t& lhs, const pthread_t& rhs) { return !(lhs < rhs); }
inline bool operator==(const pthread_t& lhs, const pthread_t& rhs) { return pthread_getw32threadid_np(lhs) == pthread_getw32threadid_np(rhs); }
inline bool operator!=(const pthread_t& lhs, const pthread_t& rhs) { return !(lhs == rhs); }
#endif
#else
#define closesocket(s) ::close(s)
#endif
/* ********************************************************************************************* * /* ********************************************************************************************* *
* Utility functions * Utility functions
* ********************************************************************************************* */ * ********************************************************************************************* */
@ -120,7 +153,7 @@ Server::start(bool wait) {
} }
struct sockaddr_in serv_addr; struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr)); memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET; serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(_port); serv_addr.sin_port = htons(_port);
@ -131,7 +164,11 @@ Server::start(bool wait) {
} }
int reuseaddr = 1; int reuseaddr = 1;
#ifdef _WIN32
if (setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuseaddr, sizeof(reuseaddr))) {
#else
if (setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr))) { if (setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr))) {
#endif
LogMessage msg(LOG_WARNING); LogMessage msg(LOG_WARNING);
msg << "httpd: Can not set SO_REUSEADDR flag for socket."; msg << "httpd: Can not set SO_REUSEADDR flag for socket.";
Logger::get().log(msg); Logger::get().log(msg);
@ -151,7 +188,7 @@ void
Server::stop(bool wait) { Server::stop(bool wait) {
_is_running = false; _is_running = false;
// Close the socket we listen on // Close the socket we listen on
::close(_socket); _socket = -1; closesocket(_socket); _socket = -1;
// wait for server to join // wait for server to join
if (wait) { this->wait(); } if (wait) { this->wait(); }
} }
@ -253,7 +290,7 @@ ConnectionObj::ConnectionObj(Server *server, int cli_socket)
} }
ConnectionObj::~ConnectionObj() { ConnectionObj::~ConnectionObj() {
::close(socket); socket=-1; closesocket(socket); socket=-1;
} }
ConnectionObj * ConnectionObj *
@ -309,7 +346,7 @@ Connection::close(bool wait) {
LogMessage msg(LOG_DEBUG); LogMessage msg(LOG_DEBUG);
msg << "httpd: Close connection " << socket << "."; msg << "httpd: Close connection " << socket << ".";
Logger::get().log(msg); Logger::get().log(msg);
::close(socket); closesocket(socket);
} }
} }
@ -337,7 +374,11 @@ Connection::main()
{ {
int error = 0; socklen_t errorlen = sizeof(error); int error = 0; socklen_t errorlen = sizeof(error);
// While socket is open // While socket is open
#ifdef _WIN32
while (0 == getsockopt(_object->socket, SOL_SOCKET, SO_ERROR, (char*)&error, &errorlen)) {
#else
while (0 == getsockopt(_object->socket, SOL_SOCKET, SO_ERROR, &error, &errorlen)) { while (0 == getsockopt(_object->socket, SOL_SOCKET, SO_ERROR, &error, &errorlen)) {
#endif
// Contstruct request & reponse instances // Contstruct request & reponse instances
Request request(*this); Request request(*this);
Response response(*this); Response response(*this);

@ -68,9 +68,17 @@
#include <list> #include <list>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef _WIN32
#define ssize_t int
#define uint unsigned int
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#endif
#include <pthread.h>
namespace sdr { namespace sdr {
@ -303,12 +311,20 @@ public:
inline ssize_t write(const void *data, size_t n) const { inline ssize_t write(const void *data, size_t n) const {
if (0 == _object) { return -1; } if (0 == _object) { return -1; }
#ifdef _WIN32
return ::send((SOCKET)_object->socket, (const char*)data, n, 0);
#else
return ::write(_object->socket, data, n); return ::write(_object->socket, data, n);
#endif
} }
inline ssize_t read(void *data, size_t n) const { inline ssize_t read(void *data, size_t n) const {
if (0 == _object) { return -1; } if (0 == _object) { return -1; }
#ifdef _WIN32
return ::recv((SOCKET)_object->socket, (char*)data, n, 0);
#else
return ::read(_object->socket, data, n); return ::read(_object->socket, data, n);
#endif
} }
bool send(const std::string &data) const; bool send(const std::string &data) const;

@ -41,9 +41,11 @@ RTLSource::RTLSource(double frequency, double sample_rate, size_t device_idx)
// Query gain factors: // Query gain factors:
int num_gains = rtlsdr_get_tuner_gains(_device, 0); int num_gains = rtlsdr_get_tuner_gains(_device, 0);
if (num_gains > 0) { if (num_gains > 0) {
int gains[num_gains]; rtlsdr_get_tuner_gains(_device, gains); int* gains = new int[num_gains];
rtlsdr_get_tuner_gains(_device, gains);
_gains.reserve(num_gains); _gains.reserve(num_gains);
for (int i=0; i<num_gains; i++) { _gains.push_back(gains[i]); } for (int i=0; i<num_gains; i++) { _gains.push_back(gains[i]); }
delete gains;
} }
// Enable AGC/manual gain // Enable AGC/manual gain

@ -0,0 +1,7 @@
# getopt-for-windows
getopt.h and getopt.c is very often used in linux, to make it easy for windows user,
two files were extracted from glibc. In order to make it works properly in windows,
some modification was done and you may compare the change using original source files. Enjoy it!
https://github.com/Chunde/getopt-for-windows

File diff suppressed because it is too large Load Diff

@ -0,0 +1,193 @@
/* Declarations for getopt.
Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009,2010
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
#ifndef __THROW
# ifndef __GNUC_PREREQ
# define __GNUC_PREREQ(maj, min) (0)
# endif
# if defined __cplusplus && __GNUC_PREREQ (2,8)
# define __THROW throw ()
# else
# define __THROW
# endif
#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
{
const char *name;
/* 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'. */
#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)
__THROW;
# if defined __need_getopt && defined __USE_POSIX2 \
&& !defined __USE_POSIX_IMPLICITLY && !defined __USE_GNU
/* The GNU getopt has more functionality than the standard version. The
additional functionality can be disable at runtime. This redirection
helps to also do this at runtime. */
# ifdef __REDIRECT
extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv,
const char *__shortopts),
__posix_getopt);
# else
extern int __posix_getopt (int ___argc, char *const *___argv,
const char *__shortopts) __THROW;
# define getopt __posix_getopt
# endif
# endif
#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)
__THROW;
extern int getopt_long_only (int ___argc, char *const *___argv,
const char *__shortopts,
const struct option *__longopts, int *__longind)
__THROW;
#endif
#ifdef __cplusplus
}
#endif
/* Make sure we later can get all the definitions and declarations. */
#undef __need_getopt
#endif /* getopt.h */

@ -3,5 +3,6 @@ set(test_SOURCES main.cc
set(test_HEADERS set(test_HEADERS
cputime.hh unittest.hh buffertest.hh coreutilstest.hh coretest.hh) cputime.hh unittest.hh buffertest.hh coreutilstest.hh coretest.hh)
add_executable(sdr_test ${test_SOURCES}) add_executable(sdr_test ${test_SOURCES} ${test_HEADERS})
target_link_libraries(sdr_test ${LIBS} libsdr) target_link_libraries(sdr_test ${LIBS} libsdr)
add_test(libsdr_test sdr_test)

@ -15,7 +15,5 @@ int main(int argc, char *argv[]) {
runner.addSuite(BufferTest::suite()); runner.addSuite(BufferTest::suite());
runner.addSuite(CoreUtilsTest::suite()); runner.addSuite(CoreUtilsTest::suite());
runner(); return (int)runner();
return 0;
} }

@ -140,7 +140,7 @@ TestRunner::addSuite(TestSuite *suite)
} }
void size_t
TestRunner::operator ()() TestRunner::operator ()()
{ {
size_t tests_run = 0; size_t tests_run = 0;
@ -188,5 +188,7 @@ TestRunner::operator ()()
<< " (" << 100. * float((tests_run-tests_failed-tests_error))/(tests_run-tests_error) << " (" << 100. * float((tests_run-tests_failed-tests_error))/(tests_run-tests_error)
<< "% passed)." << std::endl << " Where " << "% passed)." << std::endl << " Where "
<< tests_error << " tests produced errors." << std::endl; << tests_error << " tests produced errors." << std::endl;
return tests_failed + tests_error;
} }

@ -144,7 +144,7 @@ public:
void addSuite(TestSuite *suite); void addSuite(TestSuite *suite);
void operator() (); size_t operator() ();
}; };

Loading…
Cancel
Save