|
Simple coroutine library / objects in plain C Snapshot
|
Go to the source code of this file.
Functions | |
| static int | parse_spec (const char **pos, VAL_TYPE *type) |
| int | VALUES_printv (VALUES *values, const char *format, va_list ap) |
| insert typed tuple of values | |
| int | VALUES_scanv (VALUES *values, const char *format, va_list ap) |
| retrieve typed tuple of values; like scanf receives varying number of arguments | |
| static int parse_spec | ( | const char ** | pos, |
| VAL_TYPE * | type | ||
| ) | [static] |
Definition at line 4 of file val.c.
{
const char *cur = *pos;
int length = 0;
if (*cur == '\0') {
return 1;
}
for( ; isspace(*cur) ; ++cur);
if (*cur != '%') {
return -1;
}
++cur;
if (*cur == 's') {
*type = VAL_TYPE_STRING;
goto ret;
}
if (*cur == 'p') {
*type = VAL_TYPE_PTR;
goto ret;
}
for( length = 0; *cur == 'h'; ++cur,++length );
if ( *cur == 'q') {
++cur;
length = 4;
}
if (*cur != 'd' && *cur != 'u') {
return -1;
}
switch( length ) {
case 2:
*type = *cur == 'd' ? VAL_TYPE_INT8 : VAL_TYPE_UINT8;
goto ret;
case 1:
*type = *cur == 'd' ? VAL_TYPE_INT16 : VAL_TYPE_UINT16;
goto ret;
case 0:
*type = *cur == 'd' ? VAL_TYPE_INT32 : VAL_TYPE_UINT32;
goto ret;
case 4:
*type = *cur == 'd' ? VAL_TYPE_INT64 : VAL_TYPE_UINT64;
goto ret;
}
return -1;
ret:
*pos = cur + 1;
return 0;
}
1.7.4