summaryrefslogtreecommitdiffstats
path: root/core/subsurface-string.h
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2018-05-11 08:25:41 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-05-14 10:13:39 -0700
commitd577467f97e262d52ed2e1d1da94c14168480844 (patch)
treecd9e3242d839efda7264a7e5063311a5735bc034 /core/subsurface-string.h
parentc71a5d74135d8ebf9dce6de6633499c1c41c07ff (diff)
downloadsubsurface-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.h81
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