///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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;
  }
}

///////////////////////////////////////////////////////////
//  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
