static int ucli_vargparse_type__(ucli_context_t* uc, char c, char* type, const char* arg, aim_va_list_t* vargs) { int rv; aim_datatype_t* dt; if(arg == NULL) { return UCLI_STATUS_E_ARG; } if(type && type[0] == '%') { /* Immediate string specified. The argument must be that string. */ if(type[1] == 0) { /* No string */ return UCLI_STATUS_E_INTERNAL; } if(!UCLI_STRCMP(type+1, arg)) { return UCLI_STATUS_OK; } ucli_error(uc, "expected '%s', not '%s'", type+1, arg); return UCLI_STATUS_E_ARG; } dt = aim_datatype_find(c, type); if(dt == NULL) { /* Unrecognized type */ ucli_error(uc, "<bug: no handler for type '%c:%s'>", (c) ? c : '.', (type) ? type : "[NULL]"); AIM_LOG_ERROR("bug: no handler for type '%c:%s'", (c) ? c : '.', (type) ? type : "[NULL]"); return UCLI_STATUS_E_INTERNAL; } { aim_datatype_context_t dtc; dtc.dt = dt; dtc.epvs = &uc->pvs; rv = dt->from_str(&dtc, arg, vargs); } if( (rv < 0) && dt->desc) { ucli_e_arg(uc, arg, dt->desc); } return rv; }
int aim_datatype_register_struct(aim_datatype_t* dt) { __aim_datatype_t* ndt = NULL; if( (dt == NULL) || (dt->c == 0 && dt->type == NULL) || (dt->from_str == NULL && dt->to_str == NULL) ) { return -1; } if(aim_datatype_find(dt->c, dt->type) != NULL) { return -1; } ndt = aim_zmalloc(sizeof(*ndt)); ndt->dt = *dt; list_push(&aim_datatype_list__, &ndt->links); return 0; }
int aim_avsparse_type(const char* arg, aim_pvs_t* epvs, char c, char* type, aim_va_list_t* vargs) { int rv; aim_datatype_t* dt; aim_datatype_context_t dtc; if(arg == NULL) { return AIM_ERROR_PARAM; } if(type && type[0] == '%') { /* Immediate string specified. The argument must be that string. */ if(type[1] == 0) { /* No string */ return AIM_ERROR_PARAM; } if(!AIM_STRCMP(type+1, arg)) { return AIM_ERROR_NONE; } aim_printf(epvs, "expected '%s', not '%s'\n", type+1, arg); return AIM_ERROR_PARAM; } dt = aim_datatype_find(c, type); if(dt == NULL) { /* Unrecognized type */ aim_printf(epvs, "<bug: no handler for type '%c:%s'>\n", (c) ? c : '.', (type) ? type : "[NULL]"); return AIM_ERROR_NOT_FOUND; } dtc.dt = dt; dtc.epvs = epvs; rv = dt->from_str(&dtc, arg, vargs); if( (rv < 0) && dt->desc) { aim_printf(epvs, "'%s' is not a valid %s\n", arg, dt->desc); } return rv; }