2005-09-20 23:26:39 +10:00
/** \file util.h
2012-11-18 11:23:22 +01:00
Generic utilities library .
2006-06-17 23:07:08 +10:00
2012-11-18 11:23:22 +01:00
All containers in this library except strinb_buffer_t are written
so that they don ' t allocate any memory until the first element is
inserted into them . That way it is known to be very cheap to
initialize various containers at startup , supporting the fish
notion of doing as much lazy initalization as possible .
2005-09-20 23:26:39 +10:00
*/
2005-10-05 01:11:39 +10:00
# ifndef FISH_UTIL_H
# define FISH_UTIL_H
# include <wchar.h>
2005-10-12 20:34:21 +10:00
# include <stdarg.h>
2006-01-26 22:21:34 +10:00
# include <unistd.h>
2005-10-05 01:11:39 +10:00
2005-09-20 23:26:39 +10:00
/**
Buffer for concatenating arbitrary data .
*/
typedef struct buffer
{
2012-11-18 16:30:30 -08:00
char * buff ; /**<data buffer*/
size_t length ; /**< Size of buffer */
size_t used ; /**< Size of data in buffer */
2005-09-20 23:26:39 +10:00
}
buffer_t ;
/**
Returns the larger of two ints
*/
2012-07-28 17:49:46 -07:00
template < typename T >
2012-11-18 16:30:30 -08:00
static inline T maxi ( T a , T b )
2012-07-28 17:49:46 -07:00
{
return a > b ? a : b ;
}
2005-10-27 00:48:23 +10:00
2005-09-20 23:26:39 +10:00
/**
Returns the smaller of two ints
*/
2012-07-28 17:49:46 -07:00
template < typename T >
2012-11-18 16:30:30 -08:00
static inline T mini ( T a , T b )
2012-07-28 17:49:46 -07:00
{
return a < b ? a : b ;
}
2005-10-27 00:48:23 +10:00
2005-09-20 23:26:39 +10:00
/**
2006-10-02 01:59:18 +10:00
Compares two wide character strings with an ( arguably ) intuitive
ordering .
2005-09-20 23:26:39 +10:00
This function tries to order strings in a way which is intuitive to
humans with regards to sorting strings containing numbers .
Most sorting functions would sort the strings ' file1 . txt '
' file5 . txt ' and ' file12 . txt ' as :
file1 . txt
file12 . txt
file5 . txt
This function regards any sequence of digits as a single entity
when performing comparisons , so the output is instead :
file1 . txt
file5 . txt
file12 . txt
Which most people would find more intuitive .
2005-10-27 00:48:23 +10:00
This won ' t return the optimum results for numbers in bases higher
than ten , such as hexadecimal , but at least a stable sort order
will result .
2006-10-02 01:59:18 +10:00
This function performs a two - tiered sort , where difference in case
and in number of leading zeroes in numbers only have effect if no
other differences between strings are found . This way , a ' file1 '
and ' File1 ' will not be considered identical , and hence their
internal sort order is not arbitrary , but the names ' file1 ' ,
' File2 ' and ' file3 ' will still be sorted in the order given above .
2005-09-20 23:26:39 +10:00
*/
2012-11-18 16:30:30 -08:00
int wcsfilecmp ( const wchar_t * a , const wchar_t * b ) ;
2005-09-20 23:26:39 +10:00
/**
Get the current time in microseconds since Jan 1 , 1970
*/
long long get_time ( ) ;
2005-10-05 01:11:39 +10:00
# endif