OpenTTCN/Developer corner/Implementing external functions/Modified/CPP/PA impl.cpp
From OpenTTCN
Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support |
PA_impl.cpp
#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;
}
