cvar_result_e eval_string(cvar_type_t* type, void* vdata, int argc, char** argv) { char** data = (char**) vdata; if(argc == 2) { if(*data) { free(*data); } *data = strdup(argv[1]); } else { output("%s: string: %s", argv[0], *data); } return cvar_kNoError; } cvar_result_e cmd_string(int argc, char** argv) { if(argc == 3) { cvar_t* cmd; cmd = cvar_create(argv[1], g_stringtype); *((char**) cmd->data) = strdup(argv[2]); } else { output("usage: %s ", argv[0]); } return cvar_kNoError; } void view_string(char* buffer, size_t len, cvar_type_t* type, void* data) { sprintf(buffer, "string: %s", *((char**) data)); } /* ... */ g_stringtype = cvar_type_new("string"); cvar_type_set_eval(g_stringtype, eval_string); cvar_type_set_dtor(g_stringtype, cvar_type_dtor_free_pointer_default); cvar_type_set_datasize(g_stringtype, sizeof(char*)); cvar_type_set_view(g_stringtype, view_string); cvar_set_cmd("string", cmd_string);