2006-02-28 23:17:16 +10:00
# ifndef FISH_FALLBACK_H
# define FISH_FALLBACK_H
2006-03-06 07:24:11 +10:00
# include <stdio.h>
2006-05-10 23:27:04 +10:00
# include <stdint.h>
2006-03-06 07:24:11 +10:00
# include <stdarg.h>
2006-03-13 11:43:33 +10:00
# include <wctype.h>
# include <wchar.h>
2006-05-19 19:59:48 +10:00
# include <limits.h>
2006-03-06 07:24:11 +10:00
2006-05-10 02:42:22 +10:00
# ifndef WCHAR_MAX
/**
This _should_ be defined by wchar . h , but e . g . OpenBSD doesn ' t .
*/
2006-05-19 19:59:48 +10:00
# define WCHAR_MAX INT_MAX
2006-05-10 02:42:22 +10:00
# endif
2006-06-08 10:01:45 +10:00
/**
2006-06-09 09:52:12 +10:00
Make sure __func__ is defined to some string . In C99 , this should
be the currently compiled function . If we aren ' t using C99 or
later , older versions of GCC had __FUNCTION__ .
2006-06-08 10:01:45 +10:00
*/
# if __STDC_VERSION__ < 199901L
# if __GNUC__ >= 2
# define __func__ __FUNCTION__
# else
# define __func__ "<unknown>"
# endif
# endif
2006-03-14 10:08:01 +10:00
/**
Under curses , tputs expects an int ( * func ) ( char ) as its last
parameter , but in ncurses , tputs expects a int ( * func ) ( int ) as its
last parameter . tputs_arg_t is defined to always be what tputs
expects . Hopefully .
*/
2006-02-28 23:17:16 +10:00
2006-03-14 10:08:01 +10:00
# ifdef NCURSES_VERSION
typedef int tputs_arg_t ;
# else
typedef char tputs_arg_t ;
# endif
# ifdef TPUTS_KLUDGE
2006-03-06 07:24:11 +10:00
2006-02-28 23:17:16 +10:00
/**
Linux on PPC seems to have a tputs implementation that sometimes
behaves strangely . This fallback seems to fix things .
*/
2006-04-04 01:04:22 +10:00
int tputs ( const char * str , int affcnt , int ( * fish_putc ) ( tputs_arg_t ) ) ;
2006-02-28 23:17:16 +10:00
# endif
2006-03-26 02:21:03 +10:00
# ifndef HAVE_FWPRINTF
2006-02-28 23:17:16 +10:00
/**
Print formated string . Some operating systems ( Like NetBSD ) do not
have wide string formating functions . Therefore we implement our
own . Not at all complete . Supports wide and narrow characters ,
strings and decimal numbers , position ( % n ) , field width and
precision .
*/
int fwprintf ( FILE * f , const wchar_t * format , . . . ) ;
/**
Print formated string . Some operating systems ( Like NetBSD ) do not
have wide string formating functions . Therefore we define our
own . Not at all complete . Supports wide and narrow characters ,
strings and decimal numbers , position ( % n ) , field width and
precision .
*/
int swprintf ( wchar_t * str , size_t l , const wchar_t * format , . . . ) ;
/**
Print formated string . Some operating systems ( Like NetBSD ) do not
have wide string formating functions . Therefore we define our
own . Not at all complete . Supports wide and narrow characters ,
strings and decimal numbers , position ( % n ) , field width and
precision .
*/
int wprintf ( const wchar_t * format , . . . ) ;
/**
Print formated string . Some operating systems ( Like NetBSD ) do not
have wide string formating functions . Therefore we define our
own . Not at all complete . Supports wide and narrow characters ,
strings and decimal numbers , position ( % n ) , field width and
precision .
*/
int vwprintf ( const wchar_t * filter , va_list va ) ;
/**
Print formated string . Some operating systems ( Like NetBSD ) do not
have wide string formating functions . Therefore we define our
own . Not at all complete . Supports wide and narrow characters ,
strings and decimal numbers , position ( % n ) , field width and
precision .
*/
int vfwprintf ( FILE * f , const wchar_t * filter , va_list va ) ;
/**
Print formated string . Some operating systems ( Like NetBSD ) do not
have wide string formating functions . Therefore we define our
own . Not at all complete . Supports wide and narrow characters ,
strings and decimal numbers , position ( % n ) , field width and
precision .
*/
int vswprintf ( wchar_t * out , size_t n , const wchar_t * filter , va_list va ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_FGETWC
2006-02-28 23:17:16 +10:00
/**
Fallback implementation of fgetwc
*/
wint_t fgetwc ( FILE * stream ) ;
/**
Fallback implementation of getwc
*/
wint_t getwc ( FILE * stream ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_FPUTWC
2006-02-28 23:17:16 +10:00
/**
Fallback implementation of fputwc
*/
wint_t fputwc ( wchar_t wc , FILE * stream ) ;
/**
Fallback implementation of putwc
*/
wint_t putwc ( wchar_t wc , FILE * stream ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_WCSTOK
2006-02-28 23:17:16 +10:00
/**
Fallback implementation of wcstok . Uses code borrowed from glibc .
*/
wchar_t * wcstok ( wchar_t * wcs , const wchar_t * delim , wchar_t * * ptr ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_WCWIDTH
2006-02-28 23:17:16 +10:00
/**
Return the number of columns used by a character . This is a libc
function , but the prototype for this function is missing in some libc
implementations .
Fish has a fallback implementation in case the implementation is
missing altogether . In locales without a native wcwidth , Unicode
is probably so broken that it isn ' t worth trying to implement a
real wcwidth . Therefore , the fallback wcwidth assumes any printing
character takes up one column and anything else uses 0 columns .
*/
int wcwidth ( wchar_t c ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_WCSDUP
2006-02-28 23:17:16 +10:00
/**
Create a duplicate string . Wide string version of strdup . Will
automatically exit if out of memory .
*/
wchar_t * wcsdup ( const wchar_t * in ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_WCSLEN
/**
Fallback for wcsen . Returns the length of the specified string .
*/
2006-02-28 23:17:16 +10:00
size_t wcslen ( const wchar_t * in ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_WCSCASECMP
2006-02-28 23:17:16 +10:00
/**
Case insensitive string compare function . Wide string version of
strcasecmp .
This implementation of wcscasecmp does not take into account
esoteric locales where uppercase and lowercase do not cleanly
transform between each other . Hopefully this should be fine since
fish only uses this function with one of the strings supplied by
fish and guaranteed to be a sane , english word . Using wcscasecmp on
a user - supplied string should be considered a bug .
*/
int wcscasecmp ( const wchar_t * a , const wchar_t * b ) ;
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_WCSNCASECMP
2006-02-28 23:17:16 +10:00
/**
Case insensitive string compare function . Wide string version of
strncasecmp .
This implementation of wcsncasecmp does not take into account
esoteric locales where uppercase and lowercase do not cleanly
transform between each other . Hopefully this should be fine since
fish only uses this function with one of the strings supplied by
fish and guaranteed to be a sane , english word . Using wcsncasecmp on
a user - supplied string should be considered a bug .
*/
int wcsncasecmp ( const wchar_t * a , const wchar_t * b , int count ) ;
/**
Returns a newly allocated wide character string wich is a copy of
the string in , but of length c or shorter . The returned string is
always null terminated , and the null is not included in the string
length .
*/
2006-03-26 02:21:03 +10:00
# endif
# ifndef HAVE_WCSNDUP
/**
Fallback for wcsndup function . Returns a copy of \ c in , truncated
to a maximum length of \ c c .
*/
2006-02-28 23:17:16 +10:00
wchar_t * wcsndup ( const wchar_t * in , int c ) ;
2006-03-26 02:21:03 +10:00
# endif
2006-02-28 23:17:16 +10:00
/**
Converts from wide char to digit in the specified base . If d is not
2006-05-03 02:29:50 +10:00
a valid digit in the specified base , return - 1. This is a helper
function for wcstol , but it is useful itself , so it is exported .
2006-02-28 23:17:16 +10:00
*/
long convert_digit ( wchar_t d , int base ) ;
2006-03-26 02:21:03 +10:00
# ifndef HAVE_WCSTOL
2006-02-28 23:17:16 +10:00
/**
Fallback implementation . Convert a wide character string to a
number in the specified base . This functions is the wide character
string equivalent of strtol . For bases of 10 or lower , 0. .9 are
used to represent numbers . For bases below 36 , a - z and A - Z are used
to represent numbers higher than 9. Higher bases than 36 are not
supported .
*/
long wcstol ( const wchar_t * nptr ,
wchar_t * * endptr ,
int base ) ;
2006-04-19 19:56:28 +10:00
# endif
# ifndef HAVE_WCSLCAT
/**
Appends src to string dst of size siz ( unlike wcsncat , siz is the
full size of dst , not space left ) . At most siz - 1 characters will be
copied . Always NUL terminates ( unless siz < = wcslen ( dst ) ) . Returns
wcslen ( src ) + MIN ( siz , wcslen ( initial dst ) ) . If retval > = siz ,
truncation occurred .
This is the OpenBSD strlcat function , modified for wide characters ,
and renamed to reflect this change .
*/
size_t wcslcat ( wchar_t * dst , const wchar_t * src , size_t siz ) ;
# endif
# ifndef HAVE_WCSLCPY
/**
Copy src to string dst of size siz . At most siz - 1 characters will
be copied . Always NUL terminates ( unless siz = = 0 ) . Returns
wcslen ( src ) ; if retval > = siz , truncation occurred .
This is the OpenBSD strlcpy function , modified for wide characters ,
and renamed to reflect this change .
*/
size_t wcslcpy ( wchar_t * dst , const wchar_t * src , size_t siz ) ;
2006-03-26 02:21:03 +10:00
# endif
2006-02-28 23:17:16 +10:00
2006-05-11 21:58:46 +10:00
# ifdef HAVE_BROKEN_DEL_CURTERM
/**
BSD del_curterm seems to do a double - free . We redefine it as a no - op
*/
int del_curterm ( TERMINAL * oterm ) ;
# endif
2006-06-15 20:53:15 +10:00
# ifndef HAVE_LRAND48_R
/**
Datastructure for the lrand48_r fallback implementation .
*/
struct drand48_data
{
2006-06-17 23:07:08 +10:00
/**
Seed value
*/
2006-06-15 20:53:15 +10:00
unsigned int seed ;
}
;
/**
Fallback implementation of lrand48_r . Internally uses rand_r , so it is pretty weak .
*/
int lrand48_r ( struct drand48_data * buffer , long int * result ) ;
2006-06-20 10:50:10 +10:00
2006-06-15 20:53:15 +10:00
/**
2006-06-20 10:50:10 +10:00
Fallback implementation of srand48_r , the seed function for lrand48_r .
2006-06-15 20:53:15 +10:00
*/
int srand48_r ( long int seedval , struct drand48_data * buffer ) ;
2006-02-28 23:17:16 +10:00
# endif
2006-06-15 20:53:15 +10:00
# endif