From 436f3115aa14bc87d6a44856f5a8a3535f5d7a80 Mon Sep 17 00:00:00 2001 From: ahodgkinson Date: Thu, 23 Mar 2006 22:39:50 +0000 Subject: [PATCH] Renamed big-endian byte-swap macros to make their purpose clear. git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@207 0109f412-320b-0410-ab79-c3e0c5ffbbe6 --- flaim/src/ddprep.cpp | 5 +- flaim/src/fcs.h | 12 +- flaim/src/fcs_dis.cpp | 12 +- flaim/src/fcs_dos.cpp | 6 +- flaim/src/fcs_ipis.cpp | 2 +- flaim/src/fcs_ipos.cpp | 2 +- flaim/src/fcs_wire.cpp | 4 +- flaim/src/flblddb.cpp | 2 +- flaim/src/flkeymak.cpp | 4 +- flaim/src/flrddrct.cpp | 8 +- flaim/src/flreduce.cpp | 2 +- flaim/src/flverify.cpp | 10 +- flaim/src/fntable.cpp | 4 +- flaim/src/fsconvrt.cpp | 24 +- flaim/src/fsdatacu.cpp | 17 +- flaim/src/fslfileu.cpp | 10 +- flaim/src/fsrecget.cpp | 4 +- flaim/src/fsrecupd.cpp | 4 +- flaim/src/fssearch.cpp | 16 +- flaim/src/ftk.h | 3489 ++++++++++++++++++++-------------------- flaim/src/kybldkey.cpp | 4 +- flaim/src/kybuild.cpp | 2 +- flaim/src/kycollat.cpp | 4 +- flaim/src/kycompnd.cpp | 2 +- 24 files changed, 1830 insertions(+), 1819 deletions(-) diff --git a/flaim/src/ddprep.cpp b/flaim/src/ddprep.cpp index bc07865..697a472 100644 --- a/flaim/src/ddprep.cpp +++ b/flaim/src/ddprep.cpp @@ -146,7 +146,7 @@ RCODE fdictProcessAllDictRecs( // Position to the first of the data dictionary data records & read. FSInitStackCache( &stackBuf [0], BH_MAX_LEVELS); stack->pKeyBuf = btKeyBuf; - longToByte( 0, key); + flmUINT32ToBigEndian( 0, key); if( RC_BAD(rc = FSBtSearch( pDb, pLFile, &stack, key, DRN_KEY_SIZ, 0 ))) goto Exit; @@ -157,8 +157,7 @@ RCODE fdictProcessAllDictRecs( do { - uiDrn = (FLMUINT) byteToLong( btKeyBuf); - if( uiDrn == DRN_LAST_MARKER) + if( (uiDrn = flmBigEndianToUINT32( btKeyBuf)) == DRN_LAST_MARKER) { break; } diff --git a/flaim/src/fcs.h b/flaim/src/fcs.h index 42d8557..dab18c2 100644 --- a/flaim/src/fcs.h +++ b/flaim/src/fcs.h @@ -643,7 +643,7 @@ public: { FLMBYTE tmpBuf[ 2]; - intToByte( *((FLMUINT16 *)&i16Value), tmpBuf); + flmINT16ToBigEndian( i16Value, tmpBuf); return( write( tmpBuf, 2)); } @@ -652,7 +652,7 @@ public: { FLMBYTE tmpBuf[ 2]; - intToByte( ui16Value, tmpBuf); + flmUINT16ToBigEndian( ui16Value, tmpBuf); return( write( tmpBuf, 2)); } @@ -661,7 +661,7 @@ public: { FLMBYTE tmpBuf[ 4]; - longToByte( *((FLMUINT32 *)&i32Value), tmpBuf); + flmINT32ToBigEndian( i32Value, tmpBuf); return( write( tmpBuf, 4)); } @@ -670,7 +670,7 @@ public: { FLMBYTE tmpBuf[ 4]; - longToByte( ui32Value, tmpBuf); + flmUINT32ToBigEndian( ui32Value, tmpBuf); return( write( tmpBuf, 4)); } @@ -679,7 +679,7 @@ public: { FLMBYTE tmpBuf[ 8]; - long64ToByte( *((FLMUINT64 *)&i64Value), tmpBuf); + flmINT64ToBigEndian( i64Value, tmpBuf); return( write( tmpBuf, 8)); } @@ -688,7 +688,7 @@ public: { FLMBYTE tmpBuf[ 8]; - long64ToByte( ui64Value, tmpBuf); + flmUINT64ToBigEndian( ui64Value, tmpBuf); return( write( tmpBuf, 8)); } diff --git a/flaim/src/fcs_dis.cpp b/flaim/src/fcs_dis.cpp index 26152fe..9c87b34 100644 --- a/flaim/src/fcs_dis.cpp +++ b/flaim/src/fcs_dis.cpp @@ -79,7 +79,7 @@ RCODE FCS_DIS::readShort( if( RC_OK( rc = read( (FLMBYTE *)pValue, 2, NULL))) { - ui16Value = byteToInt( (FLMBYTE *)pValue); + ui16Value = flmBigEndianToUINT16( (FLMBYTE *)pValue); *pValue = *((FLMINT16 *)&ui16Value); } @@ -98,7 +98,7 @@ RCODE FCS_DIS::readUShort( if( RC_OK( rc = read( (FLMBYTE *)pValue, 2, NULL))) { - *pValue = byteToInt( (FLMBYTE *)pValue); + *pValue = flmBigEndianToUINT16( (FLMBYTE *)pValue); } return( rc); @@ -117,7 +117,7 @@ RCODE FCS_DIS::readInt( if( RC_OK( rc = read( (FLMBYTE *)pValue, 4, NULL))) { - ui32Value = byteToLong( (FLMBYTE *)pValue); + ui32Value = flmBigEndianToUINT32( (FLMBYTE *)pValue); *pValue = *((FLMINT32 *)&ui32Value); } @@ -136,7 +136,7 @@ RCODE FCS_DIS::readUInt( if( RC_OK( rc = read( (FLMBYTE *)pValue, 4, NULL))) { - *pValue = byteToLong( (FLMBYTE *)pValue); + *pValue = flmBigEndianToUINT32( (FLMBYTE *)pValue); } return( rc); @@ -155,7 +155,7 @@ RCODE FCS_DIS::readInt64( if( RC_OK( rc = read( (FLMBYTE *)pValue, 8, NULL))) { - ui64Value = byteToLong64( (FLMBYTE *)pValue); + ui64Value = flmBigEndianToUINT64( (FLMBYTE *)pValue); *pValue = *((FLMINT64 *)&ui64Value); } @@ -174,7 +174,7 @@ RCODE FCS_DIS::readUInt64( if( RC_OK( rc = read( (FLMBYTE *)pValue, 8, NULL))) { - *pValue = byteToLong64( (FLMBYTE *)pValue); + *pValue = flmBigEndianToUINT64( (FLMBYTE *)pValue); } return( rc); diff --git a/flaim/src/fcs_dos.cpp b/flaim/src/fcs_dos.cpp index 3a56d8c..db970d8 100644 --- a/flaim/src/fcs_dos.cpp +++ b/flaim/src/fcs_dos.cpp @@ -329,11 +329,11 @@ RCODE FCS_DOS::writeHTD( if( pCurNode) { - intToByte( (FLMUINT16)GedTagNum( pCurNode), pucTmpBuf); + flmUINT16ToBigEndian( GedTagNum( pCurNode), pucTmpBuf); } else if( pCurField) { - intToByte( (FLMUINT16)pRecord->getFieldID( pCurField), pucTmpBuf); + flmUINT16ToBigEndian( pRecord->getFieldID( pCurField), pucTmpBuf); } if( RC_BAD( rc = write( pucTmpBuf, 2))) @@ -512,7 +512,7 @@ RCODE FCS_DOS::writeHTD( */ flmAssert( uiCurDataLen <= 0x0000FFFF); - intToByte( (FLMUINT16)uiCurDataLen, pucTmpBuf); + flmUINT16ToBigEndian( (FLMUINT16)uiCurDataLen, pucTmpBuf); if( RC_BAD( rc = write( pucTmpBuf, 2))) { goto Exit; diff --git a/flaim/src/fcs_ipis.cpp b/flaim/src/fcs_ipis.cpp index d83d547..f852790 100644 --- a/flaim/src/fcs_ipis.cpp +++ b/flaim/src/fcs_ipis.cpp @@ -210,7 +210,7 @@ RCODE FCS_IPIS::getNextPacket( void) goto Exit; } - uiDescriptor = byteToInt( pucDescriptor); + uiDescriptor = flmBigEndianToUINT16( pucDescriptor); m_uiPacketSize = uiDescriptor & 0x7FFF; if( uiDescriptor & 0x8000) diff --git a/flaim/src/fcs_ipos.cpp b/flaim/src/fcs_ipos.cpp index 940701f..5d518ec 100644 --- a/flaim/src/fcs_ipos.cpp +++ b/flaim/src/fcs_ipos.cpp @@ -134,7 +134,7 @@ RCODE FCS_IPOS::_flush( if( uiDescriptor) { - intToByte( (FLMUINT16)uiDescriptor, m_pucBuffer); + flmUINT16ToBigEndian( (FLMUINT16)uiDescriptor, m_pucBuffer); if( RC_BAD( rc = m_pTcpObj->write( m_pucBuffer, uiLength, &uiActualCnt))) diff --git a/flaim/src/fcs_wire.cpp b/flaim/src/fcs_wire.cpp index 54ea040..1311193 100644 --- a/flaim/src/fcs_wire.cpp +++ b/flaim/src/fcs_wire.cpp @@ -1178,10 +1178,10 @@ RCODE FCS_WIRE::sendRecord( 4-byte container ID, 4-byte DRN */ - longToByte( pRecord->getContainerID(), pucBufPos); + flmUINT32ToBigEndian( pRecord->getContainerID(), pucBufPos); pucBufPos += 4; - longToByte( pRecord->getID(), pucBufPos); + flmUINT32ToBigEndian( pRecord->getID(), pucBufPos); pucBufPos += 4; /* diff --git a/flaim/src/flblddb.cpp b/flaim/src/flblddb.cpp index d5b261f..3e57363 100644 --- a/flaim/src/flblddb.cpp +++ b/flaim/src/flblddb.cpp @@ -425,7 +425,7 @@ FSTATIC RCODE bldAdjustNextDrn( // Find the element whose DRN is DRN_LAST_MARKER - longToByte( DRN_LAST_MARKER, DrnMarker); + flmUINT32ToBigEndian( DRN_LAST_MARKER, DrnMarker); if( RC_BAD( rc = FSBtSearch( pDb, pLFile, &pStack, DrnMarker, DIN_KEY_SIZ, 0))) { diff --git a/flaim/src/flkeymak.cpp b/flaim/src/flkeymak.cpp index 22bdbda..673ab29 100644 --- a/flaim/src/flkeymak.cpp +++ b/flaim/src/flkeymak.cpp @@ -189,7 +189,7 @@ RCODE flmIxKeyOutput( if( pIfd->uiFlags & IFD_CONTEXT) { if( RC_BAD( rc = flmBuildKeyPaths( pIfd, - (FLMUINT)byteToInt( &pucFromKey [1]), + flmBigEndianToUINT16( &pucFromKey [1]), uiDataType, bFullFldPaths, pKey, &pvField))) { goto Exit; @@ -366,7 +366,7 @@ RCODE flmIxKeyOutput( default: uiFromKeyLen = 5; - uiLongValue = (FLMUINT)byteToLong( pucFromKey + 1); + uiLongValue = flmBigEndianToUINT32( pucFromKey + 1); UD2FBA( (FLMUINT32)uiLongValue, pucToKey); uiToKeyLen = 4; break; diff --git a/flaim/src/flrddrct.cpp b/flaim/src/flrddrct.cpp index ad60b79..8541cfe 100644 --- a/flaim/src/flrddrct.cpp +++ b/flaim/src/flrddrct.cpp @@ -171,7 +171,7 @@ Search_Record: { goto Exit; } - longToByte( uiDrn, pSearchBuf); + flmUINT32ToBigEndian( uiDrn, pSearchBuf); FSInitStackCache( &stack [0], BH_MAX_LEVELS); pStack = &stack[0]; bStackInitialized = TRUE; @@ -208,7 +208,7 @@ Search_Record: } if (uiKeyRelPos == BT_END_OF_DATA || - byteToLong( pKeyBuf) > uiDrn) + flmBigEndianToUINT32( pKeyBuf) > uiDrn) { // Position to the last element in the block. @@ -243,7 +243,9 @@ Search_Record: goto Exit; } } - uiFoundDrn = byteToLong( pKeyBuf ); + + uiFoundDrn = flmBigEndianToUINT32( pKeyBuf); + if( uiFoundDrn == DRN_LAST_MARKER) { if( uiFlag & FO_EXACT) diff --git a/flaim/src/flreduce.cpp b/flaim/src/flreduce.cpp index 9632ae6..3ee91ab 100644 --- a/flaim/src/flreduce.cpp +++ b/flaim/src/flreduce.cpp @@ -784,7 +784,7 @@ FSTATIC RCODE FLRMoveBtreeBlk( } else { - rc = FSBtScanNonLeafData( pStack, byteToLong( ucSearchKey)); + rc = FSBtScanNonLeafData( pStack, flmBigEndianToUINT32( ucSearchKey)); } if( RC_BAD( rc)) { diff --git a/flaim/src/flverify.cpp b/flaim/src/flverify.cpp index 0cfa337..da1c829 100644 --- a/flaim/src/flverify.cpp +++ b/flaim/src/flverify.cpp @@ -1139,7 +1139,7 @@ eCorruptionType flmVerifyKey( if (pIfd->uiFlags & IFD_COMPOUND) { - if (byteToInt( &pKey [uiJ + 1]) != pIfd->uiFldNum) + if (flmBigEndianToUINT16( &pKey [uiJ + 1]) != pIfd->uiFldNum) return( FLM_BAD_CONTEXT_KEY); } else @@ -1157,7 +1157,7 @@ eCorruptionType flmVerifyKey( uiH < uiTrueNumIxFields; uiH++, pTmpIfd++) { - if (byteToInt( &pKey[ uiJ + 1]) == pTmpIfd->uiFldNum) + if (flmBigEndianToUINT16( &pKey[ uiJ + 1]) == pTmpIfd->uiFldNum) { break; } @@ -1650,12 +1650,8 @@ eCorruptionType flmVerifyElement( { f_memcpy( &ucRecBuff [uiElmPKCLen], pElmKey, uiElmKeyLen); } - //else if (uiBlkType == BHT_NON_LEAF_DATA) - //{ - // *(FLMUINT32 *) ucRecBuff = *(FLMUINT32 *)pElmKey; - //} - pStateInfo->uiElmDrn = (FLMUINT)byteToLong( ucRecBuff); + pStateInfo->uiElmDrn = flmBigEndianToUINT32( ucRecBuff); if (pStateInfo->uiElmDrn == DRN_LAST_MARKER && uiBlkType == BHT_LEAF) { FLMUINT uiTempDrn; diff --git a/flaim/src/fntable.cpp b/flaim/src/fntable.cpp index c4ca022..317825a 100644 --- a/flaim/src/fntable.cpp +++ b/flaim/src/fntable.cpp @@ -1051,7 +1051,7 @@ ExitCS: // Position to the first record in the B-Tree. - longToByte( (FLMUINT)0, ucDrnBuf); + flmUINT32ToBigEndian( 0, ucDrnBuf); if (RC_BAD( rc = FSBtSearch( pDb, pLFile, &pStack, ucDrnBuf, 4, ZERO_DOMAIN))) { @@ -1062,7 +1062,7 @@ ExitCS: while (pStack->uiCmpStatus != BT_END_OF_DATA) { - if ((uiDrn = byteToLong( ucKeyBuf)) == DRN_LAST_MARKER) + if ((uiDrn = flmBigEndianToUINT32( ucKeyBuf)) == DRN_LAST_MARKER) { break; } diff --git a/flaim/src/fsconvrt.cpp b/flaim/src/fsconvrt.cpp index 3f231fd..3d6f31e 100644 --- a/flaim/src/fsconvrt.cpp +++ b/flaim/src/fsconvrt.cpp @@ -34,7 +34,6 @@ FSTATIC RCODE FSConvertNonLeafTree( void * UserData, DB_UPGRADE_INFO * pDbConvertInfo); - FSTATIC void FSBuildNonLeafDataElement( BTSK_p pStack, FLMBYTE * pElement, @@ -45,7 +44,6 @@ FSTATIC void FSBuildNonLeafDataElement( /*************************************************************************** Desc: File system conversions from one version to another. *****************************************************************************/ - RCODE FSVersionConversion40( FDB_p pDb, FLMUINT uiNewVersion, @@ -92,7 +90,7 @@ RCODE FSVersionConversion40( FSInitStackCache( &stackBuf [0], BH_MAX_LEVELS); pStack = stackBuf; pStack->pKeyBuf = pKeyBuf; - longToByte( 0, pDrnKey); + flmUINT32ToBigEndian( 0, pDrnKey); if( RC_BAD(rc = FSBtSearch( pDb, pLFile, &pStack, pDrnKey, DIN_KEY_SIZ,0))) goto Exit; @@ -146,7 +144,7 @@ FSTATIC RCODE FSConvertNonLeafTree( FLMUINT uiBlkAddr; FSInitStackCache( &stackBuf [0], BH_MAX_LEVELS); - longToByte( 0, pDrnKey); + flmUINT32ToBigEndian( 0, pDrnKey); /* Free the b-tree blocks that are above this lowest non-leaf level. @@ -288,7 +286,7 @@ FSTATIC RCODE FSConvertNonLeafTree( // Do callback to report progress. if (fnStatusCallback) { - pDbConvertInfo->uiDrn = byteToLong( pOldStack->pKeyBuf); + pDbConvertInfo->uiDrn = flmBigEndianToUINT32( pOldStack->pKeyBuf); if (RC_BAD( rc = (*fnStatusCallback)( FLM_DB_UPGRADE_STATUS, (void *) pDbConvertInfo, (void *)0, UserData))) @@ -336,20 +334,11 @@ FSTATIC void FSBuildNonLeafDataElement( // Check for last element marker. if( pOldElm[ BBE_PKC ] == 0 && pOldElm[ BBE_KL] == 0) { - // We need to do the UNIX code in fear of misaligned memory access. -#ifdef FLM_UNIX - longToByte( DRN_LAST_MARKER, pElement); -#else - *(FLMUINT32 *)pElement = DRN_LAST_MARKER; -#endif + flmUINT32ToBigEndian( DRN_LAST_MARKER, pElement); } else { -#ifdef FLM_UNIX f_memcpy( pElement, pStack->pKeyBuf, DIN_KEY_SIZ); -#else - *(FLMUINT32 *)pElement = *(FLMUINT32 *) pStack->pKeyBuf; -#endif } } else // Old variable length 3.x format. @@ -365,11 +354,7 @@ FSTATIC void FSBuildNonLeafDataElement( pElement [ BBE_PKC ] = 0; // Set PKC, DOMAIN to zero pElement [ BBE_KL ] = DIN_KEY_SIZ; // sizeof( FLMUINT32) or 4 uiElmLen = BNE_KEY_START + DIN_KEY_SIZ; -#ifdef FLM_UNIX f_memcpy( pElement + BNE_KEY_START, pStack->pKeyBuf, DIN_KEY_SIZ); -#else - *(FLMUINT32 *)(pElement + BNE_KEY_START) = *(FLMUINT32 *) pStack->pKeyBuf; -#endif } *ppKey = pElement + BNE_KEY_START; } @@ -378,4 +363,3 @@ FSTATIC void FSBuildNonLeafDataElement( *puiElmLen = uiElmLen; return; } - diff --git a/flaim/src/fsdatacu.cpp b/flaim/src/fsdatacu.cpp index 6a8a7ad..ea89a1a 100644 --- a/flaim/src/fsdatacu.cpp +++ b/flaim/src/fsdatacu.cpp @@ -680,7 +680,7 @@ FINLINE void setItemsFromBlock( RECPOS * pRecPos ) { - pRecPos->uiRecordId = byteToLong( pRecPos->pKey); + pRecPos->uiRecordId = flmBigEndianToUINT32( pRecPos->pKey); pRecPos->uiBlockAddr = pRecPos->pStack->uiBlkAddr; pRecPos->uiBlockTransId = (pRecPos->uiBlockAddr != BT_END) ? FB2UD( &pRecPos->pStack->pBlk[ BH_TRANS_ID]) @@ -714,7 +714,7 @@ RCODE FSDataCursor::setRecPosition( pOutRecPos->pStack = pOutRecPos->Stack; pOutRecPos->Stack[0].pKeyBuf = pOutRecPos->pKey; uiRecordId = pInRecPos->uiRecordId; - longToByte( uiRecordId, buf); + flmUINT32ToBigEndian( uiRecordId, buf); // All of the variables should be setup for the search. if( RC_BAD( rc = FSBtSearch( pDb, m_pLFile, &pOutRecPos->pStack, @@ -731,8 +731,8 @@ RCODE FSDataCursor::setRecPosition( } if( bGoingForward) { - if( pOutRecPos->pStack->uiCmpStatus == BT_END_OF_DATA - || byteToLong( pOutRecPos->pKey) == DRN_LAST_MARKER) + if( pOutRecPos->pStack->uiCmpStatus == BT_END_OF_DATA || + flmBigEndianToUINT32( pOutRecPos->pKey) == DRN_LAST_MARKER) { rc = RC_SET( FERR_EOF_HIT); goto Exit; @@ -740,8 +740,8 @@ RCODE FSDataCursor::setRecPosition( } else { - if( (pOutRecPos->pStack->uiCmpStatus == BT_END_OF_DATA) - || (byteToLong( pOutRecPos->pKey) > uiRecordId)) + if( (pOutRecPos->pStack->uiCmpStatus == BT_END_OF_DATA) || + (flmBigEndianToUINT32( pOutRecPos->pKey) > uiRecordId)) { // Went a little too far - go back to the previous record. // Need to position back one element. @@ -988,7 +988,7 @@ RCODE FSDataCursor::nextRec( // FERR_OK, FERR_EOF_HIT or error goto Exit; } bRecordGone = TRUE; - if( byteToLong( m_curRecPos.pKey) <= + if( flmBigEndianToUINT32( m_curRecPos.pKey) <= m_pCurSet->untilKey.uiRecordId) { setItemsFromBlock( &m_curRecPos); @@ -1135,7 +1135,8 @@ RCODE FSDataCursor::prevRec( // FERR_OK, FERR_EOF_HIT or error pCurElm = CURRENT_ELM( pStack); } bRecordGone = TRUE; - if( byteToLong( m_curRecPos.pKey) >= m_pCurSet->fromKey.uiRecordId) + if( flmBigEndianToUINT32( m_curRecPos.pKey) >= + m_pCurSet->fromKey.uiRecordId) { setItemsFromBlock( &m_curRecPos); break; diff --git a/flaim/src/fslfileu.cpp b/flaim/src/fslfileu.cpp index 9e820a1..5322606 100644 --- a/flaim/src/fslfileu.cpp +++ b/flaim/src/fslfileu.cpp @@ -890,7 +890,7 @@ RCODE flmIndexSetOfRecords( uiLastDrn = 0; pStack->pKeyBuf = ucKeyBuf; - longToByte( uiStartDrn, ucSearchKey); + flmUINT32ToBigEndian( uiStartDrn, ucSearchKey); if (RC_BAD( rc = FSBtSearch( pDb, pDataLFile, &pStack, ucSearchKey, 4, 0))) @@ -909,7 +909,7 @@ RCODE flmIndexSetOfRecords( for (;;) { - if ((uiDrn = byteToLong( ucKeyBuf)) == DRN_LAST_MARKER) + if ((uiDrn = flmBigEndianToUINT32( ucKeyBuf)) == DRN_LAST_MARKER) { bHitEnd = TRUE; break; @@ -1044,7 +1044,7 @@ RCODE flmIndexSetOfRecords( FSInitStackCache( &stackBuf [0], BH_MAX_LEVELS); pStack = stackBuf; pStack->pKeyBuf = ucKeyBuf; - longToByte( uiDrn, ucSearchKey); + flmUINT32ToBigEndian( uiDrn, ucSearchKey); if (RC_BAD( rc = FSBtSearch( pDb, pDataLFile, &pStack, ucSearchKey, 4, 0))) { @@ -2719,7 +2719,7 @@ FSTATIC RCODE flmRetrieveTrackerRec( } pStack->pKeyBuf = ucKeyBuf; - longToByte( uiDrn, ucSearchKey); + flmUINT32ToBigEndian( uiDrn, ucSearchKey); if( RC_BAD( rc = FSBtSearch( pDb, pTrackerLFile, &pStack, ucSearchKey, 4, 0))) @@ -2737,7 +2737,7 @@ FSTATIC RCODE flmRetrieveTrackerRec( // Stack points to leaf element - if( (uiFoundDrn = byteToLong( ucKeyBuf)) == DRN_LAST_MARKER) + if( (uiFoundDrn = flmBigEndianToUINT32( ucKeyBuf)) == DRN_LAST_MARKER) { rc = RC_SET( FERR_EOF_HIT); goto Exit; diff --git a/flaim/src/fsrecget.cpp b/flaim/src/fsrecget.cpp index 251789d..b158d33 100644 --- a/flaim/src/fsrecget.cpp +++ b/flaim/src/fsrecget.cpp @@ -96,7 +96,7 @@ RCODE FSReadRecord( // Was FSRecordGet pStack->pKeyBuf = pKeyBuf; // Search the B-TREE for the record - longToByte( uiDrn, pDrnBuf); + flmUINT32ToBigEndian( uiDrn, pDrnBuf); if( RC_OK( rc = FSBtSearch( pDb, pLFile, &pStack, pDrnBuf, 4, 0))) { rc = RC_SET( FERR_NOT_FOUND); @@ -154,7 +154,7 @@ RCODE FSReadElement( #ifdef FLM_DBG_LOG flmAssert( pStack->uiKeyLen == DIN_KEY_SIZ && - (FLMUINT)byteToLong( pStack->pKeyBuf) == uiDrn); + flmBigEndianToUINT32( pStack->pKeyBuf) == uiDrn); #endif // Initialize variables diff --git a/flaim/src/fsrecupd.cpp b/flaim/src/fsrecupd.cpp index 8ab2bb5..8172a65 100644 --- a/flaim/src/fsrecupd.cpp +++ b/flaim/src/fsrecupd.cpp @@ -52,7 +52,7 @@ RCODE FSRecUpdate( FSInitStackCache( &stackBuf [0], BH_MAX_LEVELS); pStack->pKeyBuf = pKeyBuf; - longToByte( uiDrn, updCur.pKeyBuf); + flmUINT32ToBigEndian( uiDrn, updCur.pKeyBuf); // Position to the element in the b-tree. @@ -119,7 +119,7 @@ RCODE FSRecUpdate( pElmBuf = updCur.pElmBuf; pElmBuf[ BBE_PKC] = BBE_FIRST_FLAG; pElmBuf[ BBE_KL] = DIN_KEY_SIZ; - longToByte( uiDrn, &pElmBuf[ BBE_KEY]); + flmUINT32ToBigEndian( uiDrn, &pElmBuf[ BBE_KEY]); // BBE_RL is set in the flush routine diff --git a/flaim/src/fssearch.cpp b/flaim/src/fssearch.cpp index c9d124e..f45d37b 100644 --- a/flaim/src/fssearch.cpp +++ b/flaim/src/fssearch.cpp @@ -101,7 +101,8 @@ RCODE FSBtSearch( else { rc = FSBtScanNonLeafData( pStack, keyLen == 1 - ? (FLMUINT) *key : (FLMUINT) byteToLong( key)); + ? *key + : flmBigEndianToUINT32( key)); } if( RC_BAD( rc)) { @@ -158,7 +159,7 @@ RCODE FSBtSearchEnd( goto Exit; } - longToByte( uiDrn, key); + flmUINT32ToBigEndian( uiDrn, key); for(;;) { pStack->uiFlags = FULL_STACK; @@ -525,7 +526,7 @@ RCODE FSBtScanNonLeafData( { uiMid = (uiLow + uiHigh) >> 1; // (uiLow + uiHigh) / 2 - uiCurDrn = byteToLong( &pBlk[ BH_OVHD + (uiMid << 3)]); + uiCurDrn = flmBigEndianToUINT32( &pBlk[ BH_OVHD + (uiMid << 3)]); if( uiCurDrn == 0) { // Special case - at the end of a rightmost block. @@ -537,9 +538,14 @@ RCODE FSBtScanNonLeafData( // Remember a data record can span multiple blocks (same DRN). while( uiMid) { - uiCurDrn = byteToLong( &pBlk[ BH_OVHD + ((uiMid - 1) << 3)]); + uiCurDrn = flmBigEndianToUINT32( + &pBlk[ BH_OVHD + ((uiMid - 1) << 3)]); + if( uiDrn != uiCurDrn) + { break; + } + uiMid--; } pStack->uiCmpStatus = BT_EQ_KEY; @@ -576,7 +582,7 @@ RCODE FSBtScanNonLeafData( // Set curElm and the key buffer. pStack->uiCurElm = BH_OVHD + (uiMid << 3); - longToByte( uiCurDrn, pStack->pKeyBuf); + flmUINT32ToBigEndian( uiCurDrn, pStack->pKeyBuf); //Exit: return( rc); diff --git a/flaim/src/ftk.h b/flaim/src/ftk.h index 0ed9024..64b2fe1 100644 --- a/flaim/src/ftk.h +++ b/flaim/src/ftk.h @@ -1,1733 +1,1756 @@ -//------------------------------------------------------------------------- -// Desc: Toolkit - cross platform APIs for system functionality. -// Tabs: 3 -// -// Copyright (c) 1991-2006 Novell, Inc. All Rights Reserved. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of version 2 of the GNU General Public -// License as published by the Free Software Foundation. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, contact Novell, Inc. -// -// To contact Novell about this file by physical or electronic mail, -// you may find current contact information at www.novell.com -// -// $Id: ftk.h 12334 2006-01-23 12:45:35 -0700 (Mon, 23 Jan 2006) dsanders $ -//------------------------------------------------------------------------- - -#ifndef FTK_H -#define FTK_H - - #if defined( FLM_DEBUG) && !defined( FLM_HPUX) - #define f_new new( __FILE__, __LINE__) - #else - #define f_new new - #endif - - #ifdef FLM_DEBUG - #define RC_SET( rc) \ - flmMakeErr(rc, __FILE__, __LINE__) - - RCODE flmMakeErr( - RCODE rc, - const char * pszFile, - int iLine); - #else - #define RC_SET(rc) (rc) - #endif - - #define F_SEM_WAITFOREVER 0xFFFFFFFF - - #ifdef FLM_NLM - #include "ftknlm.h" - #elif defined( FLM_WIN) - - #define FSTATIC static - - #ifndef WIN32_LEAN_AND_MEAN - #define WIN32_LEAN_AND_MEAN - #endif - - #ifndef WIN32_EXTRA_LEAN - #define WIN32_EXTRA_LEAN - #endif - - // This pragma is needed because FLAIM may be built with a - // packing other than 8-bytes on Win (such as 1-byte packing). - // Code in FLAIM that uses windows structures and system calls - // MUST use 8-byte packing (the packing used by the O/S). - // See Microsoft technical article Q117388. - - #pragma pack( push, enter_windows, 8) - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #pragma pack( pop, enter_windows) - - // Conversion from XXX to YYY, possible loss of data - - #pragma warning( disable : 4244) - - // Local variable XXX may be used without having been initialized - - #pragma warning( disable : 4701) - - // Function XXX not inlined - - #pragma warning( disable : 4710) - - #define f_stricmp( str1, str2) \ - _stricmp( (str1), (str2)) - - #define f_strnicmp( str1, str2, size) \ - _strnicmp( (str1), (str2),(size_t)(size)) - - #define f_memcpy( dest, src, size) \ - memcpy((void *)(dest), (void *)(src),(size_t)(size)) - - #define f_memmove( dest, src, length) \ - memmove((void *)(dest), (void *)(src),(size_t)(length)) - - #define f_memset( src, chr, size) \ - memset((void *)(src),(chr),(size_t)(size)) - - #define f_memcmp( str1, str2, length) \ - memcmp((void *)(str1), (void *)(str2),(size_t)(length)) - - #define f_strcat( dest, src) \ - strcat( (char*)(dest), (char*)(src)) - - #define f_strcmp( str1, str2) \ - strcmp( (char*)(str1), (char*)(str2)) - - #define f_strcpy( dest, src) \ - strcpy( (char*)(dest), (char*)(src)) - - #define f_strncpy( dest, src, length) \ - strncpy( (char*)(dest), (char*)(src), (size_t)(length)) - - #define f_strlen( str) \ - ((FLMUINT)strlen( (char*)(str))) - - #define f_strncmp( str1, str2, size) \ - strncmp( (char*)(str1), (char*)(str2), (size_t)(size)) - - #define f_strrchr( str, value ) \ - strrchr( (char*)(str), (int)value) - - #define f_strstr( str1, str2) \ - strstr( (char*)(str1), (char*)(str2)) - - #define f_strncat( str1, str2, n) \ - strncat( (str1), (str2), n) - - #define f_strupr( str) \ - _strupr( (str)) - - #define f_va_list va_list - #define f_va_start va_start - #define f_va_arg va_arg - #define f_va_end va_end - - #elif defined( FLM_UNIX) - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - - #ifndef _POSIX_THREADS - #define _POSIX_THREADS - #endif - - #include - - #ifndef FLM_OSX - #include - #endif - - #ifdef FLM_AIX - #include - #endif - - #define FSTATIC static - - #define f_stricmp(str1,str2) \ - strcasecmp( (str1), (str2)) - - #define f_strnicmp(str1,str2,size_t) \ - strncasecmp( (str1), (str2),size_t) - - #define f_memcpy( dest, src, size) \ - memcpy( (void*)(dest), (void*)(src), size) - - #define f_memmove( dest, src, len) \ - memmove( (void*)(dest), (void*)(src), len) - - #define f_memset( src, chr, size) \ - memset((void *)(src),(chr),(size_t)(size)) - - #define f_memcmp( str1, str2, length) \ - memcmp((void *)(str1), (void *)(str2),(size_t)(length)) - - #define f_strcat( dest, src) \ - strcat( (char*)(dest), (char*)(src)) - - #define f_strcmp( str1, str2) \ - strcmp( (char*)(str1), (char*)(str2)) - - #define f_strcpy( dest, src) \ - strcpy( (char*)(dest), (char*)(src)) - - #define f_strncpy( dest, src, length) \ - strncpy( (char*)(dest), (char*)(src), (size_t)(length)) - - #define f_strlen( str) \ - strlen( (char*)(str)) - - #define f_strncmp( str1, str2, size) \ - strncmp( (char*)(str1), (char*)(str2), (size_t)(size)) - - #define f_strrchr( str, value ) \ - strrchr( (char*)(str), (int)value) - - #define f_strstr( str1, str2) \ - strstr( (char*)(str1), (char*)(str2)) - - #define f_strncat( str1, str2, n) \ - strncat( (str1), (str2), n) - - char * f_strupr( - char * pszStr); - - #define f_strupr( str) \ - f_strupr( (str)) - - #define f_va_list va_list - #define f_va_start va_start - #define f_va_arg va_arg - #define f_va_end va_end - - #ifndef INVALID_SOCKET - #define INVALID_SOCKET (-1) - #endif - - #ifndef INADDR_NONE - #define INADDR_NONE (-1) - #endif - - #ifndef SOCKET - #define SOCKET int - #endif - - #endif - - /**************************************************************************** - CROSS PLATFORM DEFINITIONS - ****************************************************************************/ - - #define F_UNREFERENCED_PARM( parm) \ - (void)parm - - #if defined( __va_copy) - #define f_va_copy(to, from) \ - __va_copy(to, from) - #else - #define f_va_copy(to, from) \ - ((to) = (from)) - #endif - - #define shiftN(data,size,distance) \ - f_memmove((FLMBYTE *)(data) + (FLMINT)(distance), \ - (FLMBYTE *)(data), (unsigned)(size)) - - /**************************************************************************** - FLAIM's Assert Layer - ****************************************************************************/ - - #ifndef FLM_DEBUG - #define flmAssert( exp) - #else - #ifdef FLM_DBG_LOG - void flmDbgLogFlush( void); - #endif - - #if defined( FLM_WIN) - #ifdef FLM_DBG_LOG - #define flmAssert( exp) \ - (void)( (exp) || (flmDbgLogFlush(), DebugBreak(), 0)) - #else - #define flmAssert( exp) \ - (void)( (exp) || (DebugBreak(), 0)) - #endif - - #elif defined( FLM_NLM) - #ifdef FLM_DBG_LOG - #define flmAssert( exp) \ - (void)( (exp) || (flmDbgLogFlush(), EnterDebugger(), 0)) - #else - #define flmAssert( exp) \ - (void)( (exp) || ( EnterDebugger(), 0)) - #endif - - #elif defined( FLM_UNIX) - #include - - #ifdef FLM_DBG_LOG - #define flmAssert( exp) \ - (void)( (exp) || (flmDbgLogFlush(), assert(0), 0)) - #else - #define flmAssert( exp) \ - (void)( (exp) || (assert(0), 0)) - #endif - - #else - #define flmAssert( exp) - #endif - - #endif - - #ifdef FLM_DEBUG - #define flmReleaseAssert( exp) flmAssert( exp) - #else - #if defined( FLM_WIN) - #define flmReleaseAssert( exp) \ - (void)( (exp) || (DebugBreak(), 0)) - - #elif defined( FLM_NLM) - #define flmReleaseAssert( exp) \ - (void)( (exp) || ( EnterDebugger(), 0)) - - #elif defined( FLM_UNIX) - #include - #define flmReleaseAssert( exp) \ - (void)( (exp) || (abort(), 0)) - #else - #define flmReleaseAssert( exp) - #endif - #endif - - - #include "fpackon.h" - - // IMPORTANT NOTE: No other include files should follow this one except - // for fpackoff.h - - FLMUINT f_breakpoint( - FLMUINT uiBreakFlag); - - /**************************************************************************** - Desc: ASCII Constants - ****************************************************************************/ - - #define ASCII_TAB 0x09 - #define ASCII_NEWLINE 0x0A - #define ASCII_CR 0x0D - #define ASCII_CTRLZ 0x1A - #define ASCII_SPACE 0x20 - #define ASCII_DQUOTE 0x22 - #define ASCII_POUND 0x23 - #define ASCII_DOLLAR 0x24 - #define ASCII_SQUOTE 0x27 - #define ASCII_WILDCARD 0x2A - #define ASCII_PLUS 0x2B - #define ASCII_COMMA 0x2C - #define ASCII_DASH 0x2D - #define ASCII_MINUS 0x2D - #define ASCII_DOT 0x2E - #define ASCII_SLASH 0x2F - #define ASCII_COLON 0x3A - #define ASCII_SEMICOLON 0x3B - #define ASCII_EQUAL 0x3D - #define ASCII_QUESTIONMARK 0x3F - #define ASCII_AT 0x40 - #define ASCII_BACKSLASH 0x5C - #define ASCII_CARAT 0x5E - #define ASCII_UNDERSCORE 0x5F - #define ASCII_TILDE 0x7E - #define ASCII_AMP 0x26 - - #define ASCII_UPPER_A 0x41 - #define ASCII_UPPER_B 0x42 - #define ASCII_UPPER_C 0x43 - #define ASCII_UPPER_D 0x44 - #define ASCII_UPPER_E 0x45 - #define ASCII_UPPER_F 0x46 - #define ASCII_UPPER_G 0x47 - #define ASCII_UPPER_H 0x48 - #define ASCII_UPPER_I 0x49 - #define ASCII_UPPER_J 0x4A - #define ASCII_UPPER_K 0x4B - #define ASCII_UPPER_L 0x4C - #define ASCII_UPPER_M 0x4D - #define ASCII_UPPER_N 0x4E - #define ASCII_UPPER_O 0x4F - #define ASCII_UPPER_P 0x50 - #define ASCII_UPPER_Q 0x51 - #define ASCII_UPPER_R 0x52 - #define ASCII_UPPER_S 0x53 - #define ASCII_UPPER_T 0x54 - #define ASCII_UPPER_U 0x55 - #define ASCII_UPPER_V 0x56 - #define ASCII_UPPER_W 0x57 - #define ASCII_UPPER_X 0x58 - #define ASCII_UPPER_Y 0x59 - #define ASCII_UPPER_Z 0x5A - - #define ASCII_LOWER_A 0x61 - #define ASCII_LOWER_B 0x62 - #define ASCII_LOWER_C 0x63 - #define ASCII_LOWER_D 0x64 - #define ASCII_LOWER_E 0x65 - #define ASCII_LOWER_F 0x66 - #define ASCII_LOWER_G 0x67 - #define ASCII_LOWER_H 0x68 - #define ASCII_LOWER_I 0x69 - #define ASCII_LOWER_J 0x6A - #define ASCII_LOWER_K 0x6B - #define ASCII_LOWER_L 0x6C - #define ASCII_LOWER_M 0x6D - #define ASCII_LOWER_N 0x6E - #define ASCII_LOWER_O 0x6F - #define ASCII_LOWER_P 0x70 - #define ASCII_LOWER_Q 0x71 - #define ASCII_LOWER_R 0x72 - #define ASCII_LOWER_S 0x73 - #define ASCII_LOWER_T 0x74 - #define ASCII_LOWER_U 0x75 - #define ASCII_LOWER_V 0x76 - #define ASCII_LOWER_W 0x77 - #define ASCII_LOWER_X 0x78 - #define ASCII_LOWER_Y 0x79 - #define ASCII_LOWER_Z 0x7A - - #define ASCII_ZERO 0x30 - #define ASCII_ONE 0x31 - #define ASCII_TWO 0x32 - #define ASCII_THREE 0x33 - #define ASCII_FOUR 0x34 - #define ASCII_FIVE 0x35 - #define ASCII_SIX 0x36 - #define ASCII_SEVEN 0x37 - #define ASCII_EIGHT 0x38 - #define ASCII_NINE 0x39 - - /**************************************************************************** - Desc: Native constants - ****************************************************************************/ - - #define NATIVE_SPACE ' ' - #define NATIVE_DOT '.' - #define NATIVE_PLUS '+' - #define NATIVE_MINUS '-' - #define NATIVE_WILDCARD '*' - #define NATIVE_QUESTIONMARK '?' - - #define NATIVE_UPPER_A 'A' - #define NATIVE_UPPER_F 'F' - #define NATIVE_UPPER_X 'X' - #define NATIVE_UPPER_Z 'Z' - #define NATIVE_LOWER_A 'a' - #define NATIVE_LOWER_F 'f' - #define NATIVE_LOWER_X 'x' - #define NATIVE_LOWER_Z 'z' - #define NATIVE_ZERO '0' - #define NATIVE_NINE '9' - - #define f_stringToAscii(str) - - #define f_toascii(native) \ - (native) - - #define f_tonative(ascii) \ - (ascii) - - #define f_toupper(native) \ - (((native) >= 'a' && (native) <= 'z') \ - ? (native) - 'a' + 'A' : (native)) - - #define f_tolower(native) \ - (((native) >= 'A' && (native) <= 'Z') \ - ? (native) - 'A' + 'a' : (native)) - - #define f_islower(native) \ - ((native) >= 'a' && (native) <= 'z') - - /**************************************************************************** - Desc: Unicode constants - ****************************************************************************/ - - #define FLM_UNICODE_LINEFEED ((FLMUNICODE)10) - #define FLM_UNICODE_SPACE ((FLMUNICODE)32) - #define FLM_UNICODE_BANG ((FLMUNICODE)33) - #define FLM_UNICODE_QUOTE ((FLMUNICODE)34) - #define FLM_UNICODE_POUND ((FLMUNICODE)35) - #define FLM_UNICODE_DOLLAR ((FLMUNICODE)36) - #define FLM_UNICODE_PERCENT ((FLMUNICODE)37) - #define FLM_UNICODE_AMP ((FLMUNICODE)38) - #define FLM_UNICODE_APOS ((FLMUNICODE)39) - #define FLM_UNICODE_LPAREN ((FLMUNICODE)40) - #define FLM_UNICODE_RPAREN ((FLMUNICODE)41) - #define FLM_UNICODE_ASTERISK ((FLMUNICODE)42) - #define FLM_UNICODE_PLUS ((FLMUNICODE)43) - #define FLM_UNICODE_COMMA ((FLMUNICODE)44) - #define FLM_UNICODE_HYPHEN ((FLMUNICODE)45) - #define FLM_UNICODE_PERIOD ((FLMUNICODE)46) - #define FLM_UNICODE_FSLASH ((FLMUNICODE)47) - - #define FLM_UNICODE_0 ((FLMUNICODE)48) - #define FLM_UNICODE_1 ((FLMUNICODE)49) - #define FLM_UNICODE_2 ((FLMUNICODE)50) - #define FLM_UNICODE_3 ((FLMUNICODE)51) - #define FLM_UNICODE_4 ((FLMUNICODE)52) - #define FLM_UNICODE_5 ((FLMUNICODE)53) - #define FLM_UNICODE_6 ((FLMUNICODE)54) - #define FLM_UNICODE_7 ((FLMUNICODE)55) - #define FLM_UNICODE_8 ((FLMUNICODE)56) - #define FLM_UNICODE_9 ((FLMUNICODE)57) - - #define FLM_UNICODE_COLON ((FLMUNICODE)58) - #define FLM_UNICODE_SEMI ((FLMUNICODE)59) - #define FLM_UNICODE_LT ((FLMUNICODE)60) - #define FLM_UNICODE_EQ ((FLMUNICODE)61) - #define FLM_UNICODE_GT ((FLMUNICODE)62) - #define FLM_UNICODE_QUEST ((FLMUNICODE)63) - #define FLM_UNICODE_ATSIGN ((FLMUNICODE)64) - - #define FLM_UNICODE_A ((FLMUNICODE)65) - #define FLM_UNICODE_B ((FLMUNICODE)66) - #define FLM_UNICODE_C ((FLMUNICODE)67) - #define FLM_UNICODE_D ((FLMUNICODE)68) - #define FLM_UNICODE_E ((FLMUNICODE)69) - #define FLM_UNICODE_F ((FLMUNICODE)70) - #define FLM_UNICODE_G ((FLMUNICODE)71) - #define FLM_UNICODE_H ((FLMUNICODE)72) - #define FLM_UNICODE_I ((FLMUNICODE)73) - #define FLM_UNICODE_J ((FLMUNICODE)74) - #define FLM_UNICODE_K ((FLMUNICODE)75) - #define FLM_UNICODE_L ((FLMUNICODE)76) - #define FLM_UNICODE_M ((FLMUNICODE)77) - #define FLM_UNICODE_N ((FLMUNICODE)78) - #define FLM_UNICODE_O ((FLMUNICODE)79) - #define FLM_UNICODE_P ((FLMUNICODE)80) - #define FLM_UNICODE_Q ((FLMUNICODE)81) - #define FLM_UNICODE_R ((FLMUNICODE)82) - #define FLM_UNICODE_S ((FLMUNICODE)83) - #define FLM_UNICODE_T ((FLMUNICODE)84) - #define FLM_UNICODE_U ((FLMUNICODE)85) - #define FLM_UNICODE_V ((FLMUNICODE)86) - #define FLM_UNICODE_W ((FLMUNICODE)87) - #define FLM_UNICODE_X ((FLMUNICODE)88) - #define FLM_UNICODE_Y ((FLMUNICODE)89) - #define FLM_UNICODE_Z ((FLMUNICODE)90) - - #define FLM_UNICODE_LBRACKET ((FLMUNICODE)91) - #define FLM_UNICODE_BACKSLASH ((FLMUNICODE)92) - #define FLM_UNICODE_RBRACKET ((FLMUNICODE)93) - #define FLM_UNICODE_UNDERSCORE ((FLMUNICODE)95) - - #define FLM_UNICODE_a ((FLMUNICODE)97) - #define FLM_UNICODE_b ((FLMUNICODE)98) - #define FLM_UNICODE_c ((FLMUNICODE)99) - #define FLM_UNICODE_d ((FLMUNICODE)100) - #define FLM_UNICODE_e ((FLMUNICODE)101) - #define FLM_UNICODE_f ((FLMUNICODE)102) - #define FLM_UNICODE_g ((FLMUNICODE)103) - #define FLM_UNICODE_h ((FLMUNICODE)104) - #define FLM_UNICODE_i ((FLMUNICODE)105) - #define FLM_UNICODE_j ((FLMUNICODE)106) - #define FLM_UNICODE_k ((FLMUNICODE)107) - #define FLM_UNICODE_l ((FLMUNICODE)108) - #define FLM_UNICODE_m ((FLMUNICODE)109) - #define FLM_UNICODE_n ((FLMUNICODE)110) - #define FLM_UNICODE_o ((FLMUNICODE)111) - #define FLM_UNICODE_p ((FLMUNICODE)112) - #define FLM_UNICODE_q ((FLMUNICODE)113) - #define FLM_UNICODE_r ((FLMUNICODE)114) - #define FLM_UNICODE_s ((FLMUNICODE)115) - #define FLM_UNICODE_t ((FLMUNICODE)116) - #define FLM_UNICODE_u ((FLMUNICODE)117) - #define FLM_UNICODE_v ((FLMUNICODE)118) - #define FLM_UNICODE_w ((FLMUNICODE)119) - #define FLM_UNICODE_x ((FLMUNICODE)120) - #define FLM_UNICODE_y ((FLMUNICODE)121) - #define FLM_UNICODE_z ((FLMUNICODE)122) - - #define FLM_UNICODE_LBRACE ((FLMUNICODE)123) - #define FLM_UNICODE_PIPE ((FLMUNICODE)124) - #define FLM_UNICODE_RBRACE ((FLMUNICODE)125) - #define FLM_UNICODE_TILDE ((FLMUNICODE)126) - #define FLM_UNICODE_C_CEDILLA ((FLMUNICODE)199) - #define FLM_UNICODE_N_TILDE ((FLMUNICODE)209) - #define FLM_UNICODE_c_CEDILLA ((FLMUNICODE)231) - #define FLM_UNICODE_n_TILDE ((FLMUNICODE)241) - - /**************************************************************************** - Desc: Byte order macros - ****************************************************************************/ - - FINLINE FLMUINT32 byteToLong( - FLMBYTE * pucBuf) - { - FLMUINT32 ui32Val = 0; - - ui32Val |= ((FLMUINT32)pucBuf[ 0]) << 24; - ui32Val |= ((FLMUINT32)pucBuf[ 1]) << 16; - ui32Val |= ((FLMUINT32)pucBuf[ 2]) << 8; - ui32Val |= ((FLMUINT32)pucBuf[ 3]); - - return( ui32Val); - } - - FINLINE FLMUINT64 byteToLong64( - FLMBYTE * pucBuf) - { - FLMUINT64 ui64Val = 0; - - ui64Val |= ((FLMUINT64)pucBuf[ 0]) << 56; - ui64Val |= ((FLMUINT64)pucBuf[ 1]) << 48; - ui64Val |= ((FLMUINT64)pucBuf[ 2]) << 40; - ui64Val |= ((FLMUINT64)pucBuf[ 3]) << 32; - ui64Val |= ((FLMUINT64)pucBuf[ 4]) << 24; - ui64Val |= ((FLMUINT64)pucBuf[ 5]) << 16; - ui64Val |= ((FLMUINT64)pucBuf[ 6]) << 8; - ui64Val |= ((FLMUINT64)pucBuf[ 7]); - - return( ui64Val); - } - - FINLINE FLMUINT16 byteToInt( - FLMBYTE * pucBuf) - { - FLMUINT16 ui16Val = 0; - - ui16Val |= ((FLMUINT16)pucBuf[ 0]) << 8; - ui16Val |= ((FLMUINT16)pucBuf[ 1]); - - return( ui16Val); - } - - FINLINE void longToByte( - FLMINT32 i32Num, - FLMBYTE * pucBuf) - { - FLMUINT32 ui32Temp = (FLMUINT32)(i32Num); - FLMBYTE * pucTemp = pucBuf; - - pucTemp[ 0] = (FLMBYTE) (ui32Temp >> 24); - pucTemp[ 1] = (FLMBYTE) (ui32Temp >> 16); - pucTemp[ 2] = (FLMBYTE) (ui32Temp >> 8); - pucTemp[ 3] = (FLMBYTE) (ui32Temp); - } - - FINLINE void long64ToByte( - FLMINT64 i64Num, - FLMBYTE * pucBuf) - { - FLMUINT64 ui64Temp = (FLMUINT64)i64Num; - FLMBYTE * pucTemp = pucBuf; - - pucTemp[ 0] = (FLMBYTE) (ui64Temp >> 56); - pucTemp[ 1] = (FLMBYTE) (ui64Temp >> 48); - pucTemp[ 2] = (FLMBYTE) (ui64Temp >> 40); - pucTemp[ 3] = (FLMBYTE) (ui64Temp >> 32); - pucTemp[ 4] = (FLMBYTE) (ui64Temp >> 24); - pucTemp[ 5] = (FLMBYTE) (ui64Temp >> 16); - pucTemp[ 6] = (FLMBYTE) (ui64Temp >> 8); - pucTemp[ 7] = (FLMBYTE) (ui64Temp); - } - - FINLINE void intToByte( - FLMINT16 i16Num, - FLMBYTE * pucBuf) - { - FLMUINT16 ui16Temp = (FLMUINT16)i16Num; - FLMBYTE * pucTemp = pucBuf; - - pucTemp[ 0] = (FLMBYTE) (ui16Temp >> 8); - pucTemp[ 1] = (FLMBYTE) (ui16Temp); - } - - #ifndef FLM_BIG_ENDIAN - - #if defined( FLM_SPARC) || defined( FLM_POWER_PC) - #error Wrong endian order selected - #endif - - #define LO(wrd) \ - (*(FLMUINT8 *)&wrd) - - #define HI(wrd) \ - (*((FLMUINT8 *)&wrd + 1)) - - #if( defined( FLM_UNIX) && defined( FLM_STRICT_ALIGNMENT)) - - #define FB2UW( bp) \ - ((FLMUINT16)((((FLMUINT16)(((FLMUINT8 *)(bp))[1]))<<8) | \ - (((FLMUINT16)(((FLMUINT8 *)(bp))[0]))))) - - #define FB2UD( bp) \ - ((FLMUINT32)( (((FLMUINT32)(((FLMUINT8 *)(bp))[3]))<<24) | \ - (((FLMUINT32)(((FLMUINT8 *)(bp))[2]))<<16) | \ - (((FLMUINT32)(((FLMUINT8 *)(bp))[1]))<< 8) | \ - (((FLMUINT32)(((FLMUINT8 *)(bp))[0]))))) - - #define UW2FBA( uw, bp) \ - (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)(uw)), \ - ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)((((uw) & 0xff00)>>8)))) - - #define UD2FBA( udw, bp) \ - (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)((udw) & 0xff)), \ - ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)(((udw) & 0xff00)>>8)), \ - ((FLMUINT8 *)(bp))[2] = ((FLMUINT8)(((udw) & 0xff0000)>>16)), \ - ((FLMUINT8 *)(bp))[3] = ((FLMUINT8)(((udw) & 0xff000000)>>24))) - - #else - - #define FB2UW( fbp) \ - (*((FLMUINT16 *)(fbp))) - - #define FB2UD( fbp) \ - (*((FLMUINT32 *)(fbp))) - - #define UW2FBA( uw, fbp) \ - (*((FLMUINT16 *)(fbp)) = ((FLMUINT16) (uw))) - - #define UD2FBA( uw, fbp) \ - (*((FLMUINT32 *)(fbp)) = ((FLMUINT32) (uw))) - - #endif - - #else - - #if defined( __i386__) - #error Wrong endian order selected - #endif - - #define LO(wrd) \ - (*((FLMUINT8 *)&wrd + 1)) - - #define HI(wrd) \ - (*(FLMUINT8 *)&wrd) - - #define FB2UW( bp) \ - ((FLMUINT16)((((FLMUINT16)(((FLMUINT8 *)(bp))[1])) << 8) | \ - (((FLMUINT16)(((FLMUINT8 *)(bp))[0])) ) )) - - #define FB2UD( bp) \ - ((FLMUINT32)((((FLMUINT32)(((FLMUINT8 *)(bp))[3])) << 24) | \ - (((FLMUINT32)(((FLMUINT8 *)(bp))[2])) << 16) | \ - (((FLMUINT32)(((FLMUINT8 *)(bp))[1])) << 8) | \ - (((FLMUINT32)(((FLMUINT8 *)(bp))[0])) ) )) - - #define UW2FBA( uw, bp) \ - (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)(uw)), \ - ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)((((uw) & 0xff00)>>8)))) - - #define UD2FBA( udw, bp) \ - (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)((udw) & 0xff)), \ - ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)(((udw) & 0xff00)>>8)), \ - ((FLMUINT8 *)(bp))[2] = ((FLMUINT8)(((udw) & 0xff0000)>>16)), \ - ((FLMUINT8 *)(bp))[3] = ((FLMUINT8)(((udw) & 0xff000000)>>24))) - #endif - - /**************************************************************************** - Desc: File Path Functions & Macros - ****************************************************************************/ - - #if defined( FLM_WIN) || defined( FLM_NLM) - #define FWSLASH '/' - #define SLASH '\\' - #define SSLASH "\\" - #define COLON ':' - #define PERIOD '.' - #define PARENT_DIR ".." - #define CURRENT_DIR "." - #else - #ifndef FWSLASH - #define FWSLASH '/' - #endif - - #ifndef SLASH - #define SLASH '/' - #endif - - #ifndef SSLASH - #define SSLASH "/" - #endif - - #ifndef COLON - #define COLON ':' - #endif - - #ifndef PERIOD - #define PERIOD '.' - #endif - - #ifndef PARENT_DIR - #define PARENT_DIR ".." - #endif - - #ifndef CURRENT_DIR - #define CURRENT_DIR "." - #endif - #endif - - /**************************************************************************** - Desc: CPU Release Functions - ****************************************************************************/ - - #ifdef FLM_NLM - #define f_yieldCPU() \ - NWYieldIfTime() - #else - #define f_yieldCPU() - #endif - - void f_sleep( - FLMUINT uiMilliseconds); - - #ifdef FLM_WIN - #define f_sleep( uiMilliseconds) \ - Sleep( (DWORD)uiMilliseconds) - #endif - - /**************************************************************************** - Desc: Mutexes - ****************************************************************************/ - - #if defined( FLM_WIN) - - RCODE f_mutexCreate( - F_MUTEX * phMutex); - - void f_mutexDestroy( - F_MUTEX * phMutex); - - FINLINE void f_mutexLock( - F_MUTEX hMutex) - { - (void)EnterCriticalSection( (CRITICAL_SECTION *)hMutex); - } - - FINLINE void f_mutexUnlock( - F_MUTEX hMutex) - { - (void)LeaveCriticalSection( (CRITICAL_SECTION *)hMutex); - } - - #elif defined( FLM_UNIX) - - RCODE f_mutexCreate( - F_MUTEX * phMutex); - - void f_mutexDestroy( - F_MUTEX * phMutex); - - void f_mutexLock( - F_MUTEX hMutex); - - void f_mutexUnlock( - F_MUTEX hMutex); - - #endif - - - /**************************************************************************** - Desc: Semaphores - ****************************************************************************/ - - #if defined( FLM_WIN) - - typedef HANDLE F_SEM; - typedef HANDLE * F_SEM_p; - #define F_SEM_NULL NULL - - #elif defined( FLM_UNIX) - - #if defined( FLM_AIX) || defined( FLM_OSX) - - typedef struct - { - pthread_mutex_t lock; - pthread_cond_t cond; - int count; - } sema_t; - - int sema_init( sema_t * sem); - - void sema_destroy( sema_t * sem); - - void p_operation_cleanup( void * arg); - - int sema_wait( sema_t * sem); - - int sema_timedwait( sema_t * sem, unsigned int uiTimeout); - - int sema_signal( sema_t * sem); - - #else - - #include - - #endif - - typedef F_SEM * F_SEM_p; - #define F_SEM_NULL NULL - - #elif !defined( FLM_NLM) - #error Unsupported platform - #endif - - #if defined( FLM_WIN) - - FINLINE RCODE f_semCreate( - F_SEM * phSem) - { - if( (*phSem = CreateSemaphore( (LPSECURITY_ATTRIBUTES)NULL, - 0, 10000, NULL )) == NULL) - { - return( RC_SET( FERR_MUTEX_OPERATION_FAILED)); - } - - return FERR_OK; - } - - FINLINE void f_semDestroy( - F_SEM * phSem) - { - if (*phSem != F_SEM_NULL) - { - CloseHandle( *phSem); - *phSem = F_SEM_NULL; - } - } - - FINLINE RCODE f_semWait( - F_SEM hSem, - FLMUINT uiTimeout) - { - if( WaitForSingleObject( hSem, uiTimeout ) == WAIT_OBJECT_0) - { - return( FERR_OK); - } - else - { - return( RC_SET( FERR_MUTEX_UNABLE_TO_LOCK)); - } - } - - FINLINE void f_semSignal( - F_SEM hSem) - { - (void)ReleaseSemaphore( hSem, 1, NULL); - } - - #elif defined( FLM_UNIX) - - void f_semDestroy( - F_SEM * phSem); - - RCODE f_semCreate( - F_SEM * phSem); - - RCODE f_semWait( - F_SEM hSem, - FLMUINT uiTimeout); - - FINLINE void f_semSignal( - F_SEM hSem) - { - #if defined( FLM_AIX) || defined( FLM_OSX) - (void)sema_signal( (sema_t *)hSem); - #else - (void)sem_post( (sem_t *)hSem); - #endif - } - #endif - - /**************************************************************************** - Desc: Random numbers - ****************************************************************************/ - - #define MAX_RANDOM 2147483646L - - typedef struct - { - FLMINT32 i32Seed; - } f_randomGenerator; - - void f_randomize( - f_randomGenerator * pRand); - - void f_randomSetSeed( - f_randomGenerator * pRand, - FLMINT32 i32seed); - - FLMINT32 f_randomLong( - f_randomGenerator * pRand); - - FLMINT32 f_randomChoice( - f_randomGenerator * pRand, - FLMINT32 lo, - FLMINT32 hi); - - FLMINT f_randomTruth( - f_randomGenerator * pRand, - FLMINT iPercentageTrue); - - /**************************************************************************** - Desc: Time, date, timestamp functions - ****************************************************************************/ - typedef struct - { - FLMUINT16 year; - FLMBYTE month; - FLMBYTE day; - } F_DATE, * F_DATE_p; - - typedef struct - { - FLMBYTE hour; - FLMBYTE minute; - FLMBYTE second; - FLMBYTE hundredth; - } F_TIME, * F_TIME_p; - - typedef struct - { - FLMUINT16 year; - FLMBYTE month; - FLMBYTE day; - FLMBYTE hour; - FLMBYTE minute; - FLMBYTE second; - FLMBYTE hundredth; - } F_TMSTAMP, * F_TMSTAMP_p; - - void f_timeGetSeconds( - FLMUINT * puiSeconds); - - void f_timeGetTimeStamp( - F_TMSTAMP * pTimeStamp); - - FLMINT f_timeGetLocalOffset( void); - - void f_timeSecondsToDate( - FLMUINT uiSeconds, - F_TMSTAMP * pTimeStamp); - - void f_timeDateToSeconds( - F_TMSTAMP * pTimeStamp, - FLMUINT * puiSeconds); - - FLMINT f_timeCompareTimeStamps( - F_TMSTAMP * pTimeStamp1, - F_TMSTAMP * pTimeStamp2, - FLMUINT uiFlag); - - #if defined( FLM_UNIX) - unsigned f_timeGetMilliTime(); - #endif - - /********************************************************************** - Desc: Atomic Increment, Decrement, Exchange - Note: Some of this code is derived from the Ximian source code contained - in that Mono project's atomic.h file. - **********************************************************************/ - #ifndef FLM_HAVE_ATOMICS - #define FLM_HAVE_ATOMICS - #endif - - /******************************************************************* - Desc: - *******************************************************************/ - #if defined( FLM_GNUC) && defined( __ia64__) - FINLINE FLMINT32 ia64_compare_and_swap( - volatile int * piTarget, - FLMINT32 i32NewVal, - FLMINT32 i32CompVal) - { - FLMINT32 i32Old; - - asm volatile ("mov ar.ccv = %2 ;;\n\t" - "cmpxchg4.acq %0 = [%1], %3, ar.ccv\n\t" - : "=r" (i32Old) : "r" (piTarget), - "r" (i32CompVal), - "r" (i32NewVal)); - - return( i32Old); - } - #endif - - /********************************************************************** - Desc: - **********************************************************************/ - #if defined( FLM_SPARC) && defined( FLM_SOLARIS) && !defined( FLM_GNUC) - extern "C" FLMINT32 sparc_atomic_add_32( - volatile FLMINT32 * piTarget, - FLMINT32 iDelta); - #endif - - /********************************************************************** - Desc: - **********************************************************************/ - #if defined( FLM_SPARC) && defined( FLM_SOLARIS) && !defined( FLM_GNUC) - extern "C" FLMINT32 sparc_atomic_xchg_32( - volatile FLMINT32 * piTarget, - FLMINT32 iNewValue); - #endif - - /********************************************************************** - Desc: - **********************************************************************/ - #if defined( FLM_AIX) - FINLINE int aix_atomic_add( - volatile int * piTarget, - int iDelta) - { - return( fetch_and_add( (int *)piTarget, iDelta) + iDelta); - } - #endif - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 _flmAtomicInc( - FLMATOMIC * piTarget) - { - #if defined( FLM_NLM) - { - return( (FLMINT32)nlm_AtomicIncrement( (volatile LONG *)piTarget)); - } - #elif defined( FLM_WIN) - { - return( (FLMINT32)InterlockedIncrement( (volatile LONG *)piTarget)); - } - #elif defined( FLM_AIX) - { - return( (FLMINT32)aix_atomic_add( piTarget, 1)); - } - #elif defined( FLM_GNUC) - { - #if defined( __i386__) || defined( __x86_64__) - { - FLMINT32 i32Tmp; - - __asm__ __volatile__ ("lock; xaddl %0, %1" - : "=r" (i32Tmp), "=m" (*piTarget) - : "0" (1), "m" (*piTarget)); - - return( i32Tmp + 1); - } - #elif defined( __ppc__) || defined ( __powerpc__) - { - FLMINT32 i32Result = 0; - FLMINT32 i32Tmp; - - __asm__ __volatile__ ("\n1:\n\t" - "lwarx %0, 0, %2\n\t" - "addi %1, %0, 1\n\t" - "stwcx. %1, 0, %2\n\t" - "bne- 1b" - : "=&b" (i32Result), "=&b" (i32Tmp) - : "r" (piTarget) : "cc", "memory"); - - return( i32Result + 1); - } - #elif defined( __ia64__) - { - FLMINT32 i32Old; - - for( ;;) - { - i32Old = (FLMINT32)*piTarget; - - if( ia64_compare_and_swap( piTarget, - i32Old + 1, i32Old) == i32Old) - { - break; - } - } - - return( i32Old + 1); - } - #elif defined( __s390__) - { - FLMINT32 i32Tmp; - - __asm__ __volatile__ ("\tLA\t2,%1\n" - "0:\tL\t%0,%1\n" - "\tLR\t1,%0\n" - "\tAHI\t1,1\n" - "\tCS\t%0,1,0(2)\n" - "\tJNZ\t0b\n" - "\tLR\t%0,1" - : "=r" (i32Tmp), "+m" (*piTarget) - : : "1", "2", "cc"); - - return( i32Tmp); - } - #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - - flmAssert( 0); - return( 0); - #endif - } - #elif defined( FLM_SOLARIS) && defined( FLM_SPARC) - return( sparc_atomic_add_32( piTarget, 1)); - #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - - flmAssert( 0); - return( 0); - #endif - } - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 _flmAtomicDec( - FLMATOMIC * piTarget) - { - #if defined( FLM_NLM) - { - return( (FLMINT32)nlm_AtomicDecrement( (volatile LONG *)piTarget)); - } - #elif defined( FLM_WIN) - { - return( (FLMINT32)InterlockedDecrement( (volatile LONG *)piTarget)); - } - #elif defined( FLM_AIX) - { - return( (FLMINT32)aix_atomic_add( piTarget, -1)); - } - #elif defined( FLM_GNUC) - { - #if defined( __i386__) || defined( __x86_64__) - { - FLMINT32 i32Tmp; - - __asm__ __volatile__ ("lock; xaddl %0, %1" - : "=r" (i32Tmp), "=m" (*piTarget) - : "0" (-1), "m" (*piTarget)); - - return( i32Tmp - 1); - } - #elif defined( __ppc__) || defined ( __powerpc__) - { - FLMINT32 i32Result = 0; - FLMINT32 i32Tmp; - - __asm__ __volatile__ ("\n1:\n\t" - "lwarx %0, 0, %2\n\t" - "addi %1, %0, -1\n\t" - "stwcx. %1, 0, %2\n\t" - "bne- 1b" - : "=&b" (i32Result), "=&b" (i32Tmp) - : "r" (piTarget) : "cc", "memory"); - - return( i32Result - 1); - } - #elif defined( __ia64__) - { - FLMINT32 i32Old; - - for( ;;) - { - i32Old = (FLMINT32)*piTarget; - - if( ia64_compare_and_swap( piTarget, i32Old - 1, - i32Old) == i32Old) - { - break; - } - } - - return( i32Old - 1); - } - #elif defined( __s390__) - { - FLMINT32 i32Tmp; - - __asm__ __volatile__ ("\tLA\t2,%1\n" - "0:\tL\t%0,%1\n" - "\tLR\t1,%0\n" - "\tAHI\t1,-1\n" - "\tCS\t%0,1,0(2)\n" - "\tJNZ\t0b\n" - "\tLR\t%0,1" - : "=r" (i32Tmp), "+m" (*piTarget) - : : "1", "2", "cc"); - - return( i32Tmp); - } - #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - - flmAssert( 0); - return( 0); - #endif - } - #elif defined( FLM_SOLARIS) && defined( FLM_SPARC) - return( sparc_atomic_add_32( piTarget, -1)); - #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - - flmAssert( 0); - return( 0); - #endif - } - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 _flmAtomicExchange( - FLMATOMIC * piTarget, - FLMINT32 i32NewVal) - { - #if defined( FLM_NLM) - { - return( (FLMINT32)nlm_AtomicExchange( - (volatile LONG *)piTarget, i32NewVal)); - } - #elif defined( FLM_WIN) - { - return( (FLMINT32)InterlockedExchange( (volatile LONG *)piTarget, - i32NewVal)); - } - #elif defined( FLM_AIX) - { - int iOldVal; - - for( ;;) - { - iOldVal = (int)*piTarget; - - if( compare_and_swap( (int *)piTarget, &iOldVal, i32NewVal)) - { - break; - } - } - - return( (FLMINT32)iOldVal); - } - #elif defined( FLM_GNUC) - { - #if defined( __i386__) || defined( __x86_64__) - { - FLMINT32 i32Ret; - - __asm__ __volatile__ ("1:; lock; cmpxchgl %2, %0; jne 1b" - : "=m" (*piTarget), "=a" (i32Ret) - : "r" (i32NewVal), "m" (*piTarget), - "a" (*piTarget)); - - return( i32Ret); - } - #elif defined( __ppc__) || defined ( __powerpc__) - { - FLMINT32 i32Tmp = 0; - - __asm__ __volatile__ ("\n1:\n\t" - "lwarx %0, 0, %2\n\t" - "stwcx. %3, 0, %2\n\t" - "bne 1b" - : "=r" (i32Tmp) : "0" (i32Tmp), - "b" (piTarget), - "r" (i32NewVal) : "cc", "memory"); - - return( i32Tmp); - } - #elif defined( __ia64__) - { - FLMINT32 i32Result; - - for( ;;) - { - i32Result = (FLMINT32)*piTarget; - - if( ia64_compare_and_swap( piTarget, - i32NewVal, i32Result) == i32Result) - { - break; - } - } - - return( i32Result); - } - #elif defined( __s390__) - { - FLMINT32 i32Ret; - - __asm__ __volatile__ ("\tLA\t1,%0\n" - "0:\tL\t%1,%0\n" - "\tCS\t%1,%2,0(1)\n" - "\tJNZ\t0b" - : "+m" (*piTarget), "=r" (i32Ret) - : "r" (i32NewVal) - : "1", "cc"); - - return( i32Ret); - } - #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - F_UNREFERENCED_PARM( i32NewVal); - - flmAssert( 0); - return( 0); - #endif - } - #elif defined( FLM_SOLARIS) && defined( FLM_SPARC) - return( sparc_atomic_xchg_32( piTarget, i32NewVal)); - #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - F_UNREFERENCED_PARM( i32NewVal); - - flmAssert( 0); - return( 0); - #endif - } - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 flmAtomicInc( - FLMATOMIC * piTarget, - F_MUTEX hMutex = F_MUTEX_NULL, - FLMBOOL bMutexAlreadyLocked = FALSE) - { - #ifdef FLM_HAVE_ATOMICS - F_UNREFERENCED_PARM( bMutexAlreadyLocked); - F_UNREFERENCED_PARM( hMutex); - - return( _flmAtomicInc( piTarget)); - #else - { - FLMINT32 i32NewVal; - - flmAssert( hMutex != F_MUTEX_NULL); - - if( !bMutexAlreadyLocked) - { - f_mutexLock( hMutex); - } - - i32NewVal = (FLMINT32)(++(*piTarget)); - - if( !bMutexAlreadyLocked) - { - f_mutexUnlock( hMutex); - } - - return( i32NewVal); - } - #endif - } - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 flmAtomicDec( - FLMATOMIC * piTarget, - F_MUTEX hMutex = F_MUTEX_NULL, - FLMBOOL bMutexAlreadyLocked = FALSE) - { - #ifdef FLM_HAVE_ATOMICS - F_UNREFERENCED_PARM( bMutexAlreadyLocked); - F_UNREFERENCED_PARM( hMutex); - - return( _flmAtomicDec( piTarget)); - #else - { - FLMINT32 i32NewVal; - - flmAssert( hMutex != F_MUTEX_NULL); - - if( !bMutexAlreadyLocked) - { - f_mutexLock( hMutex); - } - - i32NewVal = (FLMINT32)(--(*piTarget)); - - if( !bMutexAlreadyLocked) - { - f_mutexUnlock( hMutex); - } - - return( i32NewVal); - } - #endif - } - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 flmAtomicExchange( - FLMATOMIC * piTarget, - FLMINT32 i32NewVal, - F_MUTEX hMutex = F_MUTEX_NULL, - FLMBOOL bMutexAlreadyLocked = FALSE) - { - #ifdef FLM_HAVE_ATOMICS - F_UNREFERENCED_PARM( bMutexAlreadyLocked); - F_UNREFERENCED_PARM( hMutex); - - return( _flmAtomicExchange( piTarget, i32NewVal)); - #else - { - FLMINT32 i32OldVal; - - flmAssert( hMutex != F_MUTEX_NULL); - - if( !bMutexAlreadyLocked) - { - f_mutexLock( hMutex); - } - - i32OldVal = (FLMINT32)*piTarget; - *piTarget = i32NewVal; - - if( !bMutexAlreadyLocked) - { - f_mutexUnlock( hMutex); - } - - return( i32OldVal); - } - #endif - } - - /**************************************************************************** - Pseudo Serial Numbers - ****************************************************************************/ - - RCODE f_initSerialNumberGenerator( void); - - RCODE f_createSerialNumber( - FLMBYTE * pszGuid); - - void f_freeSerialNumberGenerator( void); - - /**************************************************************************** - CRC - ****************************************************************************/ - - RCODE f_initCRCTable( - FLMUINT32 ** ppui32CRCTbl); - - void f_updateCRC( - FLMUINT32 * pui32CRCTbl, - FLMBYTE * pucBlk, - FLMUINT uiBlkSize, - FLMUINT32 * pui32CRC); - - #define f_freeCRCTable( ppui32CRCTbl) \ - f_free( ppui32CRCTbl) - - /**************************************************************************** - Desc: Returns TRUE if the passed-in character is 0-9, a-f, or A-F - ****************************************************************************/ - FINLINE FLMBOOL f_isHexChar( - FLMBYTE ucChar) - { - if( (ucChar >= '0' && ucChar <= '9') || - (ucChar >= 'A' && ucChar <= 'F') || - (ucChar >= 'a' && ucChar <= 'f')) - { - return( TRUE); - } - - return( FALSE); - } - - /**************************************************************************** - Desc: Returns the base-10 equivalent of a hex character - ****************************************************************************/ - FINLINE FLMBYTE f_getHexVal( - FLMBYTE ucChar) - { - if( ucChar >= '0' && ucChar <= '9') - { - return( (FLMBYTE)(ucChar - '0')); - } - else if( ucChar >= 'A' && ucChar <= 'F') - { - return( (FLMBYTE)((ucChar - 'A') + 10)); - } - else if( ucChar >= 'a' && ucChar <= 'f') - { - return( (FLMBYTE)((ucChar - 'a') + 10)); - } - - return( 0); - } - - /**************************************************************************** - Desc: Process ID Functions - ****************************************************************************/ - - #if defined( FLM_WIN) - - FINLINE FLMUINT f_getpid() - { - return _getpid(); - } - - #elif defined( FLM_UNIX) - - pid_t getpid( void); - - FINLINE FLMUINT f_getpid() - { - return getpid(); - } - - #elif defined( FLM_NLM) - - FINLINE FLMUINT f_getpid() - { - return( f_getNLMHandle()); - } - - #endif - - typedef struct - { - char * pszDestStr; - } F_SPRINTF_INFO; - - void flmSprintfStringFormatter( - char ucFormatChar, - FLMUINT uiWidth, - FLMUINT uiPrecision, - FLMUINT uiFlags, - F_SPRINTF_INFO * pInfo, - f_va_list * args); - - FLMINT f_vsprintf( - char * pszDestStr, - const char * pszFormat, - f_va_list * args); - - typedef FLMINT (* F_SORT_COMPARE_FUNC)( - void * pvBuffer, - FLMUINT uiPos1, - FLMUINT uiPos2); - - typedef void (* F_SORT_SWAP_FUNC)( - void * pvBuffer, - FLMUINT uiPos1, - FLMUINT uiPos2); - - void f_qsort( - void * pvBuffer, - FLMUINT uiLowerBounds, - FLMUINT uiUpperBounds, - F_SORT_COMPARE_FUNC fnCompare, - F_SORT_SWAP_FUNC fnSwap); - - FLMINT flmQSortUINTCompare( - void * pvBuffer, - FLMUINT uiPos1, - FLMUINT uiPos2); - - void flmQSortUINTSwap( - void * pvBuffer, - FLMUINT uiPos1, - FLMUINT uiPos2); - - /**************************************************************************** - Desc: Module Load/Unload Functions - ****************************************************************************/ - - typedef void * FlmModHandle; - - RCODE FlmModLoad( - const char * pszName, - FlmModHandle * phMod); - - #ifndef FLM_NLM - RCODE FlmModUnload( - FlmModHandle * phMod); - #else - RCODE FlmModUnload( - const char * pszModPath); - #endif - - RCODE FlmSymLoad( - const char * pszName, - FlmModHandle hMod, - void ** ppvSym); - - RCODE FlmSymUnload( - const char * pszName); - - char * f_strchr( - const char * pszStr, - char c); - -#include "fpackoff.h" -#endif +//------------------------------------------------------------------------- +// Desc: Toolkit - cross platform APIs for system functionality. +// Tabs: 3 +// +// Copyright (c) 1991-2006 Novell, Inc. All Rights Reserved. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of version 2 of the GNU General Public +// License as published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, contact Novell, Inc. +// +// To contact Novell about this file by physical or electronic mail, +// you may find current contact information at www.novell.com +// +// $Id: ftk.h 12334 2006-01-23 12:45:35 -0700 (Mon, 23 Jan 2006) dsanders $ +//------------------------------------------------------------------------- + +#ifndef FTK_H +#define FTK_H + + #if defined( FLM_DEBUG) && !defined( FLM_HPUX) + #define f_new new( __FILE__, __LINE__) + #else + #define f_new new + #endif + + #ifdef FLM_DEBUG + #define RC_SET( rc) \ + flmMakeErr(rc, __FILE__, __LINE__) + + RCODE flmMakeErr( + RCODE rc, + const char * pszFile, + int iLine); + #else + #define RC_SET(rc) (rc) + #endif + + #define F_SEM_WAITFOREVER 0xFFFFFFFF + + #ifdef FLM_NLM + #include "ftknlm.h" + #elif defined( FLM_WIN) + + #define FSTATIC static + + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + + #ifndef WIN32_EXTRA_LEAN + #define WIN32_EXTRA_LEAN + #endif + + // This pragma is needed because FLAIM may be built with a + // packing other than 8-bytes on Win (such as 1-byte packing). + // Code in FLAIM that uses windows structures and system calls + // MUST use 8-byte packing (the packing used by the O/S). + // See Microsoft technical article Q117388. + + #pragma pack( push, enter_windows, 8) + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #pragma pack( pop, enter_windows) + + // Conversion from XXX to YYY, possible loss of data + + #pragma warning( disable : 4244) + + // Local variable XXX may be used without having been initialized + + #pragma warning( disable : 4701) + + // Function XXX not inlined + + #pragma warning( disable : 4710) + + #define f_stricmp( str1, str2) \ + _stricmp( (str1), (str2)) + + #define f_strnicmp( str1, str2, size) \ + _strnicmp( (str1), (str2),(size_t)(size)) + + #define f_memcpy( dest, src, size) \ + memcpy((void *)(dest), (void *)(src),(size_t)(size)) + + #define f_memmove( dest, src, length) \ + memmove((void *)(dest), (void *)(src),(size_t)(length)) + + #define f_memset( src, chr, size) \ + memset((void *)(src),(chr),(size_t)(size)) + + #define f_memcmp( str1, str2, length) \ + memcmp((void *)(str1), (void *)(str2),(size_t)(length)) + + #define f_strcat( dest, src) \ + strcat( (char*)(dest), (char*)(src)) + + #define f_strcmp( str1, str2) \ + strcmp( (char*)(str1), (char*)(str2)) + + #define f_strcpy( dest, src) \ + strcpy( (char*)(dest), (char*)(src)) + + #define f_strncpy( dest, src, length) \ + strncpy( (char*)(dest), (char*)(src), (size_t)(length)) + + #define f_strlen( str) \ + ((FLMUINT)strlen( (char*)(str))) + + #define f_strncmp( str1, str2, size) \ + strncmp( (char*)(str1), (char*)(str2), (size_t)(size)) + + #define f_strrchr( str, value ) \ + strrchr( (char*)(str), (int)value) + + #define f_strstr( str1, str2) \ + strstr( (char*)(str1), (char*)(str2)) + + #define f_strncat( str1, str2, n) \ + strncat( (str1), (str2), n) + + #define f_strupr( str) \ + _strupr( (str)) + + #define f_va_list va_list + #define f_va_start va_start + #define f_va_arg va_arg + #define f_va_end va_end + + #elif defined( FLM_UNIX) + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #ifndef _POSIX_THREADS + #define _POSIX_THREADS + #endif + + #include + + #ifndef FLM_OSX + #include + #endif + + #ifdef FLM_AIX + #include + #endif + + #define FSTATIC static + + #define f_stricmp(str1,str2) \ + strcasecmp( (str1), (str2)) + + #define f_strnicmp(str1,str2,size_t) \ + strncasecmp( (str1), (str2),size_t) + + #define f_memcpy( dest, src, size) \ + memcpy( (void*)(dest), (void*)(src), size) + + #define f_memmove( dest, src, len) \ + memmove( (void*)(dest), (void*)(src), len) + + #define f_memset( src, chr, size) \ + memset((void *)(src),(chr),(size_t)(size)) + + #define f_memcmp( str1, str2, length) \ + memcmp((void *)(str1), (void *)(str2),(size_t)(length)) + + #define f_strcat( dest, src) \ + strcat( (char*)(dest), (char*)(src)) + + #define f_strcmp( str1, str2) \ + strcmp( (char*)(str1), (char*)(str2)) + + #define f_strcpy( dest, src) \ + strcpy( (char*)(dest), (char*)(src)) + + #define f_strncpy( dest, src, length) \ + strncpy( (char*)(dest), (char*)(src), (size_t)(length)) + + #define f_strlen( str) \ + strlen( (char*)(str)) + + #define f_strncmp( str1, str2, size) \ + strncmp( (char*)(str1), (char*)(str2), (size_t)(size)) + + #define f_strrchr( str, value ) \ + strrchr( (char*)(str), (int)value) + + #define f_strstr( str1, str2) \ + strstr( (char*)(str1), (char*)(str2)) + + #define f_strncat( str1, str2, n) \ + strncat( (str1), (str2), n) + + char * f_strupr( + char * pszStr); + + #define f_strupr( str) \ + f_strupr( (str)) + + #define f_va_list va_list + #define f_va_start va_start + #define f_va_arg va_arg + #define f_va_end va_end + + #ifndef INVALID_SOCKET + #define INVALID_SOCKET (-1) + #endif + + #ifndef INADDR_NONE + #define INADDR_NONE (-1) + #endif + + #ifndef SOCKET + #define SOCKET int + #endif + + #endif + + /**************************************************************************** + CROSS PLATFORM DEFINITIONS + ****************************************************************************/ + + #define F_UNREFERENCED_PARM( parm) \ + (void)parm + + #if defined( __va_copy) + #define f_va_copy(to, from) \ + __va_copy(to, from) + #else + #define f_va_copy(to, from) \ + ((to) = (from)) + #endif + + #define shiftN(data,size,distance) \ + f_memmove((FLMBYTE *)(data) + (FLMINT)(distance), \ + (FLMBYTE *)(data), (unsigned)(size)) + + /**************************************************************************** + FLAIM's Assert Layer + ****************************************************************************/ + + #ifndef FLM_DEBUG + #define flmAssert( exp) + #else + #ifdef FLM_DBG_LOG + void flmDbgLogFlush( void); + #endif + + #if defined( FLM_WIN) + #ifdef FLM_DBG_LOG + #define flmAssert( exp) \ + (void)( (exp) || (flmDbgLogFlush(), DebugBreak(), 0)) + #else + #define flmAssert( exp) \ + (void)( (exp) || (DebugBreak(), 0)) + #endif + + #elif defined( FLM_NLM) + #ifdef FLM_DBG_LOG + #define flmAssert( exp) \ + (void)( (exp) || (flmDbgLogFlush(), EnterDebugger(), 0)) + #else + #define flmAssert( exp) \ + (void)( (exp) || ( EnterDebugger(), 0)) + #endif + + #elif defined( FLM_UNIX) + #include + + #ifdef FLM_DBG_LOG + #define flmAssert( exp) \ + (void)( (exp) || (flmDbgLogFlush(), assert(0), 0)) + #else + #define flmAssert( exp) \ + (void)( (exp) || (assert(0), 0)) + #endif + + #else + #define flmAssert( exp) + #endif + + #endif + + #ifdef FLM_DEBUG + #define flmReleaseAssert( exp) flmAssert( exp) + #else + #if defined( FLM_WIN) + #define flmReleaseAssert( exp) \ + (void)( (exp) || (DebugBreak(), 0)) + + #elif defined( FLM_NLM) + #define flmReleaseAssert( exp) \ + (void)( (exp) || ( EnterDebugger(), 0)) + + #elif defined( FLM_UNIX) + #include + #define flmReleaseAssert( exp) \ + (void)( (exp) || (abort(), 0)) + #else + #define flmReleaseAssert( exp) + #endif + #endif + + + #include "fpackon.h" + + // IMPORTANT NOTE: No other include files should follow this one except + // for fpackoff.h + + FLMUINT f_breakpoint( + FLMUINT uiBreakFlag); + + /**************************************************************************** + Desc: ASCII Constants + ****************************************************************************/ + + #define ASCII_TAB 0x09 + #define ASCII_NEWLINE 0x0A + #define ASCII_CR 0x0D + #define ASCII_CTRLZ 0x1A + #define ASCII_SPACE 0x20 + #define ASCII_DQUOTE 0x22 + #define ASCII_POUND 0x23 + #define ASCII_DOLLAR 0x24 + #define ASCII_SQUOTE 0x27 + #define ASCII_WILDCARD 0x2A + #define ASCII_PLUS 0x2B + #define ASCII_COMMA 0x2C + #define ASCII_DASH 0x2D + #define ASCII_MINUS 0x2D + #define ASCII_DOT 0x2E + #define ASCII_SLASH 0x2F + #define ASCII_COLON 0x3A + #define ASCII_SEMICOLON 0x3B + #define ASCII_EQUAL 0x3D + #define ASCII_QUESTIONMARK 0x3F + #define ASCII_AT 0x40 + #define ASCII_BACKSLASH 0x5C + #define ASCII_CARAT 0x5E + #define ASCII_UNDERSCORE 0x5F + #define ASCII_TILDE 0x7E + #define ASCII_AMP 0x26 + + #define ASCII_UPPER_A 0x41 + #define ASCII_UPPER_B 0x42 + #define ASCII_UPPER_C 0x43 + #define ASCII_UPPER_D 0x44 + #define ASCII_UPPER_E 0x45 + #define ASCII_UPPER_F 0x46 + #define ASCII_UPPER_G 0x47 + #define ASCII_UPPER_H 0x48 + #define ASCII_UPPER_I 0x49 + #define ASCII_UPPER_J 0x4A + #define ASCII_UPPER_K 0x4B + #define ASCII_UPPER_L 0x4C + #define ASCII_UPPER_M 0x4D + #define ASCII_UPPER_N 0x4E + #define ASCII_UPPER_O 0x4F + #define ASCII_UPPER_P 0x50 + #define ASCII_UPPER_Q 0x51 + #define ASCII_UPPER_R 0x52 + #define ASCII_UPPER_S 0x53 + #define ASCII_UPPER_T 0x54 + #define ASCII_UPPER_U 0x55 + #define ASCII_UPPER_V 0x56 + #define ASCII_UPPER_W 0x57 + #define ASCII_UPPER_X 0x58 + #define ASCII_UPPER_Y 0x59 + #define ASCII_UPPER_Z 0x5A + + #define ASCII_LOWER_A 0x61 + #define ASCII_LOWER_B 0x62 + #define ASCII_LOWER_C 0x63 + #define ASCII_LOWER_D 0x64 + #define ASCII_LOWER_E 0x65 + #define ASCII_LOWER_F 0x66 + #define ASCII_LOWER_G 0x67 + #define ASCII_LOWER_H 0x68 + #define ASCII_LOWER_I 0x69 + #define ASCII_LOWER_J 0x6A + #define ASCII_LOWER_K 0x6B + #define ASCII_LOWER_L 0x6C + #define ASCII_LOWER_M 0x6D + #define ASCII_LOWER_N 0x6E + #define ASCII_LOWER_O 0x6F + #define ASCII_LOWER_P 0x70 + #define ASCII_LOWER_Q 0x71 + #define ASCII_LOWER_R 0x72 + #define ASCII_LOWER_S 0x73 + #define ASCII_LOWER_T 0x74 + #define ASCII_LOWER_U 0x75 + #define ASCII_LOWER_V 0x76 + #define ASCII_LOWER_W 0x77 + #define ASCII_LOWER_X 0x78 + #define ASCII_LOWER_Y 0x79 + #define ASCII_LOWER_Z 0x7A + + #define ASCII_ZERO 0x30 + #define ASCII_ONE 0x31 + #define ASCII_TWO 0x32 + #define ASCII_THREE 0x33 + #define ASCII_FOUR 0x34 + #define ASCII_FIVE 0x35 + #define ASCII_SIX 0x36 + #define ASCII_SEVEN 0x37 + #define ASCII_EIGHT 0x38 + #define ASCII_NINE 0x39 + + /**************************************************************************** + Desc: Native constants + ****************************************************************************/ + + #define NATIVE_SPACE ' ' + #define NATIVE_DOT '.' + #define NATIVE_PLUS '+' + #define NATIVE_MINUS '-' + #define NATIVE_WILDCARD '*' + #define NATIVE_QUESTIONMARK '?' + + #define NATIVE_UPPER_A 'A' + #define NATIVE_UPPER_F 'F' + #define NATIVE_UPPER_X 'X' + #define NATIVE_UPPER_Z 'Z' + #define NATIVE_LOWER_A 'a' + #define NATIVE_LOWER_F 'f' + #define NATIVE_LOWER_X 'x' + #define NATIVE_LOWER_Z 'z' + #define NATIVE_ZERO '0' + #define NATIVE_NINE '9' + + #define f_stringToAscii(str) + + #define f_toascii(native) \ + (native) + + #define f_tonative(ascii) \ + (ascii) + + #define f_toupper(native) \ + (((native) >= 'a' && (native) <= 'z') \ + ? (native) - 'a' + 'A' : (native)) + + #define f_tolower(native) \ + (((native) >= 'A' && (native) <= 'Z') \ + ? (native) - 'A' + 'a' : (native)) + + #define f_islower(native) \ + ((native) >= 'a' && (native) <= 'z') + + /**************************************************************************** + Desc: Unicode constants + ****************************************************************************/ + + #define FLM_UNICODE_LINEFEED ((FLMUNICODE)10) + #define FLM_UNICODE_SPACE ((FLMUNICODE)32) + #define FLM_UNICODE_BANG ((FLMUNICODE)33) + #define FLM_UNICODE_QUOTE ((FLMUNICODE)34) + #define FLM_UNICODE_POUND ((FLMUNICODE)35) + #define FLM_UNICODE_DOLLAR ((FLMUNICODE)36) + #define FLM_UNICODE_PERCENT ((FLMUNICODE)37) + #define FLM_UNICODE_AMP ((FLMUNICODE)38) + #define FLM_UNICODE_APOS ((FLMUNICODE)39) + #define FLM_UNICODE_LPAREN ((FLMUNICODE)40) + #define FLM_UNICODE_RPAREN ((FLMUNICODE)41) + #define FLM_UNICODE_ASTERISK ((FLMUNICODE)42) + #define FLM_UNICODE_PLUS ((FLMUNICODE)43) + #define FLM_UNICODE_COMMA ((FLMUNICODE)44) + #define FLM_UNICODE_HYPHEN ((FLMUNICODE)45) + #define FLM_UNICODE_PERIOD ((FLMUNICODE)46) + #define FLM_UNICODE_FSLASH ((FLMUNICODE)47) + + #define FLM_UNICODE_0 ((FLMUNICODE)48) + #define FLM_UNICODE_1 ((FLMUNICODE)49) + #define FLM_UNICODE_2 ((FLMUNICODE)50) + #define FLM_UNICODE_3 ((FLMUNICODE)51) + #define FLM_UNICODE_4 ((FLMUNICODE)52) + #define FLM_UNICODE_5 ((FLMUNICODE)53) + #define FLM_UNICODE_6 ((FLMUNICODE)54) + #define FLM_UNICODE_7 ((FLMUNICODE)55) + #define FLM_UNICODE_8 ((FLMUNICODE)56) + #define FLM_UNICODE_9 ((FLMUNICODE)57) + + #define FLM_UNICODE_COLON ((FLMUNICODE)58) + #define FLM_UNICODE_SEMI ((FLMUNICODE)59) + #define FLM_UNICODE_LT ((FLMUNICODE)60) + #define FLM_UNICODE_EQ ((FLMUNICODE)61) + #define FLM_UNICODE_GT ((FLMUNICODE)62) + #define FLM_UNICODE_QUEST ((FLMUNICODE)63) + #define FLM_UNICODE_ATSIGN ((FLMUNICODE)64) + + #define FLM_UNICODE_A ((FLMUNICODE)65) + #define FLM_UNICODE_B ((FLMUNICODE)66) + #define FLM_UNICODE_C ((FLMUNICODE)67) + #define FLM_UNICODE_D ((FLMUNICODE)68) + #define FLM_UNICODE_E ((FLMUNICODE)69) + #define FLM_UNICODE_F ((FLMUNICODE)70) + #define FLM_UNICODE_G ((FLMUNICODE)71) + #define FLM_UNICODE_H ((FLMUNICODE)72) + #define FLM_UNICODE_I ((FLMUNICODE)73) + #define FLM_UNICODE_J ((FLMUNICODE)74) + #define FLM_UNICODE_K ((FLMUNICODE)75) + #define FLM_UNICODE_L ((FLMUNICODE)76) + #define FLM_UNICODE_M ((FLMUNICODE)77) + #define FLM_UNICODE_N ((FLMUNICODE)78) + #define FLM_UNICODE_O ((FLMUNICODE)79) + #define FLM_UNICODE_P ((FLMUNICODE)80) + #define FLM_UNICODE_Q ((FLMUNICODE)81) + #define FLM_UNICODE_R ((FLMUNICODE)82) + #define FLM_UNICODE_S ((FLMUNICODE)83) + #define FLM_UNICODE_T ((FLMUNICODE)84) + #define FLM_UNICODE_U ((FLMUNICODE)85) + #define FLM_UNICODE_V ((FLMUNICODE)86) + #define FLM_UNICODE_W ((FLMUNICODE)87) + #define FLM_UNICODE_X ((FLMUNICODE)88) + #define FLM_UNICODE_Y ((FLMUNICODE)89) + #define FLM_UNICODE_Z ((FLMUNICODE)90) + + #define FLM_UNICODE_LBRACKET ((FLMUNICODE)91) + #define FLM_UNICODE_BACKSLASH ((FLMUNICODE)92) + #define FLM_UNICODE_RBRACKET ((FLMUNICODE)93) + #define FLM_UNICODE_UNDERSCORE ((FLMUNICODE)95) + + #define FLM_UNICODE_a ((FLMUNICODE)97) + #define FLM_UNICODE_b ((FLMUNICODE)98) + #define FLM_UNICODE_c ((FLMUNICODE)99) + #define FLM_UNICODE_d ((FLMUNICODE)100) + #define FLM_UNICODE_e ((FLMUNICODE)101) + #define FLM_UNICODE_f ((FLMUNICODE)102) + #define FLM_UNICODE_g ((FLMUNICODE)103) + #define FLM_UNICODE_h ((FLMUNICODE)104) + #define FLM_UNICODE_i ((FLMUNICODE)105) + #define FLM_UNICODE_j ((FLMUNICODE)106) + #define FLM_UNICODE_k ((FLMUNICODE)107) + #define FLM_UNICODE_l ((FLMUNICODE)108) + #define FLM_UNICODE_m ((FLMUNICODE)109) + #define FLM_UNICODE_n ((FLMUNICODE)110) + #define FLM_UNICODE_o ((FLMUNICODE)111) + #define FLM_UNICODE_p ((FLMUNICODE)112) + #define FLM_UNICODE_q ((FLMUNICODE)113) + #define FLM_UNICODE_r ((FLMUNICODE)114) + #define FLM_UNICODE_s ((FLMUNICODE)115) + #define FLM_UNICODE_t ((FLMUNICODE)116) + #define FLM_UNICODE_u ((FLMUNICODE)117) + #define FLM_UNICODE_v ((FLMUNICODE)118) + #define FLM_UNICODE_w ((FLMUNICODE)119) + #define FLM_UNICODE_x ((FLMUNICODE)120) + #define FLM_UNICODE_y ((FLMUNICODE)121) + #define FLM_UNICODE_z ((FLMUNICODE)122) + + #define FLM_UNICODE_LBRACE ((FLMUNICODE)123) + #define FLM_UNICODE_PIPE ((FLMUNICODE)124) + #define FLM_UNICODE_RBRACE ((FLMUNICODE)125) + #define FLM_UNICODE_TILDE ((FLMUNICODE)126) + #define FLM_UNICODE_C_CEDILLA ((FLMUNICODE)199) + #define FLM_UNICODE_N_TILDE ((FLMUNICODE)209) + #define FLM_UNICODE_c_CEDILLA ((FLMUNICODE)231) + #define FLM_UNICODE_n_TILDE ((FLMUNICODE)241) + + /**************************************************************************** + Desc: Byte order macros + ****************************************************************************/ + + FINLINE FLMUINT32 flmBigEndianToUINT32( + FLMBYTE * pucBuf) + { + FLMUINT32 ui32Val = 0; + + ui32Val |= ((FLMUINT32)pucBuf[ 0]) << 24; + ui32Val |= ((FLMUINT32)pucBuf[ 1]) << 16; + ui32Val |= ((FLMUINT32)pucBuf[ 2]) << 8; + ui32Val |= ((FLMUINT32)pucBuf[ 3]); + + return( ui32Val); + } + + FINLINE FLMUINT64 flmBigEndianToUINT64( + FLMBYTE * pucBuf) + { + FLMUINT64 ui64Val = 0; + + ui64Val |= ((FLMUINT64)pucBuf[ 0]) << 56; + ui64Val |= ((FLMUINT64)pucBuf[ 1]) << 48; + ui64Val |= ((FLMUINT64)pucBuf[ 2]) << 40; + ui64Val |= ((FLMUINT64)pucBuf[ 3]) << 32; + ui64Val |= ((FLMUINT64)pucBuf[ 4]) << 24; + ui64Val |= ((FLMUINT64)pucBuf[ 5]) << 16; + ui64Val |= ((FLMUINT64)pucBuf[ 6]) << 8; + ui64Val |= ((FLMUINT64)pucBuf[ 7]); + + return( ui64Val); + } + + FINLINE FLMUINT16 flmBigEndianToUINT16( + FLMBYTE * pucBuf) + { + FLMUINT16 ui16Val = 0; + + ui16Val |= ((FLMUINT16)pucBuf[ 0]) << 8; + ui16Val |= ((FLMUINT16)pucBuf[ 1]); + + return( ui16Val); + } + + FINLINE void flmUINT32ToBigEndian( + FLMUINT32 ui32Num, + FLMBYTE * pucBuf) + { + pucBuf[ 0] = (FLMBYTE) (ui32Num >> 24); + pucBuf[ 1] = (FLMBYTE) (ui32Num >> 16); + pucBuf[ 2] = (FLMBYTE) (ui32Num >> 8); + pucBuf[ 3] = (FLMBYTE) (ui32Num); + } + + FINLINE void flmINT32ToBigEndian( + FLMINT32 i32Num, + FLMBYTE * pucBuf) + { + pucBuf[ 0] = (FLMBYTE) (i32Num >> 24); + pucBuf[ 1] = (FLMBYTE) (i32Num >> 16); + pucBuf[ 2] = (FLMBYTE) (i32Num >> 8); + pucBuf[ 3] = (FLMBYTE) (i32Num); + } + + FINLINE void flmINT64ToBigEndian( + FLMINT64 i64Num, + FLMBYTE * pucBuf) + { + pucBuf[ 0] = (FLMBYTE) (i64Num >> 56); + pucBuf[ 1] = (FLMBYTE) (i64Num >> 48); + pucBuf[ 2] = (FLMBYTE) (i64Num >> 40); + pucBuf[ 3] = (FLMBYTE) (i64Num >> 32); + pucBuf[ 4] = (FLMBYTE) (i64Num >> 24); + pucBuf[ 5] = (FLMBYTE) (i64Num >> 16); + pucBuf[ 6] = (FLMBYTE) (i64Num >> 8); + pucBuf[ 7] = (FLMBYTE) (i64Num); + } + + FINLINE void flmUINT64ToBigEndian( + FLMUINT64 ui64Num, + FLMBYTE * pucBuf) + { + pucBuf[ 0] = (FLMBYTE) (ui64Num >> 56); + pucBuf[ 1] = (FLMBYTE) (ui64Num >> 48); + pucBuf[ 2] = (FLMBYTE) (ui64Num >> 40); + pucBuf[ 3] = (FLMBYTE) (ui64Num >> 32); + pucBuf[ 4] = (FLMBYTE) (ui64Num >> 24); + pucBuf[ 5] = (FLMBYTE) (ui64Num >> 16); + pucBuf[ 6] = (FLMBYTE) (ui64Num >> 8); + pucBuf[ 7] = (FLMBYTE) (ui64Num); + } + + FINLINE void flmINT16ToBigEndian( + FLMINT16 i16Num, + FLMBYTE * pucBuf) + { + pucBuf[ 0] = (FLMBYTE) (i16Num >> 8); + pucBuf[ 1] = (FLMBYTE) (i16Num); + } + + FINLINE void flmUINT16ToBigEndian( + FLMUINT16 ui16Num, + FLMBYTE * pucBuf) + { + pucBuf[ 0] = (FLMBYTE) (ui16Num >> 8); + pucBuf[ 1] = (FLMBYTE) (ui16Num); + } + + #ifndef FLM_BIG_ENDIAN + + #if defined( FLM_SPARC) || defined( FLM_POWER_PC) + #error Wrong endian order selected + #endif + + #define LO(wrd) \ + (*(FLMUINT8 *)&wrd) + + #define HI(wrd) \ + (*((FLMUINT8 *)&wrd + 1)) + + #if( defined( FLM_UNIX) && defined( FLM_STRICT_ALIGNMENT)) + + #define FB2UW( bp) \ + ((FLMUINT16)((((FLMUINT16)(((FLMUINT8 *)(bp))[1]))<<8) | \ + (((FLMUINT16)(((FLMUINT8 *)(bp))[0]))))) + + #define FB2UD( bp) \ + ((FLMUINT32)( (((FLMUINT32)(((FLMUINT8 *)(bp))[3]))<<24) | \ + (((FLMUINT32)(((FLMUINT8 *)(bp))[2]))<<16) | \ + (((FLMUINT32)(((FLMUINT8 *)(bp))[1]))<< 8) | \ + (((FLMUINT32)(((FLMUINT8 *)(bp))[0]))))) + + #define UW2FBA( uw, bp) \ + (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)(uw)), \ + ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)((((uw) & 0xff00)>>8)))) + + #define UD2FBA( udw, bp) \ + (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)((udw) & 0xff)), \ + ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)(((udw) & 0xff00)>>8)), \ + ((FLMUINT8 *)(bp))[2] = ((FLMUINT8)(((udw) & 0xff0000)>>16)), \ + ((FLMUINT8 *)(bp))[3] = ((FLMUINT8)(((udw) & 0xff000000)>>24))) + + #else + + #define FB2UW( fbp) \ + (*((FLMUINT16 *)(fbp))) + + #define FB2UD( fbp) \ + (*((FLMUINT32 *)(fbp))) + + #define UW2FBA( uw, fbp) \ + (*((FLMUINT16 *)(fbp)) = ((FLMUINT16) (uw))) + + #define UD2FBA( uw, fbp) \ + (*((FLMUINT32 *)(fbp)) = ((FLMUINT32) (uw))) + + #endif + + #else + + #if defined( __i386__) + #error Wrong endian order selected + #endif + + #define LO(wrd) \ + (*((FLMUINT8 *)&wrd + 1)) + + #define HI(wrd) \ + (*(FLMUINT8 *)&wrd) + + #define FB2UW( bp) \ + ((FLMUINT16)((((FLMUINT16)(((FLMUINT8 *)(bp))[1])) << 8) | \ + (((FLMUINT16)(((FLMUINT8 *)(bp))[0])) ) )) + + #define FB2UD( bp) \ + ((FLMUINT32)((((FLMUINT32)(((FLMUINT8 *)(bp))[3])) << 24) | \ + (((FLMUINT32)(((FLMUINT8 *)(bp))[2])) << 16) | \ + (((FLMUINT32)(((FLMUINT8 *)(bp))[1])) << 8) | \ + (((FLMUINT32)(((FLMUINT8 *)(bp))[0])) ) )) + + #define UW2FBA( uw, bp) + (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)(uw)), \ + ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)((((uw) & 0xff00)>>8)))) + + #define UD2FBA( udw, bp) \ + (((FLMUINT8 *)(bp))[0] = ((FLMUINT8)((udw) & 0xff)), \ + ((FLMUINT8 *)(bp))[1] = ((FLMUINT8)(((udw) & 0xff00)>>8)), \ + ((FLMUINT8 *)(bp))[2] = ((FLMUINT8)(((udw) & 0xff0000)>>16)), \ + ((FLMUINT8 *)(bp))[3] = ((FLMUINT8)(((udw) & 0xff000000)>>24))) + #endif + + /**************************************************************************** + Desc: File Path Functions & Macros + ****************************************************************************/ + + #if defined( FLM_WIN) || defined( FLM_NLM) + #define FWSLASH '/' + #define SLASH '\\' + #define SSLASH "\\" + #define COLON ':' + #define PERIOD '.' + #define PARENT_DIR ".." + #define CURRENT_DIR "." + #else + #ifndef FWSLASH + #define FWSLASH '/' + #endif + + #ifndef SLASH + #define SLASH '/' + #endif + + #ifndef SSLASH + #define SSLASH "/" + #endif + + #ifndef COLON + #define COLON ':' + #endif + + #ifndef PERIOD + #define PERIOD '.' + #endif + + #ifndef PARENT_DIR + #define PARENT_DIR ".." + #endif + + #ifndef CURRENT_DIR + #define CURRENT_DIR "." + #endif + #endif + + /**************************************************************************** + Desc: CPU Release Functions + ****************************************************************************/ + + #ifdef FLM_NLM + #define f_yieldCPU() \ + NWYieldIfTime() + #else + #define f_yieldCPU() + #endif + + void f_sleep( + FLMUINT uiMilliseconds); + + #ifdef FLM_WIN + #define f_sleep( uiMilliseconds) \ + Sleep( (DWORD)uiMilliseconds) + #endif + + /**************************************************************************** + Desc: Mutexes + ****************************************************************************/ + + #if defined( FLM_WIN) + + RCODE f_mutexCreate( + F_MUTEX * phMutex); + + void f_mutexDestroy( + F_MUTEX * phMutex); + + FINLINE void f_mutexLock( + F_MUTEX hMutex) + { + (void)EnterCriticalSection( (CRITICAL_SECTION *)hMutex); + } + + FINLINE void f_mutexUnlock( + F_MUTEX hMutex) + { + (void)LeaveCriticalSection( (CRITICAL_SECTION *)hMutex); + } + + #elif defined( FLM_UNIX) + + RCODE f_mutexCreate( + F_MUTEX * phMutex); + + void f_mutexDestroy( + F_MUTEX * phMutex); + + void f_mutexLock( + F_MUTEX hMutex); + + void f_mutexUnlock( + F_MUTEX hMutex); + + #endif + + + /**************************************************************************** + Desc: Semaphores + ****************************************************************************/ + + #if defined( FLM_WIN) + + typedef HANDLE F_SEM; + typedef HANDLE * F_SEM_p; + #define F_SEM_NULL NULL + + #elif defined( FLM_UNIX) + + #if defined( FLM_AIX) || defined( FLM_OSX) + + typedef struct + { + pthread_mutex_t lock; + pthread_cond_t cond; + int count; + } sema_t; + + int sema_init( sema_t * sem); + + void sema_destroy( sema_t * sem); + + void p_operation_cleanup( void * arg); + + int sema_wait( sema_t * sem); + + int sema_timedwait( sema_t * sem, unsigned int uiTimeout); + + int sema_signal( sema_t * sem); + + #else + + #include + + #endif + + typedef F_SEM * F_SEM_p; + #define F_SEM_NULL NULL + + #elif !defined( FLM_NLM) + #error Unsupported platform + #endif + + #if defined( FLM_WIN) + + FINLINE RCODE f_semCreate( + F_SEM * phSem) + { + if( (*phSem = CreateSemaphore( (LPSECURITY_ATTRIBUTES)NULL, + 0, 10000, NULL )) == NULL) + { + return( RC_SET( FERR_MUTEX_OPERATION_FAILED)); + } + + return FERR_OK; + } + + FINLINE void f_semDestroy( + F_SEM * phSem) + { + if (*phSem != F_SEM_NULL) + { + CloseHandle( *phSem); + *phSem = F_SEM_NULL; + } + } + + FINLINE RCODE f_semWait( + F_SEM hSem, + FLMUINT uiTimeout) + { + if( WaitForSingleObject( hSem, uiTimeout ) == WAIT_OBJECT_0) + { + return( FERR_OK); + } + else + { + return( RC_SET( FERR_MUTEX_UNABLE_TO_LOCK)); + } + } + + FINLINE void f_semSignal( + F_SEM hSem) + { + (void)ReleaseSemaphore( hSem, 1, NULL); + } + + #elif defined( FLM_UNIX) + + void f_semDestroy( + F_SEM * phSem); + + RCODE f_semCreate( + F_SEM * phSem); + + RCODE f_semWait( + F_SEM hSem, + FLMUINT uiTimeout); + + FINLINE void f_semSignal( + F_SEM hSem) + { + #if defined( FLM_AIX) || defined( FLM_OSX) + (void)sema_signal( (sema_t *)hSem); + #else + (void)sem_post( (sem_t *)hSem); + #endif + } + #endif + + /**************************************************************************** + Desc: Random numbers + ****************************************************************************/ + + #define MAX_RANDOM 2147483646L + + typedef struct + { + FLMINT32 i32Seed; + } f_randomGenerator; + + void f_randomize( + f_randomGenerator * pRand); + + void f_randomSetSeed( + f_randomGenerator * pRand, + FLMINT32 i32seed); + + FLMINT32 f_randomLong( + f_randomGenerator * pRand); + + FLMINT32 f_randomChoice( + f_randomGenerator * pRand, + FLMINT32 lo, + FLMINT32 hi); + + FLMINT f_randomTruth( + f_randomGenerator * pRand, + FLMINT iPercentageTrue); + + /**************************************************************************** + Desc: Time, date, timestamp functions + ****************************************************************************/ + typedef struct + { + FLMUINT16 year; + FLMBYTE month; + FLMBYTE day; + } F_DATE, * F_DATE_p; + + typedef struct + { + FLMBYTE hour; + FLMBYTE minute; + FLMBYTE second; + FLMBYTE hundredth; + } F_TIME, * F_TIME_p; + + typedef struct + { + FLMUINT16 year; + FLMBYTE month; + FLMBYTE day; + FLMBYTE hour; + FLMBYTE minute; + FLMBYTE second; + FLMBYTE hundredth; + } F_TMSTAMP, * F_TMSTAMP_p; + + void f_timeGetSeconds( + FLMUINT * puiSeconds); + + void f_timeGetTimeStamp( + F_TMSTAMP * pTimeStamp); + + FLMINT f_timeGetLocalOffset( void); + + void f_timeSecondsToDate( + FLMUINT uiSeconds, + F_TMSTAMP * pTimeStamp); + + void f_timeDateToSeconds( + F_TMSTAMP * pTimeStamp, + FLMUINT * puiSeconds); + + FLMINT f_timeCompareTimeStamps( + F_TMSTAMP * pTimeStamp1, + F_TMSTAMP * pTimeStamp2, + FLMUINT uiFlag); + + #if defined( FLM_UNIX) + unsigned f_timeGetMilliTime(); + #endif + + /********************************************************************** + Desc: Atomic Increment, Decrement, Exchange + Note: Some of this code is derived from the Ximian source code contained + in that Mono project's atomic.h file. + **********************************************************************/ + #ifndef FLM_HAVE_ATOMICS + #define FLM_HAVE_ATOMICS + #endif + + /******************************************************************* + Desc: + *******************************************************************/ + #if defined( FLM_GNUC) && defined( __ia64__) + FINLINE FLMINT32 ia64_compare_and_swap( + volatile int * piTarget, + FLMINT32 i32NewVal, + FLMINT32 i32CompVal) + { + FLMINT32 i32Old; + + asm volatile ("mov ar.ccv = %2 ;;\n\t" + "cmpxchg4.acq %0 = [%1], %3, ar.ccv\n\t" + : "=r" (i32Old) : "r" (piTarget), + "r" (i32CompVal), + "r" (i32NewVal)); + + return( i32Old); + } + #endif + + /********************************************************************** + Desc: + **********************************************************************/ + #if defined( FLM_SPARC) && defined( FLM_SOLARIS) && !defined( FLM_GNUC) + extern "C" FLMINT32 sparc_atomic_add_32( + volatile FLMINT32 * piTarget, + FLMINT32 iDelta); + #endif + + /********************************************************************** + Desc: + **********************************************************************/ + #if defined( FLM_SPARC) && defined( FLM_SOLARIS) && !defined( FLM_GNUC) + extern "C" FLMINT32 sparc_atomic_xchg_32( + volatile FLMINT32 * piTarget, + FLMINT32 iNewValue); + #endif + + /********************************************************************** + Desc: + **********************************************************************/ + #if defined( FLM_AIX) + FINLINE int aix_atomic_add( + volatile int * piTarget, + int iDelta) + { + return( fetch_and_add( (int *)piTarget, iDelta) + iDelta); + } + #endif + + /********************************************************************** + Desc: + **********************************************************************/ + FINLINE FLMINT32 _flmAtomicInc( + FLMATOMIC * piTarget) + { + #if defined( FLM_NLM) + { + return( (FLMINT32)nlm_AtomicIncrement( (volatile LONG *)piTarget)); + } + #elif defined( FLM_WIN) + { + return( (FLMINT32)InterlockedIncrement( (volatile LONG *)piTarget)); + } + #elif defined( FLM_AIX) + { + return( (FLMINT32)aix_atomic_add( piTarget, 1)); + } + #elif defined( FLM_GNUC) + { + #if defined( __i386__) || defined( __x86_64__) + { + FLMINT32 i32Tmp; + + __asm__ __volatile__ ("lock; xaddl %0, %1" + : "=r" (i32Tmp), "=m" (*piTarget) + : "0" (1), "m" (*piTarget)); + + return( i32Tmp + 1); + } + #elif defined( __ppc__) || defined ( __powerpc__) + { + FLMINT32 i32Result = 0; + FLMINT32 i32Tmp; + + __asm__ __volatile__ ("\n1:\n\t" + "lwarx %0, 0, %2\n\t" + "addi %1, %0, 1\n\t" + "stwcx. %1, 0, %2\n\t" + "bne- 1b" + : "=&b" (i32Result), "=&b" (i32Tmp) + : "r" (piTarget) : "cc", "memory"); + + return( i32Result + 1); + } + #elif defined( __ia64__) + { + FLMINT32 i32Old; + + for( ;;) + { + i32Old = (FLMINT32)*piTarget; + + if( ia64_compare_and_swap( piTarget, + i32Old + 1, i32Old) == i32Old) + { + break; + } + } + + return( i32Old + 1); + } + #elif defined( __s390__) + { + FLMINT32 i32Tmp; + + __asm__ __volatile__ ("\tLA\t2,%1\n" + "0:\tL\t%0,%1\n" + "\tLR\t1,%0\n" + "\tAHI\t1,1\n" + "\tCS\t%0,1,0(2)\n" + "\tJNZ\t0b\n" + "\tLR\t%0,1" + : "=r" (i32Tmp), "+m" (*piTarget) + : : "1", "2", "cc"); + + return( i32Tmp); + } + #else + #ifdef FLM_HAVE_ATOMICS + #undef FLM_HAVE_ATOMICS + #endif + + F_UNREFERENCED_PARM( piTarget); + + flmAssert( 0); + return( 0); + #endif + } + #elif defined( FLM_SOLARIS) && defined( FLM_SPARC) + return( sparc_atomic_add_32( piTarget, 1)); + #else + #ifdef FLM_HAVE_ATOMICS + #undef FLM_HAVE_ATOMICS + #endif + + F_UNREFERENCED_PARM( piTarget); + + flmAssert( 0); + return( 0); + #endif + } + + /********************************************************************** + Desc: + **********************************************************************/ + FINLINE FLMINT32 _flmAtomicDec( + FLMATOMIC * piTarget) + { + #if defined( FLM_NLM) + { + return( (FLMINT32)nlm_AtomicDecrement( (volatile LONG *)piTarget)); + } + #elif defined( FLM_WIN) + { + return( (FLMINT32)InterlockedDecrement( (volatile LONG *)piTarget)); + } + #elif defined( FLM_AIX) + { + return( (FLMINT32)aix_atomic_add( piTarget, -1)); + } + #elif defined( FLM_GNUC) + { + #if defined( __i386__) || defined( __x86_64__) + { + FLMINT32 i32Tmp; + + __asm__ __volatile__ ("lock; xaddl %0, %1" + : "=r" (i32Tmp), "=m" (*piTarget) + : "0" (-1), "m" (*piTarget)); + + return( i32Tmp - 1); + } + #elif defined( __ppc__) || defined ( __powerpc__) + { + FLMINT32 i32Result = 0; + FLMINT32 i32Tmp; + + __asm__ __volatile__ ("\n1:\n\t" + "lwarx %0, 0, %2\n\t" + "addi %1, %0, -1\n\t" + "stwcx. %1, 0, %2\n\t" + "bne- 1b" + : "=&b" (i32Result), "=&b" (i32Tmp) + : "r" (piTarget) : "cc", "memory"); + + return( i32Result - 1); + } + #elif defined( __ia64__) + { + FLMINT32 i32Old; + + for( ;;) + { + i32Old = (FLMINT32)*piTarget; + + if( ia64_compare_and_swap( piTarget, i32Old - 1, + i32Old) == i32Old) + { + break; + } + } + + return( i32Old - 1); + } + #elif defined( __s390__) + { + FLMINT32 i32Tmp; + + __asm__ __volatile__ ("\tLA\t2,%1\n" + "0:\tL\t%0,%1\n" + "\tLR\t1,%0\n" + "\tAHI\t1,-1\n" + "\tCS\t%0,1,0(2)\n" + "\tJNZ\t0b\n" + "\tLR\t%0,1" + : "=r" (i32Tmp), "+m" (*piTarget) + : : "1", "2", "cc"); + + return( i32Tmp); + } + #else + #ifdef FLM_HAVE_ATOMICS + #undef FLM_HAVE_ATOMICS + #endif + + F_UNREFERENCED_PARM( piTarget); + + flmAssert( 0); + return( 0); + #endif + } + #elif defined( FLM_SOLARIS) && defined( FLM_SPARC) + return( sparc_atomic_add_32( piTarget, -1)); + #else + #ifdef FLM_HAVE_ATOMICS + #undef FLM_HAVE_ATOMICS + #endif + + F_UNREFERENCED_PARM( piTarget); + + flmAssert( 0); + return( 0); + #endif + } + + /********************************************************************** + Desc: + **********************************************************************/ + FINLINE FLMINT32 _flmAtomicExchange( + FLMATOMIC * piTarget, + FLMINT32 i32NewVal) + { + #if defined( FLM_NLM) + { + return( (FLMINT32)nlm_AtomicExchange( + (volatile LONG *)piTarget, i32NewVal)); + } + #elif defined( FLM_WIN) + { + return( (FLMINT32)InterlockedExchange( (volatile LONG *)piTarget, + i32NewVal)); + } + #elif defined( FLM_AIX) + { + int iOldVal; + + for( ;;) + { + iOldVal = (int)*piTarget; + + if( compare_and_swap( (int *)piTarget, &iOldVal, i32NewVal)) + { + break; + } + } + + return( (FLMINT32)iOldVal); + } + #elif defined( FLM_GNUC) + { + #if defined( __i386__) || defined( __x86_64__) + { + FLMINT32 i32Ret; + + __asm__ __volatile__ ("1:; lock; cmpxchgl %2, %0; jne 1b" + : "=m" (*piTarget), "=a" (i32Ret) + : "r" (i32NewVal), "m" (*piTarget), + "a" (*piTarget)); + + return( i32Ret); + } + #elif defined( __ppc__) || defined ( __powerpc__) + { + FLMINT32 i32Tmp = 0; + + __asm__ __volatile__ ("\n1:\n\t" + "lwarx %0, 0, %2\n\t" + "stwcx. %3, 0, %2\n\t" + "bne 1b" + : "=r" (i32Tmp) : "0" (i32Tmp), + "b" (piTarget), + "r" (i32NewVal) : "cc", "memory"); + + return( i32Tmp); + } + #elif defined( __ia64__) + { + FLMINT32 i32Result; + + for( ;;) + { + i32Result = (FLMINT32)*piTarget; + + if( ia64_compare_and_swap( piTarget, + i32NewVal, i32Result) == i32Result) + { + break; + } + } + + return( i32Result); + } + #elif defined( __s390__) + { + FLMINT32 i32Ret; + + __asm__ __volatile__ ("\tLA\t1,%0\n" + "0:\tL\t%1,%0\n" + "\tCS\t%1,%2,0(1)\n" + "\tJNZ\t0b" + : "+m" (*piTarget), "=r" (i32Ret) + : "r" (i32NewVal) + : "1", "cc"); + + return( i32Ret); + } + #else + #ifdef FLM_HAVE_ATOMICS + #undef FLM_HAVE_ATOMICS + #endif + + F_UNREFERENCED_PARM( piTarget); + F_UNREFERENCED_PARM( i32NewVal); + + flmAssert( 0); + return( 0); + #endif + } + #elif defined( FLM_SOLARIS) && defined( FLM_SPARC) + return( sparc_atomic_xchg_32( piTarget, i32NewVal)); + #else + #ifdef FLM_HAVE_ATOMICS + #undef FLM_HAVE_ATOMICS + #endif + + F_UNREFERENCED_PARM( piTarget); + F_UNREFERENCED_PARM( i32NewVal); + + flmAssert( 0); + return( 0); + #endif + } + + /********************************************************************** + Desc: + **********************************************************************/ + FINLINE FLMINT32 flmAtomicInc( + FLMATOMIC * piTarget, + F_MUTEX hMutex = F_MUTEX_NULL, + FLMBOOL bMutexAlreadyLocked = FALSE) + { + #ifdef FLM_HAVE_ATOMICS + F_UNREFERENCED_PARM( bMutexAlreadyLocked); + F_UNREFERENCED_PARM( hMutex); + + return( _flmAtomicInc( piTarget)); + #else + { + FLMINT32 i32NewVal; + + flmAssert( hMutex != F_MUTEX_NULL); + + if( !bMutexAlreadyLocked) + { + f_mutexLock( hMutex); + } + + i32NewVal = (FLMINT32)(++(*piTarget)); + + if( !bMutexAlreadyLocked) + { + f_mutexUnlock( hMutex); + } + + return( i32NewVal); + } + #endif + } + + /********************************************************************** + Desc: + **********************************************************************/ + FINLINE FLMINT32 flmAtomicDec( + FLMATOMIC * piTarget, + F_MUTEX hMutex = F_MUTEX_NULL, + FLMBOOL bMutexAlreadyLocked = FALSE) + { + #ifdef FLM_HAVE_ATOMICS + F_UNREFERENCED_PARM( bMutexAlreadyLocked); + F_UNREFERENCED_PARM( hMutex); + + return( _flmAtomicDec( piTarget)); + #else + { + FLMINT32 i32NewVal; + + flmAssert( hMutex != F_MUTEX_NULL); + + if( !bMutexAlreadyLocked) + { + f_mutexLock( hMutex); + } + + i32NewVal = (FLMINT32)(--(*piTarget)); + + if( !bMutexAlreadyLocked) + { + f_mutexUnlock( hMutex); + } + + return( i32NewVal); + } + #endif + } + + /********************************************************************** + Desc: + **********************************************************************/ + FINLINE FLMINT32 flmAtomicExchange( + FLMATOMIC * piTarget, + FLMINT32 i32NewVal, + F_MUTEX hMutex = F_MUTEX_NULL, + FLMBOOL bMutexAlreadyLocked = FALSE) + { + #ifdef FLM_HAVE_ATOMICS + F_UNREFERENCED_PARM( bMutexAlreadyLocked); + F_UNREFERENCED_PARM( hMutex); + + return( _flmAtomicExchange( piTarget, i32NewVal)); + #else + { + FLMINT32 i32OldVal; + + flmAssert( hMutex != F_MUTEX_NULL); + + if( !bMutexAlreadyLocked) + { + f_mutexLock( hMutex); + } + + i32OldVal = (FLMINT32)*piTarget; + *piTarget = i32NewVal; + + if( !bMutexAlreadyLocked) + { + f_mutexUnlock( hMutex); + } + + return( i32OldVal); + } + #endif + } + + /**************************************************************************** + Pseudo Serial Numbers + ****************************************************************************/ + + RCODE f_initSerialNumberGenerator( void); + + RCODE f_createSerialNumber( + FLMBYTE * pszGuid); + + void f_freeSerialNumberGenerator( void); + + /**************************************************************************** + CRC + ****************************************************************************/ + + RCODE f_initCRCTable( + FLMUINT32 ** ppui32CRCTbl); + + void f_updateCRC( + FLMUINT32 * pui32CRCTbl, + FLMBYTE * pucBlk, + FLMUINT uiBlkSize, + FLMUINT32 * pui32CRC); + + #define f_freeCRCTable( ppui32CRCTbl) \ + f_free( ppui32CRCTbl) + + /**************************************************************************** + Desc: Returns TRUE if the passed-in character is 0-9, a-f, or A-F + ****************************************************************************/ + FINLINE FLMBOOL f_isHexChar( + FLMBYTE ucChar) + { + if( (ucChar >= '0' && ucChar <= '9') || + (ucChar >= 'A' && ucChar <= 'F') || + (ucChar >= 'a' && ucChar <= 'f')) + { + return( TRUE); + } + + return( FALSE); + } + + /**************************************************************************** + Desc: Returns the base-10 equivalent of a hex character + ****************************************************************************/ + FINLINE FLMBYTE f_getHexVal( + FLMBYTE ucChar) + { + if( ucChar >= '0' && ucChar <= '9') + { + return( (FLMBYTE)(ucChar - '0')); + } + else if( ucChar >= 'A' && ucChar <= 'F') + { + return( (FLMBYTE)((ucChar - 'A') + 10)); + } + else if( ucChar >= 'a' && ucChar <= 'f') + { + return( (FLMBYTE)((ucChar - 'a') + 10)); + } + + return( 0); + } + + /**************************************************************************** + Desc: Process ID Functions + ****************************************************************************/ + + #if defined( FLM_WIN) + + FINLINE FLMUINT f_getpid() + { + return _getpid(); + } + + #elif defined( FLM_UNIX) + + pid_t getpid( void); + + FINLINE FLMUINT f_getpid() + { + return getpid(); + } + + #elif defined( FLM_NLM) + + FINLINE FLMUINT f_getpid() + { + return( f_getNLMHandle()); + } + + #endif + + typedef struct + { + char * pszDestStr; + } F_SPRINTF_INFO; + + void flmSprintfStringFormatter( + char ucFormatChar, + FLMUINT uiWidth, + FLMUINT uiPrecision, + FLMUINT uiFlags, + F_SPRINTF_INFO * pInfo, + f_va_list * args); + + FLMINT f_vsprintf( + char * pszDestStr, + const char * pszFormat, + f_va_list * args); + + typedef FLMINT (* F_SORT_COMPARE_FUNC)( + void * pvBuffer, + FLMUINT uiPos1, + FLMUINT uiPos2); + + typedef void (* F_SORT_SWAP_FUNC)( + void * pvBuffer, + FLMUINT uiPos1, + FLMUINT uiPos2); + + void f_qsort( + void * pvBuffer, + FLMUINT uiLowerBounds, + FLMUINT uiUpperBounds, + F_SORT_COMPARE_FUNC fnCompare, + F_SORT_SWAP_FUNC fnSwap); + + FLMINT flmQSortUINTCompare( + void * pvBuffer, + FLMUINT uiPos1, + FLMUINT uiPos2); + + void flmQSortUINTSwap( + void * pvBuffer, + FLMUINT uiPos1, + FLMUINT uiPos2); + + /**************************************************************************** + Desc: Module Load/Unload Functions + ****************************************************************************/ + + typedef void * FlmModHandle; + + RCODE FlmModLoad( + const char * pszName, + FlmModHandle * phMod); + + #ifndef FLM_NLM + RCODE FlmModUnload( + FlmModHandle * phMod); + #else + RCODE FlmModUnload( + const char * pszModPath); + #endif + + RCODE FlmSymLoad( + const char * pszName, + FlmModHandle hMod, + void ** ppvSym); + + RCODE FlmSymUnload( + const char * pszName); + + char * f_strchr( + const char * pszStr, + char c); + +#include "fpackoff.h" +#endif diff --git a/flaim/src/kybldkey.cpp b/flaim/src/kybldkey.cpp index d08d707..0976292 100644 --- a/flaim/src/kybldkey.cpp +++ b/flaim/src/kybldkey.cpp @@ -702,13 +702,13 @@ FSTATIC RCODE flmAddKeyPiece( if( pIfd->uiFlags & IFD_CONTEXT) { pFromKey [uiFromKeyPos] = KY_CONTEXT_PREFIX; - intToByte( (FLMUINT16) pIfd->uiFldNum, &pFromKey [uiFromKeyPos + 1]); + flmUINT16ToBigEndian( (FLMUINT16) pIfd->uiFldNum, &pFromKey [uiFromKeyPos + 1]); uiFromKeyPos += KY_CONTEXT_LEN; if( uiUntilKeyPos + KY_CONTEXT_LEN < uiMaxKeySize) { pUntilKey [uiUntilKeyPos] = KY_CONTEXT_PREFIX; - intToByte( (FLMUINT16) pIfd->uiFldNum, &pUntilKey [uiUntilKeyPos + 1]); + flmUINT16ToBigEndian( (FLMUINT16) pIfd->uiFldNum, &pUntilKey [uiUntilKeyPos + 1]); uiUntilKeyPos += KY_CONTEXT_LEN; } goto Exit; diff --git a/flaim/src/kybuild.cpp b/flaim/src/kybuild.cpp index 2083414..e495c25 100644 --- a/flaim/src/kybuild.cpp +++ b/flaim/src/kybuild.cpp @@ -429,7 +429,7 @@ FSTATIC RCODE flmProcessIndexedFld( /* Context key (tag number). */ KeyBuf [0] = KY_CONTEXT_PREFIX; - intToByte( (FLMUINT16)pRecord->getFieldID( pvField ), &KeyBuf [1]); + flmUINT16ToBigEndian( (FLMUINT16)pRecord->getFieldID( pvField ), &KeyBuf [1]); if (RC_BAD( rc = KYAddToKrefTbl( pDb, pIxd, uiContainerNum, pIfd, uiAction, uiDrn, diff --git a/flaim/src/kycollat.cpp b/flaim/src/kycollat.cpp index 0ea62b8..58f46cc 100644 --- a/flaim/src/kycollat.cpp +++ b/flaim/src/kycollat.cpp @@ -138,7 +138,7 @@ FIND_NXT: /* Output the tag number. */ *pToKey = KY_CONTEXT_PREFIX; - intToByte( (FLMUINT16) pRecord->getFieldID( pvMatchField), &pToKey [1]); + flmUINT16ToBigEndian( (FLMUINT16) pRecord->getFieldID( pvMatchField), &pToKey [1]); uiToKeyLen = KY_CONTEXT_LEN; } else @@ -504,7 +504,7 @@ NumDone: else { *pDest = 0x1F; - longToByte( FB2UD( pSrc), pDest + 1); + flmUINT32ToBigEndian( FB2UD( pSrc), pDest + 1); uiDestLen = 5; rc = FERR_OK; } diff --git a/flaim/src/kycompnd.cpp b/flaim/src/kycompnd.cpp index 0264ed3..994013b 100644 --- a/flaim/src/kycompnd.cpp +++ b/flaim/src/kycompnd.cpp @@ -485,7 +485,7 @@ Cleanup1: if( pIfd->uiFlags & IFD_CONTEXT) { pKeyBuf [uiKeyLen] = KY_CONTEXT_PREFIX; - intToByte( (FLMUINT16)pRecord->getFieldID( pvField), &pKeyBuf [uiKeyLen + 1]); + flmUINT16ToBigEndian( (FLMUINT16)pRecord->getFieldID( pvField), &pKeyBuf [uiKeyLen + 1]); uiKeyLen += KY_CONTEXT_LEN; } else if( pRecord->getDataLength( pvField))