Akifumi Takahashi / StrCommandHandler

Dependents:   Interference_Simple StrCommandHandler_Demo

Committer:
aktk
Date:
Thu Nov 14 00:40:03 2019 +0000
Revision:
2:a4873d38a32c
Parent:
0:024213917a9f
Child:
3:049a5f083f32
modified the return type of exe() and callbacks to (void *)

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 2:a4873d38a32c 9 m_function = new (void * (* [m_num_ofcommands])(void));
aktk 0:024213917a9f 10 }
aktk 0:024213917a9f 11
aktk 2:a4873d38a32c 12 void StrCommandHandler::map(
aktk 0:024213917a9f 13 const char * const arg_command,
aktk 2:a4873d38a32c 14 void * (*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 2:a4873d38a32c 24 void * (**tmp_fu)(void)= new (void * (* [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 2:a4873d38a32c 27 memcpy(tmp_fu, m_function, sizeof(void * (*)()) * (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 }
aktk 0:024213917a9f 48
aktk 0:024213917a9f 49
aktk 2:a4873d38a32c 50 void * StrCommandHandler::exe(
aktk 0:024213917a9f 51 const char* const arg_command
aktk 0:024213917a9f 52 )
aktk 0:024213917a9f 53 {
aktk 0:024213917a9f 54 int key = 0;
aktk 0:024213917a9f 55
aktk 0:024213917a9f 56 // Exception: NULL pointer
aktk 2:a4873d38a32c 57 if ( arg_command == NULL) return &(m_rescode = 0xFFFFFFFF);
aktk 0:024213917a9f 58
aktk 0:024213917a9f 59 // Exception: Null character
aktk 2:a4873d38a32c 60 if ( arg_command[0] == '\0') return &(m_rescode = 0xFFFFFFFE);
aktk 0:024213917a9f 61
aktk 0:024213917a9f 62 // Exception: Over length of Command's name
aktk 0:024213917a9f 63 for ( int i = 1; i < 16; i++ ) {
aktk 0:024213917a9f 64 if (arg_command[i] == '\0') break;
aktk 2:a4873d38a32c 65 if (i == 15) return &(m_rescode = 0xFFFFFFFD);
aktk 0:024213917a9f 66 }
aktk 0:024213917a9f 67
aktk 0:024213917a9f 68 // Search the command list
aktk 0:024213917a9f 69 while (
aktk 0:024213917a9f 70 key < m_num_ofcommands
aktk 0:024213917a9f 71 && strcmp(m_command_name[key], arg_command) != 0
aktk 0:024213917a9f 72 ) {
aktk 0:024213917a9f 73 key++;
aktk 0:024213917a9f 74 }
aktk 0:024213917a9f 75
aktk 0:024213917a9f 76 // Exception: Not registered Command
aktk 2:a4873d38a32c 77 if ( key == m_num_ofcommands ) return &(m_rescode = 0xFFFFFFFC);
aktk 0:024213917a9f 78
aktk 0:024213917a9f 79 return (*m_function[key])();;
aktk 0:024213917a9f 80 }
aktk 0:024213917a9f 81
aktk 0:024213917a9f 82 void StrCommandHandler::list()
aktk 0:024213917a9f 83 {
aktk 0:024213917a9f 84 puts("\n\n---------------");
aktk 0:024213917a9f 85 puts("---------------\n");
aktk 0:024213917a9f 86 puts("list of command\n");
aktk 0:024213917a9f 87 for(int i = 0; i < m_num_ofcommands; i++) {
aktk 0:024213917a9f 88 if(m_function[i] != NULL) {
aktk 0:024213917a9f 89 printf("%02d: %16s", i, m_command_name[i]);
aktk 0:024213917a9f 90 //printf(" / result: %d", (*m_function[i])());
aktk 0:024213917a9f 91 puts("\n");
aktk 0:024213917a9f 92 }
aktk 0:024213917a9f 93 }
aktk 0:024213917a9f 94 puts("---------------\n");
aktk 0:024213917a9f 95 }