diff options
Diffstat (limited to 'csv.c')
| -rw-r--r-- | csv.c | 27 |
1 files changed, 6 insertions, 21 deletions
| @@ -5,7 +5,7 @@ | |||
| 5 | #include <stdlib.h> | 5 | #include <stdlib.h> |
| 6 | #include <string.h> | 6 | #include <string.h> |
| 7 | 7 | ||
| 8 | // === Compiletime Options === | 8 | // === Compile time options === |
| 9 | 9 | ||
| 10 | #ifndef CSV_DEFAULT_DELIMITER | 10 | #ifndef CSV_DEFAULT_DELIMITER |
| 11 | # define CSV_DEFAULT_DELIMITER '"' | 11 | # define CSV_DEFAULT_DELIMITER '"' |
| @@ -15,7 +15,7 @@ | |||
| 15 | # define CSV_DEFAULT_SEPARATOR ',' | 15 | # define CSV_DEFAULT_SEPARATOR ',' |
| 16 | #endif | 16 | #endif |
| 17 | 17 | ||
| 18 | // === some usefull Makros === | 18 | // === some useful Makros === |
| 19 | 19 | ||
| 20 | #define UNUSED(x) (void) (x) // mark a parameter as 'unused' | 20 | #define UNUSED(x) (void) (x) // mark a parameter as 'unused' |
| 21 | #define STR(s) #s // Stringify a Makro | 21 | #define STR(s) #s // Stringify a Makro |
| @@ -32,33 +32,18 @@ const char csv_version[] = XSTR(CSV_VER_MAJOR) "." XSTR(CSV_VER_MINOR) "." XSTR( | |||
| 32 | 32 | ||
| 33 | // === CSV-MEMORY Interface === | 33 | // === CSV-MEMORY Interface === |
| 34 | 34 | ||
| 35 | #if ( (defined(__GNUC__) && __GNUC__ >= 5) || (defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))) ) | ||
| 36 | # define mul_overflow __builtin_mul_overflow | ||
| 37 | #else | ||
| 38 | static inline int | ||
| 39 | mul_overflow(size_t a, size_t b, size_t *out) | ||
| 40 | { | ||
| 41 | *out = a * b; | ||
| 42 | return (a != 0 && (*out / a) != b); | ||
| 43 | } | ||
| 44 | #endif | ||
| 45 | |||
| 46 | static void * | 35 | static void * |
| 47 | csv_mem_reallocate(void *ptr, size_t number, size_t size, void *cb_arg) | 36 | csv_mem_reallocate(void *ptr, size_t num, size_t size, void *cb_arg) |
| 48 | { | 37 | { |
| 49 | UNUSED(cb_arg); | 38 | UNUSED(cb_arg); |
| 50 | 39 | ||
| 51 | size_t len = 0; | 40 | return reallocarray(ptr, num, size); |
| 52 | if ( number == 0 || size == 0 || mul_overflow(number, size, &len) ) { | ||
| 53 | return NULL; | ||
| 54 | } | ||
| 55 | return realloc(ptr, len); | ||
| 56 | } | 41 | } |
| 57 | 42 | ||
| 58 | static void | 43 | static void |
| 59 | csv_mem_free(void *ptr, size_t number, size_t size, void *cb_arg) | 44 | csv_mem_free(void *ptr, size_t num, size_t size, void *cb_arg) |
| 60 | { | 45 | { |
| 61 | UNUSED(number); | 46 | UNUSED(num); |
| 62 | UNUSED(size); | 47 | UNUSED(size); |
| 63 | UNUSED(cb_arg); | 48 | UNUSED(cb_arg); |
| 64 | 49 | ||
