2018-05-15 14:28:53 +03:00
// SPDX-License-Identifier: GPL-2.0
# include <linux/ctype.h>
# include <linux/kernel.h>
2017-11-17 20:44:28 +03:00
# include <linux/errno.h>
2018-12-13 17:53:48 +03:00
# undef CONFIG_KASAN
2018-05-15 14:28:53 +03:00
# include "../lib/string.c"
int strncmp ( const char * cs , const char * ct , size_t count )
{
unsigned char c1 , c2 ;
while ( count ) {
c1 = * cs + + ;
c2 = * ct + + ;
if ( c1 ! = c2 )
return c1 < c2 ? - 1 : 1 ;
if ( ! c1 )
break ;
count - - ;
}
return 0 ;
}
char * skip_spaces ( const char * str )
{
while ( isspace ( * str ) )
+ + str ;
return ( char * ) str ;
}
char * strim ( char * s )
{
size_t size ;
char * end ;
size = strlen ( s ) ;
if ( ! size )
return s ;
end = s + size - 1 ;
while ( end > = s & & isspace ( * end ) )
end - - ;
* ( end + 1 ) = ' \0 ' ;
return skip_spaces ( s ) ;
}
/* Works only for digits and letters, but small and fast */
# define TOLOWER(x) ((x) | 0x20)
static unsigned int simple_guess_base ( const char * cp )
{
if ( cp [ 0 ] = = ' 0 ' ) {
if ( TOLOWER ( cp [ 1 ] ) = = ' x ' & & isxdigit ( cp [ 2 ] ) )
return 16 ;
else
return 8 ;
} else {
return 10 ;
}
}
/**
* simple_strtoull - convert a string to an unsigned long long
* @ cp : The start of the string
* @ endp : A pointer to the end of the parsed string will be placed here
* @ base : The number base to use
*/
unsigned long long simple_strtoull ( const char * cp , char * * endp ,
unsigned int base )
{
unsigned long long result = 0 ;
if ( ! base )
base = simple_guess_base ( cp ) ;
if ( base = = 16 & & cp [ 0 ] = = ' 0 ' & & TOLOWER ( cp [ 1 ] ) = = ' x ' )
cp + = 2 ;
while ( isxdigit ( * cp ) ) {
unsigned int value ;
value = isdigit ( * cp ) ? * cp - ' 0 ' : TOLOWER ( * cp ) - ' a ' + 10 ;
if ( value > = base )
break ;
result = result * base + value ;
cp + + ;
}
if ( endp )
* endp = ( char * ) cp ;
return result ;
}
long simple_strtol ( const char * cp , char * * endp , unsigned int base )
{
if ( * cp = = ' - ' )
return - simple_strtoull ( cp + 1 , endp , base ) ;
return simple_strtoull ( cp , endp , base ) ;
}
2017-11-17 20:44:28 +03:00
int kstrtobool ( const char * s , bool * res )
{
if ( ! s )
return - EINVAL ;
switch ( s [ 0 ] ) {
case ' y ' :
case ' Y ' :
case ' 1 ' :
* res = true ;
return 0 ;
case ' n ' :
case ' N ' :
case ' 0 ' :
* res = false ;
return 0 ;
case ' o ' :
case ' O ' :
switch ( s [ 1 ] ) {
case ' n ' :
case ' N ' :
* res = true ;
return 0 ;
case ' f ' :
case ' F ' :
* res = false ;
return 0 ;
default :
break ;
}
default :
break ;
}
return - EINVAL ;
}