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

Dependents:   Interference_Simple StrCommandHandler_Demo

Committer:
aktk
Date:
Thu Oct 31 02:48:35 2019 +0000
Revision:
0:024213917a9f
Child:
2:a4873d38a32c
first publish;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:024213917a9f 1 #include "StrCommandHandler.h"
aktk 0:024213917a9f 2
aktk 0:024213917a9f 3 StrCommandHandler::StrCommandHandler (
aktk 0:024213917a9f 4 int const arg_num_ofcommands
aktk 0:024213917a9f 5 ):
aktk 0:024213917a9f 6 m_num_ofcommands(arg_num_ofcommands)
aktk 0:024213917a9f 7 {
aktk 0:024213917a9f 8 m_command_name = new char[m_num_ofcommands][16];
aktk 0:024213917a9f 9 m_function = new (int (* [m_num_ofcommands])(void));
aktk 0:024213917a9f 10 }
aktk 0:024213917a9f 11
aktk 0:024213917a9f 12 int StrCommandHandler::map(
aktk 0:024213917a9f 13 const char * const arg_command,
aktk 0:024213917a9f 14 int (*arg_pfunc)(void)
aktk 0:024213917a9f 15 )
aktk 0:024213917a9f 16 {
aktk 0:024213917a9f 17 static int itr_push = 0;
aktk 0:024213917a9f 18
aktk 0:024213917a9f 19
aktk 0:024213917a9f 20 // Reallocation
aktk 0:024213917a9f 21 if (itr_push == m_num_ofcommands) {
aktk 0:024213917a9f 22 m_num_ofcommands += 5;
aktk 0:024213917a9f 23 char (*tmp_cm)[16] = new char[m_num_ofcommands][16];
aktk 0:024213917a9f 24 int (**tmp_fu)(void)= new (int (* [m_num_ofcommands])(void));
aktk 0:024213917a9f 25
aktk 0:024213917a9f 26 memcpy(tmp_cm, m_command_name, sizeof(char) * (m_num_ofcommands - 5) * 16);
aktk 0:024213917a9f 27 memcpy(tmp_fu, m_function, sizeof(int (*)()) * (m_num_ofcommands - 5));
aktk 0:024213917a9f 28
aktk 0:024213917a9f 29 delete[] m_command_name;
aktk 0:024213917a9f 30 delete[] m_function;
aktk 0:024213917a9f 31
aktk 0:024213917a9f 32 m_command_name = tmp_cm;
aktk 0:024213917a9f 33 m_function = tmp_fu;
aktk 0:024213917a9f 34 }
aktk 0:024213917a9f 35
aktk 0:024213917a9f 36 // Register the command name
aktk 0:024213917a9f 37 for (int i = 0; i < 16; i++) {
aktk 0:024213917a9f 38 m_command_name[itr_push][i] = arg_command[i];
aktk 0:024213917a9f 39 if (arg_command[i] == '\0') break;
aktk 0:024213917a9f 40 }
aktk 0:024213917a9f 41 m_command_name[itr_push][15] = '\0';
aktk 0:024213917a9f 42
aktk 0:024213917a9f 43 // Register the pointer to function
aktk 0:024213917a9f 44 m_function[itr_push] = arg_pfunc;
aktk 0:024213917a9f 45
aktk 0:024213917a9f 46 itr_push++;
aktk 0:024213917a9f 47 return 0;
aktk 0:024213917a9f 48 }
aktk 0:024213917a9f 49
aktk 0:024213917a9f 50
aktk 0:024213917a9f 51 int StrCommandHandler::exe(
aktk 0:024213917a9f 52 const char* const arg_command
aktk 0:024213917a9f 53 )
aktk 0:024213917a9f 54 {
aktk 0:024213917a9f 55 int key = 0;
aktk 0:024213917a9f 56
aktk 0:024213917a9f 57 // Exception: NULL pointer
aktk 0:024213917a9f 58 if ( arg_command == NULL) return 0xFFFFFFFF;
aktk 0:024213917a9f 59
aktk 0:024213917a9f 60 // Exception: Null character
aktk 0:024213917a9f 61 if ( arg_command[0] == '\0') return 0xFFFFFFFE;
aktk 0:024213917a9f 62
aktk 0:024213917a9f 63 // Exception: Over length of Command's name
aktk 0:024213917a9f 64 for ( int i = 1; i < 16; i++ ) {
aktk 0:024213917a9f 65 if (arg_command[i] == '\0') break;
aktk 0:024213917a9f 66 if (i == 15) return 0xFFFFFFFD;
aktk 0:024213917a9f 67 }
aktk 0:024213917a9f 68
aktk 0:024213917a9f 69 // Search the command list
aktk 0:024213917a9f 70 while (
aktk 0:024213917a9f 71 key < m_num_ofcommands
aktk 0:024213917a9f 72 && strcmp(m_command_name[key], arg_command) != 0
aktk 0:024213917a9f 73 ) {
aktk 0:024213917a9f 74 key++;
aktk 0:024213917a9f 75 }
aktk 0:024213917a9f 76
aktk 0:024213917a9f 77 // Exception: Not registered Command
aktk 0:024213917a9f 78 if ( key == m_num_ofcommands ) return 0xFFFFFFFC;
aktk 0:024213917a9f 79
aktk 0:024213917a9f 80 return (*m_function[key])();;
aktk 0:024213917a9f 81 }
aktk 0:024213917a9f 82
aktk 0:024213917a9f 83 void StrCommandHandler::list()
aktk 0:024213917a9f 84 {
aktk 0:024213917a9f 85 puts("\n\n---------------");
aktk 0:024213917a9f 86 puts("---------------\n");
aktk 0:024213917a9f 87 puts("list of command\n");
aktk 0:024213917a9f 88 for(int i = 0; i < m_num_ofcommands; i++) {
aktk 0:024213917a9f 89 if(m_function[i] != NULL) {
aktk 0:024213917a9f 90 printf("%02d: %16s", i, m_command_name[i]);
aktk 0:024213917a9f 91 //printf(" / result: %d", (*m_function[i])());
aktk 0:024213917a9f 92 puts("\n");
aktk 0:024213917a9f 93 }
aktk 0:024213917a9f 94 }
aktk 0:024213917a9f 95 puts("---------------\n");
aktk 0:024213917a9f 96 }