/* * sfconfig.h */ #ifndef SFCONFIG_H #define SFCONFIG_H /* * macros to be expanded into assignment functions for SimFront parameters */ #define WS " \t\n\r\v\f" /* white space characters */ #define SET_STRLIST(field, num, max) \ static int set_##field(SimFront *sf, char *value) { \ char *last = NULL; \ char *nwval = mdutil_strtok_r(value, WS, &last); \ if (sf->num == sf->max) { \ void *tmp = realloc(sf->field, 2 * sf->max); \ if (tmp == NULL) { \ ERRMSG(sf, "call to realloc from set_" #field " failed"); \ return -1; \ } \ sf->field = (char **) tmp; \ sf->max *= 2; \ } \ sf->field[ sf->num ] = strdup(nwval); \ if (sf->field[ sf->num ] == NULL) { \ ERRMSG(sf, "call to strdup from set_" #field " failed"); \ return -1; \ } \ sf->num++; \ return 0; \ } #define SET_STRING(field) \ static int set_##field(SimFront *sf, char *value) { \ char *last = NULL; \ char *nwval = mdutil_strtok_r(value, WS, &last); \ free(sf->field); \ sf->field = strdup(nwval); \ if (sf->field == NULL) { \ ERRMSG(sf, "call to strdup from set_" #field " failed"); \ return -1; \ } \ return 0; \ } #define SET_BOOL(field) \ static int set_##field(SimFront *sf, char *value) { \ char *last = NULL; \ char *nwval = mdutil_strtok_r(value, WS, &last); \ if (mdutil_strcasecmp(nwval, "yes") == 0 \ || mdutil_strcasecmp(nwval, "on") == 0) { \ sf->field = 1; \ } \ else if (mdutil_strcasecmp(nwval, "no") == 0) { \ sf->field = 0; \ } \ else return -1; \ return 0; \ } #define SET_INT(field) \ static int set_##field(SimFront *sf, char *value) { \ sf->field = atoi(value); \ return 0; \ } #define SET_DOUBLE(field) \ static int set_##field(SimFront *sf, char *value) { \ sf->field = atof(value); \ return 0; \ } #endif