X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2F_PDCLIB_atomax.c;fp=functions%2F_PDCLIB%2F_PDCLIB_atomax.c;h=58a8e58e438c207f44870656beef9883f6e9b70c;hb=3082b97d8f2de1584430ad42671a0e056ed33be4;hp=0000000000000000000000000000000000000000;hpb=d7f27d5325d7c44d93be00662b13aa9ffdec76b1;p=pdclib diff --git a/functions/_PDCLIB/_PDCLIB_atomax.c b/functions/_PDCLIB/_PDCLIB_atomax.c new file mode 100644 index 0000000..58a8e58 --- /dev/null +++ b/functions/_PDCLIB/_PDCLIB_atomax.c @@ -0,0 +1,46 @@ +/* $Id$ */ + +/* _PDCLIB_atomax( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef REGTEST +#include <_PDCLIB_int.h> +#include +#include + +_PDCLIB_intmax_t _PDCLIB_atomax( const char * s ) +{ + _PDCLIB_intmax_t rc = 0; + char sign = '+'; + const char * x; + /* TODO: In other than "C" locale, additional patterns may be defined */ + while ( isspace( *s ) ) ++s; + if ( *s == '+' ) ++s; + else if ( *s == '-' ) sign = *(s++); + /* TODO: Earlier version was missing tolower() but was not caught by tests */ + while ( ( x = memchr( _PDCLIB_digits, tolower(*(s++)), 10 ) ) != NULL ) + { + rc = rc * 10 + ( x - _PDCLIB_digits ); + } + return ( sign == '+' ) ? rc : -rc; +} +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ +#ifndef REGTEST + /* basic functionality */ + TESTCASE( _PDCLIB_atomax( "123" ) == 123 ); + /* testing skipping of leading whitespace and trailing garbage */ + TESTCASE( _PDCLIB_atomax( " \n\v\t\f123xyz" ) == 123 ); +#endif + return TEST_RESULTS; +} + +#endif