⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cplconv.cpp

📁 国际海图标准S-57格式数据读取源码VC
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"#include "CplConv.h"#include "CplString.h"static char **papszConfigOptions = NULL;/************************************************************************//*                             CPLCalloc()                              *//************************************************************************//** * Safe version of calloc(). * * This function is like the C library calloc(), but raises a CE_Fatal * error with CPLError() if it fails to allocate the desired memory.  It * should be used for small memory allocations that are unlikely to fail * and for which the application is unwilling to test for out of memory * conditions.  It uses VSICalloc() to get the memory, so any hooking of * VSICalloc() will apply to CPLCalloc() as well.  CPLFree() or VSIFree() * can be used free memory allocated by CPLCalloc(). * * @param nCount number of objects to allocate. * @param nSize size (in bytes) of object to allocate. * @return pointer to newly allocated memory, only NULL if nSize * nCount is * NULL. */void *CPLCalloc( size_t nCount, size_t nSize ){    void        *pReturn;    if( nSize * nCount == 0 )        return NULL;        pReturn = VSICalloc( nCount, nSize );    if( pReturn == NULL )    {        CPLError( CE_Fatal, CPLE_OutOfMemory,                  "CPLCalloc(): Out of memory allocating %d bytes.\n",                  nSize * nCount );    }    return pReturn;}/************************************************************************//*                             CPLMalloc()                              *//************************************************************************//** * Safe version of malloc(). * * This function is like the C library malloc(), but raises a CE_Fatal * error with CPLError() if it fails to allocate the desired memory.  It * should be used for small memory allocations that are unlikely to fail * and for which the application is unwilling to test for out of memory * conditions.  It uses VSIMalloc() to get the memory, so any hooking of * VSIMalloc() will apply to CPLMalloc() as well.  CPLFree() or VSIFree() * can be used free memory allocated by CPLMalloc(). * * @param nSize size (in bytes) of memory block to allocate. * @return pointer to newly allocated memory, only NULL if nSize is zero. */void *CPLMalloc( size_t nSize ){    void        *pReturn;    CPLVerifyConfiguration();    if( nSize == 0 )        return NULL;        pReturn = VSIMalloc( nSize );    if( pReturn == NULL )    {        CPLError( CE_Fatal, CPLE_OutOfMemory,                  "CPLMalloc(): Out of memory allocating %d bytes.\n",                  nSize );    }    return pReturn;}/************************************************************************//*                             CPLRealloc()                             *//************************************************************************//** * Safe version of realloc(). * * This function is like the C library realloc(), but raises a CE_Fatal * error with CPLError() if it fails to allocate the desired memory.  It * should be used for small memory allocations that are unlikely to fail * and for which the application is unwilling to test for out of memory * conditions.  It uses VSIRealloc() to get the memory, so any hooking of * VSIRealloc() will apply to CPLRealloc() as well.  CPLFree() or VSIFree() * can be used free memory allocated by CPLRealloc(). * * It is also safe to pass NULL in as the existing memory block for * CPLRealloc(), in which case it uses VSIMalloc() to allocate a new block. * * @param pData existing memory block which should be copied to the new block. * @param nNewSize new size (in bytes) of memory block to allocate. * @return pointer to allocated memory, only NULL if nNewSize is zero. */void * CPLRealloc( void * pData, size_t nNewSize ){    void        *pReturn;    if ( nNewSize == 0 )    {        VSIFree(pData);        return NULL;    }    if( pData == NULL )        pReturn = VSIMalloc( nNewSize );    else        pReturn = VSIRealloc( pData, nNewSize );        if( pReturn == NULL )    {        CPLError( CE_Fatal, CPLE_OutOfMemory,                  "CPLRealloc(): Out of memory allocating %d bytes.\n",                  nNewSize );    }    return pReturn;}/************************************************************************//*                             CPLStrdup()                              *//************************************************************************//** * Safe version of strdup() function. * * This function is similar to the C library strdup() function, but if * the memory allocation fails it will issue a CE_Fatal error with * CPLError() instead of returning NULL.  It uses VSIStrdup(), so any * hooking of that function will apply to CPLStrdup() as well.  Memory * allocated with CPLStrdup() can be freed with CPLFree() or VSIFree(). * * It is also safe to pass a NULL string into CPLStrdup().  CPLStrdup() * will allocate and return a zero length string (as opposed to a NULL * string). * * @param pszString input string to be duplicated.  May be NULL. * @return pointer to a newly allocated copy of the string.  Free with * CPLFree() or VSIFree(). */char *CPLStrdup( const char * pszString ){    char        *pszReturn;    if( pszString == NULL )        pszString = "";    pszReturn = VSIStrdup( pszString );            if( pszReturn == NULL )    {        CPLError( CE_Fatal, CPLE_OutOfMemory,                  "CPLStrdup(): Out of memory allocating %d bytes.\n",                  strlen(pszString) );            }        return( pszReturn );}/************************************************************************//*                              CPLFGets()                              *//*                                                                      *//*      Note: CR = \r = ASCII 13                                        *//*            LF = \n = ASCII 10                                        *//************************************************************************//** * Reads in at most one less than nBufferSize characters from the fp * stream and stores them into the buffer pointed to by pszBuffer. * Reading stops after an EOF or a newline. If a newline is read, it * is _not_ stored into the buffer. A '\0' is stored after the last * character in the buffer. All three types of newline terminators * recognized by the CPLFGets(): single '\r' and '\n' and '\r\n' * combination. * * @param pszBuffer pointer to the targeting character buffer. * @param nBufferSize maximum size of the string to read (not including * termonating '\0'). * @param fp file pointer to read from. * @return pointer to the pszBuffer containing a string read * from the file or NULL if the error or end of file was encountered. */char *CPLFGets( char *pszBuffer, int nBufferSize, FILE * fp ){    int nActuallyRead, nOriginalOffset;    if ( nBufferSize == 0 || pszBuffer == NULL || fp == NULL )	return NULL;/* -------------------------------------------------------------------- *//*      Let the OS level call read what it things is one line.  This    *//*      will include the newline.  On windows, if the file happens      *//*      to be in text mode, the CRLF will have been converted to        *//*      just the newline (LF).  If it is in binary mode it may well     *//*      have both.                                                      *//* -------------------------------------------------------------------- */    nOriginalOffset = VSIFTell( fp );    if( VSIFGets( pszBuffer, nBufferSize, fp ) == NULL )        return NULL;        nActuallyRead = strlen(pszBuffer);    if ( nActuallyRead == 0 )	return NULL;/* -------------------------------------------------------------------- *//*      Trim off \n, \r or \r\n if it appears at the end.  We don't     *//*      need to do any "seeking" since we want the newline eaten.       *//* -------------------------------------------------------------------- */    if( nActuallyRead > 1         && pszBuffer[nActuallyRead-1] == 10         && pszBuffer[nActuallyRead-2] == 13 )    {        pszBuffer[nActuallyRead-2] = '\0';    }    else if( pszBuffer[nActuallyRead-1] == 10              || pszBuffer[nActuallyRead-1] == 13 )    {        pszBuffer[nActuallyRead-1] = '\0';    }/* -------------------------------------------------------------------- *//*      Search within the string for a \r (MacOS convention             *//*      apparently), and if we find it we need to trim the string,      *//*      and seek back.                                                  *//* -------------------------------------------------------------------- */    char *pszExtraNewline = strchr( pszBuffer, 13 );        if( pszExtraNewline != NULL )    {        int chCheck;        nActuallyRead = pszExtraNewline - pszBuffer + 1;                *pszExtraNewline = '\0';        VSIFSeek( fp, nOriginalOffset + nActuallyRead - 1, SEEK_SET );        /*          * This hackery is necessary to try and find our correct         * spot on win32 systems with text mode line translation going          * on.  Sometimes the fseek back overshoots, but it doesn't         * "realize it" till a character has been read. Try to read till         * we get to the right spot and get our CR.          */         chCheck = fgetc( fp );        while( (chCheck != 13 && chCheck != EOF)               || VSIFTell(fp) < nOriginalOffset + nActuallyRead )        {            static int bWarned = FALSE;            if( !bWarned )            {                bWarned = TRUE;                CPLDebug( "CPL", "CPLFGets() correcting for DOS text mode translation seek problem." );            }            chCheck = fgetc( fp );        }    }    return pszBuffer;}/************************************************************************//*                            CPLReadLine()                             *//************************************************************************//** * Simplified line reading from text file. *  * Read a line of text from the given file handle, taking care * to capture CR and/or LF and strip off ... equivelent of * DKReadLine().  Pointer to an internal buffer is returned. * The application shouldn't free it, or depend on it's value * past the next call to CPLReadLine(). *  * Note that CPLReadLine() uses VSIFGets(), so any hooking of VSI file * services should apply to CPLReadLine() as well. * * CPLReadLine() maintains an internal buffer, which will appear as a  * single block memory leak in some circumstances.  CPLReadLine() may  * be called with a NULL FILE * at any time to free this working buffer. * * @param fp file pointer opened with VSIFOpen(). * * @return pointer to an internal buffer containing a line of text read * from the file or NULL if the end of file was encountered. */const char *CPLReadLine( FILE * fp ){    static char *pszRLBuffer = NULL;    static int  nRLBufferSize = 0;    int         nReadSoFar = 0;/* -------------------------------------------------------------------- *//*      Cleanup case.                                                   *//* -------------------------------------------------------------------- */    if( fp == NULL )    {        CPLFree( pszRLBuffer );        pszRLBuffer = NULL;        nRLBufferSize = 0;        return NULL;    }/* -------------------------------------------------------------------- *//*      Loop reading chunks of the line till we get to the end of       *//*      the line.                                                       *//* -------------------------------------------------------------------- */    do {/* -------------------------------------------------------------------- *//*      Grow the working buffer if we have it nearly full.  Fail out    *//*      of read line if we can't reallocate it big enough (for          *//*      instance for a _very large_ file with no newlines).             *//* -------------------------------------------------------------------- */        if( nRLBufferSize-nReadSoFar < 128 )        {            nRLBufferSize = nRLBufferSize*2 + 128;            pszRLBuffer = (char *) VSIRealloc(pszRLBuffer, nRLBufferSize);            if( pszRLBuffer == NULL )            {                nRLBufferSize = 0;                return NULL;            }        }/* -------------------------------------------------------------------- *//*      Do the actual read.                                             *//* -------------------------------------------------------------------- */        if( CPLFGets( pszRLBuffer+nReadSoFar, nRLBufferSize-nReadSoFar, fp )            == NULL )        {            CPLFree( pszRLBuffer );            pszRLBuffer = NULL;            nRLBufferSize = 0;            return NULL;        }        nReadSoFar = strlen(pszRLBuffer);    } while( nReadSoFar == nRLBufferSize - 1             && pszRLBuffer[nRLBufferSize-2] != 13             && pszRLBuffer[nRLBufferSize-2] != 10 );    return( pszRLBuffer );}/************************************************************************//*                            CPLScanString()                           *//************************************************************************//** * Scan up to a maximum number of characters from a given string, * allocate a buffer for a new string and fill it with scanned characters. * * @param pszString String containing characters to be scanned. It may be * terminated with a null character. * * @param nMaxLength The maximum number of character to read. Less * characters will be read if a null character is encountered. * * @param bTrimSpaces If TRUE, trim ending spaces from the input string. * Character considered as empty using isspace(3) function. * * @param bNormalize If TRUE, replace ':' symbol with the '_'. It is needed if * resulting string will be used in CPL dictionaries. *  * @return Pointer to the resulting string buffer. Caller responsible to free * this buffer with CPLFree(). */char *CPLScanString( char *pszString, int nMaxLength,                     int bTrimSpaces, int bNormalize ){    char    *pszBuffer;    if ( !pszString )        return NULL;    if ( !nMaxLength )        return CPLStrdup( "" );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -