blob: 39c2b78f3baebdc63a68a76675046b878da7030f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 - 2013 Profactor GmbH, ACIN, nxtControl GmbH
* 2018 TU Wien/ACIN
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thomas Strasser, Ingomar Müller, Rene Smodic, Alois Zoitl, Gerhard Ebenhofer
* Ingo Hegny, Martin Melik Merkumians, Monika Wenger, Stanislav Meduna,
* Matthias Plasch
* - initial implementation and rework communication infrastructure
* Martin Melik Merkumians
* - fixes behavior for getToStringBufferSize
*******************************************************************************/
#ifndef _FORTE_STRING_H_
#define _FORTE_STRING_H_
#include "forte_any_string.h"
#include <string.h>
#include <stdlib.h>
/*!\ingroup COREDTS CIEC_STRING represents the string data type according to IEC 61131.
*/
class CIEC_STRING : public CIEC_ANY_STRING{
DECLARE_FIRMWARE_DATATYPE(STRING)
;
public:
CIEC_STRING(){
}
// We don't want this constructor to be explicit as it simplifies code generation for ST algorithms
// Maybe when we have better code generators we want to make this constructur explicit again and generate it
// cppcheck-suppress noExplicitConstructor
CIEC_STRING(const char* pa_pacValue){
(*this) = pa_pacValue;
}
virtual ~CIEC_STRING(){
}
CIEC_STRING &operator =(const char* const pa_pacValue){
CIEC_ANY_STRING::operator =(pa_pacValue);
return *this;
}
virtual EDataTypeID getDataTypeID() const{
return CIEC_ANY::e_STRING;
}
/*! \brief Converts string value to data type value
*
* This command implements a conversion function from IEC61131
* data type (string format) to a C++ conform type.
* This function is necessary for communication with a proper engineering system.
* \param pa_pacValue string buffer
* \return number of bytes taken used from the buffer
* -1 on on error
*/
virtual int fromString(const char *pa_pacValue);
/*! \brief Converts data type value to string
*
* This command implements a conversion function from C++ data type
* to IEC61131 conform data type (string format).
* This function is necessary for communication with a proper engineering system.
* \param paValue Pointer to char-array for the result
* \param paBufferSize Size of the buffer
* \return number of bytes used in the buffer without trailing 0x00
* -1 on error
*/
virtual int toString(char* paValue, size_t paBufferSize) const;
/*! \brief Converts a UTF-8 encoded string to a STRING (ISO 10646 Row 00 internally)
*
* This command implements a conversion function from a UTF-8
* encoded string (found e.g. in XML to the internal
* ISO 10646 Row 00 encoding.
* \param pa_pacValue Reference to the given UTF-8 encoded byte array
* \param pa_nLen Length to read (-1 for null-terminated)
* \param pa_bUnescape Handle $-escapes and delimiter characters at the beginning and end
* \return number of bytes used from srcString
* -1 on error
*/
#ifdef FORTE_UNICODE_SUPPORT
virtual int fromUTF8(const char *pa_pacValue, int pa_nLen, bool pa_bUnescape);
#endif
/*! \brief Converts the STRING to a UTF-8 representation
*
* This command implements a conversion function from a STRING
* to a UTF-8 encoding, usable e.g. for the serialization.
* \param pa_pacBuffer Reference to the output buffer. If 0, only the needed size will be computed.
* \param pa_nBufferSize Size of the provided buffer.
* \param pa_bEscape Produce $-escapes and delimiter characters at the beginning and end
* \return number of bytes used in the buffer
* -1 on error
*/
#ifdef FORTE_UNICODE_SUPPORT
virtual int toUTF8(char* paBuffer, size_t paBufferSize, bool paEscape) const;
#endif
/*! \brief Returns the amount of bytes needed to create the IEC 61131 literal string
*
* IEC 61131 literal strings needs to delimit all non Common_Char_Value literals and special
* symbols, like line-feed, into escaped symbol sequences. For single byte strings the special
* symbols are represented as dollar escaped strings followed by two hex digits. For double byte strings
* is is dollar followed by four hex digits, according to the IEC 61131 standard and its EBNF.
*
* \return Needed buffer size for literal string without type delarator e.g., STRING#
*/
virtual size_t getToStringBufferSize() const;
protected:
virtual void setValue(const CIEC_ANY &pa_roValue){
if(pa_roValue.getDataTypeID() == CIEC_ANY::e_STRING){
const CIEC_STRING &roSrc(static_cast<const CIEC_STRING &>(pa_roValue));
this->assign(roSrc.getValue(), roSrc.length());
}
}
private:
};
inline
bool operator ==(const CIEC_STRING &pa_roLeft, const CIEC_STRING &pa_roRight){
return (0 == strcmp(pa_roLeft.getValue(), pa_roRight.getValue()));
}
inline
bool operator !=(const CIEC_STRING &pa_roLeft, const CIEC_STRING &pa_roRight){
return !(pa_roLeft == pa_roRight);
}
#endif /*_FORTE_STRING_H_*/