2006-01-24 06:40:14 +10:00
/** \file builtin_complete.c Functions defining the complete builtin
2006-01-23 07:10:55 +10:00
2011-12-26 19:18:46 -08:00
Functions used for implementing the complete builtin .
2006-01-23 07:10:55 +10:00
*/
2006-08-11 11:18:35 +10:00
# include "config.h"
2006-01-23 07:10:55 +10:00
# include <stdlib.h>
# include <stdio.h>
# include <wchar.h>
# include <wctype.h>
# include <sys/types.h>
# include <termios.h>
# include <signal.h>
2006-02-28 23:17:16 +10:00
# include "fallback.h"
2006-01-23 07:10:55 +10:00
# include "util.h"
2006-02-28 23:17:16 +10:00
2006-01-23 07:10:55 +10:00
# include "wutil.h"
# include "builtin.h"
# include "common.h"
# include "complete.h"
# include "wgetopt.h"
# include "parser.h"
2006-01-31 02:51:50 +10:00
# include "reader.h"
2006-07-20 08:55:49 +10:00
2006-01-23 07:10:55 +10:00
2006-06-17 23:07:08 +10:00
/**
2011-12-26 19:18:46 -08:00
Internal storage for the builtin_complete_get_temporary_buffer ( ) function .
2006-06-17 23:07:08 +10:00
*/
2010-10-08 08:43:57 +08:00
static const wchar_t * temporary_buffer ;
2006-01-31 02:51:50 +10:00
2006-01-23 09:40:03 +10:00
/*
builtin_complete_ * are a set of rather silly looping functions that
make sure that all the proper combinations of complete_add or
2006-06-02 12:15:17 +10:00
complete_remove get called . This is needed since complete allows you
to specify multiple switches on a single commandline , like ' complete
- s a - s b - s c ' , but the complete_add function only accepts one
short switch and one long switch .
2006-01-23 09:40:03 +10:00
*/
2006-01-23 07:10:55 +10:00
2006-06-17 23:07:08 +10:00
/**
Silly function
*/
2006-01-23 07:10:55 +10:00
static void builtin_complete_add2 ( const wchar_t * cmd ,
int cmd_type ,
const wchar_t * short_opt ,
array_list_t * gnu_opt ,
2011-12-26 19:18:46 -08:00
array_list_t * old_opt ,
int result_mode ,
2006-01-23 07:10:55 +10:00
const wchar_t * condition ,
const wchar_t * comp ,
2007-03-01 07:43:27 +10:00
const wchar_t * desc ,
int flags )
2006-01-23 07:10:55 +10:00
{
int i ;
const wchar_t * s ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( s = short_opt ; * s ; s + + )
{
2011-12-26 19:18:46 -08:00
complete_add ( cmd ,
2006-01-23 09:30:00 +10:00
cmd_type ,
* s ,
0 ,
0 ,
result_mode ,
condition ,
comp ,
2007-03-01 07:43:27 +10:00
desc ,
flags ) ;
2006-01-23 07:10:55 +10:00
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( i = 0 ; i < al_get_count ( gnu_opt ) ; i + + )
{
2011-12-26 19:18:46 -08:00
complete_add ( cmd ,
2006-01-23 09:30:00 +10:00
cmd_type ,
0 ,
( wchar_t * ) al_get ( gnu_opt , i ) ,
0 ,
result_mode ,
condition ,
comp ,
2007-03-01 07:43:27 +10:00
desc ,
flags ) ;
2006-01-23 07:10:55 +10:00
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( i = 0 ; i < al_get_count ( old_opt ) ; i + + )
{
2011-12-26 19:18:46 -08:00
complete_add ( cmd ,
2006-01-23 09:30:00 +10:00
cmd_type ,
0 ,
( wchar_t * ) al_get ( old_opt , i ) ,
1 ,
result_mode ,
condition ,
comp ,
2007-03-01 07:43:27 +10:00
desc ,
flags ) ;
2011-12-26 19:18:46 -08:00
}
2006-01-23 09:30:00 +10:00
if ( al_get_count ( old_opt ) + al_get_count ( gnu_opt ) + wcslen ( short_opt ) = = 0 )
{
2011-12-26 19:18:46 -08:00
complete_add ( cmd ,
2006-01-23 09:30:00 +10:00
cmd_type ,
0 ,
0 ,
0 ,
result_mode ,
condition ,
comp ,
2007-03-01 07:43:27 +10:00
desc ,
flags ) ;
2011-12-26 19:18:46 -08:00
}
2006-01-23 07:10:55 +10:00
}
2006-06-17 23:07:08 +10:00
/**
Silly function
*/
2011-12-26 19:18:46 -08:00
static void builtin_complete_add ( array_list_t * cmd ,
2006-01-23 07:10:55 +10:00
array_list_t * path ,
const wchar_t * short_opt ,
array_list_t * gnu_opt ,
2011-12-26 19:18:46 -08:00
array_list_t * old_opt ,
int result_mode ,
2007-08-02 03:35:24 +10:00
int authoritative ,
2006-01-23 07:10:55 +10:00
const wchar_t * condition ,
const wchar_t * comp ,
2007-03-01 07:43:27 +10:00
const wchar_t * desc ,
int flags )
2006-01-23 07:10:55 +10:00
{
int i ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( i = 0 ; i < al_get_count ( cmd ) ; i + + )
{
2011-12-26 19:18:46 -08:00
builtin_complete_add2 ( ( const wchar_t * ) al_get ( cmd , i ) ,
2007-01-28 23:40:59 +10:00
COMMAND ,
2011-12-26 19:18:46 -08:00
short_opt ,
2007-01-28 23:40:59 +10:00
gnu_opt ,
2011-12-26 19:18:46 -08:00
old_opt ,
result_mode ,
condition ,
comp ,
2007-03-01 07:43:27 +10:00
desc ,
flags ) ;
2007-01-28 23:40:59 +10:00
2007-08-02 03:35:24 +10:00
if ( authoritative ! = - 1 )
2007-01-28 13:24:16 +10:00
{
2011-12-26 19:18:46 -08:00
complete_set_authoritative ( ( const wchar_t * ) al_get ( cmd , i ) ,
2007-01-28 23:40:59 +10:00
COMMAND ,
2007-08-02 03:35:24 +10:00
authoritative ) ;
2007-01-28 13:24:16 +10:00
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( i = 0 ; i < al_get_count ( path ) ; i + + )
{
2011-12-26 19:18:46 -08:00
builtin_complete_add2 ( ( const wchar_t * ) al_get ( path , i ) ,
2007-01-28 23:40:59 +10:00
PATH ,
2011-12-26 19:18:46 -08:00
short_opt ,
2007-01-28 23:40:59 +10:00
gnu_opt ,
2011-12-26 19:18:46 -08:00
old_opt ,
result_mode ,
condition ,
comp ,
2007-03-01 07:43:27 +10:00
desc ,
flags ) ;
2007-01-28 23:40:59 +10:00
2007-08-02 03:35:24 +10:00
if ( authoritative ! = - 1 )
2007-01-28 13:24:16 +10:00
{
2011-12-26 19:18:46 -08:00
complete_set_authoritative ( ( const wchar_t * ) al_get ( path , i ) ,
2007-01-28 23:40:59 +10:00
PATH ,
2007-08-02 03:35:24 +10:00
authoritative ) ;
2007-01-28 13:24:16 +10:00
}
2011-12-26 19:18:46 -08:00
}
2006-01-23 07:10:55 +10:00
}
2006-06-17 23:07:08 +10:00
/**
Silly function
*/
2006-01-23 07:10:55 +10:00
static void builtin_complete_remove3 ( wchar_t * cmd ,
int cmd_type ,
wchar_t short_opt ,
2011-12-26 19:18:46 -08:00
array_list_t * long_opt )
2006-01-23 07:10:55 +10:00
{
int i ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( i = 0 ; i < al_get_count ( long_opt ) ; i + + )
{
complete_remove ( cmd ,
cmd_type ,
short_opt ,
( wchar_t * ) al_get ( long_opt , i ) ) ;
2011-12-26 19:18:46 -08:00
}
2006-01-23 07:10:55 +10:00
}
2006-06-17 23:07:08 +10:00
/**
Silly function
*/
2006-01-23 07:10:55 +10:00
static void builtin_complete_remove2 ( wchar_t * cmd ,
int cmd_type ,
const wchar_t * short_opt ,
array_list_t * gnu_opt ,
array_list_t * old_opt )
{
const wchar_t * s = ( wchar_t * ) short_opt ;
if ( * s )
{
for ( ; * s ; s + + )
{
if ( al_get_count ( old_opt ) + al_get_count ( gnu_opt ) = = 0 )
{
complete_remove ( cmd ,
cmd_type ,
* s ,
0 ) ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
}
else
{
builtin_complete_remove3 ( cmd ,
cmd_type ,
* s ,
gnu_opt ) ;
builtin_complete_remove3 ( cmd ,
cmd_type ,
* s ,
old_opt ) ;
}
}
}
else
{
builtin_complete_remove3 ( cmd ,
cmd_type ,
0 ,
gnu_opt ) ;
builtin_complete_remove3 ( cmd ,
cmd_type ,
0 ,
old_opt ) ;
2011-12-26 19:18:46 -08:00
}
2006-01-23 07:10:55 +10:00
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
}
2006-06-17 23:07:08 +10:00
/**
Silly function
*/
2011-12-26 19:18:46 -08:00
static void builtin_complete_remove ( array_list_t * cmd ,
2006-01-23 07:10:55 +10:00
array_list_t * path ,
const wchar_t * short_opt ,
array_list_t * gnu_opt ,
array_list_t * old_opt )
{
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
int i ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( i = 0 ; i < al_get_count ( cmd ) ; i + + )
{
builtin_complete_remove2 ( ( wchar_t * ) al_get ( cmd , i ) ,
COMMAND ,
2011-12-26 19:18:46 -08:00
short_opt ,
2006-01-23 07:10:55 +10:00
gnu_opt ,
old_opt ) ;
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
for ( i = 0 ; i < al_get_count ( path ) ; i + + )
{
builtin_complete_remove2 ( ( wchar_t * ) al_get ( path , i ) ,
PATH ,
2011-12-26 19:18:46 -08:00
short_opt ,
2006-01-23 07:10:55 +10:00
gnu_opt ,
old_opt ) ;
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
}
2006-01-31 02:51:50 +10:00
const wchar_t * builtin_complete_get_temporary_buffer ( )
{
2011-12-26 19:18:46 -08:00
ASSERT_IS_MAIN_THREAD ( ) ;
2006-01-31 02:51:50 +10:00
return temporary_buffer ;
}
2006-06-13 23:43:28 +10:00
/**
The complete builtin . Used for specifying programmable
tab - completions . Calls the functions in complete . c for any heavy
lifting . Defined in builtin_complete . c
*/
2012-01-16 12:10:08 -08:00
static int builtin_complete ( parser_t & parser , wchar_t * * argv )
2006-01-23 07:10:55 +10:00
{
2011-12-26 19:18:46 -08:00
ASSERT_IS_MAIN_THREAD ( ) ;
2006-01-23 09:40:03 +10:00
int res = 0 ;
2006-01-23 07:10:55 +10:00
int argc = 0 ;
int result_mode = SHARED ;
int remove = 0 ;
2007-08-02 03:35:24 +10:00
int authoritative = - 1 ;
2007-03-01 07:43:27 +10:00
int flags = COMPLETE_AUTO_SPACE ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
string_buffer_t short_opt ;
array_list_t gnu_opt , old_opt ;
2011-12-26 19:18:46 -08:00
const wchar_t * comp = L " " , * desc = L " " , * condition = L " " ;
2006-01-23 07:10:55 +10:00
2006-01-31 02:51:50 +10:00
wchar_t * do_complete = 0 ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
array_list_t cmd ;
array_list_t path ;
2006-01-31 02:51:50 +10:00
static int recursion_level = 0 ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
al_init ( & cmd ) ;
al_init ( & path ) ;
sb_init ( & short_opt ) ;
al_init ( & gnu_opt ) ;
al_init ( & old_opt ) ;
2011-12-26 19:18:46 -08:00
argc = builtin_count_args ( argv ) ;
2006-01-23 07:10:55 +10:00
woptind = 0 ;
2011-12-26 19:18:46 -08:00
2006-01-23 09:40:03 +10:00
while ( res = = 0 )
2006-01-23 07:10:55 +10:00
{
2010-10-08 08:43:57 +08:00
static const struct woption
2006-01-23 07:10:55 +10:00
long_options [ ] =
{
{
2011-12-26 19:18:46 -08:00
L " exclusive " , no_argument , 0 , ' x '
2006-01-23 07:10:55 +10:00
}
,
{
2011-12-26 19:18:46 -08:00
L " no-files " , no_argument , 0 , ' f '
2006-01-23 07:10:55 +10:00
}
,
{
2011-12-26 19:18:46 -08:00
L " require-parameter " , no_argument , 0 , ' r '
2006-01-23 07:10:55 +10:00
}
,
{
L " path " , required_argument , 0 , ' p '
}
2011-12-26 19:18:46 -08:00
,
2006-01-23 07:10:55 +10:00
{
2011-12-26 19:18:46 -08:00
L " command " , required_argument , 0 , ' c '
2006-01-23 07:10:55 +10:00
}
2011-12-26 19:18:46 -08:00
,
2006-01-23 07:10:55 +10:00
{
2011-12-26 19:18:46 -08:00
L " short-option " , required_argument , 0 , ' s '
2006-01-23 07:10:55 +10:00
}
,
{
2006-02-15 12:49:00 +10:00
L " long-option " , required_argument , 0 , ' l '
}
2006-01-23 07:10:55 +10:00
,
{
2011-12-26 19:18:46 -08:00
L " old-option " , required_argument , 0 , ' o '
2006-01-23 07:10:55 +10:00
}
,
{
L " description " , required_argument , 0 , ' d '
}
,
{
L " arguments " , required_argument , 0 , ' a '
}
,
{
L " erase " , no_argument , 0 , ' e '
}
,
{
2007-08-02 03:35:24 +10:00
L " unauthoritative " , no_argument , 0 , ' u '
2006-01-23 07:10:55 +10:00
}
,
2007-01-28 23:40:59 +10:00
{
2007-08-02 03:35:24 +10:00
L " authoritative " , no_argument , 0 , ' A '
2007-01-28 23:40:59 +10:00
}
,
2006-01-23 07:10:55 +10:00
{
L " condition " , required_argument , 0 , ' n '
}
,
2006-01-31 02:51:50 +10:00
{
2006-08-24 10:53:15 +10:00
L " do-complete " , optional_argument , 0 , ' C '
2006-01-31 02:51:50 +10:00
}
,
2006-05-26 21:24:02 +10:00
{
L " help " , no_argument , 0 , ' h '
}
,
2011-12-26 19:18:46 -08:00
{
0 , 0 , 0 , 0
2006-01-23 07:10:55 +10:00
}
}
2011-12-26 19:18:46 -08:00
;
2006-01-23 07:10:55 +10:00
int opt_index = 0 ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
int opt = wgetopt_long ( argc ,
2011-12-26 19:18:46 -08:00
argv ,
L " a:c:p:s:l:o:d:frxeuAn:C::h " ,
long_options ,
2006-01-23 07:10:55 +10:00
& opt_index ) ;
if ( opt = = - 1 )
break ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
switch ( opt )
{
case 0 :
if ( long_options [ opt_index ] . flag ! = 0 )
break ;
sb_printf ( sb_err ,
BUILTIN_ERR_UNKNOWN ,
argv [ 0 ] ,
long_options [ opt_index ] . name ) ;
2012-01-16 12:10:08 -08:00
builtin_print_help ( parser , argv [ 0 ] , sb_err ) ;
2006-01-23 07:10:55 +10:00
2011-12-26 19:18:46 -08:00
2006-01-23 09:40:03 +10:00
res = 1 ;
break ;
2011-12-26 19:18:46 -08:00
case ' x ' :
2006-01-23 07:10:55 +10:00
result_mode | = EXCLUSIVE ;
break ;
2011-12-26 19:18:46 -08:00
case ' f ' :
2006-01-23 07:10:55 +10:00
result_mode | = NO_FILES ;
break ;
2011-12-26 19:18:46 -08:00
case ' r ' :
2006-01-23 07:10:55 +10:00
result_mode | = NO_COMMON ;
break ;
2011-12-26 19:18:46 -08:00
case ' p ' :
2006-01-23 07:10:55 +10:00
case ' c ' :
2006-06-15 11:11:54 +10:00
{
wchar_t * a = unescape ( woptarg , 1 ) ;
if ( a )
{
al_push ( ( opt = = ' p ' ? & path : & cmd ) , a ) ;
}
else
{
sb_printf ( sb_err , L " %ls: Invalid token '%ls' \n " , argv [ 0 ] , woptarg ) ;
2011-12-26 19:18:46 -08:00
res = 1 ;
}
2006-01-23 07:10:55 +10:00
break ;
2006-06-15 11:11:54 +10:00
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
case ' d ' :
desc = woptarg ;
break ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
case ' u ' :
2007-08-02 03:35:24 +10:00
authoritative = 0 ;
2006-01-23 07:10:55 +10:00
break ;
2011-12-26 19:18:46 -08:00
2007-01-28 23:40:59 +10:00
case ' A ' :
2007-08-02 03:35:24 +10:00
authoritative = 1 ;
2007-01-28 23:40:59 +10:00
break ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
case ' s ' :
sb_append ( & short_opt , woptarg ) ;
break ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
case ' l ' :
al_push ( & gnu_opt , woptarg ) ;
break ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
case ' o ' :
al_push ( & old_opt , woptarg ) ;
break ;
case ' a ' :
comp = woptarg ;
break ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
case ' e ' :
remove = 1 ;
break ;
case ' n ' :
condition = woptarg ;
break ;
2011-12-26 19:18:46 -08:00
2006-01-31 02:51:50 +10:00
case ' C ' :
do_complete = woptarg ? woptarg : reader_get_buffer ( ) ;
break ;
2011-12-26 19:18:46 -08:00
2006-05-26 21:24:02 +10:00
case ' h ' :
2012-01-16 12:10:08 -08:00
builtin_print_help ( parser , argv [ 0 ] , sb_out ) ;
2006-05-26 21:24:02 +10:00
return 0 ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
case ' ? ' :
2012-01-16 12:10:08 -08:00
builtin_unknown_option ( parser , argv [ 0 ] , argv [ woptind - 1 ] ) ;
2006-01-23 09:40:03 +10:00
res = 1 ;
break ;
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
}
2011-12-26 19:18:46 -08:00
2006-01-23 07:10:55 +10:00
}
2006-01-23 09:40:03 +10:00
2006-05-22 05:26:30 +10:00
if ( ! res )
{
if ( condition & & wcslen ( condition ) )
{
2012-01-16 12:10:08 -08:00
if ( parser . test ( condition , 0 , 0 , 0 ) )
2006-05-22 05:26:30 +10:00
{
sb_printf ( sb_err ,
2011-12-26 19:18:46 -08:00
L " %ls: Condition '%ls' contained a syntax error \n " ,
2006-05-22 05:26:30 +10:00
argv [ 0 ] ,
condition ) ;
2011-12-26 19:18:46 -08:00
2012-01-16 12:10:08 -08:00
parser . test ( condition , 0 , sb_err , argv [ 0 ] ) ;
2011-12-26 19:18:46 -08:00
2006-05-22 05:26:30 +10:00
res = 1 ;
}
}
}
2011-12-26 19:18:46 -08:00
2006-05-22 05:26:30 +10:00
if ( ! res )
{
if ( comp & & wcslen ( comp ) )
{
2012-01-16 12:10:08 -08:00
if ( parser . test_args ( comp , 0 , 0 ) )
2006-05-22 05:26:30 +10:00
{
sb_printf ( sb_err ,
2011-12-26 19:18:46 -08:00
L " %ls: Completion '%ls' contained a syntax error \n " ,
2006-05-22 05:26:30 +10:00
argv [ 0 ] ,
comp ) ;
2011-12-26 19:18:46 -08:00
2012-01-16 12:10:08 -08:00
parser . test_args ( comp , sb_err , argv [ 0 ] ) ;
2011-12-26 19:18:46 -08:00
2006-05-22 05:26:30 +10:00
res = 1 ;
}
}
}
2006-02-15 12:49:00 +10:00
if ( ! res )
2006-01-31 02:51:50 +10:00
{
2006-02-15 12:49:00 +10:00
if ( do_complete )
{
2012-01-16 22:26:47 +05:30
std : : vector < completion_t > comp ;
2006-02-15 12:49:00 +10:00
int i ;
2006-01-31 02:51:50 +10:00
2006-02-15 12:49:00 +10:00
const wchar_t * prev_temporary_buffer = temporary_buffer ;
2007-04-21 05:55:06 +10:00
wchar_t * token ;
parse_util_token_extent ( do_complete , wcslen ( do_complete ) , & token , 0 , 0 , 0 ) ;
2011-12-26 19:18:46 -08:00
temporary_buffer = do_complete ;
2006-01-31 02:51:50 +10:00
2006-02-15 12:49:00 +10:00
if ( recursion_level < 1 )
{
recursion_level + + ;
2011-12-26 19:18:46 -08:00
2012-01-16 22:26:47 +05:30
// comp = al_halloc( 0 );
2011-12-26 19:18:46 -08:00
2012-01-16 22:26:47 +05:30
complete2 ( do_complete , comp ) ;
2011-12-26 19:18:46 -08:00
2012-01-16 22:26:47 +05:30
for ( i = 0 ; i < comp . size ( ) ; i + + )
2006-02-15 12:49:00 +10:00
{
2012-01-16 22:26:47 +05:30
const completion_t & next = comp . at ( i ) ;
2011-12-26 19:18:46 -08:00
const wchar_t * prepend ;
2012-01-16 22:26:47 +05:30
if ( next . flags & COMPLETE_NO_CASE )
2007-04-21 05:55:06 +10:00
{
prepend = L " " ;
}
else
{
prepend = token ;
}
2011-12-26 19:18:46 -08:00
2007-04-21 05:55:06 +10:00
2012-01-16 22:26:47 +05:30
if ( ! ( next . description ) . empty ( ) )
2007-03-26 16:13:07 +10:00
{
2012-01-16 22:26:47 +05:30
sb_printf ( sb_out , L " %ls%ls \t %ls \n " , prepend , next . completion . c_str ( ) , next . description . c_str ( ) ) ;
2007-03-26 16:13:07 +10:00
}
else
{
2012-01-16 22:26:47 +05:30
sb_printf ( sb_out , L " %ls%ls \n " , prepend , next . completion . c_str ( ) ) ;
2007-03-26 16:13:07 +10:00
}
2006-02-15 12:49:00 +10:00
}
2011-12-26 19:18:46 -08:00
2012-01-16 22:26:47 +05:30
// halloc_free( comp );
2006-02-15 12:49:00 +10:00
recursion_level - - ;
}
2011-12-26 19:18:46 -08:00
temporary_buffer = prev_temporary_buffer ;
2006-01-31 02:51:50 +10:00
}
2006-02-15 12:49:00 +10:00
else if ( woptind ! = argc )
{
2011-12-26 19:18:46 -08:00
sb_printf ( sb_err ,
2006-02-15 12:49:00 +10:00
_ ( L " %ls: Too many arguments \n " ) ,
argv [ 0 ] ) ;
2012-01-16 12:10:08 -08:00
builtin_print_help ( parser , argv [ 0 ] , sb_err ) ;
2006-01-23 07:10:55 +10:00
2006-02-15 12:49:00 +10:00
res = 1 ;
}
else if ( ( al_get_count ( & cmd ) = = 0 ) & & ( al_get_count ( & path ) = = 0 ) )
2006-01-23 07:10:55 +10:00
{
2006-02-15 12:49:00 +10:00
/* No arguments specified, meaning we print the definitions of
* all specified completions to stdout . */
2011-12-26 19:18:46 -08:00
complete_print ( sb_out ) ;
2006-01-23 07:10:55 +10:00
}
else
{
2006-02-15 12:49:00 +10:00
if ( remove )
{
builtin_complete_remove ( & cmd ,
& path ,
( wchar_t * ) short_opt . buff ,
& gnu_opt ,
2011-12-26 19:18:46 -08:00
& old_opt ) ;
2006-02-15 12:49:00 +10:00
}
else
{
2011-12-26 19:18:46 -08:00
builtin_complete_add ( & cmd ,
2006-02-15 12:49:00 +10:00
& path ,
( wchar_t * ) short_opt . buff ,
& gnu_opt ,
2011-12-26 19:18:46 -08:00
& old_opt ,
result_mode ,
2007-08-02 03:35:24 +10:00
authoritative ,
2006-02-15 12:49:00 +10:00
condition ,
comp ,
2007-03-01 07:43:27 +10:00
desc ,
2011-12-26 19:18:46 -08:00
flags ) ;
2006-02-15 12:49:00 +10:00
}
2006-01-23 09:40:03 +10:00
2011-12-26 19:18:46 -08:00
}
2006-02-15 12:49:00 +10:00
}
2011-12-26 19:18:46 -08:00
2006-06-13 07:47:42 +10:00
al_foreach ( & cmd , & free ) ;
al_foreach ( & path , & free ) ;
2006-01-23 07:10:55 +10:00
al_destroy ( & cmd ) ;
al_destroy ( & path ) ;
sb_destroy ( & short_opt ) ;
al_destroy ( & gnu_opt ) ;
al_destroy ( & old_opt ) ;
2006-01-23 09:40:03 +10:00
return res ;
2006-01-23 07:10:55 +10:00
}