blob: edd51e02f968d079ea584f58a4000569456239e0 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* ---- includes ----------------------------------------------------------- */
#include "b_BasicEm/String.h"
/*
#include <stdlib.h>
*/
/* ---- related objects --------------------------------------------------- */
/* ---- typedefs ----------------------------------------------------------- */
/* ---- constants ---------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
/* */
/* ---- \ghd{ external functions } ----------------------------------------- */
/* */
/* ========================================================================= */
/* ------------------------------------------------------------------------- */
char* bbs_strcpy( char* dstA, const char* srcA )
{
const char* srcL = srcA;
char* dstL = dstA;
while( ( *dstL++ = *srcL++ ) != 0 );
return dstA;
}
/* ------------------------------------------------------------------------- */
char* bbs_strncpy( char* dstA, const char* srcA, uint32 sizeA )
{
uint32 iL;
for( iL = 0; iL < sizeA; iL++ )
{
if( ( dstA[ iL ] = srcA[ iL ] ) == 0 ) break;
}
if( iL == sizeA && sizeA > 0 ) dstA[ iL - 1 ] = 0;
return dstA;
}
/* ------------------------------------------------------------------------- */
char* bbs_strcat( char* dstA, const char* srcA )
{
const char* srcL = srcA;
char* dstL = dstA;
while( *dstL != 0 ) dstL++;
while( ( *dstL++ = *srcL++ ) != 0 );
return dstA;
}
/* ------------------------------------------------------------------------- */
char* bbs_strncat( char* dstA, const char* srcA, uint32 sizeA )
{
uint32 iL;
for( iL = 0; iL < sizeA; iL++ )
{
if( dstA[ iL ] == 0 ) break;
}
for( ; iL < sizeA; iL++ )
{
if( ( dstA[ iL ] = srcA[ iL ] ) == 0 ) break;
}
if( iL == sizeA && sizeA > 0 ) dstA[ iL - 1 ] = 0;
return dstA;
}
/* ------------------------------------------------------------------------- */
uint32 bbs_strlen( const char* strA )
{
uint32 iL = 0;
while( strA[ iL++ ] != 0 );
return iL - 1;
}
/* ------------------------------------------------------------------------- */
flag bbs_strequal( const char* str1A, const char* str2A )
{
const char* str1L = str1A;
const char* str2L = str2A;
if( str1L == NULL && str2L == NULL ) return TRUE;
if( str1L == NULL || str2L == NULL ) return FALSE;
while( ( *str1L != 0 ) && ( *str2L != 0 ) )
{
if( *str1L != *str2L ) break;
str1L++;
str2L++;
}
return *str1L == *str2L;
}
/* ------------------------------------------------------------------------- */
flag bbs_strmatch( const char* str1A, const char* str2A )
{
const char* str1L = str1A;
const char* str2L = str2A;
if( str1L == NULL || str2L == NULL ) return TRUE;
while( ( *str1L != 0 ) && ( *str2L != 0 ) )
{
if( *str1L != *str2L ) break;
str1L++;
str2L++;
}
if( *str1L == 0 || *str2L == 0 ) return TRUE;
return *str1L == *str2L;
}
/* ------------------------------------------------------------------------- */
uint32 bbs_snprintf( char* bufA, uint32 bufSizeA, const char* formatA, ... )
{
uint32 sizeL;
va_list argsL;
va_start( argsL, formatA );
sizeL = bbs_vsnprintf( bufA, bufSizeA, formatA, argsL );
va_end( argsL );
return sizeL;
}
/* ------------------------------------------------------------------------- */
/* converts number to string without 0 termination - returns number of characters written */
uint32 bbs_cString( int32 valA, char* dstA, uint32 bufSizeA )
{
uint32 valL = ( valA < 0 ) ? -valA : valA;
uint32 iL = 0;
uint32 digitsL = 0;
if( valA < 0 )
{
if( iL < bufSizeA ) dstA[ iL++ ] = '-';
}
/* count #digits */
if( valL == 0 )
{
iL++;
}
else
{
while( valL > 0 )
{
iL++;
valL /= 10;
}
}
digitsL = ( iL > bufSizeA ) ? bufSizeA : iL;
valL = ( valA < 0 ) ? -valA : valA;
if( valL == 0 )
{
if( iL < bufSizeA ) dstA[ --iL ] = '0';
}
else
{
while( valL > 0 )
{
if( iL < bufSizeA ) dstA[ --iL ] = '0' + ( valL % 10 );
valL /= 10;
}
}
return digitsL;
}
/* ------------------------------------------------------------------------- */
uint32 bbs_vsnprintf( char* bufA, uint32 bufSizeA, const char* formatA, va_list argsA )
{
const char* fpL = formatA;
uint32 iL = 0;
while( *fpL != 0 )
{
if( *fpL == '%' )
{
if( *( fpL + 1 ) == 'i' || *( fpL + 1 ) == 'd' )
{
int valL = va_arg( argsA, int );
if( iL < bufSizeA )
{
iL += bbs_cString( valL, bufA + iL, bufSizeA - iL );
}
fpL += 2;
}
else if( *( fpL + 1 ) == 's' )
{
const char* stringL = va_arg( argsA, char* );
if( iL < bufSizeA )
{
bufA[ iL ] = 0;
bbs_strncat( bufA + iL, stringL, bufSizeA - iL );
iL += bbs_strlen( stringL );
}
fpL += 2;
}
else if( *( fpL + 1 ) == '%' )
{
if( iL < bufSizeA ) bufA[ iL++ ] = '%';
fpL++;
}
else
{
if( iL < bufSizeA ) bufA[ iL++ ] = *fpL;
fpL++;
}
}
else
{
if( iL < bufSizeA ) bufA[ iL++ ] = *fpL;
fpL++;
}
}
if( iL < bufSizeA )
{
bufA[ iL ] = 0;
}
else if( bufSizeA > 0 )
{
bufA[ bufSizeA - 1 ] = 0;
}
return iL;
}
/* ------------------------------------------------------------------------- */
int32 bbs_atoi( const char* strA )
{
int32 valL = 0;
int16 signL = 1;
uint16 iL = 0, lenL = bbs_strlen( strA );
while( iL < lenL && strA[ iL ] == ' ' ) iL++;
if( strA[ iL ] == '-' )
{
signL = -1;
iL++;
}
while( iL < lenL && strA[ iL ] == ' ' ) iL++;
while( iL < lenL && strA[ iL ] >= '0' && strA[ iL ] <= '9' )
{
valL = valL * 10 + ( strA[ iL ] - '0' );
iL++;
}
return valL * signL;
}
/* ------------------------------------------------------------------------- */