2005-09-20 21:26:39 +08:00
|
|
|
/** \file util.h
|
2012-11-18 18:23:22 +08:00
|
|
|
Generic utilities library.
|
2006-06-17 21:07:08 +08:00
|
|
|
|
2012-11-18 18:23:22 +08: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 21:26:39 +08:00
|
|
|
*/
|
|
|
|
|
2005-10-04 23:11:39 +08:00
|
|
|
#ifndef FISH_UTIL_H
|
|
|
|
#define FISH_UTIL_H
|
|
|
|
|
|
|
|
#include <wchar.h>
|
2005-10-12 18:34:21 +08:00
|
|
|
#include <stdarg.h>
|
2006-01-26 20:21:34 +08:00
|
|
|
#include <unistd.h>
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Buffer for concatenating arbitrary data.
|
|
|
|
*/
|
|
|
|
typedef struct buffer
|
|
|
|
{
|
2012-11-19 08: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 21:26:39 +08:00
|
|
|
}
|
|
|
|
buffer_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the larger of two ints
|
|
|
|
*/
|
2012-07-29 08:49:46 +08:00
|
|
|
template<typename T>
|
2012-11-19 08:30:30 +08:00
|
|
|
static inline T maxi(T a, T b)
|
2012-07-29 08:49:46 +08:00
|
|
|
{
|
|
|
|
return a>b?a:b;
|
|
|
|
}
|
2005-10-26 22:48:23 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Returns the smaller of two ints
|
|
|
|
*/
|
2012-07-29 08:49:46 +08:00
|
|
|
template<typename T>
|
2012-11-19 08:30:30 +08:00
|
|
|
static inline T mini(T a, T b)
|
2012-07-29 08:49:46 +08:00
|
|
|
{
|
|
|
|
return a<b?a:b;
|
|
|
|
}
|
2005-10-26 22:48:23 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
2006-10-01 23:59:18 +08:00
|
|
|
Compares two wide character strings with an (arguably) intuitive
|
|
|
|
ordering.
|
2005-09-20 21:26:39 +08: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-26 22:48:23 +08: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-01 23:59:18 +08: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 21:26:39 +08:00
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
int wcsfilecmp(const wchar_t *a, const wchar_t *b);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Get the current time in microseconds since Jan 1, 1970
|
|
|
|
*/
|
|
|
|
long long get_time();
|
2005-10-04 23:11:39 +08:00
|
|
|
|
|
|
|
#endif
|