#include "cmd_parser.h" #include void cmd_parser_init(cmd_parser_t *parser) { parser->count = 0; } int cmd_parser_register(cmd_parser_t *parser, const char *name, cmd_handler_t handler) { size_t i; if (parser->count >= CMD_PARSER_MAX_CMDS) return -1; i = strlen(name); if (i >= CMD_PARSER_NAME_LEN) i = CMD_PARSER_NAME_LEN - 1; memcpy(parser->entries[parser->count].name, name, i); parser->entries[parser->count].name[i] = '\0'; parser->entries[parser->count].handler = handler; parser->count++; return 0; } int cmd_parser_dispatch(cmd_parser_t *parser, char *buf, void *ctx) { char *argv[CMD_PARSER_MAX_ARGS]; int argc = 0; int i; char *p = buf; while (*p) { while (*p == ' ') p++; if (*p == '\0') break; argv[argc++] = p; if (argc >= CMD_PARSER_MAX_ARGS) break; while (*p && *p != ' ') p++; if (*p) *p++ = '\0'; } if (argc == 0) return -1; for (i = 0; i < parser->count; i++) { if (strcmp(argv[0], parser->entries[i].name) == 0) { return parser->entries[i].handler(ctx, argc, argv); } } return -1; }