Add support for bool in default type support.
Needs to rewritefully how to dispatch the default type for IN_STR method Add also proper non-support for const char* & char * for IN_STR & PARSE_STR (We cannot do it reliabelty, so the function says it always fail).
This commit is contained in:
1 parent
f8600296f0
commit
a41177a110
1 file changed
+100
-47
@@ -33,6 +33,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#define M_CORE_VERSION_MAJOR 0
|
#define M_CORE_VERSION_MAJOR 0
|
||||||
#define M_CORE_VERSION_MINOR 2
|
#define M_CORE_VERSION_MINOR 2
|
||||||
@@ -1251,6 +1252,7 @@
|
|||||||
#define M_PRINTF_FORMAT(x) \
|
#define M_PRINTF_FORMAT(x) \
|
||||||
_Generic(((void)0,x), \
|
_Generic(((void)0,x), \
|
||||||
char: "%c", \
|
char: "%c", \
|
||||||
|
bool: "%d", \
|
||||||
signed char: "%hhd", \
|
signed char: "%hhd", \
|
||||||
unsigned char: "%hhu", \
|
unsigned char: "%hhu", \
|
||||||
signed short: "%hd", \
|
signed short: "%hd", \
|
||||||
@@ -1269,23 +1271,6 @@
|
|||||||
const void *: "%p", \
|
const void *: "%p", \
|
||||||
void *: "%p")
|
void *: "%p")
|
||||||
|
|
||||||
#define M_SCANF_FORMAT(x) \
|
|
||||||
_Generic(((void)0,x), \
|
|
||||||
char: "%c", \
|
|
||||||
signed char: "%hhd", \
|
|
||||||
unsigned char: "%hhu", \
|
|
||||||
signed short: "%hd", \
|
|
||||||
unsigned short: "%hu", \
|
|
||||||
signed int: "%d", \
|
|
||||||
unsigned int: "%u", \
|
|
||||||
long int: "%ld", \
|
|
||||||
unsigned long int: "%lu", \
|
|
||||||
long long int: "%Ld", \
|
|
||||||
unsigned long long int: "%Lu", \
|
|
||||||
float: "%f", \
|
|
||||||
double: "%lf", \
|
|
||||||
long double: "%Lf")
|
|
||||||
|
|
||||||
/* Print a C variable if it is a standard type to stdout.*/
|
/* Print a C variable if it is a standard type to stdout.*/
|
||||||
#define M_PRINT_ARG(x) printf(M_PRINTF_FORMAT(x), x)
|
#define M_PRINT_ARG(x) printf(M_PRINTF_FORMAT(x), x)
|
||||||
|
|
||||||
@@ -1293,7 +1278,59 @@
|
|||||||
#define M_FPRINT_ARG(f, x) fprintf(f, M_PRINTF_FORMAT(x), x)
|
#define M_FPRINT_ARG(f, x) fprintf(f, M_PRINTF_FORMAT(x), x)
|
||||||
|
|
||||||
/* Get a C variable if it is a standard type from the given file 'f'.*/
|
/* Get a C variable if it is a standard type from the given file 'f'.*/
|
||||||
#define M_FSCAN_ARG(xptr, f) (fscanf(f, M_SCANF_FORMAT(*xptr), xptr) == 1)
|
#define M_FSCAN_ARG(xptr, f) \
|
||||||
|
_Generic(((void)0,*xptr), \
|
||||||
|
bool: m_core_fscan_bool(M_AS_TYPE(bool*,xptr), f), \
|
||||||
|
char: m_core_fscan_char(M_AS_TYPE(char*,xptr), f), \
|
||||||
|
signed char: m_core_fscan_schar(M_AS_TYPE(signed char*,xptr),f), \
|
||||||
|
unsigned char: m_core_fscan_uchar(M_AS_TYPE(unsigned char*,xptr),f), \
|
||||||
|
signed short: m_core_fscan_sshort(M_AS_TYPE(signed short*,xptr),f), \
|
||||||
|
unsigned short: m_core_fscan_ushort(M_AS_TYPE(unsigned short*,xptr), f), \
|
||||||
|
signed int: m_core_fscan_sint(M_AS_TYPE(signed int*,xptr), f), \
|
||||||
|
unsigned int: m_core_fscan_uint(M_AS_TYPE(unsigned int*,xptr), f), \
|
||||||
|
long int: m_core_fscan_slong(M_AS_TYPE(long*,xptr), f), \
|
||||||
|
unsigned long int: m_core_fscan_ulong(M_AS_TYPE(unsigned long*,xptr), f), \
|
||||||
|
long long int: m_core_fscan_sllong(M_AS_TYPE(long long*,xptr), f), \
|
||||||
|
unsigned long long int: m_core_fscan_ullong(M_AS_TYPE(unsigned long long*,xptr),f), \
|
||||||
|
float: m_core_fscan_float(M_AS_TYPE(float*,xptr), f), \
|
||||||
|
double: m_core_fscan_double(M_AS_TYPE(double*,xptr), f), \
|
||||||
|
long double: m_core_fscan_ldouble(M_AS_TYPE(long double*,xptr),f), \
|
||||||
|
const char *: false /* unsupported */, \
|
||||||
|
char *: false /* unsupported */, \
|
||||||
|
const void *: false /* unsupported */, \
|
||||||
|
void *: false /* unsupported */)
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
m_core_fscan_bool (bool *ptr, FILE *f)
|
||||||
|
{
|
||||||
|
char c = fgetc(f);
|
||||||
|
if (c == '0' || c == '1') {
|
||||||
|
*ptr = (c == '1');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define M_FSCAN_DEFAULT_TYPE_DEF(name, type, format) \
|
||||||
|
static inline bool \
|
||||||
|
name (type *ptr, FILE *f) \
|
||||||
|
{ \
|
||||||
|
return fscanf(f, format, ptr); \
|
||||||
|
}
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_char, char, "%c")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_schar, signed char, "%hhd")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_uchar, unsigned char, "%hhu")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_sshort, signed short, "%hd")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_ushort, unsigned short, "%hu")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_sint, signed int, "%d")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_uint, unsigned int, "%u")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_slong, signed long, "%ld")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_ulong, unsigned long, "%lu")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_sllong, signed long long, "%lld")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_ullong, unsigned long long, "%llu")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_float, float, "%f")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_double, double, "%lf")
|
||||||
|
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_ldouble, long double, "%Lf")
|
||||||
|
|
||||||
/* Transform a C variable into a string_t (needs m-string.h) */
|
/* Transform a C variable into a string_t (needs m-string.h) */
|
||||||
#define M_GET_STRING_ARG(string, x, append) \
|
#define M_GET_STRING_ARG(string, x, append) \
|
||||||
@@ -1304,29 +1341,45 @@
|
|||||||
|
|
||||||
#define M_PARSE_DEFAULT_TYPE(x, str, endptr) \
|
#define M_PARSE_DEFAULT_TYPE(x, str, endptr) \
|
||||||
_Generic(((void)0,*x), \
|
_Generic(((void)0,*x), \
|
||||||
char: m_parse_char(M_AS_TYPE(char*,x),str,endptr), \
|
char: m_core_parse_char(M_AS_TYPE(char*,x),str,endptr), \
|
||||||
signed char: m_parse_schar(M_AS_TYPE(signed char*,x),str,endptr), \
|
bool: m_core_parse_bool(M_AS_TYPE(bool*,x),str,endptr), \
|
||||||
unsigned char: m_parse_uchar(M_AS_TYPE(unsigned char*,x),str,endptr), \
|
signed char: m_core_parse_schar(M_AS_TYPE(signed char*,x),str,endptr), \
|
||||||
signed short: m_parse_sshort(M_AS_TYPE(signed short*,x),str,endptr), \
|
unsigned char: m_core_parse_uchar(M_AS_TYPE(unsigned char*,x),str,endptr), \
|
||||||
unsigned short: m_parse_ushort(M_AS_TYPE(unsigned short*,x),str,endptr), \
|
signed short: m_core_parse_sshort(M_AS_TYPE(signed short*,x),str,endptr), \
|
||||||
signed int: m_parse_sint(M_AS_TYPE(signed int*,x),str,endptr), \
|
unsigned short: m_core_parse_ushort(M_AS_TYPE(unsigned short*,x),str,endptr), \
|
||||||
unsigned int: m_parse_uint(M_AS_TYPE(unsigned int*,x),str,endptr), \
|
signed int: m_core_parse_sint(M_AS_TYPE(signed int*,x),str,endptr), \
|
||||||
signed long: m_parse_slong(M_AS_TYPE(signed long *,x),str,endptr), \
|
unsigned int: m_core_parse_uint(M_AS_TYPE(unsigned int*,x),str,endptr), \
|
||||||
unsigned long: m_parse_ulong(M_AS_TYPE(unsigned long*,x),str,endptr), \
|
signed long: m_core_parse_slong(M_AS_TYPE(signed long *,x),str,endptr), \
|
||||||
signed long long: m_parse_sllong(M_AS_TYPE(signed long long*,x),str,endptr), \
|
unsigned long: m_core_parse_ulong(M_AS_TYPE(unsigned long*,x),str,endptr), \
|
||||||
unsigned long long: m_parse_ullong(M_AS_TYPE(unsigned long long*,x),str,endptr), \
|
signed long long: m_core_parse_sllong(M_AS_TYPE(signed long long*,x),str,endptr), \
|
||||||
float: m_parse_float(M_AS_TYPE(float*,x),str,endptr), \
|
unsigned long long: m_core_parse_ullong(M_AS_TYPE(unsigned long long*,x),str,endptr), \
|
||||||
double: m_parse_double(M_AS_TYPE(double*,x),str,endptr), \
|
float: m_core_parse_float(M_AS_TYPE(float*,x),str,endptr), \
|
||||||
long double: m_parse_ldouble(M_AS_TYPE(long double*,x),str,endptr) )
|
double: m_core_parse_double(M_AS_TYPE(double*,x),str,endptr), \
|
||||||
|
long double: m_core_parse_ldouble(M_AS_TYPE(long double*,x),str,endptr), \
|
||||||
|
const char *: false /* not supported */, \
|
||||||
|
char *: false /* not supported */, \
|
||||||
|
const void *: false /* not supported */, \
|
||||||
|
void *: false /* not supported */)
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
m_parse_char (char *ptr, const char str[], const char **endptr)
|
m_core_parse_char (char *ptr, const char str[], const char **endptr)
|
||||||
{
|
{
|
||||||
*ptr = *str++;
|
*ptr = *str++;
|
||||||
if (endptr != NULL) *endptr = str;
|
if (endptr != NULL) *endptr = str;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
m_core_parse_bool (bool *ptr, const char str[], const char **endptr)
|
||||||
|
{
|
||||||
|
char c = *str++;
|
||||||
|
if (c != '0' && c != '1')
|
||||||
|
return false;
|
||||||
|
*ptr = (c == '1');
|
||||||
|
if (endptr != NULL) *endptr = str;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#define M_PARSE_DEFAULT_TYPE_DEF(name, type, parse_func, extra_arg) \
|
#define M_PARSE_DEFAULT_TYPE_DEF(name, type, parse_func, extra_arg) \
|
||||||
static inline bool \
|
static inline bool \
|
||||||
name (type *ptr, const char str[], const char **endptr) \
|
name (type *ptr, const char str[], const char **endptr) \
|
||||||
@@ -1335,21 +1388,21 @@ m_parse_char (char *ptr, const char str[], const char **endptr)
|
|||||||
*ptr = parse_func (str, &end extra_arg); \
|
*ptr = parse_func (str, &end extra_arg); \
|
||||||
if (endptr != NULL) *endptr = end; \
|
if (endptr != NULL) *endptr = end; \
|
||||||
return end != str; \
|
return end != str; \
|
||||||
}
|
}
|
||||||
|
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_schar, signed char, strtol, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_schar, signed char, strtol, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_uchar, unsigned char, strtoul, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_uchar, unsigned char, strtoul, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_sshort, signed short, strtol, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_sshort, signed short, strtol, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_ushort, unsigned short, strtoul, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_ushort, unsigned short, strtoul, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_sint, signed int, strtol, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_sint, signed int, strtol, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_uint, unsigned int, strtoul, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_uint, unsigned int, strtoul, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_slong, signed long, strtol, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_slong, signed long, strtol, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_ulong, unsigned long, strtoul, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_ulong, unsigned long, strtoul, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_sllong, signed long long, strtoll, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_sllong, signed long long, strtoll, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_ullong, unsigned long long, strtoull, M_DEFERRED_COMMA 10)
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_ullong, unsigned long long, strtoull, M_DEFERRED_COMMA 10)
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_float, float, strtof, )
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_float, float, strtof, )
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_double, double, strtod, )
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_double, double, strtod, )
|
||||||
M_PARSE_DEFAULT_TYPE_DEF(m_parse_ldouble, long double, strtold, )
|
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_ldouble, long double, strtold, )
|
||||||
|
|
||||||
|
|
||||||
#define M_SEPARATE_PER_SEMICOLON(a,b) a ; b
|
#define M_SEPARATE_PER_SEMICOLON(a,b) a ; b
|
||||||
|
|||||||
Reference in new issue
Block a user