mirror of
https://github.com/fish-shell/fish-shell
synced 2024-11-11 07:34:32 +00:00
Code cleanup
darcs-hash:20051215135902-ac50b-e9fc18bca34459ddb56e970a16c05e9b3cc54848.gz
This commit is contained in:
parent
e4a95cb989
commit
fa75fc3901
5 changed files with 176 additions and 126 deletions
215
builtin.c
215
builtin.c
|
@ -72,30 +72,37 @@
|
|||
*/
|
||||
|
||||
#define READ_MODE_NAME L"fish_read"
|
||||
|
||||
/**
|
||||
The send stuff to foreground message
|
||||
*/
|
||||
#define FG_MSG L"Send job %d, '%ls' to foreground\n"
|
||||
|
||||
/**
|
||||
Print modes for the jobs builtin
|
||||
*/
|
||||
enum
|
||||
{
|
||||
JOBS_DEFAULT, /**< Print lots of general info */
|
||||
JOBS_PRINT_PID, /**< Print pid of each process in job */
|
||||
JOBS_PRINT_COMMAND, /**< Print command name of each process in job */
|
||||
JOBS_PRINT_GROUP, /**< Print group id of job */
|
||||
}
|
||||
;
|
||||
|
||||
/**
|
||||
Table of all builtins
|
||||
*/
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
JOBS_DEFAULT,
|
||||
JOBS_PRINT_PID,
|
||||
JOBS_PRINT_COMMAND,
|
||||
JOBS_PRINT_GROUP,
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
static hash_table_t builtin;
|
||||
|
||||
int builtin_out_redirect;
|
||||
int builtin_err_redirect;
|
||||
|
||||
/**
|
||||
/*
|
||||
Buffers for storing the output of builtin functions
|
||||
*/
|
||||
string_buffer_t *sb_out=0, *sb_err=0;
|
||||
|
||||
/**
|
||||
Stack containing builtin I/O for recursive builtin calls.
|
||||
*/
|
||||
|
@ -422,8 +429,6 @@ static int builtin_block( wchar_t **argv )
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
The builtin builtin, used for given builtins precedence over functions. Mostly handled by the parser. All this code does is some additional operational modes, such as printing a list of all builtins.
|
||||
*/
|
||||
|
@ -530,7 +535,6 @@ static int builtin_builtin( wchar_t **argv )
|
|||
only a placeholder that prints the help message. Useful for
|
||||
commands that live in hte parser.
|
||||
*/
|
||||
|
||||
static int builtin_generic( wchar_t **argv )
|
||||
{
|
||||
int argc=builtin_count_args( argv );
|
||||
|
@ -594,7 +598,6 @@ static int builtin_generic( wchar_t **argv )
|
|||
/**
|
||||
The exec bultin. This is only a placeholder that prints the help message. Ther actual implementation lives in exec.c.
|
||||
*/
|
||||
|
||||
static int builtin_exec( wchar_t **argv )
|
||||
{
|
||||
int argc=builtin_count_args( argv );
|
||||
|
@ -784,9 +787,9 @@ static int builtin_functions( wchar_t **argv )
|
|||
|
||||
if( argc-woptind != 1 )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
L"functions: Expected exactly one function name\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Expected exactly one function name\n",
|
||||
argv[0] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
|
||||
return 1;
|
||||
|
@ -794,11 +797,11 @@ static int builtin_functions( wchar_t **argv )
|
|||
func = argv[woptind];
|
||||
if( !function_exists( func ) )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
L"functions: Function ",
|
||||
func,
|
||||
L" does not exist\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Function '%ls' does not exist\n",
|
||||
argv[0],
|
||||
func );
|
||||
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
|
||||
return 1;
|
||||
|
@ -1158,24 +1161,21 @@ static int builtin_function( wchar_t **argv )
|
|||
}
|
||||
else if( !(is_binding?wcsbindingname( argv[woptind] ) : wcsvarname( argv[woptind] ) ))
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": illegal function name \'",
|
||||
argv[woptind],
|
||||
L"\'\n",
|
||||
(void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: illegal function name '%ls'\n",
|
||||
argv[0],
|
||||
argv[woptind] );
|
||||
|
||||
res=1;
|
||||
}
|
||||
else if( parser_is_reserved(argv[woptind] ) )
|
||||
{
|
||||
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": the name \'",
|
||||
argv[woptind],
|
||||
L"\' is reserved,\nand can not be used as a function name\n",
|
||||
(void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: the name '%ls' is reserved,\nand can not be used as a function name\n",
|
||||
argv[0],
|
||||
argv[woptind] );
|
||||
|
||||
res=1;
|
||||
}
|
||||
}
|
||||
|
@ -1248,7 +1248,6 @@ static int builtin_function( wchar_t **argv )
|
|||
/**
|
||||
The random builtin. For generating random numbers.
|
||||
*/
|
||||
|
||||
static int builtin_random( wchar_t **argv )
|
||||
{
|
||||
static int seeded=0;
|
||||
|
@ -1333,9 +1332,10 @@ static int builtin_random( wchar_t **argv )
|
|||
foo = wcstol( argv[woptind], &end, 10 );
|
||||
if( errno || *end )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Seed value '" , argv[woptind], L"' is not a valid number\n", (void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Seed value '%ls' is not a valid number\n",
|
||||
argv[0],
|
||||
argv[woptind] );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -1348,6 +1348,7 @@ static int builtin_random( wchar_t **argv )
|
|||
{
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Expected zero or one argument, got %d\n",
|
||||
argv[0],
|
||||
argc-woptind );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
|
@ -1788,7 +1789,10 @@ static int builtin_exit( wchar_t **argv )
|
|||
ec = wcstol(argv[1],&end,10);
|
||||
if( errno || *end != 0)
|
||||
{
|
||||
sb_append2( sb_err, argv[0], L": Argument must be an integer '", argv[1], L"'\n", (void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Argument must be an integer '%ls'\n",
|
||||
argv[0],
|
||||
argv[1] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -1796,7 +1800,10 @@ static int builtin_exit( wchar_t **argv )
|
|||
}
|
||||
|
||||
default:
|
||||
sb_append2( sb_err, argv[0], L": Too many arguments\n", (void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Too many arguments\n",
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
|
||||
|
@ -2295,14 +2302,19 @@ static int builtin_fg( wchar_t **argv )
|
|||
if( builtin_err_redirect )
|
||||
{
|
||||
sb_printf( sb_err,
|
||||
L"Send job %d, '%ls' to foreground\n",
|
||||
FG_MSG,
|
||||
j->job_id,
|
||||
j->command );
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
If we aren't redirecting, send output to real stderr,
|
||||
since stuff in sb_err won't get printed until the
|
||||
command finishes.
|
||||
*/
|
||||
fwprintf( stderr,
|
||||
L"Send job %d, '%ls' to foreground\n",
|
||||
FG_MSG,
|
||||
j->job_id,
|
||||
j->command );
|
||||
}
|
||||
|
@ -2313,11 +2325,7 @@ static int builtin_fg( wchar_t **argv )
|
|||
env_set( L"_", ft, ENV_EXPORT );
|
||||
free(ft);
|
||||
reader_write_title();
|
||||
/*
|
||||
fwprintf( stderr, L"Send job %d, \'%ls\' to foreground\n",
|
||||
j->job_id,
|
||||
j->command );
|
||||
*/
|
||||
|
||||
make_first( j );
|
||||
j->fg=1;
|
||||
|
||||
|
@ -2539,12 +2547,11 @@ static int builtin_jobs( wchar_t **argv )
|
|||
case 0:
|
||||
if(long_options[opt_index].flag != 0)
|
||||
break;
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Unknown option ",
|
||||
long_options[opt_index].name,
|
||||
L"\n",
|
||||
(void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Unknown option '%ls'\n",
|
||||
argv[0],
|
||||
long_options[opt_index].name );
|
||||
|
||||
sb_append( sb_err,
|
||||
parser_current_line() );
|
||||
// builtin_print_help( argv[0], sb_err );
|
||||
|
@ -2620,7 +2627,10 @@ static int builtin_jobs( wchar_t **argv )
|
|||
pid=wcstol( argv[i], &end, 10 );
|
||||
if( errno || *end )
|
||||
{
|
||||
sb_append2( sb_err, argv[0], L": Not a process id: ", argv[i], L"\n", (void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Not a process id: '%ls'\n",
|
||||
argv[0],
|
||||
argv[i] );
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2632,7 +2642,10 @@ static int builtin_jobs( wchar_t **argv )
|
|||
}
|
||||
else
|
||||
{
|
||||
sb_printf( sb_err, L"%ls: No suitable job: %d\n", argv[0], pid );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: No suitable job: %d\n",
|
||||
argv[0],
|
||||
pid );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -2655,7 +2668,9 @@ static int builtin_jobs( wchar_t **argv )
|
|||
|
||||
if( !found )
|
||||
{
|
||||
sb_append2( sb_out, argv[0], L": There are no running jobs\n", (void *)0 );
|
||||
sb_printf( sb_out,
|
||||
L"%ls: There are no running jobs\n",
|
||||
argv[0] );
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -2672,28 +2687,24 @@ static int builtin_for( wchar_t **argv )
|
|||
|
||||
if( argc < 3)
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Expected at least two arguments\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Expected at least two arguments\n",
|
||||
argv[0] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
}
|
||||
else if ( !wcsvarname(argv[1]) )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": \'",
|
||||
argv[1],
|
||||
L"\' invalid variable name\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: '%ls' invalid variable name\n",
|
||||
argv[0],
|
||||
argv[1] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
}
|
||||
else if (wcscmp( argv[2], L"in") != 0 )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Second argument must be \'in\'\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Second argument must be 'in'\n",
|
||||
argv[0] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
}
|
||||
else
|
||||
|
@ -2753,10 +2764,10 @@ static int builtin_end( wchar_t **argv )
|
|||
current_block->type == OR ||
|
||||
current_block->type == AND )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Not inside of block\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Not inside of block\n",
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -2877,10 +2888,9 @@ static int builtin_else( wchar_t **argv )
|
|||
current_block->type != IF ||
|
||||
current_block->param1.if_state != 1)
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": not inside of if block\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: not inside of if block\n",
|
||||
argv[0] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -2911,9 +2921,10 @@ static int builtin_break_continue( wchar_t **argv )
|
|||
|
||||
if( argc != 1 )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Unknown option \'", argv[1], L"\'", (void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Unknown option '%ls'\n",
|
||||
argv[0],
|
||||
argv[1] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -2928,9 +2939,9 @@ static int builtin_break_continue( wchar_t **argv )
|
|||
|
||||
if( b == 0 )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Not inside of loop\n", (void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Not inside of loop\n",
|
||||
argv[0] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -2968,12 +2979,10 @@ static int builtin_return( wchar_t **argv )
|
|||
status = wcstol(argv[1],&end,10);
|
||||
if( errno || *end != 0)
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Argument must be an integer '",
|
||||
argv[1],
|
||||
L"'\n",
|
||||
(void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Argument must be an integer '%ls'\n",
|
||||
argv[0],
|
||||
argv[1] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -2981,9 +2990,9 @@ static int builtin_return( wchar_t **argv )
|
|||
break;
|
||||
}
|
||||
default:
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Too many arguments\n", (void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Too many arguments\n",
|
||||
argv[0] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -2997,9 +3006,9 @@ static int builtin_return( wchar_t **argv )
|
|||
|
||||
if( b == 0 )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": Not inside of function\n", (void *)0 );
|
||||
sb_printf( sb_err,
|
||||
L"%ls: Not inside of function\n",
|
||||
argv[0] );
|
||||
builtin_print_help( argv[0], sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -3057,10 +3066,9 @@ static int builtin_case( wchar_t **argv )
|
|||
|
||||
if( current_block->type != SWITCH )
|
||||
{
|
||||
sb_append2( sb_err,
|
||||
argv[0],
|
||||
L": syntax error, case command while not in switch block\n",
|
||||
(void *)0);
|
||||
sb_printf( sb_err,
|
||||
L"%ls: syntax error, case command while not in switch block\n",
|
||||
argv[0] );
|
||||
builtin_print_help( L"case", sb_err );
|
||||
return 1;
|
||||
}
|
||||
|
@ -3094,6 +3102,7 @@ static int builtin_case( wchar_t **argv )
|
|||
END OF BUILTIN COMMANDS
|
||||
Below are functions for handling the builtin commands
|
||||
*/
|
||||
|
||||
void builtin_init()
|
||||
{
|
||||
al_init( &io_stack );
|
||||
|
|
|
@ -28,10 +28,10 @@ Functions used for implementing the commandline builtin.
|
|||
*/
|
||||
enum
|
||||
{
|
||||
STRING_MODE=1, // Operate on entire buffer
|
||||
JOB_MODE, // Operate on job under cursor
|
||||
PROCESS_MODE, // Operate on process under cursor
|
||||
TOKEN_MODE // Operate on token under cursor
|
||||
STRING_MODE=1, /**< Operate on entire buffer */
|
||||
JOB_MODE, /**< Operate on job under cursor */
|
||||
PROCESS_MODE, /**< Operate on process under cursor */
|
||||
TOKEN_MODE /**< Operate on token under cursor */
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -40,9 +40,9 @@ enum
|
|||
*/
|
||||
enum
|
||||
{
|
||||
REPLACE_MODE=1, // Replace current text
|
||||
INSERT_MODE, // Insert at cursor position
|
||||
APPEND_MODE // Insert at end of current token/command/buffer
|
||||
REPLACE_MODE=1, /**< Replace current text */
|
||||
INSERT_MODE, /**< Insert at cursor position */
|
||||
APPEND_MODE /**< Insert at end of current token/command/buffer */
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -66,10 +66,6 @@ static void replace_part( wchar_t *begin,
|
|||
|
||||
sb_init( &out );
|
||||
|
||||
// wchar_t *tmp = wcsndup( begin, end-begin );
|
||||
|
||||
// fwprintf( stderr, L"Commandline '%ls', current command '%ls'\n", reader_get_buffer(), tmp );
|
||||
|
||||
sb_append_substring( &out, buff, begin-buff );
|
||||
|
||||
switch( append_mode)
|
||||
|
|
7
event.h
7
event.h
|
@ -17,6 +17,9 @@
|
|||
*/
|
||||
#define EVENT_ANY_PID 0
|
||||
|
||||
/**
|
||||
Enumeration of event types
|
||||
*/
|
||||
enum
|
||||
{
|
||||
EVENT_ANY, /**< Matches any event type (Not always any event, as the function name may limit the choice as well */
|
||||
|
@ -40,6 +43,10 @@ typedef struct
|
|||
Type of event
|
||||
*/
|
||||
int type;
|
||||
|
||||
/**
|
||||
The type-specific parameter
|
||||
*/
|
||||
union
|
||||
{
|
||||
/**
|
||||
|
|
4
parser.h
4
parser.h
|
@ -313,12 +313,12 @@ void parser_forbid_function( wchar_t *function );
|
|||
void parser_allow_function();
|
||||
|
||||
/**
|
||||
Initialize the parser
|
||||
Initialize static parser data
|
||||
*/
|
||||
void parser_init();
|
||||
|
||||
/**
|
||||
Destroy the parser
|
||||
Destroy static parser data
|
||||
*/
|
||||
void parser_destroy();
|
||||
|
||||
|
|
58
proc.h
58
proc.h
|
@ -20,15 +20,30 @@
|
|||
|
||||
|
||||
/**
|
||||
Types of internal processes
|
||||
Types of processes
|
||||
*/
|
||||
enum
|
||||
{
|
||||
/**
|
||||
A regular external command
|
||||
*/
|
||||
EXTERNAL,
|
||||
/**
|
||||
A builtin command
|
||||
*/
|
||||
INTERNAL_BUILTIN,
|
||||
/**
|
||||
A shellscript function
|
||||
*/
|
||||
INTERNAL_FUNCTION,
|
||||
/**
|
||||
A block of commands
|
||||
*/
|
||||
INTERNAL_BLOCK,
|
||||
INTERNAL_EXEC
|
||||
/**
|
||||
The exec builtin
|
||||
*/
|
||||
INTERNAL_EXEC,
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -142,19 +157,39 @@ typedef struct job
|
|||
}
|
||||
job_t;
|
||||
|
||||
/** Whether we are running a subshell command */
|
||||
/**
|
||||
Whether we are running a subshell command
|
||||
*/
|
||||
extern int is_subshell;
|
||||
/** Whether we are running a block of commands */
|
||||
|
||||
/**
|
||||
Whether we are running a block of commands
|
||||
*/
|
||||
extern int is_block;
|
||||
/** Whether we are reading from the keyboard right now*/
|
||||
|
||||
/**
|
||||
Whether we are reading from the keyboard right now
|
||||
*/
|
||||
extern int is_interactive;
|
||||
/** Whether this shell is attached to the keyboard at all*/
|
||||
|
||||
/**
|
||||
Whether this shell is attached to the keyboard at all
|
||||
*/
|
||||
extern int is_interactive_session;
|
||||
/** Whether we are a login shell*/
|
||||
|
||||
/**
|
||||
Whether we are a login shell
|
||||
*/
|
||||
extern int is_login;
|
||||
/** Whether we are a event handler*/
|
||||
|
||||
/**
|
||||
Whether we are a event handler
|
||||
*/
|
||||
extern int is_event;
|
||||
/** Linked list of all jobs */
|
||||
|
||||
/**
|
||||
Linked list of all jobs
|
||||
*/
|
||||
extern job_t *first_job;
|
||||
|
||||
/**
|
||||
|
@ -175,6 +210,7 @@ extern pid_t proc_last_bg_pid;
|
|||
Sets the status of the last process to exit
|
||||
*/
|
||||
void proc_set_last_status( int s );
|
||||
|
||||
/**
|
||||
Returns the status of the last process to exit
|
||||
*/
|
||||
|
@ -184,6 +220,7 @@ int proc_get_last_status();
|
|||
Remove the specified job
|
||||
*/
|
||||
void job_free( job_t* j );
|
||||
|
||||
/**
|
||||
Create a new job
|
||||
*/
|
||||
|
@ -219,6 +256,7 @@ int job_is_completed( const job_t *j );
|
|||
\param cont Whether the function should wait for the job to complete before returning
|
||||
*/
|
||||
void job_continue( job_t *j, int cont );
|
||||
|
||||
/**
|
||||
Notify user of nog events. Notify the user about stopped or
|
||||
terminated jobs. Delete terminated jobs from the active job list.
|
||||
|
@ -226,10 +264,10 @@ void job_continue( job_t *j, int cont );
|
|||
\param interactive whether interactive jobs should be reaped as well
|
||||
*/
|
||||
int job_reap( int interactive );
|
||||
|
||||
/**
|
||||
Signal handler for SIGCHLD. Mark any processes with relevant
|
||||
information.
|
||||
|
||||
*/
|
||||
void job_handle_signal( int signal, siginfo_t *info, void *con );
|
||||
|
||||
|
|
Loading…
Reference in a new issue