OpenTTCN/Developer corner/Implementing external functions/Skeletons/C/Utilities.cxx

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


Utilities.cxx


Back to main article >>

#include "Utilities.h"

#include <isl/TTCN3.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <assert.h>
#include <ctype.h>
#include <malloc.h>

#ifndef _WIN32
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
typedef int socklen_t;
#endif

#define MAX_BUFFER_SIZE 8192

long tciValueToLong(TciValue value)
{
    String valNumberAbs;
    Boolean valNumberSign;

    char* valNumber;
    long val;

    valNumberAbs = tciGetIntAbs(value);
    valNumberSign = tciGetIntSign(value);

    valNumber = (char *) malloc(strlen(valNumberAbs) + 2);
    valNumber[0] = valNumberSign ? '+' : '-';
    strcpy(valNumber + 1, valNumberAbs);

    val = atol(valNumber);
    free(valNumber);

    return val;
}

void assignLongToTciValue(TciValue dst, long value)
{
    char valAbsValue[MAX_BUFFER_SIZE];
    Boolean valSignValue;

    valSignValue = (value >= 0) ? 1 : 0;
    if (value < 0) value = -value;

    sprintf(valAbsValue, "%li", value);

    tciSetIntAbs(dst, valAbsValue);
    tciSetIntSign(dst, valSignValue);
}

TciValue longToTciValue(long value)
{
    TciValue result = tciNewInstance(tciGetIntegerType());
    assignLongToTciValue(result, value);
    return result;
}

void tciValueToCharstring(char** dst_str, long* dst_str_len, TciValue value)
{
    long len = 0;
    TciCharStringValue cStringValue = tciGetCStringValue(value);
    len = (long) cStringValue.length;

    *dst_str = (char *) malloc(len + 1);
    *dst_str_len = len;

    memcpy(*dst_str, cStringValue.string + 1, len);
    (*dst_str)[len] = 0;
}

void assignCharstringToTciValue(TciValue dst, const char* value)
{
    TciCharStringValue cStringValue;
    int len = (int) strlen(value);

    char* rawValue = (char *) malloc(len + 3);
    sprintf(rawValue, "\"%s\"", value);

    cStringValue.length = len;
    cStringValue.string = rawValue;

    tciSetCStringValue(dst, cStringValue);

    free(rawValue);
}

TciValue charstringToTciValue(const char* value)
{
    TciValue result = tciNewInstance(tciGetTciCharstringType());
    assignCharstringToTciValue(result, value);
    return result;
}

void assignSizedCharstringToTciValue(TciValue dst, const char* value, long len)
{
    TciCharStringValue cStringValue;

    char* rawValue = (char *) malloc(len + 3);

    rawValue[0] = '"';
    memcpy(rawValue + 1, value, len);
    rawValue[len + 1] = '"';
    rawValue[len + 2] = 0;

    cStringValue.length = len;
    cStringValue.string = rawValue;

    tciSetCStringValue(dst, cStringValue);

    free(rawValue);
}

TciValue sizedCharstringToTciValue(const char* value, long len)
{
    TciValue result = tciNewInstance(tciGetTciCharstringType());
    assignSizedCharstringToTciValue(result, value, len);
    return result;
}
Views
Personal tools