/* * pocli_process -- process input commands */ int pocli_process(struct pocli *pcli) { while (1) { pocli_prompt(pcli); if (!fgets(pcli->inbuf, (int)pcli->inbuf_len, pcli->in)) return 0; char *nl = strchr(pcli->inbuf, '\n'); if (!nl) return 1; *nl = '\0'; char *hash = strchr(pcli->inbuf, '#'); if (hash) { if (pcli->opts.enable_comments) *hash = '\0'; else return 1; } if (pcli->inbuf[0] == 0 || pcli->inbuf[0] == '\n') { if (pcli->opts.enable_empty_cmds) continue; else return 1; } if (pcli->opts.echo_mode) pocli_printf(&pcli->ctx, "%s\n", pcli->inbuf); char *argstr = strchr(pcli->inbuf, ' '); if (argstr) { *argstr = '\0'; argstr++; } char *cmds = pcli->inbuf; const struct pocli_cmd *cmd = pocli_get_cmd(pcli, cmds); if (!cmd) { pocli_err(&pcli->ctx, 0, "unknown command -- '%s'\n", cmds); if (pcli->opts.exit_on_error) return 1; else continue; } if (!argstr) argstr = cmds + strlen(pcli->inbuf) + 1; struct pocli_args *args = pocli_args_alloc(pcli->inbuf, argstr, POCLI_CMD_DELIM); if (!args) return 1; enum pocli_ret ret = cmd->func(&pcli->ctx, args); free(args); if (ret != POCLI_RET_OK) return ret; } }
/* * pocli_help -- help command */ static enum pocli_ret pocli_help(struct pocli_ctx *ctx, struct pocli_args *args) { if (!ctx->pocli->opts.enable_help) return POCLI_ERR_CMD; if (args->argc != 2 && args->argc != 1) return POCLI_ERR_ARGS; if (args->argc == 1) { for (size_t i = 0; i < ctx->pocli->ncmds; i++) pocli_print_cmd(ctx, &ctx->pocli->cmds[i]); } else { const struct pocli_cmd *cmd = pocli_get_cmd(ctx->pocli, args->argv[1]); if (!cmd) return POCLI_ERR_PARS; pocli_print_cmd_usage(ctx, cmd); } return POCLI_RET_OK; }