/** * This method is to parse and add the argument attribute to command structure. **/ static pj_status_t add_arg_node(pj_cli_t *cli, pj_xml_node *xml_node, pj_cli_cmd_spec *cmd, pj_cli_arg_spec *arg, pj_cli_get_dyn_choice get_choice) { pj_xml_attr *attr; pj_status_t status = PJ_SUCCESS; pj_xml_node *sub_node = xml_node; if (cmd->arg_cnt >= PJ_CLI_MAX_ARGS) return PJ_CLI_ETOOMANYARGS; pj_bzero(arg, sizeof(*arg)); attr = sub_node->attr_head.next; arg->optional = PJ_FALSE; arg->validate = PJ_TRUE; while (attr != &sub_node->attr_head) { if (!pj_stricmp2(&attr->name, "name")) { pj_strassign(&arg->name, &attr->value); } else if (!pj_stricmp2(&attr->name, "id")) { arg->id = pj_strtol(&attr->value); } else if (!pj_stricmp2(&attr->name, "type")) { if (!pj_stricmp2(&attr->value, "text")) { arg->type = PJ_CLI_ARG_TEXT; } else if (!pj_stricmp2(&attr->value, "int")) { arg->type = PJ_CLI_ARG_INT; } else if (!pj_stricmp2(&attr->value, "choice")) { /* Get choice value */ add_choice_node(cli, xml_node, arg, get_choice); } } else if (!pj_stricmp2(&attr->name, "desc")) { pj_strassign(&arg->desc, &attr->value); } else if (!pj_stricmp2(&attr->name, "optional")) { if (!pj_strcmp2(&attr->value, "1")) { arg->optional = PJ_TRUE; } } else if (!pj_stricmp2(&attr->name, "validate")) { if (!pj_strcmp2(&attr->value, "1")) { arg->validate = PJ_TRUE; } else { arg->validate = PJ_FALSE; } } attr = attr->next; } cmd->arg_cnt++; return status; }
PJ_DEF(float) pj_strtof(const pj_str_t *str) { pj_str_t part; char *pdot; float val; if (str->slen == 0) return 0; pdot = (char*)pj_memchr(str->ptr, '.', str->slen); part.ptr = str->ptr; part.slen = pdot ? pdot - str->ptr : str->slen; if (part.slen) val = (float)pj_strtol(&part); else val = 0; if (pdot) { part.ptr = pdot + 1; part.slen = (str->ptr + str->slen - pdot - 1); if (part.slen) { pj_str_t endptr; float fpart, fdiv; int i; fpart = (float)pj_strtoul2(&part, &endptr, 10); fdiv = 1.0; for (i=0; i<(part.slen - endptr.slen); ++i) fdiv = fdiv * 10; if (val >= 0) val += (fpart / fdiv); else val -= (fpart / fdiv); } } return val; }
/** * This method is to parse and add the command attribute to command structure. **/ static pj_status_t add_cmd_node(pj_cli_t *cli, pj_cli_cmd_spec *group, pj_xml_node *xml_node, pj_cli_cmd_handler handler, pj_cli_cmd_spec **p_cmd, pj_cli_get_dyn_choice get_choice) { pj_xml_node *root = xml_node; pj_xml_attr *attr; pj_xml_node *sub_node; pj_cli_cmd_spec *cmd; pj_cli_arg_spec args[PJ_CLI_MAX_ARGS]; pj_str_t sc[PJ_CLI_MAX_SHORTCUTS]; pj_status_t status = PJ_SUCCESS; if (pj_stricmp2(&root->name, "CMD")) return PJ_EINVAL; /* Initialize the command spec */ cmd = PJ_POOL_ZALLOC_T(cli->pool, struct pj_cli_cmd_spec); /* Get the command attributes */ attr = root->attr_head.next; while (attr != &root->attr_head) { if (!pj_stricmp2(&attr->name, "name")) { pj_strltrim(&attr->value); if (!attr->value.slen || cmd_name_exists(cli, group, &attr->value)) { return PJ_CLI_EBADNAME; } pj_strdup(cli->pool, &cmd->name, &attr->value); } else if (!pj_stricmp2(&attr->name, "id")) { pj_bool_t is_valid = PJ_FALSE; if (attr->value.slen) { pj_cli_cmd_id cmd_id = pj_strtol(&attr->value); if (!pj_hash_get(cli->cmd_id_hash, &cmd_id, sizeof(pj_cli_cmd_id), NULL)) is_valid = PJ_TRUE; } if (!is_valid) return PJ_CLI_EBADID; cmd->id = (pj_cli_cmd_id)pj_strtol(&attr->value); } else if (!pj_stricmp2(&attr->name, "sc")) { pj_scanner scanner; pj_str_t str; PJ_USE_EXCEPTION; pj_scan_init(&scanner, attr->value.ptr, attr->value.slen, PJ_SCAN_AUTOSKIP_WS, &on_syntax_error); PJ_TRY { while (!pj_scan_is_eof(&scanner)) { pj_scan_get_until_ch(&scanner, ',', &str); pj_strrtrim(&str); if (!pj_scan_is_eof(&scanner)) pj_scan_advance_n(&scanner, 1, PJ_TRUE); if (!str.slen) continue; if (cmd->sc_cnt >= PJ_CLI_MAX_SHORTCUTS) { PJ_THROW(PJ_CLI_ETOOMANYARGS); } /* Check whether the shortcuts are already used */ if (cmd_name_exists(cli, group, &str)) { PJ_THROW(PJ_CLI_EBADNAME); } pj_strassign(&sc[cmd->sc_cnt++], &str); } } PJ_CATCH_ANY { pj_scan_fini(&scanner); return (PJ_GET_EXCEPTION()); } PJ_END; } else if (!pj_stricmp2(&attr->name, "desc")) {