/** \file common.h Prototypes for various functions, mostly string utilities, that are used by most parts of fish. */ /** 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. */ #ifdef NCURSES_VERSION typedef int tputs_arg_t; #else typedef char tputs_arg_t; #endif /** Maximum number of bytes in a utf-8 character */ #define MAX_UTF8_BYTES 6 /** Color code for set_color. Does not update the color. */ #define FISH_COLOR_IGNORE -1 /** Color code for set_color. Sets the default color. */ #define FISH_COLOR_RESET -2 /** Save the shell mode on startup so we can restore them on exit */ extern struct termios shell_modes; /** The character to use where the text has been truncated. Is an ellipsis on unicode system and a $ on other systems. */ extern wchar_t ellipsis_char; /** The maximum number of charset convertion errors to report */ extern int error_max; /** The verbosity of fish */ extern int debug_level; /** Profiling flag. True if commands should be profiled. */ extern char *profile; /** Name of the current program. Should be set at startup. Used by the debug function. */ extern wchar_t *program_name; /** Take an array_list_t containing wide strings and converts them to a wchar_t **. */ wchar_t **list_to_char_arr( array_list_t *l ); /** Read a line from the stream f into the buffer buff of length len. If buff is to small, it will be reallocated, and both buff and len will be updated to reflect this. Returns the number of bytes read or -1 on failiure. If the carriage return character is encountered, it is ignored. fgetws() considers the line to end if reading the file results in either a newline (L'\n') character, the null (L'\\0') character or the end of file (WEOF) character. */ int fgetws2( wchar_t **buff, int *len, FILE *f ); /** Sorts a list of wide strings according to the wcsfilecmp-function from the util library */ void sort_list( array_list_t *comp ); /** Returns a newly allocated wide character string equivalent of the specified multibyte character string */ wchar_t *str2wcs( const char *in ); /** Returns a newly allocated multibyte character string equivalent of the specified wide character string */ char *wcs2str( const wchar_t *in ); /** Returns a newly allocated wide character string array equivalent of the specified multibyte character string array */ char **wcsv2strv( const wchar_t **in ); /** Returns a newly allocated multibyte character string array equivalent of the specified wide character string array */ wchar_t **strv2wcsv( const char **in ); /** Returns a newly allocated concatenation of the specified wide character strings */ wchar_t *wcsdupcat( const wchar_t *a, const wchar_t *b ); /** Returns a newly allocated concatenation of the specified wide character strings. The last argument must be a null pointer. */ wchar_t *wcsdupcat2( const wchar_t *a, ... ); /** 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. */ wchar_t *wcsndup( const wchar_t *in, int c ); /** Converts from wide char to digit in the specified base. If d is not a valid digit in the specified base, return -1. */ long convert_digit( wchar_t d, int base ); /** 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); size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t siz); size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz); /** Create a dublicate string. Wide string version of strdup. */ wchar_t *wcsdup(const wchar_t *in); /** 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. */ int wcscasecmp( const wchar_t *a, const wchar_t *b ); /** Test if the given string is a valid variable name */ int wcsvarname( wchar_t *str ); /** The prototype for this function is missing in some libc implementations. Fish has a fallback implementation in case the implementation is missing altogether. */ int wcwidth( wchar_t c ); /** A wcswidth workalike. Fish uses this since the regular wcswidth seems flaky. */ int my_wcswidth( const wchar_t *c ); /** This functions returns the end of a quoted substring. It can handle nested single and double quotes. */ wchar_t *quote_end( const wchar_t *in ); /** A call to this function will reset the error counter. Some functions print out non-critical error messages. These should check the error_count before, and skip printing the message if MAX_ERROR_COUNT messages have been printed. The error_reset() should be called after each interactive command executes, to allow new messages to be printed. */ void error_reset(); /** Set the locale, also change the ellipsis character */ void fish_setlocale(int category, const wchar_t *locale); /** Checks if \c needle is included in the list of strings specified \param needle the string to search for in the list */ int contains_str( const wchar_t *needle, ... ); /** Call read while blocking the SIGCHLD signal. Should only be called if you _know_ there is data available for reading. */ int read_blocked(int fd, void *buf, size_t count); /** This is for writing process notification messages. Has to write to stdout, so clr_eol and such functions will work correctly. Not an issue since this function is only used in interactive mode anyway. */ int writeb( tputs_arg_t b ); void die_mem(); /** Clean up */ void common_destroy(); /** Issue a debug message \param level the priority of the message. Lower number means higher priority. Messages with too high priority number will be discarded. \param the message. */ void debug( int level, wchar_t *msg, ... ); /** Replace special characters with escape sequences. Newline is replaced with \n, etc. \param in The string to be escaped \param escape_all Whether all characters wich hold special meaning in fish (Pipe, semicolon, etc,) should be escaped, or only unprintable characters \return The escaped string, or 0 if there is not enough memory */ wchar_t *escape( wchar_t *in, int escape_all ); wchar_t *unescape( wchar_t * in, int escape_special ); void block(); void unblock();