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");
}