diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md index 5133f7d8d..12ea0ba23 100644 --- a/documentation/RELEASE_NOTES.md +++ b/documentation/RELEASE_NOTES.md @@ -17,6 +17,19 @@ should also be read to understand what has changed since earlier releases. +### Make `epicsInt8` signed on all architectures + +The `epicsInt8` and thus `DBF_CHAR` types have always been unsigned on +architectures where `char` is unsigned, for example on many PowerPC CPU +architectures. This was counter-intuitive, and resulted in IOC behavior +differing between architectures when converting `DBF_CHAR` values into a +signed integer or floating point type. + +**WARNING**: This fix may change behavior of existing databases on target +architectures with unsigned `char` (mainly PowerPC) when using input links to +read from `CHAR` arrays. Architectures with signed `char` (usually x86) should +be unaffected, although some compilers might generate new warnings. + ### Allow hexadecimal and octal numbers in hardware links [GH:213](https://github.com/epics-base/epics-base/pull/213) diff --git a/modules/ca/src/client/comBuf.h b/modules/ca/src/client/comBuf.h index 6a4899414..3d5f58c45 100644 --- a/modules/ca/src/client/comBuf.h +++ b/modules/ca/src/client/comBuf.h @@ -88,6 +88,7 @@ public: bool push ( const T & value ); template < class T > unsigned push ( const T * pValue, unsigned nElem ); + unsigned push ( const char * pValue, unsigned nElem ); unsigned push ( const epicsInt8 * pValue, unsigned nElem ); unsigned push ( const epicsUInt8 * pValue, unsigned nElem ); unsigned push ( const epicsOldString * pValue, unsigned nElem ); @@ -208,6 +209,11 @@ inline unsigned comBuf :: push ( const epicsUInt8 *pValue, unsigned nElem ) return copyInBytes ( pValue, nElem ); } +inline unsigned comBuf :: push ( const char *pValue, unsigned nElem ) +{ + return copyInBytes ( pValue, nElem ); +} + inline unsigned comBuf :: push ( const epicsOldString * pValue, unsigned nElem ) { unsigned index = this->nextWriteIndex; diff --git a/modules/ca/src/client/comQueRecv.cpp b/modules/ca/src/client/comQueRecv.cpp index 60e142a35..d7d07361b 100644 --- a/modules/ca/src/client/comQueRecv.cpp +++ b/modules/ca/src/client/comQueRecv.cpp @@ -46,7 +46,7 @@ void comQueRecv::clear () this->nBytesPending = 0u; } -unsigned comQueRecv::copyOutBytes ( epicsInt8 *pBuf, unsigned nBytes ) +unsigned comQueRecv::copyOutBytes ( char *pBuf, unsigned nBytes ) { unsigned totalBytes = 0u; do { diff --git a/modules/ca/src/client/comQueRecv.h b/modules/ca/src/client/comQueRecv.h index ad8bead88..01c961e51 100644 --- a/modules/ca/src/client/comQueRecv.h +++ b/modules/ca/src/client/comQueRecv.h @@ -33,7 +33,7 @@ public: comQueRecv ( comBufMemoryManager & ); ~comQueRecv (); unsigned occupiedBytes () const; - unsigned copyOutBytes ( epicsInt8 *pBuf, unsigned nBytes ); + unsigned copyOutBytes ( char *pBuf, unsigned nBytes ); unsigned removeBytes ( unsigned nBytes ); void pushLastComBufReceived ( comBuf & ); void clear (); diff --git a/modules/libcom/src/misc/epicsTypes.h b/modules/libcom/src/misc/epicsTypes.h index 432c8961c..5efd69464 100644 --- a/modules/libcom/src/misc/epicsTypes.h +++ b/modules/libcom/src/misc/epicsTypes.h @@ -41,7 +41,7 @@ typedef enum { * These are sufficient for all our current archs * @{ */ -typedef char epicsInt8; +typedef signed char epicsInt8; typedef unsigned char epicsUInt8; typedef short epicsInt16; typedef unsigned short epicsUInt16;