From 4e0783a3598fb5123ae71cd43282f6e33c83efc3 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 23 Sep 2025 17:12:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CliRedirectTable.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ CliRedirectTable.h | 40 ++++++++++++++++++++++++++++++++++++ modular.json | 23 +++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 CliRedirectTable.c create mode 100644 CliRedirectTable.h create mode 100644 modular.json diff --git a/CliRedirectTable.c b/CliRedirectTable.c new file mode 100644 index 0000000..9714b3b --- /dev/null +++ b/CliRedirectTable.c @@ -0,0 +1,51 @@ +// +// 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, ÷r, 1); + } + } + return -1; +} + diff --git a/CliRedirectTable.h b/CliRedirectTable.h new file mode 100644 index 0000000..ef41b53 --- /dev/null +++ b/CliRedirectTable.h @@ -0,0 +1,40 @@ +// +// Created by zemon on 11.11.22. +// + +#ifndef UVEOS_ON_NATION_CLIREDIRECTTABLE_H +#define UVEOS_ON_NATION_CLIREDIRECTTABLE_H + +#include +#include +#include "CliCmd.h" +#include "BaseTypes.h" + +typedef int32_t (*cliCall)(void *env, tCliCmd *cli); + +typedef struct { + tStringStatic cmd; + cliCall method; + void *env; +} tCliRedirectItem; + +typedef struct { + tCliRedirectItem *items; + uint16_t count; + uint16_t itemsLimit; +} tCliRedirectTable; + +void CliRedirectionTable_Init(tCliRedirectTable *baseTable, tCliRedirectItem *mem, uint16_t itemsLimit); + +#define CliRedirectionTable_InitStatic(TAB, MEM) CliRedirectionTable_Init(TAB,MEM,sizeof(MEM)/sizeof(tCliRedirectItem)) + +bool CliRedirectionTable_RecAdd(tCliRedirectTable *baseTable, char *cmdStatic, uint8_t cmdLen, cliCall mtd, void *env); + +#define CliRedirectionTable_RecAddStatic(TAB, CMD, CALL, ENV) CliRedirectionTable_RecAdd(TAB,CMD,sizeof (CMD)-1,CALL,ENV) + +int32_t CliRedirectionTable_ProcessCmd(tCliRedirectTable *env, tCliCmd *cmd); + +int32_t CliRedirectionTable_ListCmd(tCliRedirectTable *env, tCliCmd *cmd, char divider); + +#endif //UVEOS_ON_NATION_CLIREDIRECTTABLE_H + diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..a6499da --- /dev/null +++ b/modular.json @@ -0,0 +1,23 @@ +{ + "dep": [ + { + "type": "git", + "provider": "HVAC_DEV", + "repo": "BaseTypes" + }, + { + "type": "git", + "provider": "HVAC_DEV", + "repo": "CliCmd" + } + ], + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} +