Add variant in_str

This commit is contained in:
Patrick Pelissier committed 2017-03-04 19:25:17 +01:00
1 parent 838ac00eb7
commit 3b99c5b4b4
1 file changed
+32 -2
+32 -2
View File
@@ -270,7 +270,35 @@
VARIANTI_GET_OUT_STR a (f, el -> value . VARIANTI_GET_FIELD a); \
break;
//todo : in_str
#define VARIANTI_DEFINE_IN_STR(name, ...) \
static inline bool M_C(name, _in_str)(M_C(name,_t) el, \
FILE *f) { \
assert (f != NULL && el != NULL); \
/* A buffer of 400 bytes should be more than enough for all variant names... */ \
char variantTypeBuf[400]; \
if (fgetc(f) != '@') return false; \
/* First read the name of the type */ \
char c = fgetc(f); \
unsigned int i = 0; \
while (c != '@' && !feof(f) && !ferror(f) && i < sizeof(variantTypeBuf) - 1) { \
variantTypeBuf[i++] = c; \
c = fgetc(f); \
} \
variantTypeBuf[i++] = 0; \
assert(i < sizeof(variantTypeBuf)); \
/* In function of the type */ \
if (strcmp(variantTypeBuf, "EMPTY") == 0) { \
el->type = M_C(name, _EMPTY); \
} \
M_MAP2(VARIANTI_DEFINE_IN_STR_FUNC , name, __VA_ARGS__) \
else return false; \
return fgetc(f) == '@'; \
}
#define VARIANTI_DEFINE_IN_STR_FUNC(name, a) \
else if (strcmp (variantTypeBuf, M_AS_STR(VARIANTI_GET_FIELD a)) == 0) { \
bool b = VARIANTI_GET_IN_STR a (el -> value . VARIANTI_GET_FIELD a, f); \
if (!b) return false; \
}
#define VARIANTI_OPLIST(name, ...) \
(INIT(M_C(name,_init)), \
@@ -323,8 +351,10 @@
(VARIANTI_DEFINE_EQUAL(name, __VA_ARGS__),) \
M_IF(VARIANTI_ALL_GET_STR(__VA_ARGS__)) \
(VARIANTI_DEFINE_GET_STR(name, __VA_ARGS__),) \
M_IF(VARIANTI_ALL_OUT_STR(__VA_ARGS__)) \
M_IF(VARIANTI_ALL_OUT_STR(__VA_ARGS__)) \
(VARIANTI_DEFINE_OUT_STR(name, __VA_ARGS__),) \
M_IF(VARIANTI_ALL_IN_STR(__VA_ARGS__)) \
(VARIANTI_DEFINE_IN_STR(name, __VA_ARGS__),) \
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
(VARIANTI_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \