📄 routelink_update.c
字号:
/* Exception prevention */
if( (NULL == pbUpdFileName) || (NULL == pbLinkData) ||
(NULL == pstFilePos) )
{
return RET_FAILED;
}
/* Temporary file name get */
memset( abTmpFileName, 0, sizeof(abTmpFileName) );
RTL_TMPFILE_FILENAME( abTmpFileName, pbUpdFileName );
/* Get the size of original file */
iOrgFileSize = routelink_getfsize( pbUpdFileName );
/* Route link data file open */
pOrgFile = fopen( pbUpdFileName, "rb" );
if( NULL == pOrgFile )
{
printf( "\nFailed to open file GTBL.data.\n" );
return RET_FAILED;
}
/* Temporary file create */
pTmpFile = fopen( abTmpFileName, "wb" );
if( NULL == pTmpFile )
{
fclose( pOrgFile );
pOrgFile = NULL;
printf( "Failed to create the temporary file!" );
return RET_FAILED;
}
/* Memory block allocation */
pbReadBlock = malloc( FILEREAD_BLOCKSIZE );
if( NULL == pbReadBlock )
{
fclose( pOrgFile );
pOrgFile = NULL;
fclose( pTmpFile );
pOrgFile = NULL;
remove( abTmpFileName );
return RET_FAILED;
}
else
{
memset( pbReadBlock, 0, FILEREAD_BLOCKSIZE );
}
/* Read file until the end of the file */
while( 0 == feof( pOrgFile ) )
{
/* Memory clear */
memset( pbReadBlock, 0, FILEREAD_BLOCKSIZE );
/* Get current file read position */
fgetpos( pOrgFile, &stFilePntr );
/* The next block includes the data for updating */
if( *pstFilePos == stFilePntr )
{
/* Read the record size of current link data from original file*/
iRetReadFile = fread( pbReadBlock, RL_SIZE_RECSIZE, 1, pOrgFile );
/* Get Record size and Link ID */
uwRecSize = MC_GET_SHORT( pbReadBlock );
/* Set file reading pointer to the end of current link data */
fseek( pOrgFile, (uwRecSize - (RL_SIZE_RECSIZE)), SEEK_CUR );
/* Get Record size of the new link data */
uwNewRecSize = MC_GET_SHORT( pbLinkData );
/* Write new link data into the temporary file */
fwrite( pbLinkData, uwNewRecSize, 1, pTmpFile );
}
else
{
/* Calculate the size of data reading */
if( ( *pstFilePos > stFilePntr ) &&
(*pstFilePos - stFilePntr) < FILEREAD_BLOCKSIZE )
{
iReadSize = (int)(*pstFilePos - stFilePntr);
}
else
{
/* The left size is less than FILEREAD_BLOCKSIZE */
if( (iOrgFileSize - stFilePntr) < FILEREAD_BLOCKSIZE )
{
iReadSize = (int)(iOrgFileSize - stFilePntr);
}
else
{
iReadSize = FILEREAD_BLOCKSIZE;
}
}
/* Read data by the size specified from link data file */
iRetReadFile = fread( pbReadBlock, iReadSize, 1, pOrgFile );
if( iRetReadFile > 0 )
{
iFwrite = fwrite( pbReadBlock, iReadSize, 1, pTmpFile );
if( iFwrite <= 0 )
{
printf( "\nWrite file failed!\n" );
break;
}
}
else
{
break;
}
}
}
/* File close */
fclose( pOrgFile );
pOrgFile = NULL;
/* Route link data file reopen */
pOrgFile = fopen( pbUpdFileName, "wb" );
if( NULL == pOrgFile )
{
fclose( pTmpFile );
pTmpFile = NULL;
return RET_FAILED;
}
/* File pointer seek */
if( NULL != pTmpFile )
{
fclose( pTmpFile );
pTmpFile = fopen( abTmpFileName, "rb" );
if( NULL == pTmpFile )
{
fclose( pOrgFile );
pOrgFile = NULL;
}
}
/* From temporary file into data file */
while( 0 == feof( pOrgFile ) )
{
/* Get current file read position */
fgetpos( pTmpFile, &stFilePntr );
/* Get the size of original file */
iTmpFileSize = routelink_getfsize( abTmpFileName );
/* Size of block read from file */
if( (iTmpFileSize - stFilePntr) < FILEREAD_BLOCKSIZE )
{
iReadSize = (int)(iTmpFileSize - stFilePntr);
}
else
{
iReadSize = FILEREAD_BLOCKSIZE;
}
/* Read the record size of current link data from original file*/
iRetReadFile = fread( pbReadBlock, iReadSize, 1, pTmpFile );
if( iRetReadFile > 0 )
{
fwrite( pbReadBlock, iReadSize, 1, pOrgFile );
}
else
{
break;
}
}
/* Memory block free */
if( NULL != pbReadBlock )
{
free( pbReadBlock );
pbReadBlock = NULL;
}
/* File close */
fclose( pOrgFile );
pOrgFile = NULL;
/* Temprary file close */
fclose( pTmpFile );
pTmpFile = NULL;
/* Data file exchange */
remove( abTmpFileName );
return RET_SUCCESS;
}
/***************************************************************************/
/* routelink_upd_chklnkid */
/* -----------------------------------------------------------------------*/
/* Input: */
/* UDWORD : Link ID for the data updating[IN] */
/* fpos_t* : Position of the linkdata being updated[OUT]*/
/* */
/* -----------------------------------------------------------------------*/
/* Output: */
/* RETURN : 乮Normal乯Matched link data node number */
/* 乮Error乯 RET_FAILED */
/* */
/* -----------------------------------------------------------------------*/
/* Outline: */
/* Find the position of the link data to being updated. */
/* */
/* -----------------------------------------------------------------------*/
/* Others: */
/* */
/***************************************************************************/
int routelink_upd_chklnkid(
UDWORD udwBaseLnkID,
/* I / Link ID for the data updating */
fpos_t* pstFilePos,
/* O / Position of the link data being updated */
BYTE* pbUpdFileName
/* IO/ File to be updated */
)
{
UWORD uwRecSize = 0; /* Current Record size */
UDWORD udwLinkID = 0; /* Link ID */
int iRetReadFile= 0; /* Return of read file */
int iSrcRsltNum = 0; /* Search result */
int iMovSize = 0; /* Size of memory move */
BYTE* pbMemBlock = NULL; /* Memory Block for read from file */
BYTE* pbCurBlock = NULL; /* Current pointer to Memory Block */
BYTE* pbCatPos = NULL;
FILE* pOrgFile = NULL; /* File Handle */
/* Exception prevention */
if( (NULL == pbUpdFileName) || (NULL == pstFilePos) )
{
return RET_FAILED;
}
/* Route link data file open */
pOrgFile = fopen( pbUpdFileName, "ab+" );
if( NULL == pOrgFile )
{
printf( "\nOpen data file failed!\n" );
return RET_FAILED;
}
/* Memory block allocation */
pbMemBlock = malloc( FILEREAD_BLOCKSIZE );
if( NULL == pbMemBlock )
{
fclose( pOrgFile );
pOrgFile = NULL;
return RET_FAILED;
}
else
{
memset( pbMemBlock, 0, FILEREAD_BLOCKSIZE );
pbCatPos = pbMemBlock;
}
/* Read file until find the same ID or until the end of file(not exist)*/
while( 0 == feof( pOrgFile ) )
{
memset( pbCatPos, 0, (FILEREAD_BLOCKSIZE - iMovSize) );
/* Current file pointer get */
fgetpos( pOrgFile, pstFilePos );
iRetReadFile = fread( pbCatPos,
(FILEREAD_BLOCKSIZE - iMovSize), 1, pOrgFile );
pbCurBlock = pbMemBlock;
if( iRetReadFile > 0 )
{
while( (pbCurBlock + RL_SIZE_RECSIZE) <
(pbMemBlock + FILEREAD_BLOCKSIZE) )
{
/* Get Record size and Link ID */
uwRecSize = MC_GET_SHORT( pbCurBlock );
if( (pbCurBlock + uwRecSize) >
(pbMemBlock + FILEREAD_BLOCKSIZE) )
{
break;
}
udwLinkID = MC_GET_LONG( (pbCurBlock + RL_OFFSET_LNKID) );
if( udwLinkID == udwBaseLnkID )
{
iSrcRsltNum++;
/* The position of the data need to be updated */
*pstFilePos += (pbCurBlock - pbCatPos);
break;
}
/* Next record header address get */
pbCurBlock += uwRecSize;
}
iMovSize = (pbMemBlock + (FILEREAD_BLOCKSIZE) - pbCurBlock);
memcpy( pbMemBlock, pbCurBlock, iMovSize );
pbCatPos = pbMemBlock + iMovSize;
}
else
{
break;
}
if( iSrcRsltNum > 0 )
{
break;
}
}
/* Memory block free */
if( NULL != pbMemBlock )
{
free( pbMemBlock );
pbMemBlock = NULL;
}
/* File close */
fclose( pOrgFile );
pOrgFile = NULL;
/* Return the flag of match Link ID exist or not */
return iSrcRsltNum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -