mirror of https://github.com/OpenRCT2/OpenRCT2.git
remove libs from orct repo, add dependencies pull to prebuilds, update unix scripts
This commit is contained in:
parent
f729ed028f
commit
ca4f2d0fa3
|
@ -11,10 +11,8 @@ distribution/windows/*.exe
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
.cache
|
.cache
|
||||||
|
|
||||||
#libcurl
|
#lib
|
||||||
lib/libcurl/
|
lib
|
||||||
#libjansson
|
|
||||||
lib/jansson/
|
|
||||||
|
|
||||||
#################
|
#################
|
||||||
## Eclipse
|
## Eclipse
|
||||||
|
|
|
@ -29,10 +29,10 @@ add_definitions(-DCURL_STATICLIB)
|
||||||
#uncomment the line bellow if you don't want to build openrct2 with twitch integration
|
#uncomment the line bellow if you don't want to build openrct2 with twitch integration
|
||||||
#add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH)
|
#add_definitions(-DDISABLE_HTTP -DDISABLE_TWITCH)
|
||||||
|
|
||||||
set(ORCALIBS_INCLUDE /usr/local/cross-tools/orcalibs/include)
|
set(ORCTLIBS_INCLUDE /usr/local/cross-tools/orctlibs/include)
|
||||||
set(JANSSON_INCLUDE /usr/local/cross-tools/orcalibs/include/jansson)
|
set(JANSSON_INCLUDE /usr/local/cross-tools/orctlibs/include/jansson)
|
||||||
set(ORCALIBS_LIB_DIR /usr/local/cross-tools/orcalibs/lib)
|
set(ORCTLIBS_LIB_DIR /usr/local/cross-tools/orctlibs/lib)
|
||||||
set(ORCALIBS_LIB jansson curl ssl crypto ws2_32)
|
set(ORCTLIBS_LIB jansson curl ssl crypto ws2_32)
|
||||||
|
|
||||||
# include lib
|
# include lib
|
||||||
include_directories("lib/")
|
include_directories("lib/")
|
||||||
|
@ -52,8 +52,8 @@ if (UNIX)
|
||||||
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS})
|
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS})
|
||||||
endif (UNIX)
|
endif (UNIX)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${ORCALIBS_INCLUDE} ${JANSSON_INCLUDE})
|
INCLUDE_DIRECTORIES(${ORCTLIBS_INCLUDE} ${JANSSON_INCLUDE})
|
||||||
LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${ORCALIBS_LIB_DIR})
|
LINK_DIRECTORIES(${SDL2_LIBRARY_DIRS} ${ORCTLIBS_LIB_DIR})
|
||||||
|
|
||||||
# build as library for now, replace with add_executable
|
# build as library for now, replace with add_executable
|
||||||
add_library(${PROJECT} SHARED ${ORCT2_SOURCES})
|
add_library(${PROJECT} SHARED ${ORCT2_SOURCES})
|
||||||
|
@ -64,7 +64,7 @@ add_library(${PROJECT} SHARED ${ORCT2_SOURCES})
|
||||||
# libopenrct2.dll -> openrct2.dll
|
# libopenrct2.dll -> openrct2.dll
|
||||||
set_target_properties(${PROJECT} PROPERTIES PREFIX "")
|
set_target_properties(${PROJECT} PROPERTIES PREFIX "")
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCALIBS_LIB})
|
TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB})
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound)
|
target_link_libraries(${PROJECT} winmm.lib -limm32 -lversion -ldsound)
|
||||||
|
|
1
clean.sh
1
clean.sh
|
@ -4,5 +4,6 @@ set -ev
|
||||||
|
|
||||||
sudo rm -rf /usr/local/cross-tools/i686-w64-mingw32
|
sudo rm -rf /usr/local/cross-tools/i686-w64-mingw32
|
||||||
sudo rm -rf /usr/local/cross-tools/orcalibs
|
sudo rm -rf /usr/local/cross-tools/orcalibs
|
||||||
|
sudo rm -rf /usr/local/cross-tools/orctlibs
|
||||||
rm -rf .cache
|
rm -rf .cache
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
|
18
install.sh
18
install.sh
|
@ -84,12 +84,13 @@ if [[ ! -d $cachedir/SDL2-${SDL2_PV} ]]; then
|
||||||
tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz
|
tar -xzf SDL2-devel-${SDL2_PV}-mingw.tar.gz
|
||||||
popd
|
popd
|
||||||
fi
|
fi
|
||||||
if [[ ! -f $cachedir/orcalibs.zip ]]; then
|
if [[ ! -f $cachedir/orctlibs.zip ]]; then
|
||||||
wget http://misozmiric.com/ted/openrct2/orcalibs-unix.zip --output-document $cachedir/orcalibs.zip;
|
wget https://download.openrct2.website/dev/lib/mingw --secure-protocol=tlsv1_2 --output-document $cachedir/orctlibs.zip;
|
||||||
fi
|
fi
|
||||||
if [[ ! -d $cachedir/orcalibs ]]; then
|
if [[ ! -d $cachedir/orctlibs ]]; then
|
||||||
pushd $cachedir
|
mkdir -p $cachedir/orctlibs
|
||||||
unzip -uaq orcalibs.zip
|
pushd $cachedir/orctlibs
|
||||||
|
unzip -uaq ../orctlibs.zip
|
||||||
popd
|
popd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -111,8 +112,11 @@ fi
|
||||||
if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then
|
if [[ ! -d /usr/local/cross-tools/i686-w64-mingw32 ]]; then
|
||||||
sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/
|
sudo cp -r $cachedir/SDL2-${SDL2_PV}/i686-w64-mingw32 /usr/local/cross-tools/
|
||||||
fi
|
fi
|
||||||
if [[ ! -d /usr/local/cross-tools/orcalibs ]]; then
|
if [[ ! -d /usr/local/cross-tools/orctlibs ]]; then
|
||||||
sudo cp -r $cachedir/orcalibs /usr/local/cross-tools/
|
sudo mkdir -p /usr/local/cross-tools/orctlibs
|
||||||
|
mkdir -p lib
|
||||||
|
sudo cp -rf $cachedir/orctlibs/glob/* /usr/local/cross-tools/orctlibs/.
|
||||||
|
cp -rf $cachedir/orctlibs/local/* ./lib/.
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then
|
if [[ ! -f $cachedir/i686-w64-mingw32-pkg-config ]]; then
|
||||||
|
|
|
@ -1,323 +0,0 @@
|
||||||
#include "argparse.h"
|
|
||||||
|
|
||||||
#define OPT_UNSET 1
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
prefix_skip(const char *str, const char *prefix)
|
|
||||||
{
|
|
||||||
size_t len = strlen(prefix);
|
|
||||||
return strncmp(str, prefix, len) ? NULL : str + len;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
prefix_cmp(const char *str, const char *prefix)
|
|
||||||
{
|
|
||||||
for (;; str++, prefix++)
|
|
||||||
if (!*prefix)
|
|
||||||
return 0;
|
|
||||||
else if (*str != *prefix)
|
|
||||||
return (unsigned char)*prefix - (unsigned char)*str;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
argparse_error(struct argparse *this, const struct argparse_option *opt,
|
|
||||||
const char *reason)
|
|
||||||
{
|
|
||||||
if (!strncmp(this->argv[0], "--", 2)) {
|
|
||||||
fprintf(stderr, "error: option `%s` %s\n", opt->long_name, reason);
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "error: option `%c` %s\n", opt->short_name, reason);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
argparse_getvalue(struct argparse *this, const struct argparse_option *opt,
|
|
||||||
int flags)
|
|
||||||
{
|
|
||||||
const char *s = NULL;
|
|
||||||
if (!opt->value)
|
|
||||||
goto skipped;
|
|
||||||
switch (opt->type) {
|
|
||||||
case ARGPARSE_OPT_BOOLEAN:
|
|
||||||
if (flags & OPT_UNSET) {
|
|
||||||
*(int *)opt->value = *(int *)opt->value - 1;
|
|
||||||
} else {
|
|
||||||
*(int *)opt->value = *(int *)opt->value + 1;
|
|
||||||
}
|
|
||||||
if (*(int *)opt->value < 0) {
|
|
||||||
*(int *)opt->value = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ARGPARSE_OPT_BIT:
|
|
||||||
if (flags & OPT_UNSET) {
|
|
||||||
*(int *)opt->value &= ~opt->data;
|
|
||||||
} else {
|
|
||||||
*(int *)opt->value |= opt->data;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ARGPARSE_OPT_STRING:
|
|
||||||
if (this->optvalue) {
|
|
||||||
*(const char **)opt->value = this->optvalue;
|
|
||||||
this->optvalue = NULL;
|
|
||||||
} else if (this->argc > 1) {
|
|
||||||
this->argc--;
|
|
||||||
*(const char **)opt->value = *++this->argv;
|
|
||||||
} else {
|
|
||||||
argparse_error(this, opt, "requires a value");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ARGPARSE_OPT_INTEGER:
|
|
||||||
if (this->optvalue) {
|
|
||||||
*(int *)opt->value = strtol(this->optvalue, (char **)&s, 0);
|
|
||||||
this->optvalue = NULL;
|
|
||||||
} else if (this->argc > 1) {
|
|
||||||
this->argc--;
|
|
||||||
*(int *)opt->value = strtol(*++this->argv, (char **)&s, 0);
|
|
||||||
} else {
|
|
||||||
argparse_error(this, opt, "requires a value");
|
|
||||||
}
|
|
||||||
if (s[0] != '\0')
|
|
||||||
argparse_error(this, opt, "expects a numerical value");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
skipped:
|
|
||||||
if (opt->callback) {
|
|
||||||
return opt->callback(this, opt);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
argparse_options_check(const struct argparse_option *options)
|
|
||||||
{
|
|
||||||
for (; options->type != ARGPARSE_OPT_END; options++) {
|
|
||||||
switch (options->type) {
|
|
||||||
case ARGPARSE_OPT_END:
|
|
||||||
case ARGPARSE_OPT_BOOLEAN:
|
|
||||||
case ARGPARSE_OPT_BIT:
|
|
||||||
case ARGPARSE_OPT_INTEGER:
|
|
||||||
case ARGPARSE_OPT_STRING:
|
|
||||||
case ARGPARSE_OPT_GROUP:
|
|
||||||
continue;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "wrong option type: %d", options->type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
argparse_short_opt(struct argparse *this, const struct argparse_option *options)
|
|
||||||
{
|
|
||||||
for (; options->type != ARGPARSE_OPT_END; options++) {
|
|
||||||
if (options->short_name == *this->optvalue) {
|
|
||||||
this->optvalue = this->optvalue[1] ? this->optvalue + 1 : NULL;
|
|
||||||
return argparse_getvalue(this, options, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
argparse_long_opt(struct argparse *this, const struct argparse_option *options)
|
|
||||||
{
|
|
||||||
for (; options->type != ARGPARSE_OPT_END; options++) {
|
|
||||||
const char *rest;
|
|
||||||
int opt_flags = 0;
|
|
||||||
if (!options->long_name)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
rest = prefix_skip(this->argv[0] + 2, options->long_name);
|
|
||||||
if (!rest) {
|
|
||||||
// Negation allowed?
|
|
||||||
if (options->flags & OPT_NONEG) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Only boolean/bit allow negation.
|
|
||||||
if (options->type != ARGPARSE_OPT_BOOLEAN && options->type != ARGPARSE_OPT_BIT) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!prefix_cmp(this->argv[0] + 2, "no-")) {
|
|
||||||
rest = prefix_skip(this->argv[0] + 2 + 3, options->long_name);
|
|
||||||
if (!rest)
|
|
||||||
continue;
|
|
||||||
opt_flags |= OPT_UNSET;
|
|
||||||
} else {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (*rest) {
|
|
||||||
if (*rest != '=')
|
|
||||||
continue;
|
|
||||||
this->optvalue = rest + 1;
|
|
||||||
}
|
|
||||||
return argparse_getvalue(this, options, opt_flags);
|
|
||||||
}
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
argparse_init(struct argparse *this, struct argparse_option *options,
|
|
||||||
const char *const *usage, int flags)
|
|
||||||
{
|
|
||||||
memset(this, 0, sizeof(*this));
|
|
||||||
this->options = options;
|
|
||||||
this->usage = usage;
|
|
||||||
this->flags = flags;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
argparse_parse(struct argparse *this, int argc, const char **argv)
|
|
||||||
{
|
|
||||||
this->argc = argc - 1;
|
|
||||||
this->argv = argv + 1;
|
|
||||||
this->out = argv;
|
|
||||||
|
|
||||||
argparse_options_check(this->options);
|
|
||||||
|
|
||||||
for (; this->argc; this->argc--, this->argv++) {
|
|
||||||
const char *arg = this->argv[0];
|
|
||||||
if (arg[0] != '-' || !arg[1]) {
|
|
||||||
if (this->flags & ARGPARSE_STOP_AT_NON_OPTION) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
// if it's not option or is a single char '-', copy verbatimly
|
|
||||||
this->out[this->cpidx++] = this->argv[0];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// short option
|
|
||||||
if (arg[1] != '-') {
|
|
||||||
this->optvalue = arg + 1;
|
|
||||||
switch (argparse_short_opt(this, this->options)) {
|
|
||||||
case -1:
|
|
||||||
break;
|
|
||||||
case -2:
|
|
||||||
goto unknown;
|
|
||||||
}
|
|
||||||
while (this->optvalue) {
|
|
||||||
switch (argparse_short_opt(this, this->options)) {
|
|
||||||
case -1:
|
|
||||||
break;
|
|
||||||
case -2:
|
|
||||||
goto unknown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// if '--' presents
|
|
||||||
if (!arg[2]) {
|
|
||||||
this->argc--;
|
|
||||||
this->argv++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// long option
|
|
||||||
switch (argparse_long_opt(this, this->options)) {
|
|
||||||
case -1:
|
|
||||||
break;
|
|
||||||
case -2:
|
|
||||||
goto unknown;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
|
|
||||||
unknown:
|
|
||||||
fprintf(stderr, "error: unknown option `%s`\n", this->argv[0]);
|
|
||||||
argparse_usage(this);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
memmove(this->out + this->cpidx, this->argv,
|
|
||||||
this->argc * sizeof(*this->out));
|
|
||||||
this->out[this->cpidx + this->argc] = NULL;
|
|
||||||
|
|
||||||
return this->cpidx + this->argc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
argparse_usage(struct argparse *this)
|
|
||||||
{
|
|
||||||
fprintf(stdout, "Usage: %s\n", *this->usage++);
|
|
||||||
while (*this->usage && **this->usage)
|
|
||||||
fprintf(stdout, " or: %s\n", *this->usage++);
|
|
||||||
fputc('\n', stdout);
|
|
||||||
|
|
||||||
const struct argparse_option *options;
|
|
||||||
|
|
||||||
// figure out best width
|
|
||||||
size_t usage_opts_width = 0;
|
|
||||||
size_t len;
|
|
||||||
options = this->options;
|
|
||||||
for (; options->type != ARGPARSE_OPT_END; options++) {
|
|
||||||
len = 0;
|
|
||||||
if ((options)->short_name) {
|
|
||||||
len += 2;
|
|
||||||
}
|
|
||||||
if ((options)->short_name && (options)->long_name) {
|
|
||||||
len += 2; // separator ", "
|
|
||||||
}
|
|
||||||
if ((options)->long_name) {
|
|
||||||
len += strlen((options)->long_name) + 2;
|
|
||||||
}
|
|
||||||
if (options->type == ARGPARSE_OPT_INTEGER) {
|
|
||||||
len += strlen("=<int>");
|
|
||||||
} else if (options->type == ARGPARSE_OPT_STRING) {
|
|
||||||
len += strlen("=<str>");
|
|
||||||
}
|
|
||||||
len = ceil((float)len / 4) * 4;
|
|
||||||
if (usage_opts_width < len) {
|
|
||||||
usage_opts_width = len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
usage_opts_width += 4; // 4 spaces prefix
|
|
||||||
|
|
||||||
options = this->options;
|
|
||||||
for (; options->type != ARGPARSE_OPT_END; options++) {
|
|
||||||
size_t pos = 0;
|
|
||||||
int pad = 0;
|
|
||||||
if (options->type == ARGPARSE_OPT_GROUP) {
|
|
||||||
fputc('\n', stdout);
|
|
||||||
pos += fprintf(stdout, "%s", options->help);
|
|
||||||
fputc('\n', stdout);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
pos = fprintf(stdout, " ");
|
|
||||||
if (options->short_name) {
|
|
||||||
pos += fprintf(stdout, "-%c", options->short_name);
|
|
||||||
}
|
|
||||||
if (options->long_name && options->short_name) {
|
|
||||||
pos += fprintf(stdout, ", ");
|
|
||||||
}
|
|
||||||
if (options->long_name) {
|
|
||||||
pos += fprintf(stdout, "--%s", options->long_name);
|
|
||||||
}
|
|
||||||
if (options->type == ARGPARSE_OPT_INTEGER) {
|
|
||||||
pos += fprintf(stdout, "=<int>");
|
|
||||||
} else if (options->type == ARGPARSE_OPT_STRING) {
|
|
||||||
pos += fprintf(stdout, "=<str>");
|
|
||||||
}
|
|
||||||
if (pos <= usage_opts_width) {
|
|
||||||
pad = usage_opts_width - pos;
|
|
||||||
} else {
|
|
||||||
fputc('\n', stdout);
|
|
||||||
pad = usage_opts_width;
|
|
||||||
}
|
|
||||||
fprintf(stdout, "%*s%s\n", pad + 2, "", options->help);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
argparse_help_cb(struct argparse *this, const struct argparse_option *option)
|
|
||||||
{
|
|
||||||
(void)option;
|
|
||||||
argparse_usage(this);
|
|
||||||
exit(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,132 +0,0 @@
|
||||||
#ifndef ARGPARSE_H
|
|
||||||
#define ARGPARSE_H
|
|
||||||
/**
|
|
||||||
* Command-line arguments parsing library.
|
|
||||||
*
|
|
||||||
* This module is inspired by parse-options.c (git) and python's argparse
|
|
||||||
* module.
|
|
||||||
*
|
|
||||||
* Arguments parsing is common task in cli program, but traditional `getopt`
|
|
||||||
* libraries are not easy to use. This library provides high-level arguments
|
|
||||||
* parsing solutions.
|
|
||||||
*
|
|
||||||
* The program defines what arguments it requires, and `argparse` will figure
|
|
||||||
* out how to parse those out of `argc` and `argv`, it also automatically
|
|
||||||
* generates help and usage messages and issues errors when users give the
|
|
||||||
* program invalid arguments.
|
|
||||||
*
|
|
||||||
* Reserved namespaces:
|
|
||||||
* argparse
|
|
||||||
* OPT
|
|
||||||
* Author: Yecheng Fu <cofyc.jackson@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
struct argparse;
|
|
||||||
struct argparse_option;
|
|
||||||
|
|
||||||
typedef int argparse_callback(struct argparse *this,
|
|
||||||
const struct argparse_option *option);
|
|
||||||
|
|
||||||
enum argparse_flag {
|
|
||||||
ARGPARSE_STOP_AT_NON_OPTION = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum argparse_option_type {
|
|
||||||
/* special */
|
|
||||||
ARGPARSE_OPT_END,
|
|
||||||
ARGPARSE_OPT_GROUP,
|
|
||||||
/* options with no arguments */
|
|
||||||
ARGPARSE_OPT_BOOLEAN,
|
|
||||||
ARGPARSE_OPT_BIT,
|
|
||||||
/* options with arguments (optional or required) */
|
|
||||||
ARGPARSE_OPT_INTEGER,
|
|
||||||
ARGPARSE_OPT_STRING,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum argparse_option_flags {
|
|
||||||
OPT_NONEG = 1, /* Negation disabled. */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Argparse option struct.
|
|
||||||
*
|
|
||||||
* `type`:
|
|
||||||
* holds the type of the option, you must have an ARGPARSE_OPT_END last in your
|
|
||||||
* array.
|
|
||||||
*
|
|
||||||
* `short_name`:
|
|
||||||
* the character to use as a short option name, '\0' if none.
|
|
||||||
*
|
|
||||||
* `long_name`:
|
|
||||||
* the long option name, without the leading dash, NULL if none.
|
|
||||||
*
|
|
||||||
* `value`:
|
|
||||||
* stores pointer to the value to be filled.
|
|
||||||
*
|
|
||||||
* `help`:
|
|
||||||
* the short help message associated to what the option does.
|
|
||||||
* Must never be NULL (except for ARGPARSE_OPT_END).
|
|
||||||
*
|
|
||||||
* `callback`:
|
|
||||||
* function is called when corresponding argument is parsed.
|
|
||||||
*
|
|
||||||
* `data`:
|
|
||||||
* associated data. Callbacks can use it like they want.
|
|
||||||
*
|
|
||||||
* `flags`:
|
|
||||||
* option flags.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
struct argparse_option {
|
|
||||||
enum argparse_option_type type;
|
|
||||||
const char short_name;
|
|
||||||
const char *long_name;
|
|
||||||
void *value;
|
|
||||||
const char *help;
|
|
||||||
argparse_callback *callback;
|
|
||||||
intptr_t data;
|
|
||||||
int flags;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* argpparse
|
|
||||||
*/
|
|
||||||
struct argparse {
|
|
||||||
// user supplied
|
|
||||||
const struct argparse_option *options;
|
|
||||||
const char *const *usage;
|
|
||||||
int flags;
|
|
||||||
// internal context
|
|
||||||
int argc;
|
|
||||||
const char **argv;
|
|
||||||
const char **out;
|
|
||||||
int cpidx;
|
|
||||||
const char *optvalue; // current option value
|
|
||||||
};
|
|
||||||
|
|
||||||
// builtin callbacks
|
|
||||||
int argparse_help_cb(struct argparse *this,
|
|
||||||
const struct argparse_option *option);
|
|
||||||
|
|
||||||
// builtin option macros
|
|
||||||
#define OPT_END() { ARGPARSE_OPT_END }
|
|
||||||
#define OPT_BOOLEAN(...) { ARGPARSE_OPT_BOOLEAN, __VA_ARGS__ }
|
|
||||||
#define OPT_BIT(...) { ARGPARSE_OPT_BIT, __VA_ARGS__ }
|
|
||||||
#define OPT_INTEGER(...) { ARGPARSE_OPT_INTEGER, __VA_ARGS__ }
|
|
||||||
#define OPT_STRING(...) { ARGPARSE_OPT_STRING, __VA_ARGS__ }
|
|
||||||
#define OPT_GROUP(h) { ARGPARSE_OPT_GROUP, 0, NULL, NULL, h, NULL }
|
|
||||||
#define OPT_HELP() OPT_BOOLEAN('h', "help", NULL, "show this help message and exit", argparse_help_cb)
|
|
||||||
|
|
||||||
int argparse_init(struct argparse *this, struct argparse_option *options,
|
|
||||||
const char *const *usage, int flags);
|
|
||||||
int argparse_parse(struct argparse *this, int argc, const char **argv);
|
|
||||||
void argparse_usage(struct argparse *this);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,339 +0,0 @@
|
||||||
#include <assert.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "CuTest.h"
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*
|
|
||||||
* CuStr
|
|
||||||
*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
char* CuStrAlloc(int size)
|
|
||||||
{
|
|
||||||
char* newStr = (char*) malloc( sizeof(char) * (size) );
|
|
||||||
return newStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* CuStrCopy(const char* old)
|
|
||||||
{
|
|
||||||
int len = strlen(old);
|
|
||||||
char* newStr = CuStrAlloc(len + 1);
|
|
||||||
strcpy(newStr, old);
|
|
||||||
return newStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*
|
|
||||||
* CuString
|
|
||||||
*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void CuStringInit(CuString* str)
|
|
||||||
{
|
|
||||||
str->length = 0;
|
|
||||||
str->size = STRING_MAX;
|
|
||||||
str->buffer = (char*) malloc(sizeof(char) * str->size);
|
|
||||||
str->buffer[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
CuString* CuStringNew(void)
|
|
||||||
{
|
|
||||||
CuString* str = (CuString*) malloc(sizeof(CuString));
|
|
||||||
str->length = 0;
|
|
||||||
str->size = STRING_MAX;
|
|
||||||
str->buffer = (char*) malloc(sizeof(char) * str->size);
|
|
||||||
str->buffer[0] = '\0';
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuStringDelete(CuString *str)
|
|
||||||
{
|
|
||||||
if (!str) return;
|
|
||||||
free(str->buffer);
|
|
||||||
free(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuStringResize(CuString* str, int newSize)
|
|
||||||
{
|
|
||||||
str->buffer = (char*) realloc(str->buffer, sizeof(char) * newSize);
|
|
||||||
str->size = newSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuStringAppend(CuString* str, const char* text)
|
|
||||||
{
|
|
||||||
int length;
|
|
||||||
|
|
||||||
if (text == NULL) {
|
|
||||||
text = "NULL";
|
|
||||||
}
|
|
||||||
|
|
||||||
length = strlen(text);
|
|
||||||
if (str->length + length + 1 >= str->size)
|
|
||||||
CuStringResize(str, str->length + length + 1 + STRING_INC);
|
|
||||||
str->length += length;
|
|
||||||
strcat(str->buffer, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuStringAppendChar(CuString* str, char ch)
|
|
||||||
{
|
|
||||||
char text[2];
|
|
||||||
text[0] = ch;
|
|
||||||
text[1] = '\0';
|
|
||||||
CuStringAppend(str, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuStringAppendFormat(CuString* str, const char* format, ...)
|
|
||||||
{
|
|
||||||
va_list argp;
|
|
||||||
char buf[HUGE_STRING_LEN];
|
|
||||||
va_start(argp, format);
|
|
||||||
vsprintf(buf, format, argp);
|
|
||||||
va_end(argp);
|
|
||||||
CuStringAppend(str, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuStringInsert(CuString* str, const char* text, int pos)
|
|
||||||
{
|
|
||||||
int length = strlen(text);
|
|
||||||
if (pos > str->length)
|
|
||||||
pos = str->length;
|
|
||||||
if (str->length + length + 1 >= str->size)
|
|
||||||
CuStringResize(str, str->length + length + 1 + STRING_INC);
|
|
||||||
memmove(str->buffer + pos + length, str->buffer + pos, (str->length - pos) + 1);
|
|
||||||
str->length += length;
|
|
||||||
memcpy(str->buffer + pos, text, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*
|
|
||||||
* CuTest
|
|
||||||
*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void CuTestInit(CuTest* t, const char* name, TestFunction function)
|
|
||||||
{
|
|
||||||
t->name = CuStrCopy(name);
|
|
||||||
t->failed = 0;
|
|
||||||
t->ran = 0;
|
|
||||||
t->message = NULL;
|
|
||||||
t->function = function;
|
|
||||||
t->jumpBuf = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
CuTest* CuTestNew(const char* name, TestFunction function)
|
|
||||||
{
|
|
||||||
CuTest* tc = CU_ALLOC(CuTest);
|
|
||||||
CuTestInit(tc, name, function);
|
|
||||||
return tc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuTestDelete(CuTest *t)
|
|
||||||
{
|
|
||||||
if (!t) return;
|
|
||||||
free(t->name);
|
|
||||||
free(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuTestRun(CuTest* tc)
|
|
||||||
{
|
|
||||||
jmp_buf buf;
|
|
||||||
tc->jumpBuf = &buf;
|
|
||||||
if (setjmp(buf) == 0)
|
|
||||||
{
|
|
||||||
tc->ran = 1;
|
|
||||||
(tc->function)(tc);
|
|
||||||
}
|
|
||||||
tc->jumpBuf = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void CuFailInternal(CuTest* tc, const char* file, int line, CuString* string)
|
|
||||||
{
|
|
||||||
char buf[HUGE_STRING_LEN];
|
|
||||||
|
|
||||||
sprintf(buf, "%s:%d: ", file, line);
|
|
||||||
CuStringInsert(string, buf, 0);
|
|
||||||
|
|
||||||
tc->failed = 1;
|
|
||||||
tc->message = string->buffer;
|
|
||||||
if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message)
|
|
||||||
{
|
|
||||||
CuString string;
|
|
||||||
|
|
||||||
CuStringInit(&string);
|
|
||||||
if (message2 != NULL)
|
|
||||||
{
|
|
||||||
CuStringAppend(&string, message2);
|
|
||||||
CuStringAppend(&string, ": ");
|
|
||||||
}
|
|
||||||
CuStringAppend(&string, message);
|
|
||||||
CuFailInternal(tc, file, line, &string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition)
|
|
||||||
{
|
|
||||||
if (condition) return;
|
|
||||||
CuFail_Line(tc, file, line, NULL, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuAssertStrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
|
||||||
const char* expected, const char* actual)
|
|
||||||
{
|
|
||||||
CuString string;
|
|
||||||
if ((expected == NULL && actual == NULL) ||
|
|
||||||
(expected != NULL && actual != NULL &&
|
|
||||||
strcmp(expected, actual) == 0))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CuStringInit(&string);
|
|
||||||
if (message != NULL)
|
|
||||||
{
|
|
||||||
CuStringAppend(&string, message);
|
|
||||||
CuStringAppend(&string, ": ");
|
|
||||||
}
|
|
||||||
CuStringAppend(&string, "expected <");
|
|
||||||
CuStringAppend(&string, expected);
|
|
||||||
CuStringAppend(&string, "> but was <");
|
|
||||||
CuStringAppend(&string, actual);
|
|
||||||
CuStringAppend(&string, ">");
|
|
||||||
CuFailInternal(tc, file, line, &string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuAssertIntEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
|
||||||
int expected, int actual)
|
|
||||||
{
|
|
||||||
char buf[STRING_MAX];
|
|
||||||
if (expected == actual) return;
|
|
||||||
sprintf(buf, "expected <%d> but was <%d>", expected, actual);
|
|
||||||
CuFail_Line(tc, file, line, message, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuAssertDblEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
|
||||||
double expected, double actual, double delta)
|
|
||||||
{
|
|
||||||
char buf[STRING_MAX];
|
|
||||||
if (fabs(expected - actual) <= delta) return;
|
|
||||||
sprintf(buf, "expected <%f> but was <%f>", expected, actual);
|
|
||||||
|
|
||||||
CuFail_Line(tc, file, line, message, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuAssertPtrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
|
||||||
void* expected, void* actual)
|
|
||||||
{
|
|
||||||
char buf[STRING_MAX];
|
|
||||||
if (expected == actual) return;
|
|
||||||
sprintf(buf, "expected pointer <0x%p> but was <0x%p>", expected, actual);
|
|
||||||
CuFail_Line(tc, file, line, message, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*
|
|
||||||
* CuSuite
|
|
||||||
*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void CuSuiteInit(CuSuite* testSuite)
|
|
||||||
{
|
|
||||||
testSuite->count = 0;
|
|
||||||
testSuite->failCount = 0;
|
|
||||||
memset(testSuite->list, 0, sizeof(testSuite->list));
|
|
||||||
}
|
|
||||||
|
|
||||||
CuSuite* CuSuiteNew(void)
|
|
||||||
{
|
|
||||||
CuSuite* testSuite = CU_ALLOC(CuSuite);
|
|
||||||
CuSuiteInit(testSuite);
|
|
||||||
return testSuite;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuSuiteDelete(CuSuite *testSuite)
|
|
||||||
{
|
|
||||||
unsigned int n;
|
|
||||||
for (n=0; n < MAX_TEST_CASES; n++)
|
|
||||||
{
|
|
||||||
if (testSuite->list[n])
|
|
||||||
{
|
|
||||||
CuTestDelete(testSuite->list[n]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(testSuite);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase)
|
|
||||||
{
|
|
||||||
assert(testSuite->count < MAX_TEST_CASES);
|
|
||||||
testSuite->list[testSuite->count] = testCase;
|
|
||||||
testSuite->count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0 ; i < testSuite2->count ; ++i)
|
|
||||||
{
|
|
||||||
CuTest* testCase = testSuite2->list[i];
|
|
||||||
CuSuiteAdd(testSuite, testCase);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuSuiteRun(CuSuite* testSuite)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0 ; i < testSuite->count ; ++i)
|
|
||||||
{
|
|
||||||
CuTest* testCase = testSuite->list[i];
|
|
||||||
CuTestRun(testCase);
|
|
||||||
if (testCase->failed) { testSuite->failCount += 1; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuSuiteSummary(CuSuite* testSuite, CuString* summary)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0 ; i < testSuite->count ; ++i)
|
|
||||||
{
|
|
||||||
CuTest* testCase = testSuite->list[i];
|
|
||||||
CuStringAppend(summary, testCase->failed ? "F" : ".");
|
|
||||||
}
|
|
||||||
CuStringAppend(summary, "\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void CuSuiteDetails(CuSuite* testSuite, CuString* details)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int failCount = 0;
|
|
||||||
|
|
||||||
if (testSuite->failCount == 0)
|
|
||||||
{
|
|
||||||
int passCount = testSuite->count - testSuite->failCount;
|
|
||||||
const char* testWord = passCount == 1 ? "test" : "tests";
|
|
||||||
CuStringAppendFormat(details, "OK (%d %s)\n", passCount, testWord);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (testSuite->failCount == 1)
|
|
||||||
CuStringAppend(details, "There was 1 failure:\n");
|
|
||||||
else
|
|
||||||
CuStringAppendFormat(details, "There were %d failures:\n", testSuite->failCount);
|
|
||||||
|
|
||||||
for (i = 0 ; i < testSuite->count ; ++i)
|
|
||||||
{
|
|
||||||
CuTest* testCase = testSuite->list[i];
|
|
||||||
if (testCase->failed)
|
|
||||||
{
|
|
||||||
failCount++;
|
|
||||||
CuStringAppendFormat(details, "%d) %s: %s\n",
|
|
||||||
failCount, testCase->name, testCase->message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CuStringAppend(details, "\n!!!FAILURES!!!\n");
|
|
||||||
|
|
||||||
CuStringAppendFormat(details, "Runs: %d ", testSuite->count);
|
|
||||||
CuStringAppendFormat(details, "Passes: %d ", testSuite->count - testSuite->failCount);
|
|
||||||
CuStringAppendFormat(details, "Fails: %d\n", testSuite->failCount);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,116 +0,0 @@
|
||||||
#ifndef CU_TEST_H
|
|
||||||
#define CU_TEST_H
|
|
||||||
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#define CUTEST_VERSION "CuTest 1.5"
|
|
||||||
|
|
||||||
/* CuString */
|
|
||||||
|
|
||||||
char* CuStrAlloc(int size);
|
|
||||||
char* CuStrCopy(const char* old);
|
|
||||||
|
|
||||||
#define CU_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE)))
|
|
||||||
|
|
||||||
#define HUGE_STRING_LEN 8192
|
|
||||||
#define STRING_MAX 256
|
|
||||||
#define STRING_INC 256
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int length;
|
|
||||||
int size;
|
|
||||||
char* buffer;
|
|
||||||
} CuString;
|
|
||||||
|
|
||||||
void CuStringInit(CuString* str);
|
|
||||||
CuString* CuStringNew(void);
|
|
||||||
void CuStringRead(CuString* str, const char* path);
|
|
||||||
void CuStringAppend(CuString* str, const char* text);
|
|
||||||
void CuStringAppendChar(CuString* str, char ch);
|
|
||||||
void CuStringAppendFormat(CuString* str, const char* format, ...);
|
|
||||||
void CuStringInsert(CuString* str, const char* text, int pos);
|
|
||||||
void CuStringResize(CuString* str, int newSize);
|
|
||||||
void CuStringDelete(CuString* str);
|
|
||||||
|
|
||||||
/* CuTest */
|
|
||||||
|
|
||||||
typedef struct CuTest CuTest;
|
|
||||||
|
|
||||||
typedef void (*TestFunction)(CuTest *);
|
|
||||||
|
|
||||||
struct CuTest
|
|
||||||
{
|
|
||||||
char* name;
|
|
||||||
TestFunction function;
|
|
||||||
int failed;
|
|
||||||
int ran;
|
|
||||||
const char* message;
|
|
||||||
jmp_buf *jumpBuf;
|
|
||||||
};
|
|
||||||
|
|
||||||
void CuTestInit(CuTest* t, const char* name, TestFunction function);
|
|
||||||
CuTest* CuTestNew(const char* name, TestFunction function);
|
|
||||||
void CuTestRun(CuTest* tc);
|
|
||||||
void CuTestDelete(CuTest *t);
|
|
||||||
|
|
||||||
/* Internal versions of assert functions -- use the public versions */
|
|
||||||
void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message);
|
|
||||||
void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition);
|
|
||||||
void CuAssertStrEquals_LineMsg(CuTest* tc,
|
|
||||||
const char* file, int line, const char* message,
|
|
||||||
const char* expected, const char* actual);
|
|
||||||
void CuAssertIntEquals_LineMsg(CuTest* tc,
|
|
||||||
const char* file, int line, const char* message,
|
|
||||||
int expected, int actual);
|
|
||||||
void CuAssertDblEquals_LineMsg(CuTest* tc,
|
|
||||||
const char* file, int line, const char* message,
|
|
||||||
double expected, double actual, double delta);
|
|
||||||
void CuAssertPtrEquals_LineMsg(CuTest* tc,
|
|
||||||
const char* file, int line, const char* message,
|
|
||||||
void* expected, void* actual);
|
|
||||||
|
|
||||||
/* public assert functions */
|
|
||||||
|
|
||||||
#define CuFail(tc, ms) CuFail_Line( (tc), __FILE__, __LINE__, NULL, (ms))
|
|
||||||
#define CuAssert(tc, ms, cond) CuAssert_Line((tc), __FILE__, __LINE__, (ms), (cond))
|
|
||||||
#define CuAssertTrue(tc, cond) CuAssert_Line((tc), __FILE__, __LINE__, "assert failed", (cond))
|
|
||||||
|
|
||||||
#define CuAssertStrEquals(tc,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
|
|
||||||
#define CuAssertStrEquals_Msg(tc,ms,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
|
|
||||||
#define CuAssertIntEquals(tc,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
|
|
||||||
#define CuAssertIntEquals_Msg(tc,ms,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
|
|
||||||
#define CuAssertDblEquals(tc,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac),(dl))
|
|
||||||
#define CuAssertDblEquals_Msg(tc,ms,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac),(dl))
|
|
||||||
#define CuAssertPtrEquals(tc,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
|
|
||||||
#define CuAssertPtrEquals_Msg(tc,ms,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
|
|
||||||
|
|
||||||
#define CuAssertPtrNotNull(tc,p) CuAssert_Line((tc),__FILE__,__LINE__,"null pointer unexpected",(p != NULL))
|
|
||||||
#define CuAssertPtrNotNullMsg(tc,msg,p) CuAssert_Line((tc),__FILE__,__LINE__,(msg),(p != NULL))
|
|
||||||
|
|
||||||
/* CuSuite */
|
|
||||||
|
|
||||||
#define MAX_TEST_CASES 1024
|
|
||||||
|
|
||||||
#define SUITE_ADD_TEST(SUITE,TEST) CuSuiteAdd(SUITE, CuTestNew(#TEST, TEST))
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
CuTest* list[MAX_TEST_CASES];
|
|
||||||
int failCount;
|
|
||||||
|
|
||||||
} CuSuite;
|
|
||||||
|
|
||||||
|
|
||||||
void CuSuiteInit(CuSuite* testSuite);
|
|
||||||
CuSuite* CuSuiteNew(void);
|
|
||||||
void CuSuiteDelete(CuSuite *testSuite);
|
|
||||||
void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase);
|
|
||||||
void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2);
|
|
||||||
void CuSuiteRun(CuSuite* testSuite);
|
|
||||||
void CuSuiteSummary(CuSuite* testSuite, CuString* summary);
|
|
||||||
void CuSuiteDetails(CuSuite* testSuite, CuString* details);
|
|
||||||
|
|
||||||
#endif /* CU_TEST_H */
|
|
|
@ -1,38 +0,0 @@
|
||||||
NOTE
|
|
||||||
|
|
||||||
The license is based on the zlib/libpng license. For more details see
|
|
||||||
http://www.opensource.org/licenses/zlib-license.html. The intent of the
|
|
||||||
license is to:
|
|
||||||
|
|
||||||
- keep the license as simple as possible
|
|
||||||
- encourage the use of CuTest in both free and commercial applications
|
|
||||||
and libraries
|
|
||||||
- keep the source code together
|
|
||||||
- give credit to the CuTest contributors for their work
|
|
||||||
|
|
||||||
If you ship CuTest in source form with your source distribution, the
|
|
||||||
following license document must be included with it in unaltered form.
|
|
||||||
If you find CuTest useful we would like to hear about it.
|
|
||||||
|
|
||||||
LICENSE
|
|
||||||
|
|
||||||
Copyright (c) 2003 Asim Jalis
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software in
|
|
||||||
a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not
|
|
||||||
be misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
|
@ -1,239 +0,0 @@
|
||||||
/* Copyright (C) 2003 Jean-Marc Valin */
|
|
||||||
/**
|
|
||||||
@file arch.h
|
|
||||||
@brief Various architecture definitions Speex
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
- Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
- Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
- Neither the name of the Xiph.org Foundation nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
|
||||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ARCH_H
|
|
||||||
#define ARCH_H
|
|
||||||
|
|
||||||
#ifndef SPEEX_VERSION
|
|
||||||
#define SPEEX_MAJOR_VERSION 1 /**< Major Speex version. */
|
|
||||||
#define SPEEX_MINOR_VERSION 1 /**< Minor Speex version. */
|
|
||||||
#define SPEEX_MICRO_VERSION 15 /**< Micro Speex version. */
|
|
||||||
#define SPEEX_EXTRA_VERSION "" /**< Extra Speex version. */
|
|
||||||
#define SPEEX_VERSION "speex-1.2beta3" /**< Speex version string. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A couple test to catch stupid option combinations */
|
|
||||||
#ifdef FIXED_POINT
|
|
||||||
|
|
||||||
#ifdef FLOATING_POINT
|
|
||||||
#error You cannot compile as floating point and fixed point at the same time
|
|
||||||
#endif
|
|
||||||
#ifdef _USE_SSE
|
|
||||||
#error SSE is only for floating-point
|
|
||||||
#endif
|
|
||||||
#if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM))
|
|
||||||
#error Make up your mind. What CPU do you have?
|
|
||||||
#endif
|
|
||||||
#ifdef VORBIS_PSYCHO
|
|
||||||
#error Vorbis-psy model currently not implemented in fixed-point
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef FLOATING_POINT
|
|
||||||
#error You now need to define either FIXED_POINT or FLOATING_POINT
|
|
||||||
#endif
|
|
||||||
#if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM)
|
|
||||||
#error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions?
|
|
||||||
#endif
|
|
||||||
#ifdef FIXED_POINT_DEBUG
|
|
||||||
#error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef OUTSIDE_SPEEX
|
|
||||||
#include "speex/speex_types.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */
|
|
||||||
#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */
|
|
||||||
#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */
|
|
||||||
#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */
|
|
||||||
#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */
|
|
||||||
#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */
|
|
||||||
#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */
|
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
|
||||||
|
|
||||||
typedef spx_int16_t spx_word16_t;
|
|
||||||
typedef spx_int32_t spx_word32_t;
|
|
||||||
typedef spx_word32_t spx_mem_t;
|
|
||||||
typedef spx_word16_t spx_coef_t;
|
|
||||||
typedef spx_word16_t spx_lsp_t;
|
|
||||||
typedef spx_word32_t spx_sig_t;
|
|
||||||
|
|
||||||
#define Q15ONE 32767
|
|
||||||
|
|
||||||
#define LPC_SCALING 8192
|
|
||||||
#define SIG_SCALING 16384
|
|
||||||
#define LSP_SCALING 8192.
|
|
||||||
#define GAMMA_SCALING 32768.
|
|
||||||
#define GAIN_SCALING 64
|
|
||||||
#define GAIN_SCALING_1 0.015625
|
|
||||||
|
|
||||||
#define LPC_SHIFT 13
|
|
||||||
#define LSP_SHIFT 13
|
|
||||||
#define SIG_SHIFT 14
|
|
||||||
#define GAIN_SHIFT 6
|
|
||||||
|
|
||||||
#define VERY_SMALL 0
|
|
||||||
#define VERY_LARGE32 ((spx_word32_t)2147483647)
|
|
||||||
#define VERY_LARGE16 ((spx_word16_t)32767)
|
|
||||||
#define Q15_ONE ((spx_word16_t)32767)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef FIXED_DEBUG
|
|
||||||
#include "fixed_debug.h"
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include "fixed_generic.h"
|
|
||||||
|
|
||||||
#ifdef ARM5E_ASM
|
|
||||||
#include "fixed_arm5e.h"
|
|
||||||
#elif defined (ARM4_ASM)
|
|
||||||
#include "fixed_arm4.h"
|
|
||||||
#elif defined (BFIN_ASM)
|
|
||||||
#include "fixed_bfin.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
typedef float spx_mem_t;
|
|
||||||
typedef float spx_coef_t;
|
|
||||||
typedef float spx_lsp_t;
|
|
||||||
typedef float spx_sig_t;
|
|
||||||
typedef float spx_word16_t;
|
|
||||||
typedef float spx_word32_t;
|
|
||||||
|
|
||||||
#define Q15ONE 1.0f
|
|
||||||
#define LPC_SCALING 1.f
|
|
||||||
#define SIG_SCALING 1.f
|
|
||||||
#define LSP_SCALING 1.f
|
|
||||||
#define GAMMA_SCALING 1.f
|
|
||||||
#define GAIN_SCALING 1.f
|
|
||||||
#define GAIN_SCALING_1 1.f
|
|
||||||
|
|
||||||
|
|
||||||
#define VERY_SMALL 1e-15f
|
|
||||||
#define VERY_LARGE32 1e15f
|
|
||||||
#define VERY_LARGE16 1e15f
|
|
||||||
#define Q15_ONE ((spx_word16_t)1.f)
|
|
||||||
|
|
||||||
#define QCONST16(x,bits) (x)
|
|
||||||
#define QCONST32(x,bits) (x)
|
|
||||||
|
|
||||||
#define NEG16(x) (-(x))
|
|
||||||
#define NEG32(x) (-(x))
|
|
||||||
#define EXTRACT16(x) (x)
|
|
||||||
#define EXTEND32(x) (x)
|
|
||||||
#define SHR16(a,shift) (a)
|
|
||||||
#define SHL16(a,shift) (a)
|
|
||||||
#define SHR32(a,shift) (a)
|
|
||||||
#define SHL32(a,shift) (a)
|
|
||||||
#define PSHR16(a,shift) (a)
|
|
||||||
#define PSHR32(a,shift) (a)
|
|
||||||
#define VSHR32(a,shift) (a)
|
|
||||||
#define SATURATE16(x,a) (x)
|
|
||||||
#define SATURATE32(x,a) (x)
|
|
||||||
|
|
||||||
#define PSHR(a,shift) (a)
|
|
||||||
#define SHR(a,shift) (a)
|
|
||||||
#define SHL(a,shift) (a)
|
|
||||||
#define SATURATE(x,a) (x)
|
|
||||||
|
|
||||||
#define ADD16(a,b) ((a)+(b))
|
|
||||||
#define SUB16(a,b) ((a)-(b))
|
|
||||||
#define ADD32(a,b) ((a)+(b))
|
|
||||||
#define SUB32(a,b) ((a)-(b))
|
|
||||||
#define MULT16_16_16(a,b) ((a)*(b))
|
|
||||||
#define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b))
|
|
||||||
#define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b))
|
|
||||||
|
|
||||||
#define MULT16_32_Q11(a,b) ((a)*(b))
|
|
||||||
#define MULT16_32_Q13(a,b) ((a)*(b))
|
|
||||||
#define MULT16_32_Q14(a,b) ((a)*(b))
|
|
||||||
#define MULT16_32_Q15(a,b) ((a)*(b))
|
|
||||||
#define MULT16_32_P15(a,b) ((a)*(b))
|
|
||||||
|
|
||||||
#define MAC16_32_Q11(c,a,b) ((c)+(a)*(b))
|
|
||||||
#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b))
|
|
||||||
|
|
||||||
#define MAC16_16_Q11(c,a,b) ((c)+(a)*(b))
|
|
||||||
#define MAC16_16_Q13(c,a,b) ((c)+(a)*(b))
|
|
||||||
#define MAC16_16_P13(c,a,b) ((c)+(a)*(b))
|
|
||||||
#define MULT16_16_Q11_32(a,b) ((a)*(b))
|
|
||||||
#define MULT16_16_Q13(a,b) ((a)*(b))
|
|
||||||
#define MULT16_16_Q14(a,b) ((a)*(b))
|
|
||||||
#define MULT16_16_Q15(a,b) ((a)*(b))
|
|
||||||
#define MULT16_16_P15(a,b) ((a)*(b))
|
|
||||||
#define MULT16_16_P13(a,b) ((a)*(b))
|
|
||||||
#define MULT16_16_P14(a,b) ((a)*(b))
|
|
||||||
|
|
||||||
#define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b))
|
|
||||||
#define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b))
|
|
||||||
#define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b))
|
|
||||||
#define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b))
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
|
|
||||||
|
|
||||||
/* 2 on TI C5x DSP */
|
|
||||||
#define BYTES_PER_CHAR 2
|
|
||||||
#define BITS_PER_CHAR 16
|
|
||||||
#define LOG2_BITS_PER_CHAR 4
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define BYTES_PER_CHAR 1
|
|
||||||
#define BITS_PER_CHAR 8
|
|
||||||
#define LOG2_BITS_PER_CHAR 3
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef FIXED_DEBUG
|
|
||||||
extern long long spx_mips;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,20 +0,0 @@
|
||||||
// Microsoft version of 'inline'
|
|
||||||
#define inline __inline
|
|
||||||
|
|
||||||
// Visual Studio support alloca(), but it always align variables to 16-bit
|
|
||||||
// boundary, while SSE need 128-bit alignment. So we disable alloca() when
|
|
||||||
// SSE is enabled.
|
|
||||||
#ifndef _USE_SSE
|
|
||||||
# define USE_ALLOCA
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Default to floating point */
|
|
||||||
#ifndef FIXED_POINT
|
|
||||||
# define FLOATING_POINT
|
|
||||||
# define USE_SMALLFT
|
|
||||||
#else
|
|
||||||
# define USE_KISS_FFT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We don't support visibility on Win32 */
|
|
||||||
#define EXPORT
|
|
|
@ -1,169 +0,0 @@
|
||||||
/* Copyright (C) 2007 Jean-Marc Valin
|
|
||||||
|
|
||||||
File: os_support.h
|
|
||||||
This is the (tiny) OS abstraction layer. Aside from math.h, this is the
|
|
||||||
only place where system headers are allowed.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OS_SUPPORT_H
|
|
||||||
#define OS_SUPPORT_H
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
#ifdef OS_SUPPORT_CUSTOM
|
|
||||||
#include "os_support_custom.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_free
|
|
||||||
NOTE: speex_alloc needs to CLEAR THE MEMORY */
|
|
||||||
#ifndef OVERRIDE_SPEEX_ALLOC
|
|
||||||
static inline void *speex_alloc (int size)
|
|
||||||
{
|
|
||||||
/* WARNING: this is not equivalent to malloc(). If you want to use malloc()
|
|
||||||
or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise
|
|
||||||
you will experience strange bugs */
|
|
||||||
return calloc(size,1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Same as speex_alloc, except that the area is only needed inside a Speex call (might cause problem with wideband though) */
|
|
||||||
#ifndef OVERRIDE_SPEEX_ALLOC_SCRATCH
|
|
||||||
static inline void *speex_alloc_scratch (int size)
|
|
||||||
{
|
|
||||||
/* Scratch space doesn't need to be cleared */
|
|
||||||
return calloc(size,1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Speex wrapper for realloc. To do your own dynamic allocation, all you need to do is replace this function, speex_alloc and speex_free */
|
|
||||||
#ifndef OVERRIDE_SPEEX_REALLOC
|
|
||||||
static inline void *speex_realloc (void *ptr, int size)
|
|
||||||
{
|
|
||||||
return realloc(ptr, size);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_alloc */
|
|
||||||
#ifndef OVERRIDE_SPEEX_FREE
|
|
||||||
static inline void speex_free (void *ptr)
|
|
||||||
{
|
|
||||||
free(ptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Same as speex_free, except that the area is only needed inside a Speex call (might cause problem with wideband though) */
|
|
||||||
#ifndef OVERRIDE_SPEEX_FREE_SCRATCH
|
|
||||||
static inline void speex_free_scratch (void *ptr)
|
|
||||||
{
|
|
||||||
free(ptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Copy n bytes of memory from src to dst. The 0* term provides compile-time type checking */
|
|
||||||
#ifndef OVERRIDE_SPEEX_COPY
|
|
||||||
#define SPEEX_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Copy n bytes of memory from src to dst, allowing overlapping regions. The 0* term
|
|
||||||
provides compile-time type checking */
|
|
||||||
#ifndef OVERRIDE_SPEEX_MOVE
|
|
||||||
#define SPEEX_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Set n bytes of memory to value of c, starting at address s */
|
|
||||||
#ifndef OVERRIDE_SPEEX_MEMSET
|
|
||||||
#define SPEEX_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst))))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef OVERRIDE_SPEEX_FATAL
|
|
||||||
static inline void _speex_fatal(const char *str, const char *file, int line)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef OVERRIDE_SPEEX_WARNING
|
|
||||||
static inline void speex_warning(const char *str)
|
|
||||||
{
|
|
||||||
#ifndef DISABLE_WARNINGS
|
|
||||||
fprintf (stderr, "warning: %s\n", str);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef OVERRIDE_SPEEX_WARNING_INT
|
|
||||||
static inline void speex_warning_int(const char *str, int val)
|
|
||||||
{
|
|
||||||
#ifndef DISABLE_WARNINGS
|
|
||||||
fprintf (stderr, "warning: %s %d\n", str, val);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef OVERRIDE_SPEEX_NOTIFY
|
|
||||||
static inline void speex_notify(const char *str)
|
|
||||||
{
|
|
||||||
#ifndef DISABLE_NOTIFICATIONS
|
|
||||||
fprintf (stderr, "notification: %s\n", str);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef OVERRIDE_SPEEX_PUTC
|
|
||||||
/** Speex wrapper for putc */
|
|
||||||
static inline void _speex_putc(int ch, void *file)
|
|
||||||
{
|
|
||||||
FILE *f = (FILE *)file;
|
|
||||||
fprintf(f, "%c", ch);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define speex_fatal(str) _speex_fatal(str, __FILE__, __LINE__);
|
|
||||||
#define speex_assert(cond) {if (!(cond)) {speex_fatal("assertion failed: " #cond);}}
|
|
||||||
|
|
||||||
#ifndef RELEASE
|
|
||||||
static inline void print_vec(float *vec, int len, char *name)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
printf ("%s ", name);
|
|
||||||
for (i=0;i<len;i++)
|
|
||||||
printf (" %f", vec[i]);
|
|
||||||
printf ("\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,340 +0,0 @@
|
||||||
/* Copyright (C) 2007 Jean-Marc Valin
|
|
||||||
|
|
||||||
File: speex_resampler.h
|
|
||||||
Resampling code
|
|
||||||
|
|
||||||
The design goals of this code are:
|
|
||||||
- Very fast algorithm
|
|
||||||
- Low memory requirement
|
|
||||||
- Good *perceptual* quality (and not best SNR)
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SPEEX_RESAMPLER_H
|
|
||||||
#define SPEEX_RESAMPLER_H
|
|
||||||
|
|
||||||
#ifdef OUTSIDE_SPEEX
|
|
||||||
|
|
||||||
/********* WARNING: MENTAL SANITY ENDS HERE *************/
|
|
||||||
|
|
||||||
/* If the resampler is defined outside of Speex, we change the symbol names so that
|
|
||||||
there won't be any clash if linking with Speex later on. */
|
|
||||||
|
|
||||||
/* #define RANDOM_PREFIX your software name here */
|
|
||||||
#ifndef RANDOM_PREFIX
|
|
||||||
#error "Please define RANDOM_PREFIX (above) to something specific to your project to prevent symbol name clashes"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CAT_PREFIX2(a,b) a ## b
|
|
||||||
#define CAT_PREFIX(a,b) CAT_PREFIX2(a, b)
|
|
||||||
|
|
||||||
#define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init)
|
|
||||||
#define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac)
|
|
||||||
#define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy)
|
|
||||||
#define speex_resampler_process_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_float)
|
|
||||||
#define speex_resampler_process_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_int)
|
|
||||||
#define speex_resampler_process_interleaved_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_float)
|
|
||||||
#define speex_resampler_process_interleaved_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_int)
|
|
||||||
#define speex_resampler_set_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate)
|
|
||||||
#define speex_resampler_get_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_get_rate)
|
|
||||||
#define speex_resampler_set_rate_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate_frac)
|
|
||||||
#define speex_resampler_get_ratio CAT_PREFIX(RANDOM_PREFIX,_resampler_get_ratio)
|
|
||||||
#define speex_resampler_set_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_set_quality)
|
|
||||||
#define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality)
|
|
||||||
#define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride)
|
|
||||||
#define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride)
|
|
||||||
#define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride)
|
|
||||||
#define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride)
|
|
||||||
#define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency)
|
|
||||||
#define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency)
|
|
||||||
#define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros)
|
|
||||||
#define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem)
|
|
||||||
#define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror)
|
|
||||||
|
|
||||||
#define spx_int16_t short
|
|
||||||
#define spx_int32_t int
|
|
||||||
#define spx_uint16_t unsigned short
|
|
||||||
#define spx_uint32_t unsigned int
|
|
||||||
|
|
||||||
#else /* OUTSIDE_SPEEX */
|
|
||||||
|
|
||||||
#include "speex/speex_types.h"
|
|
||||||
|
|
||||||
#endif /* OUTSIDE_SPEEX */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SPEEX_RESAMPLER_QUALITY_MAX 10
|
|
||||||
#define SPEEX_RESAMPLER_QUALITY_MIN 0
|
|
||||||
#define SPEEX_RESAMPLER_QUALITY_DEFAULT 4
|
|
||||||
#define SPEEX_RESAMPLER_QUALITY_VOIP 3
|
|
||||||
#define SPEEX_RESAMPLER_QUALITY_DESKTOP 5
|
|
||||||
|
|
||||||
enum {
|
|
||||||
RESAMPLER_ERR_SUCCESS = 0,
|
|
||||||
RESAMPLER_ERR_ALLOC_FAILED = 1,
|
|
||||||
RESAMPLER_ERR_BAD_STATE = 2,
|
|
||||||
RESAMPLER_ERR_INVALID_ARG = 3,
|
|
||||||
RESAMPLER_ERR_PTR_OVERLAP = 4,
|
|
||||||
|
|
||||||
RESAMPLER_ERR_MAX_ERROR
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SpeexResamplerState_;
|
|
||||||
typedef struct SpeexResamplerState_ SpeexResamplerState;
|
|
||||||
|
|
||||||
/** Create a new resampler with integer input and output rates.
|
|
||||||
* @param nb_channels Number of channels to be processed
|
|
||||||
* @param in_rate Input sampling rate (integer number of Hz).
|
|
||||||
* @param out_rate Output sampling rate (integer number of Hz).
|
|
||||||
* @param quality Resampling quality between 0 and 10, where 0 has poor quality
|
|
||||||
* and 10 has very high quality.
|
|
||||||
* @return Newly created resampler state
|
|
||||||
* @retval NULL Error: not enough memory
|
|
||||||
*/
|
|
||||||
SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels,
|
|
||||||
spx_uint32_t in_rate,
|
|
||||||
spx_uint32_t out_rate,
|
|
||||||
int quality,
|
|
||||||
int *err);
|
|
||||||
|
|
||||||
/** Create a new resampler with fractional input/output rates. The sampling
|
|
||||||
* rate ratio is an arbitrary rational number with both the numerator and
|
|
||||||
* denominator being 32-bit integers.
|
|
||||||
* @param nb_channels Number of channels to be processed
|
|
||||||
* @param ratio_num Numerator of the sampling rate ratio
|
|
||||||
* @param ratio_den Denominator of the sampling rate ratio
|
|
||||||
* @param in_rate Input sampling rate rounded to the nearest integer (in Hz).
|
|
||||||
* @param out_rate Output sampling rate rounded to the nearest integer (in Hz).
|
|
||||||
* @param quality Resampling quality between 0 and 10, where 0 has poor quality
|
|
||||||
* and 10 has very high quality.
|
|
||||||
* @return Newly created resampler state
|
|
||||||
* @retval NULL Error: not enough memory
|
|
||||||
*/
|
|
||||||
SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels,
|
|
||||||
spx_uint32_t ratio_num,
|
|
||||||
spx_uint32_t ratio_den,
|
|
||||||
spx_uint32_t in_rate,
|
|
||||||
spx_uint32_t out_rate,
|
|
||||||
int quality,
|
|
||||||
int *err);
|
|
||||||
|
|
||||||
/** Destroy a resampler state.
|
|
||||||
* @param st Resampler state
|
|
||||||
*/
|
|
||||||
void speex_resampler_destroy(SpeexResamplerState *st);
|
|
||||||
|
|
||||||
/** Resample a float array. The input and output buffers must *not* overlap.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param channel_index Index of the channel to process for the multi-channel
|
|
||||||
* base (0 otherwise)
|
|
||||||
* @param in Input buffer
|
|
||||||
* @param in_len Number of input samples in the input buffer. Returns the
|
|
||||||
* number of samples processed
|
|
||||||
* @param out Output buffer
|
|
||||||
* @param out_len Size of the output buffer. Returns the number of samples written
|
|
||||||
*/
|
|
||||||
int speex_resampler_process_float(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t channel_index,
|
|
||||||
const float *in,
|
|
||||||
spx_uint32_t *in_len,
|
|
||||||
float *out,
|
|
||||||
spx_uint32_t *out_len);
|
|
||||||
|
|
||||||
/** Resample an int array. The input and output buffers must *not* overlap.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param channel_index Index of the channel to process for the multi-channel
|
|
||||||
* base (0 otherwise)
|
|
||||||
* @param in Input buffer
|
|
||||||
* @param in_len Number of input samples in the input buffer. Returns the number
|
|
||||||
* of samples processed
|
|
||||||
* @param out Output buffer
|
|
||||||
* @param out_len Size of the output buffer. Returns the number of samples written
|
|
||||||
*/
|
|
||||||
int speex_resampler_process_int(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t channel_index,
|
|
||||||
const spx_int16_t *in,
|
|
||||||
spx_uint32_t *in_len,
|
|
||||||
spx_int16_t *out,
|
|
||||||
spx_uint32_t *out_len);
|
|
||||||
|
|
||||||
/** Resample an interleaved float array. The input and output buffers must *not* overlap.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param in Input buffer
|
|
||||||
* @param in_len Number of input samples in the input buffer. Returns the number
|
|
||||||
* of samples processed. This is all per-channel.
|
|
||||||
* @param out Output buffer
|
|
||||||
* @param out_len Size of the output buffer. Returns the number of samples written.
|
|
||||||
* This is all per-channel.
|
|
||||||
*/
|
|
||||||
int speex_resampler_process_interleaved_float(SpeexResamplerState *st,
|
|
||||||
const float *in,
|
|
||||||
spx_uint32_t *in_len,
|
|
||||||
float *out,
|
|
||||||
spx_uint32_t *out_len);
|
|
||||||
|
|
||||||
/** Resample an interleaved int array. The input and output buffers must *not* overlap.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param in Input buffer
|
|
||||||
* @param in_len Number of input samples in the input buffer. Returns the number
|
|
||||||
* of samples processed. This is all per-channel.
|
|
||||||
* @param out Output buffer
|
|
||||||
* @param out_len Size of the output buffer. Returns the number of samples written.
|
|
||||||
* This is all per-channel.
|
|
||||||
*/
|
|
||||||
int speex_resampler_process_interleaved_int(SpeexResamplerState *st,
|
|
||||||
const spx_int16_t *in,
|
|
||||||
spx_uint32_t *in_len,
|
|
||||||
spx_int16_t *out,
|
|
||||||
spx_uint32_t *out_len);
|
|
||||||
|
|
||||||
/** Set (change) the input/output sampling rates (integer value).
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param in_rate Input sampling rate (integer number of Hz).
|
|
||||||
* @param out_rate Output sampling rate (integer number of Hz).
|
|
||||||
*/
|
|
||||||
int speex_resampler_set_rate(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t in_rate,
|
|
||||||
spx_uint32_t out_rate);
|
|
||||||
|
|
||||||
/** Get the current input/output sampling rates (integer value).
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param in_rate Input sampling rate (integer number of Hz) copied.
|
|
||||||
* @param out_rate Output sampling rate (integer number of Hz) copied.
|
|
||||||
*/
|
|
||||||
void speex_resampler_get_rate(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t *in_rate,
|
|
||||||
spx_uint32_t *out_rate);
|
|
||||||
|
|
||||||
/** Set (change) the input/output sampling rates and resampling ratio
|
|
||||||
* (fractional values in Hz supported).
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param ratio_num Numerator of the sampling rate ratio
|
|
||||||
* @param ratio_den Denominator of the sampling rate ratio
|
|
||||||
* @param in_rate Input sampling rate rounded to the nearest integer (in Hz).
|
|
||||||
* @param out_rate Output sampling rate rounded to the nearest integer (in Hz).
|
|
||||||
*/
|
|
||||||
int speex_resampler_set_rate_frac(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t ratio_num,
|
|
||||||
spx_uint32_t ratio_den,
|
|
||||||
spx_uint32_t in_rate,
|
|
||||||
spx_uint32_t out_rate);
|
|
||||||
|
|
||||||
/** Get the current resampling ratio. This will be reduced to the least
|
|
||||||
* common denominator.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param ratio_num Numerator of the sampling rate ratio copied
|
|
||||||
* @param ratio_den Denominator of the sampling rate ratio copied
|
|
||||||
*/
|
|
||||||
void speex_resampler_get_ratio(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t *ratio_num,
|
|
||||||
spx_uint32_t *ratio_den);
|
|
||||||
|
|
||||||
/** Set (change) the conversion quality.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param quality Resampling quality between 0 and 10, where 0 has poor
|
|
||||||
* quality and 10 has very high quality.
|
|
||||||
*/
|
|
||||||
int speex_resampler_set_quality(SpeexResamplerState *st,
|
|
||||||
int quality);
|
|
||||||
|
|
||||||
/** Get the conversion quality.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param quality Resampling quality between 0 and 10, where 0 has poor
|
|
||||||
* quality and 10 has very high quality.
|
|
||||||
*/
|
|
||||||
void speex_resampler_get_quality(SpeexResamplerState *st,
|
|
||||||
int *quality);
|
|
||||||
|
|
||||||
/** Set (change) the input stride.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param stride Input stride
|
|
||||||
*/
|
|
||||||
void speex_resampler_set_input_stride(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t stride);
|
|
||||||
|
|
||||||
/** Get the input stride.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param stride Input stride copied
|
|
||||||
*/
|
|
||||||
void speex_resampler_get_input_stride(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t *stride);
|
|
||||||
|
|
||||||
/** Set (change) the output stride.
|
|
||||||
* @param st Resampler state
|
|
||||||
* @param stride Output stride
|
|
||||||
*/
|
|
||||||
void speex_resampler_set_output_stride(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t stride);
|
|
||||||
|
|
||||||
/** Get the output stride.
|
|
||||||
* @param st Resampler state copied
|
|
||||||
* @param stride Output stride
|
|
||||||
*/
|
|
||||||
void speex_resampler_get_output_stride(SpeexResamplerState *st,
|
|
||||||
spx_uint32_t *stride);
|
|
||||||
|
|
||||||
/** Get the latency in input samples introduced by the resampler.
|
|
||||||
* @param st Resampler state
|
|
||||||
*/
|
|
||||||
int speex_resampler_get_input_latency(SpeexResamplerState *st);
|
|
||||||
|
|
||||||
/** Get the latency in output samples introduced by the resampler.
|
|
||||||
* @param st Resampler state
|
|
||||||
*/
|
|
||||||
int speex_resampler_get_output_latency(SpeexResamplerState *st);
|
|
||||||
|
|
||||||
/** Make sure that the first samples to go out of the resamplers don't have
|
|
||||||
* leading zeros. This is only useful before starting to use a newly created
|
|
||||||
* resampler. It is recommended to use that when resampling an audio file, as
|
|
||||||
* it will generate a file with the same length. For real-time processing,
|
|
||||||
* it is probably easier not to use this call (so that the output duration
|
|
||||||
* is the same for the first frame).
|
|
||||||
* @param st Resampler state
|
|
||||||
*/
|
|
||||||
int speex_resampler_skip_zeros(SpeexResamplerState *st);
|
|
||||||
|
|
||||||
/** Reset a resampler so a new (unrelated) stream can be processed.
|
|
||||||
* @param st Resampler state
|
|
||||||
*/
|
|
||||||
int speex_resampler_reset_mem(SpeexResamplerState *st);
|
|
||||||
|
|
||||||
/** Returns the English meaning for an error code
|
|
||||||
* @param err Error code
|
|
||||||
* @return English string
|
|
||||||
*/
|
|
||||||
const char *speex_resampler_strerror(int err);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,126 +0,0 @@
|
||||||
/* speex_types.h taken from libogg */
|
|
||||||
/********************************************************************
|
|
||||||
* *
|
|
||||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
|
||||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
|
||||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
|
||||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
|
||||||
* *
|
|
||||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
|
|
||||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
|
||||||
* *
|
|
||||||
********************************************************************
|
|
||||||
|
|
||||||
function: #ifdef jail to whip a few platforms into the UNIX ideal.
|
|
||||||
last mod: $Id: os_types.h 7524 2004-08-11 04:20:36Z conrad $
|
|
||||||
|
|
||||||
********************************************************************/
|
|
||||||
/**
|
|
||||||
@file speex_types.h
|
|
||||||
@brief Speex types
|
|
||||||
*/
|
|
||||||
#ifndef _SPEEX_TYPES_H
|
|
||||||
#define _SPEEX_TYPES_H
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
|
||||||
|
|
||||||
# if defined(__CYGWIN__)
|
|
||||||
# include <_G_config.h>
|
|
||||||
typedef _G_int32_t spx_int32_t;
|
|
||||||
typedef _G_uint32_t spx_uint32_t;
|
|
||||||
typedef _G_int16_t spx_int16_t;
|
|
||||||
typedef _G_uint16_t spx_uint16_t;
|
|
||||||
# elif defined(__MINGW32__)
|
|
||||||
typedef short spx_int16_t;
|
|
||||||
typedef unsigned short spx_uint16_t;
|
|
||||||
typedef int spx_int32_t;
|
|
||||||
typedef unsigned int spx_uint32_t;
|
|
||||||
# elif defined(__MWERKS__)
|
|
||||||
typedef int spx_int32_t;
|
|
||||||
typedef unsigned int spx_uint32_t;
|
|
||||||
typedef short spx_int16_t;
|
|
||||||
typedef unsigned short spx_uint16_t;
|
|
||||||
# else
|
|
||||||
/* MSVC/Borland */
|
|
||||||
typedef __int32 spx_int32_t;
|
|
||||||
typedef unsigned __int32 spx_uint32_t;
|
|
||||||
typedef __int16 spx_int16_t;
|
|
||||||
typedef unsigned __int16 spx_uint16_t;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#elif defined(__MACOS__)
|
|
||||||
|
|
||||||
# include <sys/types.h>
|
|
||||||
typedef SInt16 spx_int16_t;
|
|
||||||
typedef UInt16 spx_uint16_t;
|
|
||||||
typedef SInt32 spx_int32_t;
|
|
||||||
typedef UInt32 spx_uint32_t;
|
|
||||||
|
|
||||||
#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
|
|
||||||
|
|
||||||
# include <sys/types.h>
|
|
||||||
typedef int16_t spx_int16_t;
|
|
||||||
typedef u_int16_t spx_uint16_t;
|
|
||||||
typedef int32_t spx_int32_t;
|
|
||||||
typedef u_int32_t spx_uint32_t;
|
|
||||||
|
|
||||||
#elif defined(__BEOS__)
|
|
||||||
|
|
||||||
/* Be */
|
|
||||||
# include <inttypes.h>
|
|
||||||
typedef int16_t spx_int16_t;
|
|
||||||
typedef u_int16_t spx_uint16_t;
|
|
||||||
typedef int32_t spx_int32_t;
|
|
||||||
typedef u_int32_t spx_uint32_t;
|
|
||||||
|
|
||||||
#elif defined (__EMX__)
|
|
||||||
|
|
||||||
/* OS/2 GCC */
|
|
||||||
typedef short spx_int16_t;
|
|
||||||
typedef unsigned short spx_uint16_t;
|
|
||||||
typedef int spx_int32_t;
|
|
||||||
typedef unsigned int spx_uint32_t;
|
|
||||||
|
|
||||||
#elif defined (DJGPP)
|
|
||||||
|
|
||||||
/* DJGPP */
|
|
||||||
typedef short spx_int16_t;
|
|
||||||
typedef int spx_int32_t;
|
|
||||||
typedef unsigned int spx_uint32_t;
|
|
||||||
|
|
||||||
#elif defined(R5900)
|
|
||||||
|
|
||||||
/* PS2 EE */
|
|
||||||
typedef int spx_int32_t;
|
|
||||||
typedef unsigned spx_uint32_t;
|
|
||||||
typedef short spx_int16_t;
|
|
||||||
|
|
||||||
#elif defined(__SYMBIAN32__)
|
|
||||||
|
|
||||||
/* Symbian GCC */
|
|
||||||
typedef signed short spx_int16_t;
|
|
||||||
typedef unsigned short spx_uint16_t;
|
|
||||||
typedef signed int spx_int32_t;
|
|
||||||
typedef unsigned int spx_uint32_t;
|
|
||||||
|
|
||||||
#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
|
|
||||||
|
|
||||||
typedef short spx_int16_t;
|
|
||||||
typedef unsigned short spx_uint16_t;
|
|
||||||
typedef long spx_int32_t;
|
|
||||||
typedef unsigned long spx_uint32_t;
|
|
||||||
|
|
||||||
#elif defined(CONFIG_TI_C6X)
|
|
||||||
|
|
||||||
typedef short spx_int16_t;
|
|
||||||
typedef unsigned short spx_uint16_t;
|
|
||||||
typedef int spx_int32_t;
|
|
||||||
typedef unsigned int spx_uint32_t;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
# include <speex/speex_config_types.h>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _SPEEX_TYPES_H */
|
|
|
@ -1,115 +0,0 @@
|
||||||
/* Copyright (C) 2002 Jean-Marc Valin */
|
|
||||||
/**
|
|
||||||
@file stack_alloc.h
|
|
||||||
@brief Temporary memory allocation on stack
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
- Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
- Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
- Neither the name of the Xiph.org Foundation nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
|
||||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef STACK_ALLOC_H
|
|
||||||
#define STACK_ALLOC_H
|
|
||||||
|
|
||||||
#ifdef USE_ALLOCA
|
|
||||||
# ifdef WIN32
|
|
||||||
# include <malloc.h>
|
|
||||||
# else
|
|
||||||
# ifdef HAVE_ALLOCA_H
|
|
||||||
# include <alloca.h>
|
|
||||||
# else
|
|
||||||
# include <stdlib.h>
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @def ALIGN(stack, size)
|
|
||||||
*
|
|
||||||
* Aligns the stack to a 'size' boundary
|
|
||||||
*
|
|
||||||
* @param stack Stack
|
|
||||||
* @param size New size boundary
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @def PUSH(stack, size, type)
|
|
||||||
*
|
|
||||||
* Allocates 'size' elements of type 'type' on the stack
|
|
||||||
*
|
|
||||||
* @param stack Stack
|
|
||||||
* @param size Number of elements
|
|
||||||
* @param type Type of element
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @def VARDECL(var)
|
|
||||||
*
|
|
||||||
* Declare variable on stack
|
|
||||||
*
|
|
||||||
* @param var Variable to declare
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @def ALLOC(var, size, type)
|
|
||||||
*
|
|
||||||
* Allocate 'size' elements of 'type' on stack
|
|
||||||
*
|
|
||||||
* @param var Name of variable to allocate
|
|
||||||
* @param size Number of elements
|
|
||||||
* @param type Type of element
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef ENABLE_VALGRIND
|
|
||||||
|
|
||||||
#include <valgrind/memcheck.h>
|
|
||||||
|
|
||||||
#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
|
|
||||||
|
|
||||||
#define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type))))
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
|
|
||||||
|
|
||||||
#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type))))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(VAR_ARRAYS)
|
|
||||||
#define VARDECL(var)
|
|
||||||
#define ALLOC(var, size, type) type var[size]
|
|
||||||
#elif defined(USE_ALLOCA)
|
|
||||||
#define VARDECL(var) var
|
|
||||||
#define ALLOC(var, size, type) var = _alloca(sizeof(type)*(size))
|
|
||||||
#else
|
|
||||||
#define VARDECL(var) var
|
|
||||||
#define ALLOC(var, size, type) var = PUSH(stack, size, type)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,15 +1,11 @@
|
||||||
$path = Split-Path $Script:MyInvocation.MyCommand.Path
|
$path = Split-Path $Script:MyInvocation.MyCommand.Path
|
||||||
$zip = $path+'\lib\orcalibs.zip'
|
$zip = $path+'\orctlibs.zip'
|
||||||
$libs = $path+'\lib'
|
$libs = $path+'\lib'
|
||||||
$libcurl = Test-Path $path\lib\libcurl\
|
$libsTest = Test_path $libs
|
||||||
$jansson = Test-Path $path\lib\jansson\
|
if (!$libsTest) {
|
||||||
$sdl = Test-Path $path\lib\sdl\
|
mkdir $libs
|
||||||
if (!$libcurl -or !$jansson -or !$sdl) {
|
Invoke-WebRequest https://download.openrct2.website/dev/lib/vs -OutFile $path\orctlibs.zip
|
||||||
Invoke-WebRequest http://misozmiric.com/ted/openrct2/orcalibs-vs.zip -OutFile $path\lib\orcalibs.zip
|
|
||||||
rm $path\lib\libcurl -r -Force -ErrorAction SilentlyContinue
|
|
||||||
rm $path\lib\jansson -r -Force -ErrorAction SilentlyContinue
|
|
||||||
rm $path\lib\sdl -r -Force -ErrorAction SilentlyContinue
|
|
||||||
[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') > $null
|
[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') > $null
|
||||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $libs)
|
[System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $libs)
|
||||||
rm $path\lib\orcalibs.zip -Force -ErrorAction SilentlyContinue
|
rm $path\orctlibs.zip -Force -ErrorAction SilentlyContinue
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue