Add variant in_str
This commit is contained in:
1 parent
838ac00eb7
commit
3b99c5b4b4
1 file changed
+32
-2
+32
-2
@@ -270,7 +270,35 @@
|
|||||||
VARIANTI_GET_OUT_STR a (f, el -> value . VARIANTI_GET_FIELD a); \
|
VARIANTI_GET_OUT_STR a (f, el -> value . VARIANTI_GET_FIELD a); \
|
||||||
break;
|
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, ...) \
|
#define VARIANTI_OPLIST(name, ...) \
|
||||||
(INIT(M_C(name,_init)), \
|
(INIT(M_C(name,_init)), \
|
||||||
@@ -323,8 +351,10 @@
|
|||||||
(VARIANTI_DEFINE_EQUAL(name, __VA_ARGS__),) \
|
(VARIANTI_DEFINE_EQUAL(name, __VA_ARGS__),) \
|
||||||
M_IF(VARIANTI_ALL_GET_STR(__VA_ARGS__)) \
|
M_IF(VARIANTI_ALL_GET_STR(__VA_ARGS__)) \
|
||||||
(VARIANTI_DEFINE_GET_STR(name, __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__),) \
|
(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__)) \
|
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
|
||||||
(VARIANTI_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \
|
(VARIANTI_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \
|
||||||
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
|
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
|
||||||
|
|||||||
Reference in new issue
Block a user