OpenTTCN/Developer corner/Implementing external functions/Modified/CPP/PA impl.cpp

From OpenTTCN

Jump to: navigation, search

  OpenTTCN DocZone

  Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support


PA_impl.cpp


Back to main article >>

#include "PA_impl.h"

#include <StartHere.h>

using OpenTTCN::SDK::StartHere;

#include <iostream>

PA_impl::ExtFuncMapType PA_impl :: _extFuncMap;

bool PA_impl :: _extFuncMapInitialized = false;

/***************************************************************************
 * Initialization of TRI interface (PA, user-provided part).
 */

PA_impl :: PA_impl()
{
    if (!_extFuncMapInitialized)
    {
        _extFuncMap["ef_calc_sum"] = &PA_impl::ef_calc_sum;
        _extFuncMap["ef_calc_sub"] = &PA_impl::ef_calc_sub;
        _extFuncMap["ef_calc_mul"] = &PA_impl::ef_calc_mul;
        _extFuncMap["ef_calc_div"] = &PA_impl::ef_calc_div;

        _extFuncMapInitialized = true;
    }
}

PA_impl :: ~PA_impl()
{
}

/***************************************************************************
 * Implementation of TRI interface (PA, user-provided part).
 */

TriStatus PA_impl :: triPAReset()
{
    return TRI_OK;
}

TriStatus PA_impl :: triStartTimer(
    const TriTimerId *timerId,
    const TriTimerDuration *timerDuration)
{
    return TRI_ERROR;
}

TriStatus PA_impl :: triStopTimer(
    const TriTimerId *timerId)
{
    return TRI_ERROR;
}

TriStatus PA_impl :: triReadTimer(
    const TriTimerId *timerId,
    TriTimerDuration *elapsedTime)
{
    return TRI_ERROR;
}

TriStatus PA_impl :: triTimerRunning(
    const TriTimerId *timerId,
    Tboolean &running)
{
    return TRI_ERROR;
}

TriStatus PA_impl :: triExternalFunction(
    const TriFunctionId *functionId,
    TriParameterList *parameterList,
    TriParameter *returnValue)
{
    std::string funcId = functionId->getObjectName();

    std::cout << "**************************************************************************" << std::endl;
    std::cout << "*** DEBUG: triExternalFunction() callback called. Function: " << funcId << std::endl;

    ExtFuncMapType::iterator iter = _extFuncMap.find(funcId);

    if (iter != _extFuncMap.end())
    {
        return (*(iter->second))(functionId, parameterList, returnValue);
    }

    std::string errMsg = "Unrecognized external function " + funcId + " called.";
    StartHere::reportError(errMsg);

    return TRI_ERROR;
}

/***************************************************************************
 * External function implementation helpers.
 */

static long triParameterToLong(TriParameter* src)
{
    return *((const long *) src->getEncodedParameter());
}

static void assignLongToTriParameter(TriParameter* dst, long src)
{
    int len = sizeof(long);

    unsigned char* dst_par_data = (unsigned char *) malloc(len);
    memcpy(dst_par_data, &src, len);
    long dst_par_bits = len << 3;

    dst->setEncodedParameter(dst_par_data, dst_par_bits);

    free(dst_par_data);
}

/***************************************************************************
 * External function implementations.
 */

TriStatus PA_impl :: ef_calc_sum(
    const TriFunctionId *functionId,
    TriParameterList *parameterList,
    TriParameter *returnValue)
{
    TriParameterList* pars = parameterList;

    assignLongToTriParameter(returnValue,
        triParameterToLong(&pars->get(0)) + triParameterToLong(&pars->get(1)));

    return TRI_OK;
}

TriStatus PA_impl :: ef_calc_sub(
    const TriFunctionId *functionId,
    TriParameterList *parameterList,
    TriParameter *returnValue)
{
    TriParameterList* pars = parameterList;

    assignLongToTriParameter(returnValue,
        triParameterToLong(&pars->get(0)) - triParameterToLong(&pars->get(1)));

    return TRI_OK;
}

TriStatus PA_impl :: ef_calc_mul(
    const TriFunctionId *functionId,
    TriParameterList *parameterList,
    TriParameter *returnValue)
{
    TriParameterList* pars = parameterList;

    assignLongToTriParameter(returnValue,
        triParameterToLong(&pars->get(0)) * triParameterToLong(&pars->get(1)));

    return TRI_OK;
}

TriStatus PA_impl :: ef_calc_div(
    const TriFunctionId *functionId,
    TriParameterList *parameterList,
    TriParameter *returnValue)
{
    TriParameterList* pars = parameterList;

    assignLongToTriParameter(returnValue,
        triParameterToLong(&pars->get(0)) / triParameterToLong(&pars->get(1)));

    return TRI_OK;
}
Views
Personal tools