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

Dependents:   Interference_Simple StrCommandHandler_Demo

Committer:
aktk
Date:
Mon Aug 10 10:35:29 2020 +0000
Revision:
4:59a5e39e3e91
Parent:
3:049a5f083f32
Modify the callbacks which are to be received and registered to those which receive the command str received as an argument.;

Who changed what in which revision?

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