This class can map strings(commands) and functions receiving no arguments returning an int value.
Dependents: Interference_Simple StrCommandHandler_Demo
StrCommandHandler.cpp
- Committer:
- aktk
- Date:
- 2020-08-10
- Revision:
- 4:59a5e39e3e91
- Parent:
- 3:049a5f083f32
File content as of revision 4:59a5e39e3e91:
#include "StrCommandHandler.h"
char const * const StrCommandHandler::ARROW_UP = "\x1b\x5b\x41";
char const * const StrCommandHandler::ARROW_DOWN = "\x1b\x5b\x42";
char const * const StrCommandHandler::ARROW_RIGHT= "\x1b\x5b\x43";
char const * const StrCommandHandler::ARROW_LEFT = "\x1b\x5b\x44";
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 (void * (* [m_num_ofcommands])(const char * const));
}
void StrCommandHandler::map(
const char * const arg_command,
void * (*arg_pfunc)(const char * const)
)
{
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];
void * (**tmp_fu)(const char * const)= new (void * (* [m_num_ofcommands])(const char * const));
memcpy(tmp_cm, m_command_name, sizeof(char) * (m_num_ofcommands - 5) * 16);
memcpy(tmp_fu, m_function, sizeof(void * (*)(const char * const)) * (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++;
}
void * StrCommandHandler::exe(
const char* const arg_command
)
{
int key = 0;
// Exception: NULL pointer
if ( arg_command == NULL) return &(m_rescode = 0xFFFFFFFF);
// Exception: Null character
if ( arg_command[0] == '\0') return &(m_rescode = 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 &(m_rescode = 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 &(m_rescode = 0xFFFFFFFC);
return (*m_function[key])(arg_command);;
}
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");
}