2005-09-20 21:26:39 +08:00
/** \file common.h
Prototypes for various functions , mostly string utilities , that are used by most parts of fish .
*/
2005-10-04 23:11:39 +08:00
# ifndef FISH_COMMON_H
2005-10-24 23:26:25 +08:00
/**
Header guard
*/
2005-10-04 23:11:39 +08:00
# define FISH_COMMON_H
2006-02-06 21:45:32 +08:00
# include <stdlib.h>
# include <stdio.h>
2005-10-04 23:11:39 +08:00
# include <wchar.h>
# include <termios.h>
2011-12-27 11:18:46 +08:00
# include <string>
# include <sstream>
# include <vector>
2012-01-06 05:58:48 +08:00
# include <pthread.h>
# include <string.h>
2005-10-04 23:11:39 +08:00
2011-12-27 11:18:46 +08:00
# include <errno.h>
2012-01-29 06:56:13 +08:00
# include <assert.h>
2005-10-04 23:11:39 +08:00
# include "util.h"
2005-09-20 21:26:39 +08:00
2012-02-02 08:27:14 +08:00
class completion_t ;
2012-01-17 00:56:47 +08:00
2011-12-27 11:18:46 +08:00
/* Common string type */
typedef std : : wstring wcstring ;
2011-12-27 16:06:07 +08:00
typedef std : : vector < wcstring > wcstring_list_t ;
2011-12-27 11:18:46 +08:00
2005-09-20 21:26:39 +08:00
/**
2005-11-03 00:49:13 +08:00
Maximum number of bytes used by a single utf - 8 character
2005-09-20 21:26:39 +08:00
*/
# define MAX_UTF8_BYTES 6
2006-01-28 10:03:29 +08:00
/**
This is in the unicode private use area .
*/
2006-02-14 19:35:14 +08:00
# define ENCODE_DIRECT_BASE 0xf100
2006-01-28 10:03:29 +08:00
2006-05-27 00:46:38 +08:00
/**
Highest legal ascii value
*/
# define ASCII_MAX 127u
/**
Highest legal 16 - bit unicode value
*/
# define UCS2_MAX 0xffffu
/**
Highest legal byte value
*/
# define BYTE_MAX 0xffu
2008-01-14 00:47:47 +08:00
/**
Escape special fish syntax characters like the semicolon
2007-10-06 18:51:31 +08:00
*/
2007-01-19 00:02:46 +08:00
# define UNESCAPE_SPECIAL 1
2008-01-14 00:47:47 +08:00
/**
2007-10-06 18:51:31 +08:00
Allow incomplete escape sequences
*/
2007-01-19 00:02:46 +08:00
# define UNESCAPE_INCOMPLETE 2
2007-10-06 18:51:31 +08:00
/**
Escape all characters , including magic characters like the semicolon
*/
# define ESCAPE_ALL 1
/**
Do not try to use ' simplified ' quoted escapes , and do not use empty quotes as the empty string
*/
# define ESCAPE_NO_QUOTED 2
2010-09-18 09:51:16 +08:00
/**
2011-12-27 11:18:46 +08:00
Helper macro for errors
*/
# define VOMIT_ON_FAILURE(a) do { if (0 != (a)) { int err = errno; fprintf(stderr, "%s failed on line %d in file %s: %d (%s)\n", #a, __LINE__, __FILE__, err, strerror(err)); abort(); }} while (0)
2012-03-26 16:21:10 +08:00
/** Exits without invoking destructors (via _exit), useful for code after fork. */
void exit_without_destructors ( int code ) __attribute__ ( ( noreturn ) ) ;
2012-01-06 05:58:48 +08:00
2011-12-27 11:18:46 +08:00
/**
2005-11-03 00:49:13 +08:00
Save the shell mode on startup so we can restore them on exit
*/
2011-12-27 11:18:46 +08:00
extern struct termios shell_modes ;
2005-09-20 21:26:39 +08:00
/**
2005-11-03 00:49:13 +08:00
The character to use where the text has been truncated . Is an
ellipsis on unicode system and a $ on other systems .
2005-09-20 21:26:39 +08:00
*/
extern wchar_t ellipsis_char ;
2005-09-25 03:31:17 +08:00
/**
2006-10-26 18:22:53 +08:00
The verbosity level of fish . If a call to debug has a severity
level higher than \ c debug_level , it will not be printed .
2005-09-25 03:31:17 +08:00
*/
extern int debug_level ;
2005-09-20 21:26:39 +08:00
/**
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 .
*/
2011-12-27 11:18:46 +08:00
extern const wchar_t * program_name ;
2005-10-25 17:39:45 +08:00
2006-06-21 08:48:36 +08:00
/**
This macro is used to check that an input argument is not null . It
is a bit lika a non - fatal form of assert . Instead of exit - ing on
failiure , the current function is ended at once . The second
2006-11-11 18:54:52 +08:00
parameter is the return value of the current function on failiure .
2006-06-21 08:48:36 +08:00
*/
2006-10-30 05:09:11 +08:00
# define CHECK( arg, retval ) \
2006-06-21 08:48:36 +08:00
if ( ! ( arg ) ) \
{ \
2006-11-17 22:58:25 +08:00
debug ( 0 , \
_ ( L " function %s called with null value for argument %s. " ) , \
2006-06-21 08:48:36 +08:00
__func__ , \
2006-11-17 22:58:25 +08:00
# arg ); \
bugreport ( ) ; \
2007-01-20 10:36:49 +08:00
show_stackframe ( ) ; \
2006-06-21 08:48:36 +08:00
return retval ; \
2006-10-30 05:09:11 +08:00
}
2006-06-21 08:48:36 +08:00
2007-01-20 10:36:49 +08:00
/**
2007-01-21 23:03:41 +08:00
Pause for input , then exit the program . If supported , print a backtrace first .
2007-01-20 10:36:49 +08:00
*/
2009-02-05 06:43:10 +08:00
# define FATAL_EXIT() \
{ \
int exit_read_count ; char exit_read_buff ; \
show_stackframe ( ) ; \
exit_read_count = read ( 0 , & exit_read_buff , 1 ) ; \
2012-02-29 07:11:46 +08:00
exit_without_destructors ( 1 ) ; \
2009-02-05 06:43:10 +08:00
} \
2011-12-27 11:18:46 +08:00
2007-01-20 10:36:49 +08:00
2006-07-03 18:39:57 +08:00
/**
2006-11-11 18:54:52 +08:00
Exit program at once , leaving an error message about running out of memory .
2006-07-03 18:39:57 +08:00
*/
2006-10-30 05:09:11 +08:00
# define DIE_MEM() \
2006-07-03 18:39:57 +08:00
{ \
2006-10-30 05:09:11 +08:00
fwprintf ( stderr , \
L " fish: Out of memory on line %d of file %s, shutting down fish \n " , \
__LINE__ , \
__FILE__ ) ; \
2007-01-21 23:03:41 +08:00
FATAL_EXIT ( ) ; \
2006-10-30 05:09:11 +08:00
}
/**
2006-11-11 18:54:52 +08:00
Check if signals are blocked . If so , print an error message and
return from the function performing this check .
2006-10-30 05:09:11 +08:00
*/
2006-11-17 22:58:25 +08:00
# define CHECK_BLOCK( retval ) \
2006-10-30 05:09:11 +08:00
if ( signal_is_blocked ( ) ) \
{ \
debug ( 0 , \
2006-11-17 22:58:25 +08:00
_ ( L " function %s called while blocking signals. " ) , \
__func__ ) ; \
bugreport ( ) ; \
2007-01-20 10:36:49 +08:00
show_stackframe ( ) ; \
2006-11-17 22:58:25 +08:00
return retval ; \
2006-10-30 05:09:11 +08:00
}
2011-12-27 11:18:46 +08:00
2006-07-20 06:55:49 +08:00
/**
Shorthand for wgettext call
*/
2011-12-27 11:18:46 +08:00
# define _(wstr) wgettext((const wchar_t *)wstr)
2006-07-20 06:55:49 +08:00
/**
2006-11-11 18:54:52 +08:00
Noop , used to tell xgettext that a string should be translated ,
2011-12-27 11:18:46 +08:00
even though it is not directly sent to wgettext .
2006-07-20 06:55:49 +08:00
*/
# define N_(wstr) wstr
2008-01-14 00:47:47 +08:00
/**
Check if the specified stringelement is a part of the specified string list
*/
2011-12-27 11:18:46 +08:00
# define contains( str,... ) contains_internal( str, __VA_ARGS__, NULL )
2007-04-17 05:40:41 +08:00
2008-01-14 00:47:47 +08:00
/**
2007-01-21 23:01:14 +08:00
Print a stack trace to stderr
*/
2007-01-20 10:36:49 +08:00
void show_stackframe ( ) ;
2005-09-20 21:26:39 +08:00
2012-02-01 10:06:20 +08:00
wcstring_list_t completions_to_wcstring_list ( const std : : vector < completion_t > & completions ) ;
2012-01-17 00:56:47 +08:00
2005-09-20 21:26:39 +08:00
/**
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
2011-12-27 11:18:46 +08:00
on failiure .
2005-09-20 21:26:39 +08:00
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 ) ;
2011-12-27 11:18:46 +08:00
void sort_strings ( std : : vector < wcstring > & strings ) ;
2012-01-17 00:56:47 +08:00
void sort_completions ( std : : vector < completion_t > & strings ) ;
2005-09-20 21:26:39 +08:00
/**
2005-11-03 00:49:13 +08:00
Returns a newly allocated wide character string equivalent of the
specified multibyte character string
2006-06-17 21:07:08 +08:00
This function encodes illegal character sequences in a reversible
way using the private use area .
2005-09-20 21:26:39 +08:00
*/
wchar_t * str2wcs ( const char * in ) ;
2006-06-17 21:07:08 +08:00
2011-12-27 11:18:46 +08:00
/**
Returns a newly allocated wide character string equivalent of the
specified multibyte character string
This function encodes illegal character sequences in a reversible
way using the private use area .
*/
wcstring str2wcstring ( const char * in ) ;
2012-02-19 01:58:54 +08:00
wcstring str2wcstring ( const std : : string & in ) ;
2011-12-27 11:18:46 +08:00
2006-06-17 21:07:08 +08:00
/**
Converts the narrow character string \ c in into it ' s wide
equivalent , stored in \ c out . \ c out must have enough space to fit
the entire string .
This function encodes illegal character sequences in a reversible
way using the private use area .
*/
2006-02-08 22:58:47 +08:00
wchar_t * str2wcs_internal ( const char * in , wchar_t * out ) ;
2005-09-20 21:26:39 +08:00
/**
2005-11-03 00:49:13 +08:00
Returns a newly allocated multibyte character string equivalent of
the specified wide character string
2006-06-17 21:07:08 +08:00
This function decodes illegal character sequences in a reversible
way using the private use area .
2005-09-20 21:26:39 +08:00
*/
char * wcs2str ( const wchar_t * in ) ;
2011-12-27 11:18:46 +08:00
std : : string wcs2string ( const wcstring & input ) ;
2012-02-01 08:50:03 +08:00
/** Test if a string prefixes another. Returns true if a is a prefix of b */
bool string_prefixes_string ( const wcstring & proposed_prefix , const wcstring & value ) ;
2012-05-09 17:33:42 +08:00
bool string_prefixes_string ( const wchar_t * proposed_prefix , const wcstring & value ) ;
2012-02-01 08:50:03 +08:00
2012-05-14 11:49:14 +08:00
/** Test if a string is a suffix of another */
bool string_suffixes_string ( const wcstring & proposed_suffix , const wcstring & value ) ;
bool string_suffixes_string ( const wchar_t * proposed_suffix , const wcstring & value ) ;
2012-03-02 09:31:45 +08:00
/** Test if a string prefixes another without regard to case. Returns true if a is a prefix of b */
bool string_prefixes_string_case_insensitive ( const wcstring & proposed_prefix , const wcstring & value ) ;
2012-02-27 12:11:34 +08:00
/** Test if a list contains a string using a linear search. */
bool list_contains_string ( const wcstring_list_t & list , const wcstring & str ) ;
2011-12-27 11:18:46 +08:00
void assert_is_main_thread ( const char * who ) ;
# define ASSERT_IS_MAIN_THREAD_TRAMPOLINE(x) assert_is_main_thread(x)
# define ASSERT_IS_MAIN_THREAD() ASSERT_IS_MAIN_THREAD_TRAMPOLINE(__FUNCTION__)
void assert_is_background_thread ( const char * who ) ;
# define ASSERT_IS_BACKGROUND_THREAD_TRAMPOLINE(x) assert_is_background_thread(x)
# define ASSERT_IS_BACKGROUND_THREAD() ASSERT_IS_BACKGROUND_THREAD_TRAMPOLINE(__FUNCTION__)
2012-02-25 04:13:35 +08:00
/* Useful macro for asserting that a lock is locked. This doesn't check whether this thread locked it, which it would be nice if it did, but here it is anyways. */
2012-04-22 11:08:08 +08:00
void assert_is_locked ( void * mutex , const char * who , const char * caller ) ;
# define ASSERT_IS_LOCKED(x) assert_is_locked((void *)(&x), #x, __FUNCTION__)
2005-09-20 21:26:39 +08:00
2006-06-17 21:07:08 +08:00
/**
Converts the wide character string \ c in into it ' s narrow
equivalent , stored in \ c out . \ c out must have enough space to fit
the entire string .
This function decodes illegal character sequences in a reversible
way using the private use area .
*/
2006-02-08 22:58:47 +08:00
char * wcs2str_internal ( const wchar_t * in , char * out ) ;
2012-03-06 02:18:42 +08:00
/** Format the specified size (in bytes, kilobytes, etc.) into the specified stringbuffer. */
wcstring format_size ( long long sz ) ;
/** Version of format_size that does not allocate memory. */
void format_size_safe ( char buff [ 128 ] , unsigned long long sz ) ;
/** Our crappier versions of debug which is guaranteed to not allocate any memory, or do anything other than call write(). This is useful after a call to fork() with threads. */
2012-03-09 15:21:07 +08:00
void debug_safe ( int level , const char * msg , const char * param1 = NULL , const char * param2 = NULL , const char * param3 = NULL , const char * param4 = NULL , const char * param5 = NULL , const char * param6 = NULL , const char * param7 = NULL , const char * param8 = NULL , const char * param9 = NULL , const char * param10 = NULL , const char * param11 = NULL , const char * param12 = NULL ) ;
2012-03-06 02:18:42 +08:00
/** Writes out a long safely */
void format_long_safe ( char buff [ 128 ] , long val ) ;
void format_long_safe ( wchar_t buff [ 128 ] , long val ) ;
2011-12-27 11:18:46 +08:00
template < typename T >
T from_string ( const wcstring & x ) {
T result ;
std : : wstringstream stream ( x ) ;
stream > > result ;
return result ;
}
2012-03-06 02:44:08 +08:00
template < typename T >
T from_string ( const std : : string & x ) {
T result = T ( ) ;
std : : stringstream stream ( x ) ;
stream > > result ;
return result ;
}
2012-02-02 08:27:14 +08:00
template < typename T >
wcstring to_string ( const T & x ) {
std : : wstringstream stream ;
stream < < x ;
return stream . str ( ) ;
}
2012-03-06 02:18:42 +08:00
/* wstringstream is a huge memory pig. Let's provide some specializations where we can. */
template < >
inline wcstring to_string ( const long & x ) {
wchar_t buff [ 128 ] ;
format_long_safe ( buff , x ) ;
return wcstring ( buff ) ;
}
2012-03-06 02:44:08 +08:00
template < >
inline bool from_string ( const std : : string & x ) {
2012-03-06 05:39:01 +08:00
return ! x . empty ( ) & & strchr ( " YTyt1 " , x . at ( 0 ) ) ;
2012-03-06 02:44:08 +08:00
}
template < >
inline bool from_string ( const wcstring & x ) {
2012-03-06 05:39:01 +08:00
return ! x . empty ( ) & & wcschr ( L " YTyt1 " , x . at ( 0 ) ) ;
2012-03-06 02:44:08 +08:00
}
2012-03-06 02:18:42 +08:00
template < >
inline wcstring to_string ( const int & x ) {
return to_string ( static_cast < long > ( x ) ) ;
}
2012-02-29 07:11:46 +08:00
/* Helper class for managing a null-terminated array of null-terminated strings (of some char type) */
template < typename CharType_t >
class null_terminated_array_t {
CharType_t * * array ;
typedef std : : basic_string < CharType_t > string_t ;
typedef std : : vector < string_t > string_list_t ;
void swap ( null_terminated_array_t < CharType_t > & him ) { std : : swap ( array , him . array ) ; }
/* Silly function to get the length of a null terminated array of...something */
template < typename T >
static size_t count_not_null ( const T * arr ) {
size_t len ;
for ( len = 0 ; arr [ len ] ! = T ( 0 ) ; len + + )
;
return len ;
}
size_t size ( ) const {
return count_not_null ( array ) ;
}
void free ( void ) {
if ( array ! = NULL ) {
for ( size_t i = 0 ; array [ i ] ! = NULL ; i + + ) {
delete [ ] array [ i ] ;
}
delete [ ] array ;
array = NULL ;
}
}
public :
null_terminated_array_t ( ) : array ( NULL ) { }
2012-03-01 03:27:14 +08:00
null_terminated_array_t ( const string_list_t & argv ) : array ( NULL ) { this - > set ( argv ) ; }
2012-02-29 07:11:46 +08:00
~ null_terminated_array_t ( ) { this - > free ( ) ; }
/** operator=. Notice the pass-by-value parameter. */
null_terminated_array_t & operator = ( null_terminated_array_t rhs ) {
if ( this ! = & rhs )
this - > swap ( rhs ) ;
return * this ;
}
/* Copy constructor. */
2012-03-01 03:27:14 +08:00
null_terminated_array_t ( const null_terminated_array_t & him ) : array ( NULL ) {
2012-02-29 07:11:46 +08:00
this - > set ( him . array ) ;
}
void set ( const string_list_t & argv ) {
/* Get rid of the old argv */
this - > free ( ) ;
/* Allocate our null-terminated array of null-terminated strings */
size_t i , count = argv . size ( ) ;
this - > array = new CharType_t * [ count + 1 ] ;
for ( i = 0 ; i < count ; i + + ) {
const string_t & str = argv . at ( i ) ;
this - > array [ i ] = new CharType_t [ 1 + str . size ( ) ] ;
std : : copy ( str . begin ( ) , str . end ( ) , this - > array [ i ] ) ;
this - > array [ i ] [ str . size ( ) ] = CharType_t ( 0 ) ;
}
this - > array [ count ] = NULL ;
}
void set ( const CharType_t * const * new_array ) {
if ( new_array = = array )
return ;
/* Get rid of the old argv */
this - > free ( ) ;
/* Copy the new one */
if ( new_array ) {
size_t i , count = count_not_null ( new_array ) ;
this - > array = new CharType_t * [ count + 1 ] ;
for ( i = 0 ; i < count ; i + + ) {
size_t len = count_not_null ( new_array [ i ] ) ;
this - > array [ i ] = new CharType_t [ 1 + len ] ;
std : : copy ( new_array [ i ] , new_array [ i ] + len , this - > array [ i ] ) ;
this - > array [ i ] [ len ] = CharType_t ( 0 ) ;
}
this - > array [ count ] = NULL ;
}
}
CharType_t * * get ( ) { return array ; }
const CharType_t * const * get ( ) const { return array ; }
string_list_t to_list ( ) const {
string_list_t lst ;
if ( array ! = NULL ) {
size_t count = this - > size ( ) ;
lst . reserve ( count ) ;
lst . insert ( lst . end ( ) , array , array + count ) ;
}
return lst ;
}
} ;
2012-03-01 03:27:14 +08:00
/* Helper function to convert from a null_terminated_array_t<wchar_t> to a null_terminated_array_t<char_t> */
null_terminated_array_t < char > convert_wide_array_to_narrow ( const null_terminated_array_t < wchar_t > & arr ) ;
2012-03-09 15:21:07 +08:00
/* Helper class to cache a narrow version of a wcstring in a malloc'd buffer, so that we can read it after fork() */
class narrow_string_rep_t {
private :
const char * str ;
public :
~ narrow_string_rep_t ( ) {
free ( ( void * ) str ) ;
}
narrow_string_rep_t ( ) : str ( NULL ) { }
void set ( const wcstring & s ) {
free ( ( void * ) str ) ;
str = wcs2str ( s . c_str ( ) ) ;
}
const char * get ( ) const {
return str ;
}
} ;
2012-02-28 10:43:24 +08:00
bool is_forked_child ( ) ;
2012-02-29 07:11:46 +08:00
/* Basic scoped lock class */
2011-12-27 11:18:46 +08:00
class scoped_lock {
2012-01-29 06:56:13 +08:00
pthread_mutex_t * lock_obj ;
bool locked ;
2011-12-27 11:18:46 +08:00
public :
2012-02-28 10:43:24 +08:00
void lock ( void ) ;
void unlock ( void ) ;
scoped_lock ( pthread_mutex_t & mutex ) ;
~ scoped_lock ( ) ;
2011-12-27 11:18:46 +08:00
} ;
class wcstokenizer {
wchar_t * buffer , * str , * state ;
const wcstring sep ;
public :
wcstokenizer ( const wcstring & s , const wcstring & separator ) : sep ( separator ) {
wchar_t * wcsdup ( const wchar_t * s ) ;
buffer = wcsdup ( s . c_str ( ) ) ;
str = buffer ;
state = NULL ;
}
bool next ( wcstring & result ) {
wchar_t * tmp = wcstok ( str , sep . c_str ( ) , & state ) ;
str = NULL ;
if ( tmp ) result = tmp ;
return tmp ! = NULL ;
}
~ wcstokenizer ( ) {
free ( buffer ) ;
}
} ;
/**
Appends a path component , with a / if necessary
*/
void append_path_component ( wcstring & path , const wcstring & component ) ;
wcstring format_string ( const wchar_t * format , . . . ) ;
2012-02-10 10:43:36 +08:00
wcstring vformat_string ( const wchar_t * format , va_list va_orig ) ;
2012-02-23 02:51:06 +08:00
void append_format ( wcstring & str , const wchar_t * format , . . . ) ;
2011-12-27 11:18:46 +08:00
2005-09-20 21:26:39 +08:00
/**
2005-11-03 00:49:13 +08:00
Returns a newly allocated wide character string array equivalent of
the specified multibyte character string array
2005-09-20 21:26:39 +08:00
*/
2012-01-30 14:06:58 +08:00
char * * wcsv2strv ( const wchar_t * const * in ) ;
2005-09-20 21:26:39 +08:00
2006-04-21 22:29:39 +08:00
/**
2011-12-27 11:18:46 +08:00
Test if the given string is a valid variable name .
2006-04-21 22:29:39 +08:00
\ return null if this is a valid name , and a pointer to the first invalid character otherwise
*/
2006-10-19 23:39:50 +08:00
wchar_t * wcsvarname ( const wchar_t * str ) ;
2005-09-20 21:26:39 +08:00
2006-10-19 23:47:47 +08:00
/**
2011-12-27 11:18:46 +08:00
Test if the given string is a valid function name .
2006-10-19 23:47:47 +08:00
\ return null if this is a valid name , and a pointer to the first invalid character otherwise
*/
2012-01-06 05:58:48 +08:00
const wchar_t * wcsfuncname ( const wchar_t * str ) ;
2006-10-19 23:47:47 +08:00
2006-06-02 07:04:38 +08:00
/**
2011-12-27 11:18:46 +08:00
Test if the given string is valid in a variable name
2006-06-02 07:04:38 +08:00
\ return 1 if this is a valid name , 0 otherwise
*/
int wcsvarchr ( wchar_t chr ) ;
2005-09-20 21:26:39 +08:00
/**
A wcswidth workalike . Fish uses this since the regular wcswidth seems flaky .
*/
int my_wcswidth ( const wchar_t * c ) ;
/**
2005-11-03 00:49:13 +08:00
This functions returns the end of the quoted substring beginning at
2006-02-01 20:27:15 +08:00
\ c in . The type of quoting character is detemrined by examining \ c
in . Returns 0 on error .
2005-11-03 00:49:13 +08:00
\ param in the position of the opening quote
2005-09-20 21:26:39 +08:00
*/
2006-06-14 21:22:40 +08:00
wchar_t * quote_end ( const wchar_t * in ) ;
2005-09-20 21:26:39 +08:00
/**
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 ( ) ;
/**
2006-01-09 07:00:49 +08:00
This function behaves exactly like a wide character equivalent of
the C function setlocale , except that it will also try to detect if
the user is using a Unicode character set , and if so , use the
2011-12-27 11:18:46 +08:00
unicode ellipsis character as ellipsis , instead of ' $ ' .
2005-09-20 21:26:39 +08:00
*/
2012-02-01 13:06:52 +08:00
wcstring wsetlocale ( int category , const wchar_t * locale ) ;
2005-09-20 21:26:39 +08:00
/**
2006-05-03 00:28:30 +08:00
Checks if \ c needle is included in the list of strings specified . A warning is printed if needle is zero .
2005-09-20 21:26:39 +08:00
2011-12-27 11:18:46 +08:00
\ param needle the string to search for in the list
2006-05-03 00:28:30 +08:00
2007-09-24 16:18:23 +08:00
\ return zero if needle is not found , of if needle is null , non - zero otherwise
2005-09-20 21:26:39 +08:00
*/
2012-01-31 01:46:33 +08:00
__sentinel bool contains_internal ( const wchar_t * needle , . . . ) ;
__sentinel bool contains_internal ( const wcstring & needle , . . . ) ;
2005-09-20 21:26:39 +08:00
/**
Call read while blocking the SIGCHLD signal . Should only be called
2007-09-24 16:18:23 +08:00
if you _know_ there is data available for reading , or the program
will hang until there is data .
2005-09-20 21:26:39 +08:00
*/
int read_blocked ( int fd , void * buf , size_t count ) ;
2009-02-23 04:28:52 +08:00
/**
Loop a write request while failiure is non - critical . Return - 1 and set errno
in case of critical error .
*/
2012-01-14 19:41:50 +08:00
ssize_t write_loop ( int fd , const char * buff , size_t count ) ;
2009-02-23 04:28:52 +08:00
2012-03-01 09:55:50 +08:00
/**
Loop a read request while failiure is non - critical . Return - 1 and set errno
in case of critical error .
*/
ssize_t read_loop ( int fd , void * buff , size_t count ) ;
2005-09-20 21:26:39 +08:00
/**
2005-10-14 19:40:33 +08:00
Issue a debug message with printf - style string formating and
automatic line breaking . The string will begin with the string \ c
program_name , followed by a colon and a whitespace .
2006-12-14 18:01:31 +08:00
Because debug is often called to tell the user about an error ,
before using wperror to give a specific error message , debug will
never ever modify the value of errno .
2011-12-27 11:18:46 +08:00
2005-10-14 19:40:33 +08:00
\ param level the priority of the message . Lower number means higher priority . Messages with a priority_number higher than \ c debug_level will be ignored . .
2011-12-27 11:18:46 +08:00
\ param msg the message format string .
2005-10-14 19:40:33 +08:00
Example :
< code > debug ( 1 , L " Pi = %.3f " , M_PI ) ; < / code >
will print the string ' fish : Pi = 3.141 ' , given that debug_level is 1 or higher , and that program_name is ' fish ' .
2005-09-20 21:26:39 +08:00
*/
2006-01-04 20:51:02 +08:00
void debug ( int level , const wchar_t * msg , . . . ) ;
2005-09-20 21:26:39 +08:00
/**
2005-10-14 19:40:33 +08:00
Replace special characters with backslash escape sequences . Newline is
2011-12-27 11:18:46 +08:00
replaced with \ n , etc .
2005-09-20 21:26:39 +08:00
\ 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
*/
2006-02-11 08:13:17 +08:00
wchar_t * escape ( const wchar_t * in , int escape_all ) ;
2011-12-27 11:18:46 +08:00
wcstring escape_string ( const wcstring & in , int escape_all ) ;
2005-09-20 21:26:39 +08:00
2005-10-24 23:26:25 +08:00
/**
Expand backslashed escapes and substitute them with their unescaped
counterparts . Also optionally change the wildcards , the tilde
character and a few more into constants which are defined in a
private use area of Unicode . This assumes wchar_t is a unicode
2005-10-25 19:03:52 +08:00
character set .
2005-10-24 23:26:25 +08:00
The result must be free ( ) d . The original string is not modified . If
an invalid sequence is specified , 0 is returned .
*/
2011-12-27 11:18:46 +08:00
wchar_t * unescape ( const wchar_t * in ,
2005-10-24 23:26:25 +08:00
int escape_special ) ;
2005-09-20 21:26:39 +08:00
2012-01-03 05:40:03 +08:00
bool unescape_string ( wcstring & str ,
2011-12-27 11:18:46 +08:00
int escape_special ) ;
2005-10-14 19:40:33 +08:00
2011-12-27 11:18:46 +08:00
/**
2007-09-24 16:18:23 +08:00
Returns the width of the terminal window , so that not all
functions that use these values continually have to keep track of
it separately .
2005-10-14 19:40:33 +08:00
2007-09-24 16:18:23 +08:00
Only works if common_handle_winch is registered to handle winch signals .
2005-10-14 19:40:33 +08:00
*/
int common_get_width ( ) ;
/**
Returns the height of the terminal window , so that not all
functions that use these values continually have to keep track of
2007-09-24 16:18:23 +08:00
it separatly .
2005-10-14 19:40:33 +08:00
Only works if common_handle_winch is registered to handle winch signals .
*/
int common_get_height ( ) ;
2005-10-24 23:26:25 +08:00
/**
2005-10-14 19:40:33 +08:00
Handle a window change event by looking up the new window size and
saving it in an internal variable used by common_get_wisth and
common_get_height ( ) .
*/
void common_handle_winch ( int signal ) ;
2006-01-15 19:58:05 +08:00
/**
2006-05-14 17:47:21 +08:00
Write paragraph of output to the specified stringbuffer , and redo
the linebreaks to fit the current screen .
2006-01-15 19:58:05 +08:00
*/
2012-02-23 02:51:06 +08:00
void write_screen ( const wcstring & msg , wcstring & buff ) ;
2006-01-15 19:58:05 +08:00
2006-05-29 19:13:42 +08:00
/**
2012-02-16 03:33:41 +08:00
Tokenize the specified string into the specified wcstring_list_t .
2006-05-29 19:13:42 +08:00
\ param val the input string . The contents of this string is not changed .
2011-12-27 11:18:46 +08:00
\ param out the list in which to place the elements .
2006-05-29 19:13:42 +08:00
*/
2012-02-10 17:37:30 +08:00
void tokenize_variable_array ( const wcstring & val , wcstring_list_t & out ) ;
2006-05-29 19:13:42 +08:00
2006-10-19 19:50:23 +08:00
/**
2007-09-24 16:18:23 +08:00
Make sure the specified direcotry exists . If needed , try to create
it and any currently not existing parent directories . .
2006-10-19 19:50:23 +08:00
2007-09-24 16:18:23 +08:00
\ return 0 if , at the time of function return the directory exists , - 1 otherwise .
2006-10-19 19:50:23 +08:00
*/
2012-02-19 01:11:22 +08:00
int create_directory ( const wcstring & d ) ;
2006-10-19 19:50:23 +08:00
2006-11-17 22:58:25 +08:00
/**
Print a short message about how to file a bug report to stderr
*/
void bugreport ( ) ;
2009-02-03 06:46:45 +08:00
/**
Return the number of seconds from the UNIX epoch , with subsecond
precision . This function uses the gettimeofday function , and will
have the same precision as that function .
If an error occurs , NAN is returned .
*/
double timef ( ) ;
2012-01-06 05:58:48 +08:00
/**
Call the following function early in main to set the main thread .
This is our replacement for pthread_main_np ( ) .
*/
void set_main_thread ( ) ;
2012-03-20 02:52:18 +08:00
bool is_main_thread ( ) ;
2012-01-06 05:58:48 +08:00
2012-05-14 11:19:02 +08:00
/** Configures thread assertions for testing */
void configure_thread_assertions_for_testing ( ) ;
2012-02-28 10:43:24 +08:00
/** Set up a guard to complain if we try to do certain things (like take a lock) after calling fork */
void setup_fork_guards ( void ) ;
2012-01-06 05:58:48 +08:00
2012-02-28 10:43:24 +08:00
/** Return whether we are the child of a fork */
bool is_forked_child ( void ) ;
void assert_is_not_forked_child ( const char * who ) ;
# define ASSERT_IS_NOT_FORKED_CHILD_TRAMPOLINE(x) assert_is_not_forked_child(x)
# define ASSERT_IS_NOT_FORKED_CHILD() ASSERT_IS_NOT_FORKED_CHILD_TRAMPOLINE(__FUNCTION__)
2009-02-03 06:46:45 +08:00
2012-03-01 09:55:50 +08:00
extern " C " {
__attribute__ ( ( noinline ) ) void debug_thread_error ( void ) ;
}
2005-10-04 23:11:39 +08:00
# endif