diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2018-05-11 08:25:41 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-05-14 10:13:39 -0700 |
commit | d577467f97e262d52ed2e1d1da94c14168480844 (patch) | |
tree | cd9e3242d839efda7264a7e5063311a5735bc034 /core/subsurface-string.h | |
parent | c71a5d74135d8ebf9dce6de6633499c1c41c07ff (diff) | |
download | subsurface-d577467f97e262d52ed2e1d1da94c14168480844.tar.gz |
Core: introduce new subsurface-string header
First small step to shrinking dive.h.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'core/subsurface-string.h')
-rw-r--r-- | core/subsurface-string.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/core/subsurface-string.h b/core/subsurface-string.h new file mode 100644 index 000000000..33849e217 --- /dev/null +++ b/core/subsurface-string.h @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifndef SUBSURFACE_STRING_H +#define SUBSURFACE_STRING_H + +#include <stdbool.h> +#include <string.h> +#include <time.h> + +// shared generic definitions and macros +// mostly about strings, but a couple of math macros are here as well + +/* Windows has no MIN/MAX macros - so let's just roll our own */ +#define MIN(x, y) ({ \ + __typeof__(x) _min1 = (x); \ + __typeof__(y) _min2 = (y); \ + (void) (&_min1 == &_min2); \ + _min1 < _min2 ? _min1 : _min2; }) + +#define MAX(x, y) ({ \ + __typeof__(x) _max1 = (x); \ + __typeof__(y) _max2 = (y); \ + (void) (&_max1 == &_max2); \ + _max1 > _max2 ? _max1 : _max2; }) + +#define IS_FP_SAME(_a, _b) (fabs((_a) - (_b)) <= 0.000001 * MAX(fabs(_a), fabs(_b))) + +// string handling + +#ifdef __cplusplus +extern "C" { +#endif + +static inline bool same_string(const char *a, const char *b) +{ + return !strcmp(a ?: "", b ?: ""); +} + +static inline bool same_string_caseinsensitive(const char *a, const char *b) +{ + return !strcasecmp(a ?: "", b ?: ""); +} + +static inline bool empty_string(const char *s) +{ + return !s || !*s; +} + +static inline bool includes_string_caseinsensitive(const char *haystack, const char *needle) +{ + if (!needle) + return 1; /* every string includes the NULL string */ + if (!haystack) + return 0; /* nothing is included in the NULL string */ + int len = strlen(needle); + while (*haystack) { + if (strncasecmp(haystack, needle, len)) + return 1; + haystack++; + } + return 0; +} + +static inline char *copy_string(const char *s) +{ + return (s && *s) ? strdup(s) : NULL; +} + +#define STRTOD_NO_SIGN 0x01 +#define STRTOD_NO_DOT 0x02 +#define STRTOD_NO_COMMA 0x04 +#define STRTOD_NO_EXPONENT 0x08 +extern double strtod_flags(const char *str, const char **ptr, unsigned int flags); + +#define STRTOD_ASCII (STRTOD_NO_COMMA) + +#define ascii_strtod(str, ptr) strtod_flags(str, ptr, STRTOD_ASCII) + +#ifdef __cplusplus +} +#endif +#endif // SUBSURFACE_STRING_H |