?? cpl_conv.cpp
字號:
/**
* Scan up to a maximum number of characters from a string and convert
* the result to a unsigned long.
*
* @param pszString String containing characters to be scanned. It may be
* terminated with a null character.
*
* @param nMaxLength The maximum number of character to consider as part
* of the number. Less characters will be considered if a null character
* is encountered.
*
* @return Unsigned long value, converted from its ASCII form.
*/
unsigned long CPLScanULong( const char *pszString, int nMaxLength )
{
unsigned long uValue;
char *pszValue = (char *)CPLMalloc( nMaxLength + 1);
/* -------------------------------------------------------------------- */
/* Compute string into local buffer, and terminate it. */
/* -------------------------------------------------------------------- */
strncpy( pszValue, pszString, nMaxLength );
pszValue[nMaxLength] = '\0';
/* -------------------------------------------------------------------- */
/* Use strtoul() to fetch out the result */
/* -------------------------------------------------------------------- */
uValue = strtoul( pszValue, NULL, 10 );
CPLFree( pszValue );
return uValue;
}
/************************************************************************/
/* CPLScanUIntBig() */
/************************************************************************/
/**
* Extract big integer from string.
*
* Scan up to a maximum number of characters from a string and convert
* the result to a GUIntBig.
*
* @param pszString String containing characters to be scanned. It may be
* terminated with a null character.
*
* @param nMaxLength The maximum number of character to consider as part
* of the number. Less characters will be considered if a null character
* is encountered.
*
* @return GUIntBig value, converted from its ASCII form.
*/
GUIntBig CPLScanUIntBig( const char *pszString, int nMaxLength )
{
GUIntBig iValue;
char *pszValue = (char *)CPLMalloc( nMaxLength + 1);
/* -------------------------------------------------------------------- */
/* Compute string into local buffer, and terminate it. */
/* -------------------------------------------------------------------- */
strncpy( pszValue, pszString, nMaxLength );
pszValue[nMaxLength] = '\0';
/* -------------------------------------------------------------------- */
/* Fetch out the result */
/* -------------------------------------------------------------------- */
#if defined(WIN32) && defined(_MSC_VER)
iValue = (GUIntBig)_atoi64( pszValue );
# elif HAVE_ATOLL
iValue = atoll( pszValue );
#else
iValue = atol( pszValue );
#endif
CPLFree( pszValue );
return iValue;
}
/************************************************************************/
/* CPLScanPointer() */
/************************************************************************/
/**
* Extract pointer from string.
*
* Scan up to a maximum number of characters from a string and convert
* the result to a pointer.
*
* @param pszString String containing characters to be scanned. It may be
* terminated with a null character.
*
* @param nMaxLength The maximum number of character to consider as part
* of the number. Less characters will be considered if a null character
* is encountered.
*
* @return pointer value, converted from its ASCII form.
*/
void *CPLScanPointer( const char *pszString, int nMaxLength )
{
void *pResult;
char szTemp[128];
/* -------------------------------------------------------------------- */
/* Compute string into local buffer, and terminate it. */
/* -------------------------------------------------------------------- */
if( nMaxLength > (int) sizeof(szTemp)-1 )
nMaxLength = sizeof(szTemp)-1;
strncpy( szTemp, pszString, nMaxLength );
szTemp[nMaxLength] = '\0';
/* -------------------------------------------------------------------- */
/* On MSVC we have to scanf pointer values without the 0x */
/* prefix. */
/* -------------------------------------------------------------------- */
if( EQUALN(szTemp,"0x",2) )
{
pResult = NULL;
#if defined(WIN32) && defined(_MSC_VER)
sscanf( szTemp+2, "%p", &pResult );
#else
sscanf( szTemp, "%p", &pResult );
#endif
}
else
{
#if SIZEOF_VOIDP == 8
pResult = (void *) CPLScanUIntBig( szTemp, nMaxLength );
#else
pResult = (void *) CPLScanULong( szTemp, nMaxLength );
#endif
}
return pResult;
}
/************************************************************************/
/* CPLScanDouble() */
/************************************************************************/
/**
* Scan up to a maximum number of characters from a string and convert
* the result to a double.
*
* @param pszString String containing characters to be scanned. It may be
* terminated with a null character.
*
* @param nMaxLength The maximum number of character to consider as part
* of the number. Less characters will be considered if a null character
* is encountered.
*
* @param pszLocale Pointer to a character string containing locale name
* ("C", "POSIX", "us_US", "ru_RU.KOI8-R" etc.). If NULL, we will not
* manipulate with locale settings and current process locale will be used for
* printing. Wee need this setting because in different locales decimal
* delimiter represented with the different characters. With the pszLocale
* option we can control what exact locale will be used for scanning a numeric
* value from the string (in most cases it should be C/POSIX).
*
* @return Double value, converted from its ASCII form.
*/
double CPLScanDouble( const char *pszString, int nMaxLength, char *pszLocale )
{
int i;
double dfValue;
char *pszValue = (char *)CPLMalloc( nMaxLength + 1);
/* -------------------------------------------------------------------- */
/* Compute string into local buffer, and terminate it. */
/* -------------------------------------------------------------------- */
strncpy( pszValue, pszString, nMaxLength );
pszValue[nMaxLength] = '\0';
/* -------------------------------------------------------------------- */
/* Make a pass through converting 'D's to 'E's. */
/* -------------------------------------------------------------------- */
for( i = 0; i < nMaxLength; i++ )
if ( pszValue[i] == 'd' || pszValue[i] == 'D' )
pszValue[i] = 'E';
/* -------------------------------------------------------------------- */
/* Use atof() to fetch out the result */
/* -------------------------------------------------------------------- */
#if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
char *pszCurLocale = NULL;
if ( pszLocale || EQUAL( pszLocale, "" ) )
{
// Save the current locale
pszCurLocale = setlocale(LC_ALL, NULL );
// Set locale to the specified value
setlocale(LC_ALL, pszLocale );
}
#endif
dfValue = atof( pszValue );
#if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
// Restore stored locale back
if ( pszCurLocale )
setlocale(LC_ALL, pszCurLocale );
#endif
CPLFree( pszValue );
return dfValue;
}
/************************************************************************/
/* CPLPrintString() */
/************************************************************************/
/**
* Copy the string pointed to by pszSrc, NOT including the terminating
* `\0' character, to the array pointed to by pszDest.
*
* @param pszDest Pointer to the destination string buffer. Should be
* large enough to hold the resulting string.
*
* @param pszDest Pointer to the source buffer.
*
* @param nMaxLen Maximum length of the resulting string. If string length
* is greater than nMaxLen, it will be truncated.
*
* @return Number of characters printed.
*/
int CPLPrintString( char *pszDest, const char *pszSrc, int nMaxLen )
{
char *pszTemp = pszDest;
int nChars = 0;
if ( !pszDest )
return 0;
if ( !pszSrc )
{
*pszDest = '\0';
return 1;
}
while ( nChars < nMaxLen && *pszSrc )
{
*pszTemp++ = *pszSrc++;
nChars++;
}
return nChars;
}
/************************************************************************/
/* CPLPrintStringFill() */
/************************************************************************/
/**
* Copy the string pointed to by pszSrc, NOT including the terminating
* `\0' character, to the array pointed to by pszDest. Remainder of the
* destination string will be filled with space characters. This is only
* difference from the PrintString().
*
* @param pszDest Pointer to the destination string buffer. Should be
* large enough to hold the resulting string.
*
* @param pszDest Pointer to the source buffer.
*
* @param nMaxLen Maximum length of the resulting string. If string length
* is greater than nMaxLen, it will be truncated.
*
* @return Number of characters printed.
*/
int CPLPrintStringFill( char *pszDest, const char *pszSrc, int nMaxLen )
{
char *pszTemp = pszDest;
if ( !pszDest )
return 0;
if ( !pszSrc )
{
memset( pszDest, ' ', nMaxLen );
return nMaxLen;
}
while ( nMaxLen && *pszSrc )
{
*pszTemp++ = *pszSrc++;
nMaxLen--;
}
if ( nMaxLen )
memset( pszTemp, ' ', nMaxLen );
return nMaxLen;
}
/************************************************************************/
/* CPLPrintInt32() */
/************************************************************************/
/**
* Print GInt32 value into specified string buffer. This string will not
* be NULL-terminated.
*
* @param Pointer to the destination string buffer. Should be
* large enough to hold the resulting string. Note, that the string will
* not be NULL-terminated, so user should do this himself, if needed.
*
* @param iValue Numerical value to print.
*
* @param nMaxLen Maximum length of the resulting string. If string length
* is greater than nMaxLen, it will be truncated.
*
* @return Number of characters printed.
*/
int CPLPrintInt32( char *pszBuffer, GInt32 iValue, int nMaxLen )
{
char szTemp[64];
if ( !pszBuffer )
return 0;
if ( nMaxLen >= 64 )
nMaxLen = 63;
#if UINT_MAX == 65535
sprintf( szTemp, "%*ld", nMaxLen, iValue );
#else
sprintf( szTemp, "%*d", nMaxLen, iValue );
#endif
return CPLPrintString( pszBuffer, szTemp, nMaxLen );
}
/************************************************************************/
/* CPLPrintUIntBig() */
/************************************************************************/
/**
* Print GUIntBig value into specified string buffer. This string will not
* be NULL-terminated.
*
* @param Pointer to the destination string buffer. Should be
* large enough to hold the resulting string. Note, that the string will
* not be NULL-terminated, so user should do this himself, if needed.
*
* @param iValue Numerical value to print.
*
* @param nMaxLen Maximum length of the resulting string. If string length
* is greater than nMaxLen, it will be truncated.
*
* @return Number of characters printed.
*/
int CPLPrintUIntBig( char *pszBuffer, GUIntBig iValue, int nMaxLen )
{
char szTemp[64];
if ( !pszBuffer )
return 0;
if ( nMaxLen >= 64 )
nMaxLen = 63;
#if defined(WIN32) && defined(_MSC_VER)
sprintf( szTemp, "%*I64d", nMaxLen, iValue );
# elif HAVE_LONG_LONG
sprintf( szTemp, "%*lld", nMaxLen, (long long) iValue );
// sprintf( szTemp, "%*Ld", nMaxLen, (long long) iValue );
#else
sprintf( szTemp, "%*ld", nMaxLen, iValue );
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -