CliCmd_RedirectTable/CliRedirectTable.c

52 lines
1.5 KiB
C

//
// Created by zemon on 15.11.22.
//
#include "CliRedirectTable.h"
bool CliRedirectionTable_RecAdd(tCliRedirectTable *baseTable, char *cmdStatic, uint8_t cmdLen, cliCall mtd, void *env) {
if (baseTable->count >= baseTable->itemsLimit) {
return false;
}
baseTable->items[baseTable->count].cmd.data = cmdStatic;
baseTable->items[baseTable->count].cmd.length = cmdLen;
baseTable->items[baseTable->count].method = mtd;
baseTable->items[baseTable->count].env = env;
++baseTable->count;
return true;
}
void CliRedirectionTable_Init(tCliRedirectTable *baseTable, tCliRedirectItem *mem, uint16_t itemsLimit) {
baseTable->count = 0;
baseTable->itemsLimit = itemsLimit;
baseTable->items = mem;
}
int32_t CliRedirectionTable_ProcessCmd(tCliRedirectTable *env, tCliCmd *cmd) {
for (uint16_t id = 0; id < env->count; ++id) {
tCliRedirectItem *item = env->items + id;
char *cmdName = CliCmd_RxStartsWith(cmd, item->cmd.data, item->cmd.length);
if (cmdName) {
CliCmd_RxSkip(cmd, item->cmd.length);
CliCmd_RxSkipSpace(cmd);
return item->method(item->env, cmd);
}
}
return -1;
}
int32_t CliRedirectionTable_ListCmd(tCliRedirectTable *env, tCliCmd *cmd, char divider) {
for (uint16_t id = 0; id < env->count; ++id) {
tCliRedirectItem *item = env->items + id;
CliCmd_Print(cmd, item->cmd.data, item->cmd.length);
if (divider) {
CliCmd_Print(cmd, &divider, 1);
}
}
return -1;
}