# ifndef UTILPP_H
# define UTILPP_H
# include <cstdio>
# include <unistd.h>
# include <string>
# include <memory>
# include <sstream>
# include <fstream>
# ifdef __x86_64
# include <linux/limits.h>
# endif
namespace util {
inline bool starts_with ( std : : string s , std : : string prefix ) {
return s . compare ( 0 , prefix . size ( ) , prefix ) = = 0 ;
}
template < typename . . . Args >
inline std : : string string_format ( const std : : string & format , Args . . . args ) {
size_t size = snprintf ( nullptr , 0 , format . c_str ( ) , args . . . ) + 1 ;
std : : unique_ptr < char [ ] > buf ( new char [ size ] ) ;
snprintf ( buf . get ( ) , size , format . c_str ( ) , args . . . ) ;
return std : : string ( buf . get ( ) , buf . get ( ) + size - 1 ) ;
}
inline std : : string read_file ( std : : string fn ) {
std : : ifstream t ( fn ) ;
std : : stringstream buffer ;
buffer < < t . rdbuf ( ) ;
return buffer . str ( ) ;
}
inline std : : string tohex ( const uint8_t * buf , size_t buf_size ) {
std : : unique_ptr < char [ ] > hexbuf ( new char [ buf_size * 2 + 1 ] ) ;
for ( int i = 0 ; i < buf_size ; i + + ) {
sprintf ( & hexbuf [ i * 2 ] , " %02x " , buf [ i ] ) ;
}
hexbuf [ buf_size * 2 ] = 0 ;
return std : : string ( hexbuf . get ( ) , hexbuf . get ( ) + buf_size * 2 ) ;
}
inline std : : string base_name ( std : : string const & path ) {
size_t pos = path . find_last_of ( " / " ) ;
if ( pos = = std : : string : : npos ) return path ;
return path . substr ( pos + 1 ) ;
}
inline std : : string dir_name ( std : : string const & path ) {
size_t pos = path . find_last_of ( " / " ) ;
if ( pos = = std : : string : : npos ) return " " ;
return path . substr ( 0 , pos ) ;
}
inline std : : string readlink ( std : : string path ) {
char buff [ PATH_MAX ] ;
ssize_t len = : : readlink ( path . c_str ( ) , buff , sizeof ( buff ) - 1 ) ;
if ( len ! = - 1 ) {
buff [ len ] = ' \0 ' ;
return std : : string ( buff ) ;
}
return " " ;
}
}
# endif