2015-11-16 17:42:05 +03:00
/*
* linux / tools / lib / string . c
*
* Copied from linux / lib / string . c , where it is :
*
* Copyright ( C ) 1991 , 1992 Linus Torvalds
*
* More specifically , the first copied function was strtobool , which
* was introduced by :
*
* d0f1fed29e6e ( " Add a strtobool function matching semantics of existing in kernel equivalents " )
* Author : Jonathan Cameron < jic23 @ cam . ac . uk >
*/
2015-11-16 17:36:29 +03:00
# include <stdlib.h>
# include <string.h>
2015-11-16 17:42:05 +03:00
# include <errno.h>
2015-11-16 17:36:29 +03:00
# include <linux/string.h>
2015-12-15 18:39:33 +03:00
# include <linux/compiler.h>
2015-11-16 17:36:29 +03:00
/**
* memdup - duplicate region of memory
*
* @ src : memory region to duplicate
* @ len : memory region length
*/
void * memdup ( const void * src , size_t len )
{
void * p = malloc ( len ) ;
if ( p )
memcpy ( p , src , len ) ;
return p ;
}
2015-11-16 17:42:05 +03:00
/**
* strtobool - convert common user inputs into boolean values
* @ s : input string
* @ res : result
*
2017-07-20 21:35:33 +03:00
* This routine returns 0 iff the first character is one of ' Yy1Nn0 ' , or
* [ oO ] [ NnFf ] for " on " and " off " . Otherwise it will return - EINVAL . Value
* pointed to by res is updated upon finding a match .
2015-11-16 17:42:05 +03:00
*/
int strtobool ( const char * s , bool * res )
{
2017-07-20 21:35:33 +03:00
if ( ! s )
return - EINVAL ;
2015-11-16 17:42:05 +03:00
switch ( s [ 0 ] ) {
case ' y ' :
case ' Y ' :
case ' 1 ' :
* res = true ;
2017-07-20 21:35:33 +03:00
return 0 ;
2015-11-16 17:42:05 +03:00
case ' n ' :
case ' N ' :
case ' 0 ' :
* res = false ;
2017-07-20 21:35:33 +03:00
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 ;
}
2015-11-16 17:42:05 +03:00
default :
2017-07-20 21:35:33 +03:00
break ;
2015-11-16 17:42:05 +03:00
}
2017-07-20 21:35:33 +03:00
return - EINVAL ;
2015-11-16 17:42:05 +03:00
}
2015-12-15 18:39:33 +03:00
/**
* strlcpy - Copy a C - string into a sized buffer
* @ dest : Where to copy the string to
* @ src : Where to copy the string from
* @ size : size of destination buffer
*
* Compatible with * BSD : the result is always a valid
* NUL - terminated string that fits in the buffer ( unless ,
* of course , the buffer size is zero ) . It does not pad
* out the result like strncpy ( ) does .
*
* If libc has strlcpy ( ) then that version will override this
* implementation :
*/
size_t __weak strlcpy ( char * dest , const char * src , size_t size )
{
size_t ret = strlen ( src ) ;
if ( size ) {
size_t len = ( ret > = size ) ? size - 1 : ret ;
memcpy ( dest , src , len ) ;
dest [ len ] = ' \0 ' ;
}
return ret ;
}