blob: c2b975cb81b615ac0ba15869890dba9b9dac5dd6 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2000-2019 Ericsson Telecom AB //
// //
// All rights reserved. This program and the accompanying materials //
// are made available under the terms of the Eclipse Public License v2.0 //
// which accompanies this distribution, and is available at //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// Module: EPTF_CLL_Common_Functions
//
// Purpose:
// This module provides common functions for common for TITANSim load generators
//
// Module Parameters:
// -
//
// Module depends on:
// <EPTF_CLL_Common_Definitions>
//
// Current Owner:
// ENORPIN
//
// Last Review Date:
// 2007-xx-xx
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
module EPTF_CLL_Common_Functions {
//=========================================================================
// Import Part
//=========================================================================
import from EPTF_CLL_Common_Definitions all;
import from TCCConversion_Functions all;
//=========================================================================
// Functions
//========================================================================
public external function f_EPTF_Common_error(in charstring pl_message);
public external function f_EPTF_Common_warning(in charstring pl_message);
public external function f_EPTF_Common_user(in charstring pl_message);
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_initErrorMsgs
//
// Purpose:
// Initializes the ErrorMsgs database.
//
// Parameters:
// -
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
private external function f_EPTF_Common_initErrorMsgs();
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_init
//
// Purpose:
// Initializes the Common feature.
//
// Parameters:
// -
//
// Return Value:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_init() {
f_EPTF_Common_initErrorMsgs();
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_nofErrorMsgs
//
// Purpose:
// Returns the number of error messages generated by previous <f_EPTF_Common_error> function calls.
//
// Parameters:
// -
//
// Return Value:
// integer - the number of error messages
//
///////////////////////////////////////////////////////////
public external function f_EPTF_Common_nofErrorMsgs() return integer;
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_getErrorMsg
//
// Purpose:
// Returns an error message from the previous error messages.
//
// Parameters:
// pl_errorNum - *in integer* - the id of the error message (0 for the first message)
//
// Return Value:
// charstring - the error message, "" if not found
//
///////////////////////////////////////////////////////////
public external function f_EPTF_Common_getErrorMsg(in integer pl_errorNum := 0) return charstring;
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_checkExpectedError
//
// Purpose:
// Checks if the expectedError message pl_expectedError was the error message at pl_errorNum or not
//
// Parameters:
// pl_expectedError - *in charstring* - the expected error pattern
// pl_errorNum - *in integer* - the id of the error message (0 for the first message)
//
// Return Value:
// boolean - true if the expected error pattern matches with the given error
//
// Detailed Comments:
// -
///////////////////////////////////////////////////////////
public function f_EPTF_Common_checkExpectedError(in charstring pl_expectedError, in integer pl_errorNum := 0) return boolean {
if (not match(f_EPTF_Common_getErrorMsg(pl_errorNum), pattern pl_expectedError)) {
f_EPTF_Common_warning("Warning: "&%definitionId& ": Error message with id "&int2str(pl_errorNum)&" is different from the expected pattern: "&
log2str(match(f_EPTF_Common_getErrorMsg(pl_errorNum), pattern pl_expectedError)));
return false;
} else {
f_EPTF_Common_user(%definitionId& ": Error message with id "&int2str(pl_errorNum)&" matches with the expected pattern: "& pl_expectedError);
return true;
}
return true;
}
///////////////////////////////////////////////////////////
// Group: RangeHandling
//
// Purpose:
// Convinience functions to handle <EPTF_ParamRangeDescriptorList>
//
///////////////////////////////////////////////////////////
group RangeHandling {
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_resetParamRanges
//
// Purpose:
// Initializes the range iterators to the first elements
//
// Parameters:
// pl_rangeList - *inout* <EPTF_ParamRangeDescriptorList> - the reference of the rangeList
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_resetParamRanges(inout EPTF_ParamRangeDescriptorList pl_rangeList) {
for (var integer i:=0;i<sizeof(pl_rangeList);i:=i+1) {
pl_rangeList[i].iterator := pl_rangeList[i].baseOffset;
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_incParamRanges
//
// Purpose:
// Increases the least significant range iterator and handles
// carry if necessary
//
// Parameters:
// pl_rangeList - *inout* <EPTF_ParamRangeDescriptorList> - the reference of the rangeList
//
// Return Value:
// *boolean* - true, if the range iteration finished
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_incParamRanges(inout EPTF_ParamRangeDescriptorList pl_rangeList) return boolean {
var integer i;
for (i:=sizeof(pl_rangeList)-1;i>=0 and f_EPTF_Common_private_incParamRangeItem(pl_rangeList[i]);i:=i-1) {}
if (i<0) {return true}
return false;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_private_incParamRangeItem
//
// Purpose:
// Used by f_EPTF_Common_incParamRanges
//
// Parameters:
// pl_range - *inout* <EPTF_ParamRangeDescriptor> - the reference of the range
//
// Return Value:
// *boolean* - true, if the range iteration finished
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_private_incParamRangeItem(inout EPTF_ParamRangeDescriptor pl_range) return boolean {
pl_range.iterator := pl_range.iterator + 1;
if (pl_range.baseOffset + pl_range.count>pl_range.iterator) {return false}
pl_range.iterator := pl_range.baseOffset;
return true;
}
}//group RangeHandling
///////////////////////////////////////////////////////////
// Group: WeightedLists
//
// Purpose:
// Convinience functions to distribute given nr of items
// according weights
//
///////////////////////////////////////////////////////////
group WeightedLists {
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_fillWeightedBuckets
//
// Purpose:
// Increases the least significant range iterator and handles
// carry if necessary
//
// Parameters:
// pl_weightList - *in* <EPTF_FloatList> - the weights, the base of the distribution
// pl_nrOfElements - *ini* *integer* - the nr of items to distribute
// pl_result - *out* <EPTF_IntegerList> - the distribution result
//
// Return Value:
// *boolean* - true, if the algorithm succeded
//
// Errors:
// -
//
// Detailed Comments:
// The minimum nr of element is the number of 'buckets',
// i.e. the size of the pl_weightList. The elements of weightlist
// must be normalized (the sum of the weights must be equal to 1.0).
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_fillWeightedBuckets(in EPTF_FloatList pl_weightList, in integer pl_nrOfElements, out EPTF_IntegerList pl_result) return boolean
{
if (sizeof(pl_weightList)<1) {
f_EPTF_Common_user(log2str(%definitionId,": empty weightList, unable to split"));
return false;
}
if (sizeof(pl_weightList)>pl_nrOfElements) {
f_EPTF_Common_user(log2str(%definitionId,": not enough elements, unable to split"));
return false;
}
// Preparing for sorting...
var EPTF_IntegerList vl_sortedWeightsIdx := {};
for (var integer i:=0;i<sizeof(pl_weightList);i:=i+1) {
vl_sortedWeightsIdx[i] := i;
}
// Bouble-sorting the indexes to pl_weightList
var integer vl_tmpint;
for (var integer i:=sizeof(pl_weightList)-1;i>=0;i:=i-1) {
for (var integer j:=0;j<i;j:=j+1) {
if (pl_weightList[vl_sortedWeightsIdx[j]]>pl_weightList[vl_sortedWeightsIdx[j+1]]) {
vl_tmpint := vl_sortedWeightsIdx[j];
vl_sortedWeightsIdx[j] := vl_sortedWeightsIdx[j+1];
vl_sortedWeightsIdx[j+1] := vl_tmpint;
}
}
}
var integer vl_nrOfUsedElements := 0;
pl_result := {};
// Fill the buckets
for (var integer i:=0;i<sizeof(pl_weightList)-1;i:=i+1) {
pl_result[vl_sortedWeightsIdx[i]] := float2int(pl_weightList[vl_sortedWeightsIdx[i]] * int2float(pl_nrOfElements));
if (pl_result[vl_sortedWeightsIdx[i]]<1) {pl_result[vl_sortedWeightsIdx[i]] := 1}
vl_nrOfUsedElements := vl_nrOfUsedElements + pl_result[vl_sortedWeightsIdx[i]];
}
// Assign the remainder to the last item
pl_result[vl_sortedWeightsIdx[sizeof(pl_weightList)-1]] := pl_nrOfElements - vl_nrOfUsedElements;
return true;
}
} // group WeightedLists
group EscapeConversions{
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_encodeEscapeSequence
//
// Purpose:
// To encode the string not to contain Escape Sequences.
//
// Parameters:
// pl_charstring - *in* *charstring* - string that contains " or \ that cannot be sent over network
//
// Return Value:
// *charstring* - result string that can be sent over network
//
// Errors:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_encodeEscapeSequence(charstring pl_charstring) return charstring{
var charstring vl_out := f_replaceEveryOccurenceOfSubstring( pl_charstring, "\"", "\\\"");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "/", "//");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\n", "\\n");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\r", "\\r");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\t", "\\t");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\f", "\\f");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\b", "\\b");
return vl_out;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_decodeEscapeSequence
//
// Purpose:
// To decode the string to contain Escape Sequences.
//
// Parameters:
// pl_charstring - *in* *charstring* - string that does not contain " or \ that cannot be sent over network
//
// Return Value:
// *charstring* - result string contains escape sequences.
//
// Errors:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_decodeEscapeSequence(charstring pl_charstring) return charstring{
var charstring vl_out := f_replaceEveryOccurenceOfSubstring( pl_charstring, "\\n", "\n");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\\r", "\r");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\\t", "\t");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\\f", "\f");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "\\b", "\b");
vl_out := f_replaceEveryOccurenceOfSubstring( vl_out, "//", "/");
return f_replaceEveryOccurenceOfSubstring( vl_out, "\\\"", "\"");
}
} // group EscapeConversions
///////////////////////////////////////////////////////////
// Group: StringFunctions
//
// Purpose:
// Some string manipulator function
//
///////////////////////////////////////////////////////////
group StringFunctions {
///////////////////////////////////////////////////////////
// Function: f_EPTF_Common_splitString
//
// Purpose:
// split the string according to the delimiter
//
// Parameters:
// pl_string - *in* *charstring* - string to split
// pl_delimiter - *in* *charstring* - delimiter
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////
public function f_EPTF_Common_splitString(
charstring pl_string,
charstring pl_delimiter) return EPTF_CharstringList
{
var EPTF_CharstringList vl_wordList := {};
var boolean vl_startNewWord := true;
for(var integer vl_i := 0; vl_i < lengthof(pl_string); vl_i := vl_i+1)
{
if(pl_string[vl_i] == pl_delimiter)
{
vl_startNewWord := true;
}
else
{
if(vl_startNewWord)
{
vl_wordList[sizeof(vl_wordList)] := pl_string[vl_i];
vl_startNewWord := false;
}
else
{
vl_wordList[sizeof(vl_wordList)-1] := vl_wordList[sizeof(vl_wordList)-1] & pl_string[vl_i];
}
}
}
return vl_wordList;
}
} // group StringFunctions
} // end of module