/* * Delete a record. */ static HB_ERRCODE hb_delimDeleteRec( DELIMAREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("hb_delimDeleteRec(%p)", pArea)); if( pArea->fRecordChanged ) { pArea->ulRecCount--; pArea->fEof = TRUE; pArea->fPositioned = pArea->fRecordChanged = FALSE; hb_delimClearRecordBuffer( pArea ); } return HB_SUCCESS; }
/* * Delete a record. */ static HB_ERRCODE hb_delimDeleteRec( DELIMAREAP pArea ) { HB_TRACE( HB_TR_DEBUG, ( "hb_delimDeleteRec(%p)", pArea ) ); HB_SYMBOL_UNUSED( pArea ); /* It's not Cl*pper compatible so I had to disable it [druzus] */ #if 0 if( pArea->fRecordChanged ) { pArea->ulRecCount--; pArea->area.fEof = HB_TRUE; pArea->fPositioned = pArea->fRecordChanged = HB_FALSE; hb_delimClearRecordBuffer( pArea ); } #endif return HB_SUCCESS; }
/* * Append a record to the WorkArea. */ static HB_ERRCODE hb_delimAppend( DELIMAREAP pArea, BOOL fUnLockAll ) { HB_TRACE(HB_TR_DEBUG, ("hb_delimAppend(%p,%d)", pArea, (int) fUnLockAll)); HB_SYMBOL_UNUSED( fUnLockAll ); if( SELF_GOCOLD( ( AREAP ) pArea ) != HB_SUCCESS ) return HB_FAILURE; if( SELF_GOHOT( ( AREAP ) pArea ) != HB_SUCCESS ) return HB_FAILURE; pArea->ulRecordOffset = pArea->ulFileSize; pArea->ulRecNo = ++pArea->ulRecCount; pArea->fEof = FALSE; pArea->fPositioned = TRUE; hb_delimClearRecordBuffer( pArea ); return HB_SUCCESS; }
static HB_ERRCODE hb_delimNextRecord( DELIMAREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("hb_delimNextRecord(%p)", pArea)); if( pArea->fPositioned ) { if( pArea->ulNextOffset == ( HB_FOFFSET ) -1 ) { pArea->fEof = TRUE; pArea->fPositioned = FALSE; hb_delimClearRecordBuffer( pArea ); } else { pArea->ulRecNo++; pArea->ulRecordOffset = pArea->ulNextOffset; return hb_delimReadRecord( pArea ); } } return HB_SUCCESS; }
/* * Read record, decode it to buffer and set next record offset */ static HB_ERRCODE hb_delimReadRecord( DELIMAREAP pArea ) { USHORT uiField, uiLen, uiSize; HB_TYPE uiType; LPFIELD pField; BYTE * pFieldBuf, buffer[ 256 ]; char cStop; int ch = 0; HB_TRACE(HB_TR_DEBUG, ("hb_delimReadRecord(%p)", pArea)); if( pArea->ulBufferStart <= pArea->ulRecordOffset && pArea->ulBufferStart + ( HB_FOFFSET ) pArea->ulBufferRead > pArea->ulRecordOffset ) { pArea->ulBufferIndex = ( ULONG ) ( pArea->ulRecordOffset - pArea->ulBufferStart ); } else { pArea->ulBufferStart = pArea->ulRecordOffset; pArea->ulBufferRead = pArea->ulBufferIndex = 0; } /* clear the record buffer */ hb_delimClearRecordBuffer( pArea ); for( uiField = 0; uiField < pArea->uiFieldCount; ++uiField ) { pField = pArea->lpFields + uiField; uiType = pField->uiType; if( uiType == HB_FT_STRING || uiType == HB_FT_LOGICAL || uiType == HB_FT_DATE || uiType == HB_FT_LONG ) { uiSize = 0; uiLen = pField->uiLen; pFieldBuf = pArea->pRecord + pArea->pFieldOffset[ uiField ]; /* ignore leading spaces */ do ch = hb_delimNextChar( pArea ); while( ch == ' ' ); /* set the stop character */ if( pArea->cDelim && ch == pArea->cDelim ) { cStop = pArea->cDelim; ch = hb_delimNextChar( pArea ); } else cStop = pArea->cSeparator; /* * Clipper uses differ rules for character fields, they * can be terminated only with valid stop character, when * other fields also by length */ if( pField->uiType == HB_FT_STRING ) { while( ch >= 0 && ch != cStop ) { if( uiSize < uiLen ) pFieldBuf[ uiSize++ ] = ( BYTE ) ch; ch = hb_delimNextChar( pArea ); } } else { while( ch >= 0 && ch != cStop && uiSize < uiLen ) { buffer[ uiSize++ ] = ( BYTE ) ch; ch = hb_delimNextChar( pArea ); } buffer[ uiSize ] = '\0'; if( pField->uiType == HB_FT_LOGICAL ) { *pFieldBuf = ( *buffer == 'T' || *buffer == 't' || *buffer == 'Y' || *buffer == 'y' ) ? 'T' : 'F'; } else if( pField->uiType == HB_FT_DATE ) { if( uiSize == 8 && hb_dateEncStr( ( char * ) buffer ) != 0 ) memcpy( pFieldBuf, buffer, 8 ); } else { HB_LONG lVal; double dVal; BOOL fDbl; fDbl = hb_strnToNum( (const char *) buffer, uiSize, &lVal, &dVal ); if( fDbl ) pArea->valResult = hb_itemPutNDLen( pArea->valResult, dVal, uiLen - pField->uiDec - 1, pField->uiDec ); else pArea->valResult = hb_itemPutNIntLen( pArea->valResult, lVal, uiLen ); hb_itemStrBuf( ( char * ) buffer, pArea->valResult, uiLen, pField->uiDec ); /* TODO: RT error on width range */ memcpy( pFieldBuf, buffer, uiLen ); } } /* ignore all character to the next field separator */ while( ch >= 0 && ch != pArea->cSeparator ) ch = hb_delimNextChar( pArea ); /* stop reading on EOL */ if( ch < 0 ) break; } } /* ignore all character to the end of line */ while( ch >= 0 ) ch = hb_delimNextChar( pArea ); if( ch == -2 && pArea->ulRecordOffset == ( HB_FOFFSET ) ( pArea->ulBufferStart + pArea->ulBufferIndex ) ) { pArea->fEof = TRUE; pArea->fPositioned = FALSE; } else { pArea->fEof = FALSE; pArea->fPositioned = TRUE; } return HB_SUCCESS; }