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:
Patrick Pelissier committed 2018-08-24 20:45:26 +02:00
1 parent f8600296f0
commit a41177a110
1 file changed
+100 -47
+100 -47
View File
@@ -33,6 +33,7 @@
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#define M_CORE_VERSION_MAJOR 0
#define M_CORE_VERSION_MINOR 2
@@ -1251,6 +1252,7 @@
#define M_PRINTF_FORMAT(x) \
_Generic(((void)0,x), \
char: "%c", \
bool: "%d", \
signed char: "%hhd", \
unsigned char: "%hhu", \
signed short: "%hd", \
@@ -1269,23 +1271,6 @@
const 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.*/
#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)
/* 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) */
#define M_GET_STRING_ARG(string, x, append) \
@@ -1304,29 +1341,45 @@
#define M_PARSE_DEFAULT_TYPE(x, str, endptr) \
_Generic(((void)0,*x), \
char: m_parse_char(M_AS_TYPE(char*,x),str,endptr), \
signed char: m_parse_schar(M_AS_TYPE(signed char*,x),str,endptr), \
unsigned char: m_parse_uchar(M_AS_TYPE(unsigned char*,x),str,endptr), \
signed short: m_parse_sshort(M_AS_TYPE(signed short*,x),str,endptr), \
unsigned short: m_parse_ushort(M_AS_TYPE(unsigned short*,x),str,endptr), \
signed int: m_parse_sint(M_AS_TYPE(signed int*,x),str,endptr), \
unsigned int: m_parse_uint(M_AS_TYPE(unsigned int*,x),str,endptr), \
signed long: m_parse_slong(M_AS_TYPE(signed long *,x),str,endptr), \
unsigned long: m_parse_ulong(M_AS_TYPE(unsigned long*,x),str,endptr), \
signed long long: m_parse_sllong(M_AS_TYPE(signed long long*,x),str,endptr), \
unsigned long long: m_parse_ullong(M_AS_TYPE(unsigned long long*,x),str,endptr), \
float: m_parse_float(M_AS_TYPE(float*,x),str,endptr), \
double: m_parse_double(M_AS_TYPE(double*,x),str,endptr), \
long double: m_parse_ldouble(M_AS_TYPE(long double*,x),str,endptr) )
char: m_core_parse_char(M_AS_TYPE(char*,x),str,endptr), \
bool: m_core_parse_bool(M_AS_TYPE(bool*,x),str,endptr), \
signed char: m_core_parse_schar(M_AS_TYPE(signed char*,x),str,endptr), \
unsigned char: m_core_parse_uchar(M_AS_TYPE(unsigned char*,x),str,endptr), \
signed short: m_core_parse_sshort(M_AS_TYPE(signed short*,x),str,endptr), \
unsigned short: m_core_parse_ushort(M_AS_TYPE(unsigned short*,x),str,endptr), \
signed int: m_core_parse_sint(M_AS_TYPE(signed int*,x),str,endptr), \
unsigned int: m_core_parse_uint(M_AS_TYPE(unsigned int*,x),str,endptr), \
signed long: m_core_parse_slong(M_AS_TYPE(signed long *,x),str,endptr), \
unsigned long: m_core_parse_ulong(M_AS_TYPE(unsigned long*,x),str,endptr), \
signed long long: m_core_parse_sllong(M_AS_TYPE(signed long long*,x),str,endptr), \
unsigned long long: m_core_parse_ullong(M_AS_TYPE(unsigned long long*,x),str,endptr), \
float: m_core_parse_float(M_AS_TYPE(float*,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
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++;
if (endptr != NULL) *endptr = str;
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) \
static inline bool \
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); \
if (endptr != NULL) *endptr = end; \
return end != str; \
}
}
M_PARSE_DEFAULT_TYPE_DEF(m_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_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_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_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_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_parse_float, float, strtof, )
M_PARSE_DEFAULT_TYPE_DEF(m_parse_double, double, strtod, )
M_PARSE_DEFAULT_TYPE_DEF(m_parse_ldouble, long double, strtold, )
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_schar, signed char, strtol, 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_core_parse_sshort, signed short, strtol, 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_core_parse_sint, signed int, strtol, 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_core_parse_slong, signed long, strtol, 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_core_parse_sllong, signed long long, strtoll, 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_core_parse_float, float, strtof, )
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_double, double, strtod, )
M_PARSE_DEFAULT_TYPE_DEF(m_core_parse_ldouble, long double, strtold, )
#define M_SEPARATE_PER_SEMICOLON(a,b) a ; b