167 lines
3.7 KiB
C
Executable File
167 lines
3.7 KiB
C
Executable File
/*
|
|
Include section
|
|
*/
|
|
|
|
#include "ammunition_string.h"
|
|
#include "ammunition_stdio.h"
|
|
#include "ammunition_stdlib.h"
|
|
|
|
|
|
/*
|
|
Standard library functions
|
|
*/
|
|
|
|
char ammunition_isdigit( unsigned char c )
|
|
{
|
|
if ( ( c >= '0' ) & ( c <= '9' ) )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
int ammunition_isspace( int c )
|
|
{
|
|
return ( c == ' ' ) | ( c == '\t' ) | ( c == '\n' ) | ( c == '\r' );
|
|
}
|
|
|
|
void *ammunition_memcpy( void *dest, const void *src, size_t size )
|
|
{
|
|
size_t i;
|
|
_Pragma( "loopbound min 2 max 6" )
|
|
for ( i = 0; i < size; i++ )
|
|
( ( unsigned char * )dest )[ i ] = ( ( unsigned char * )src )[ i ];
|
|
|
|
return dest;
|
|
}
|
|
|
|
|
|
void *ammunition_memset( void *s, int c, size_t n )
|
|
{
|
|
size_t i;
|
|
_Pragma( "loopbound min 0 max 4" )
|
|
for ( i = 0; i < n; i++ )
|
|
( ( unsigned char * )s )[ i ] = ( unsigned char )c;
|
|
|
|
return s;
|
|
}
|
|
|
|
|
|
int ammunition_memcmp ( const void *mem1, const void *mem2, size_t size )
|
|
{
|
|
const unsigned char *p1 = ( const unsigned char * ) mem1,
|
|
*p2 = ( const unsigned char * ) mem2;
|
|
_Pragma( "loopbound min 0 max 4" )
|
|
while ( size-- )
|
|
if ( *p1 != *p2 )
|
|
return ( *p1 - *p2 );
|
|
else
|
|
p1++, p2++;
|
|
return 0;
|
|
}
|
|
|
|
|
|
/* The following function is an analog of standard C function
|
|
`memmove'. The function returns the first operand. */
|
|
|
|
void *ammunition_memmove ( void *s1, const void *s2, size_t n )
|
|
{
|
|
int i;
|
|
|
|
if ( ( ( char * ) s1 < ( char * ) s2 && ( char * ) s1 + n <= ( char * ) s2 )
|
|
|| ( ( char * ) s2 < ( char * ) s1
|
|
&& ( char * ) s2 + n <= ( char * ) s1 ) )
|
|
return ( void * ) ammunition_memcpy ( s1, s2, n );
|
|
if ( ( char * ) s1 < ( char * ) s2 && ( char * ) s1 + n > ( char * ) s2 ) {
|
|
_Pragma( "loopbound min 0 max 4" )
|
|
for ( i = 0; ( size_t ) i < n; i++ )
|
|
( ( char * ) s1 ) [ i ] = ( ( char * ) s2 ) [ i ];
|
|
} else {
|
|
_Pragma( "loopbound min 0 max 4" )
|
|
for ( i = n - 1; i >= 0; i-- )
|
|
( ( char * ) s1 )[ i ] = ( ( char * ) s2 ) [ i ];
|
|
}
|
|
return s1;
|
|
}
|
|
|
|
int ammunition_strcmp ( const char *str1, const char *str2 )
|
|
{
|
|
_Pragma( "loopbound min 1 max 11" )
|
|
while ( *str1 && ( *str1 == *str2 ) )
|
|
str1++, str2++;
|
|
return *( const unsigned char * )str1 - *( const unsigned char * )str2;
|
|
}
|
|
|
|
int ammunition_atoi ( const char *str )
|
|
{
|
|
int result = 0;
|
|
int sign = ( str[ 0 ] == '-' ? -1 : 1 );
|
|
|
|
int readingPos = 0;
|
|
if ( str[ 0 ] == '-' || str[ 0 ] == '+' )
|
|
readingPos++;
|
|
_Pragma( "loopbound min 1 max 7" )
|
|
do {
|
|
result *= 10;
|
|
result += str[ readingPos++ ] - 48;
|
|
} while ( str[ readingPos ] != 0 );
|
|
|
|
return sign * result;
|
|
}
|
|
|
|
|
|
int ammunition_sprintf_d( char *s, int number )
|
|
{
|
|
/* How many decimal digits do we need? */
|
|
char digits = 0;
|
|
unsigned char writePos = 0;
|
|
long long copyOfNumber = number;
|
|
_Pragma( "loopbound min 1 max 10" )
|
|
do {
|
|
digits++;
|
|
copyOfNumber /= 10;
|
|
} while ( copyOfNumber != 0 );
|
|
|
|
writePos = digits;
|
|
if ( number < 0 ) {
|
|
writePos++;
|
|
s[ 0 ] = '-';
|
|
}
|
|
s[ writePos ] = 0;
|
|
|
|
copyOfNumber = number;
|
|
_Pragma( "loopbound min 1 max 10" )
|
|
do {
|
|
s[ --writePos ] = 48 + ( ( copyOfNumber >= 0 ?
|
|
copyOfNumber : -copyOfNumber ) % 10 );
|
|
copyOfNumber /= 10;
|
|
} while ( copyOfNumber != 0 );
|
|
|
|
return digits + ( number < 0 ? 1 : 0 );
|
|
}
|
|
|
|
|
|
int ammunition_sprintf_u( char *s, unsigned int number )
|
|
{
|
|
/* How many decimal digits do we need? */
|
|
char digits = 0;
|
|
unsigned char writePos = 0;
|
|
unsigned long long copyOfNumber = number;
|
|
_Pragma( "loopbound min 1 max 10" )
|
|
do {
|
|
digits++;
|
|
copyOfNumber /= 10;
|
|
} while ( copyOfNumber != 0 );
|
|
|
|
writePos = digits;
|
|
s[ writePos ] = 0;
|
|
|
|
copyOfNumber = number;
|
|
_Pragma( "loopbound min 1 max 10" )
|
|
do {
|
|
s[ --writePos ] = 48 + ( copyOfNumber % 10 );
|
|
copyOfNumber /= 10;
|
|
} while ( copyOfNumber != 0 );
|
|
|
|
return digits;
|
|
}
|