This class can map strings(commands) and functions receiving no arguments returning an int value.

Dependents:   Interference_Simple StrCommandHandler_Demo

Revision:
0:024213917a9f
Child:
2:a4873d38a32c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/StrCommandHandler.cpp	Thu Oct 31 02:48:35 2019 +0000
@@ -0,0 +1,96 @@
+#include "StrCommandHandler.h"
+
+StrCommandHandler::StrCommandHandler (
+    int const arg_num_ofcommands
+):
+    m_num_ofcommands(arg_num_ofcommands)
+{
+    m_command_name = new char[m_num_ofcommands][16];
+    m_function = new (int (* [m_num_ofcommands])(void));
+}
+
+int StrCommandHandler::map(
+    const char * const   arg_command,
+    int (*arg_pfunc)(void)
+)
+{
+    static int itr_push = 0;
+
+
+    //  Reallocation
+    if (itr_push == m_num_ofcommands) {
+        m_num_ofcommands += 5;
+        char (*tmp_cm)[16]  = new char[m_num_ofcommands][16];
+        int (**tmp_fu)(void)= new (int (* [m_num_ofcommands])(void));
+
+        memcpy(tmp_cm, m_command_name,  sizeof(char) * (m_num_ofcommands - 5) * 16);
+        memcpy(tmp_fu, m_function,      sizeof(int (*)()) * (m_num_ofcommands - 5));
+
+        delete[] m_command_name;
+        delete[] m_function;
+
+        m_command_name  = tmp_cm;
+        m_function      = tmp_fu;
+    }
+
+    //  Register the command name
+    for (int i = 0; i < 16; i++) {
+        m_command_name[itr_push][i] = arg_command[i];
+        if (arg_command[i] == '\0') break;
+    }
+    m_command_name[itr_push][15] = '\0';
+
+    //  Register the pointer to function
+    m_function[itr_push] = arg_pfunc;
+
+    itr_push++;
+    return 0;
+}
+
+
+int StrCommandHandler::exe(
+    const char* const   arg_command
+)
+{
+    int key = 0;
+
+    //  Exception: NULL pointer
+    if ( arg_command == NULL) return 0xFFFFFFFF;
+
+    //  Exception: Null character
+    if ( arg_command[0] == '\0') return 0xFFFFFFFE;
+
+    //  Exception: Over length of Command's name
+    for ( int i = 1; i < 16; i++ ) {
+        if (arg_command[i] == '\0') break;
+        if (i == 15) return 0xFFFFFFFD;
+    }
+
+    //  Search the command list
+    while (
+        key < m_num_ofcommands
+        &&  strcmp(m_command_name[key], arg_command) != 0
+    ) {
+        key++;
+    }
+
+    //  Exception: Not registered Command
+    if ( key == m_num_ofcommands ) return 0xFFFFFFFC;
+
+    return (*m_function[key])();;
+}
+
+void StrCommandHandler::list()
+{
+    puts("\n\n---------------");
+    puts("---------------\n");
+    puts("list of command\n");
+    for(int i = 0; i < m_num_ofcommands; i++) {
+        if(m_function[i] != NULL) {
+            printf("%02d: %16s", i, m_command_name[i]);
+            //printf(" / result: %d", (*m_function[i])());
+            puts("\n");
+        }
+    }
+    puts("---------------\n");
+}
\ No newline at end of file