1 /* pcomplete.c - functions to generate lists of matches for programmable completion. */
3 /* Copyright (C) 1999-2012 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
23 #if defined (PROGRAMMABLE_COMPLETION)
25 #include "bashtypes.h"
26 #include "posixstat.h"
28 #if defined (HAVE_UNISTD_H)
34 #if defined (PREFER_STDARG)
47 #include "pcomplete.h"
50 #include "execute_cmd.h"
53 #if defined (JOB_CONTROL)
64 #include "builtins/common.h"
65 #include "builtins/builtext.h"
67 #include <glob/glob.h>
68 #include <glob/strmatch.h>
70 #include <readline/rlconf.h>
71 #include <readline/readline.h>
72 #include <readline/history.h>
74 #define PCOMP_RETRYFAIL 256
79 #define STRDUP(x) ((x) ? savestring (x) : (char *)NULL)
81 typedef SHELL_VAR
**SVFUNC ();
84 extern char *strpbrk
__P((char *, char *));
87 extern int array_needs_making
;
88 extern STRING_INT_ALIST word_token_alist
[];
89 extern char *signal_names
[];
90 extern sh_builtin_func_t
*last_shell_builtin
, *this_shell_builtin
;
93 #if defined (PREFER_STDARG)
94 static void debug_printf (const char *, ...) __attribute__((__format__ (printf
, 1, 2)));
98 static int it_init_joblist
__P((ITEMLIST
*, int));
100 static int it_init_aliases
__P((ITEMLIST
*));
101 static int it_init_arrayvars
__P((ITEMLIST
*));
102 static int it_init_bindings
__P((ITEMLIST
*));
103 static int it_init_builtins
__P((ITEMLIST
*));
104 static int it_init_disabled
__P((ITEMLIST
*));
105 static int it_init_enabled
__P((ITEMLIST
*));
106 static int it_init_exported
__P((ITEMLIST
*));
107 static int it_init_functions
__P((ITEMLIST
*));
108 static int it_init_helptopics
__P((ITEMLIST
*));
109 static int it_init_hostnames
__P((ITEMLIST
*));
110 static int it_init_jobs
__P((ITEMLIST
*));
111 static int it_init_running
__P((ITEMLIST
*));
112 static int it_init_stopped
__P((ITEMLIST
*));
113 static int it_init_keywords
__P((ITEMLIST
*));
114 static int it_init_signals
__P((ITEMLIST
*));
115 static int it_init_variables
__P((ITEMLIST
*));
116 static int it_init_setopts
__P((ITEMLIST
*));
117 static int it_init_shopts
__P((ITEMLIST
*));
119 static int shouldexp_filterpat
__P((char *));
120 static char *preproc_filterpat
__P((char *, char *));
122 static void init_itemlist_from_varlist
__P((ITEMLIST
*, SVFUNC
*));
124 static STRINGLIST
*gen_matches_from_itemlist
__P((ITEMLIST
*, const char *));
125 static STRINGLIST
*gen_action_completions
__P((COMPSPEC
*, const char *));
126 static STRINGLIST
*gen_globpat_matches
__P((COMPSPEC
*, const char *));
127 static STRINGLIST
*gen_wordlist_matches
__P((COMPSPEC
*, const char *));
128 static STRINGLIST
*gen_shell_function_matches
__P((COMPSPEC
*, const char *,
130 char *, int, WORD_LIST
*,
132 static STRINGLIST
*gen_command_matches
__P((COMPSPEC
*, const char *,
134 char *, int, WORD_LIST
*,
137 static STRINGLIST
*gen_progcomp_completions
__P((const char *, const char *,
139 int, int, int *, int *,
142 static char *pcomp_filename_completion_function
__P((const char *, int));
144 #if defined (ARRAY_VARS)
145 static SHELL_VAR
*bind_comp_words
__P((WORD_LIST
*));
147 static void bind_compfunc_variables
__P((char *, int, WORD_LIST
*, int, int));
148 static void unbind_compfunc_variables
__P((int));
149 static WORD_LIST
*build_arg_list
__P((char *, const char *, const char *, WORD_LIST
*, int));
150 static WORD_LIST
*command_line_to_word_list
__P((char *, int, int, int *, int *));
153 static int progcomp_debug
= 0;
156 int prog_completion_enabled
= 1;
158 /* These are used to manage the arrays of strings for possible completions. */
159 ITEMLIST it_aliases
= { 0, it_init_aliases
, (STRINGLIST
*)0 };
160 ITEMLIST it_arrayvars
= { LIST_DYNAMIC
, it_init_arrayvars
, (STRINGLIST
*)0 };
161 ITEMLIST it_bindings
= { 0, it_init_bindings
, (STRINGLIST
*)0 };
162 ITEMLIST it_builtins
= { 0, it_init_builtins
, (STRINGLIST
*)0 };
163 ITEMLIST it_commands
= { LIST_DYNAMIC
}; /* unused */
164 ITEMLIST it_directories
= { LIST_DYNAMIC
}; /* unused */
165 ITEMLIST it_disabled
= { 0, it_init_disabled
, (STRINGLIST
*)0 };
166 ITEMLIST it_enabled
= { 0, it_init_enabled
, (STRINGLIST
*)0 };
167 ITEMLIST it_exports
= { LIST_DYNAMIC
, it_init_exported
, (STRINGLIST
*)0 };
168 ITEMLIST it_files
= { LIST_DYNAMIC
}; /* unused */
169 ITEMLIST it_functions
= { 0, it_init_functions
, (STRINGLIST
*)0 };
170 ITEMLIST it_helptopics
= { 0, it_init_helptopics
, (STRINGLIST
*)0 };
171 ITEMLIST it_hostnames
= { LIST_DYNAMIC
, it_init_hostnames
, (STRINGLIST
*)0 };
172 ITEMLIST it_groups
= { LIST_DYNAMIC
}; /* unused */
173 ITEMLIST it_jobs
= { LIST_DYNAMIC
, it_init_jobs
, (STRINGLIST
*)0 };
174 ITEMLIST it_keywords
= { 0, it_init_keywords
, (STRINGLIST
*)0 };
175 ITEMLIST it_running
= { LIST_DYNAMIC
, it_init_running
, (STRINGLIST
*)0 };
176 ITEMLIST it_services
= { LIST_DYNAMIC
}; /* unused */
177 ITEMLIST it_setopts
= { 0, it_init_setopts
, (STRINGLIST
*)0 };
178 ITEMLIST it_shopts
= { 0, it_init_shopts
, (STRINGLIST
*)0 };
179 ITEMLIST it_signals
= { 0, it_init_signals
, (STRINGLIST
*)0 };
180 ITEMLIST it_stopped
= { LIST_DYNAMIC
, it_init_stopped
, (STRINGLIST
*)0 };
181 ITEMLIST it_users
= { LIST_DYNAMIC
}; /* unused */
182 ITEMLIST it_variables
= { LIST_DYNAMIC
, it_init_variables
, (STRINGLIST
*)0 };
184 COMPSPEC
*pcomp_curcs
;
185 const char *pcomp_curcmd
;
190 #if defined (PREFER_STDARG)
191 debug_printf (const char *format
, ...)
193 debug_printf (format
, va_alist
)
200 if (progcomp_debug
== 0)
203 SH_VA_START (args
, format
);
205 fprintf (stdout
, "DEBUG: ");
206 vfprintf (stdout
, format
, args
);
207 fprintf (stdout
, "\n");
215 /* Functions to manage the item lists */
218 set_itemlist_dirty (it
)
221 it
->flags
|= LIST_DIRTY
;
225 initialize_itemlist (itp
)
228 (*itp
->list_getter
) (itp
);
229 itp
->flags
|= LIST_INITIALIZED
;
230 itp
->flags
&= ~LIST_DIRTY
;
242 if ((itp
->flags
& (LIST_DONTFREEMEMBERS
|LIST_DONTFREE
)) == 0)
243 strvec_flush (sl
->list
);
244 if ((itp
->flags
& LIST_DONTFREE
) == 0)
248 itp
->slist
= (STRINGLIST
*)NULL
;
249 itp
->flags
&= ~(LIST_DONTFREE
|LIST_DONTFREEMEMBERS
|LIST_INITIALIZED
|LIST_DIRTY
);
254 shouldexp_filterpat (s
)
259 for (p
= s
; p
&& *p
; p
++)
269 /* Replace any instance of `&' in PAT with TEXT. Backslash may be used to
270 quote a `&' and inhibit substitution. Returns a new string. This just
271 calls stringlib.c:strcreplace(). */
273 preproc_filterpat (pat
, text
)
279 ret
= strcreplace (pat
, '&', text
, 1);
283 /* Remove any match of FILTERPAT from SL. A `&' in FILTERPAT is replaced by
284 TEXT. A leading `!' in FILTERPAT negates the pattern; in this case
285 any member of SL->list that does *not* match will be removed. This returns
286 a new STRINGLIST with the matching members of SL *copied*. Any
287 non-matching members of SL->list are *freed*. */
289 filter_stringlist (sl
, filterpat
, text
)
291 char *filterpat
, *text
;
297 if (sl
== 0 || sl
->list
== 0 || sl
->list_len
== 0)
300 npat
= shouldexp_filterpat (filterpat
) ? preproc_filterpat (filterpat
, text
) : filterpat
;
302 not = (npat
[0] == '!');
303 t
= not ? npat
+ 1 : npat
;
305 ret
= strlist_create (sl
->list_size
);
306 for (i
= 0; i
< sl
->list_len
; i
++)
308 m
= strmatch (t
, sl
->list
[i
], FNMATCH_EXTFLAG
);
309 if ((not && m
== FNM_NOMATCH
) || (not == 0 && m
!= FNM_NOMATCH
))
312 ret
->list
[ret
->list_len
++] = sl
->list
[i
];
315 ret
->list
[ret
->list_len
] = (char *)NULL
;
316 if (npat
!= filterpat
)
322 /* Turn an array of strings returned by rl_completion_matches into a STRINGLIST.
323 This understands how rl_completion_matches sets matches[0] (the lcd of the
324 strings in the list, unless it's the only match). */
326 completions_to_stringlist (matches
)
332 mlen
= (matches
== 0) ? 0 : strvec_len (matches
);
333 sl
= strlist_create (mlen
+ 1);
335 if (matches
== 0 || matches
[0] == 0)
340 sl
->list
[0] = STRDUP (matches
[0]);
341 sl
->list
[sl
->list_len
= 1] = (char *)NULL
;
345 for (i
= 1, n
= 0; i
< mlen
; i
++, n
++)
346 sl
->list
[n
] = STRDUP (matches
[i
]);
348 sl
->list
[n
] = (char *)NULL
;
353 /* Functions to manage the various ITEMLISTs that we populate internally.
354 The caller is responsible for setting ITP->flags correctly. */
357 it_init_aliases (itp
)
361 alias_t
**alias_list
;
365 alias_list
= all_aliases ();
368 itp
->slist
= (STRINGLIST
*)NULL
;
371 for (n
= 0; alias_list
[n
]; n
++)
373 sl
= strlist_create (n
+1);
374 for (i
= 0; i
< n
; i
++)
375 sl
->list
[i
] = STRDUP (alias_list
[i
]->name
);
376 sl
->list
[n
] = (char *)NULL
;
377 sl
->list_size
= sl
->list_len
= n
;
380 itp
->slist
= (STRINGLIST
*)NULL
;
387 init_itemlist_from_varlist (itp
, svfunc
)
395 vlist
= (*svfunc
) ();
398 itp
->slist
= (STRINGLIST
*)NULL
;
401 for (n
= 0; vlist
[n
]; n
++)
403 sl
= strlist_create (n
+1);
404 for (i
= 0; i
< n
; i
++)
405 sl
->list
[i
] = savestring (vlist
[i
]->name
);
406 sl
->list
[sl
->list_len
= n
] = (char *)NULL
;
411 it_init_arrayvars (itp
)
414 #if defined (ARRAY_VARS)
415 init_itemlist_from_varlist (itp
, all_array_variables
);
423 it_init_bindings (itp
)
429 /* rl_funmap_names allocates blist, but not its members */
430 blist
= (char **)rl_funmap_names (); /* XXX fix const later */
431 sl
= strlist_create (0);
434 sl
->list_len
= strvec_len (sl
->list
);
435 itp
->flags
|= LIST_DONTFREEMEMBERS
;
442 it_init_builtins (itp
)
448 sl
= strlist_create (num_shell_builtins
);
449 for (i
= n
= 0; i
< num_shell_builtins
; i
++)
450 if (shell_builtins
[i
].function
)
451 sl
->list
[n
++] = shell_builtins
[i
].name
;
452 sl
->list
[sl
->list_len
= n
] = (char *)NULL
;
453 itp
->flags
|= LIST_DONTFREEMEMBERS
;
459 it_init_enabled (itp
)
465 sl
= strlist_create (num_shell_builtins
);
466 for (i
= n
= 0; i
< num_shell_builtins
; i
++)
468 if (shell_builtins
[i
].function
&& (shell_builtins
[i
].flags
& BUILTIN_ENABLED
))
469 sl
->list
[n
++] = shell_builtins
[i
].name
;
471 sl
->list
[sl
->list_len
= n
] = (char *)NULL
;
472 itp
->flags
|= LIST_DONTFREEMEMBERS
;
478 it_init_disabled (itp
)
484 sl
= strlist_create (num_shell_builtins
);
485 for (i
= n
= 0; i
< num_shell_builtins
; i
++)
487 if (shell_builtins
[i
].function
&& ((shell_builtins
[i
].flags
& BUILTIN_ENABLED
) == 0))
488 sl
->list
[n
++] = shell_builtins
[i
].name
;
490 sl
->list
[sl
->list_len
= n
] = (char *)NULL
;
491 itp
->flags
|= LIST_DONTFREEMEMBERS
;
497 it_init_exported (itp
)
500 init_itemlist_from_varlist (itp
, all_exported_variables
);
505 it_init_functions (itp
)
508 init_itemlist_from_varlist (itp
, all_visible_functions
);
512 /* Like it_init_builtins, but includes everything the help builtin looks at,
513 not just builtins with an active implementing function. */
515 it_init_helptopics (itp
)
521 sl
= strlist_create (num_shell_builtins
);
522 for (i
= n
= 0; i
< num_shell_builtins
; i
++)
523 sl
->list
[n
++] = shell_builtins
[i
].name
;
524 sl
->list
[sl
->list_len
= n
] = (char *)NULL
;
525 itp
->flags
|= LIST_DONTFREEMEMBERS
;
531 it_init_hostnames (itp
)
536 sl
= strlist_create (0);
537 sl
->list
= get_hostname_list ();
538 sl
->list_len
= sl
->list
? strvec_len (sl
->list
) : 0;
539 sl
->list_size
= sl
->list_len
;
541 itp
->flags
|= LIST_DONTFREEMEMBERS
|LIST_DONTFREE
;
546 it_init_joblist (itp
, jstate
)
550 #if defined (JOB_CONTROL)
556 JOB_STATE ws
; /* wanted state */
561 else if (jstate
== 1)
564 sl
= strlist_create (js
.j_jobslots
);
565 for (i
= js
.j_jobslots
- 1; i
>= 0; i
--)
567 j
= get_job_by_jid (i
);
571 if (jstate
== -1 || JOBSTATE(i
) == ws
)
573 s
= savestring (p
->command
);
574 t
= strpbrk (s
, " \t\n");
577 sl
->list
[sl
->list_len
++] = s
;
582 itp
->slist
= (STRINGLIST
*)NULL
;
591 return (it_init_joblist (itp
, -1));
595 it_init_running (itp
)
598 return (it_init_joblist (itp
, 0));
602 it_init_stopped (itp
)
605 return (it_init_joblist (itp
, 1));
609 it_init_keywords (itp
)
615 for (n
= 0; word_token_alist
[n
].word
; n
++)
617 sl
= strlist_create (n
);
618 for (i
= 0; i
< n
; i
++)
619 sl
->list
[i
] = word_token_alist
[i
].word
;
620 sl
->list
[sl
->list_len
= i
] = (char *)NULL
;
621 itp
->flags
|= LIST_DONTFREEMEMBERS
;
627 it_init_signals (itp
)
632 sl
= strlist_create (0);
633 sl
->list
= signal_names
;
634 sl
->list_len
= strvec_len (sl
->list
);
635 itp
->flags
|= LIST_DONTFREE
;
641 it_init_variables (itp
)
644 init_itemlist_from_varlist (itp
, all_visible_variables
);
649 it_init_setopts (itp
)
654 sl
= strlist_create (0);
655 sl
->list
= get_minus_o_opts ();
656 sl
->list_len
= strvec_len (sl
->list
);
658 itp
->flags
|= LIST_DONTFREEMEMBERS
;
668 sl
= strlist_create (0);
669 sl
->list
= get_shopt_options ();
670 sl
->list_len
= strvec_len (sl
->list
);
672 itp
->flags
|= LIST_DONTFREEMEMBERS
;
676 /* Generate a list of all matches for TEXT using the STRINGLIST in itp->slist
677 as the list of possibilities. If the itemlist has been marked dirty or
678 it should be regenerated every time, destroy the old STRINGLIST and make a
679 new one before trying the match. TEXT is dequoted before attempting a
682 gen_matches_from_itemlist (itp
, text
)
686 STRINGLIST
*ret
, *sl
;
690 if ((itp
->flags
& (LIST_DIRTY
|LIST_DYNAMIC
)) ||
691 (itp
->flags
& LIST_INITIALIZED
) == 0)
693 if (itp
->flags
& (LIST_DIRTY
|LIST_DYNAMIC
))
694 clean_itemlist (itp
);
695 if ((itp
->flags
& LIST_INITIALIZED
) == 0)
696 initialize_itemlist (itp
);
699 return ((STRINGLIST
*)NULL
);
700 ret
= strlist_create (itp
->slist
->list_len
+1);
703 ntxt
= bash_dequote_text (text
);
704 tlen
= STRLEN (ntxt
);
706 for (i
= n
= 0; i
< sl
->list_len
; i
++)
708 if (tlen
== 0 || STREQN (sl
->list
[i
], ntxt
, tlen
))
709 ret
->list
[n
++] = STRDUP (sl
->list
[i
]);
711 ret
->list
[ret
->list_len
= n
] = (char *)NULL
;
717 /* A wrapper for rl_filename_completion_function that dequotes the filename
718 before attempting completions. */
720 pcomp_filename_completion_function (text
, state
)
724 static char *dfn
; /* dequoted filename */
726 int iscompgen
, iscompleting
;
731 /* remove backslashes quoting special characters in filenames. */
732 /* There are roughtly three paths we can follow to get here:
734 2. compgen -f "$word" from a completion function
735 3. compgen -f "$word" from the command line
736 They all need to be handled.
738 In the first two cases, readline will run the filename dequoting
739 function in rl_filename_completion_function if it found a filename
740 quoting character in the word to be completed
741 (rl_completion_found_quote). We run the dequoting function here
742 if we're running compgen, we're not completing, and the
743 rl_filename_completion_function won't dequote the filename
744 (rl_completion_found_quote == 0). */
745 iscompgen
= this_shell_builtin
== compgen_builtin
;
746 iscompleting
= RL_ISSTATE (RL_STATE_COMPLETING
);
747 if (iscompgen
&& iscompleting
== 0 && rl_completion_found_quote
== 0)
749 /* Use rl_completion_quote_character because any single or
750 double quotes have been removed by the time TEXT makes it
751 here, and we don't want to remove backslashes inside
753 dfn
= (*rl_filename_dequoting_function
) ((char *)text
, rl_completion_quote_character
);
756 dfn
= savestring (text
);
759 return (rl_filename_completion_function (dfn
, state
));
762 #define GEN_COMPS(bmap, flag, it, text, glist, tlist) \
766 tlist = gen_matches_from_itemlist (it, text); \
769 glist = strlist_append (glist, tlist); \
770 strlist_dispose (tlist); \
775 #define GEN_XCOMPS(bmap, flag, text, func, cmatches, glist, tlist) \
779 cmatches = rl_completion_matches (text, func); \
780 tlist = completions_to_stringlist (cmatches); \
781 glist = strlist_append (glist, tlist); \
782 strvec_dispose (cmatches); \
783 strlist_dispose (tlist); \
787 /* Functions to generate lists of matches from the actions member of CS. */
790 gen_action_completions (cs
, text
)
794 STRINGLIST
*ret
, *tmatches
;
795 char **cmatches
; /* from rl_completion_matches ... */
799 ret
= tmatches
= (STRINGLIST
*)NULL
;
802 GEN_COMPS (flags
, CA_ALIAS
, &it_aliases
, text
, ret
, tmatches
);
803 GEN_COMPS (flags
, CA_ARRAYVAR
, &it_arrayvars
, text
, ret
, tmatches
);
804 GEN_COMPS (flags
, CA_BINDING
, &it_bindings
, text
, ret
, tmatches
);
805 GEN_COMPS (flags
, CA_BUILTIN
, &it_builtins
, text
, ret
, tmatches
);
806 GEN_COMPS (flags
, CA_DISABLED
, &it_disabled
, text
, ret
, tmatches
);
807 GEN_COMPS (flags
, CA_ENABLED
, &it_enabled
, text
, ret
, tmatches
);
808 GEN_COMPS (flags
, CA_EXPORT
, &it_exports
, text
, ret
, tmatches
);
809 GEN_COMPS (flags
, CA_FUNCTION
, &it_functions
, text
, ret
, tmatches
);
810 GEN_COMPS (flags
, CA_HELPTOPIC
, &it_helptopics
, text
, ret
, tmatches
);
811 GEN_COMPS (flags
, CA_HOSTNAME
, &it_hostnames
, text
, ret
, tmatches
);
812 GEN_COMPS (flags
, CA_JOB
, &it_jobs
, text
, ret
, tmatches
);
813 GEN_COMPS (flags
, CA_KEYWORD
, &it_keywords
, text
, ret
, tmatches
);
814 GEN_COMPS (flags
, CA_RUNNING
, &it_running
, text
, ret
, tmatches
);
815 GEN_COMPS (flags
, CA_SETOPT
, &it_setopts
, text
, ret
, tmatches
);
816 GEN_COMPS (flags
, CA_SHOPT
, &it_shopts
, text
, ret
, tmatches
);
817 GEN_COMPS (flags
, CA_SIGNAL
, &it_signals
, text
, ret
, tmatches
);
818 GEN_COMPS (flags
, CA_STOPPED
, &it_stopped
, text
, ret
, tmatches
);
819 GEN_COMPS (flags
, CA_VARIABLE
, &it_variables
, text
, ret
, tmatches
);
821 GEN_XCOMPS(flags
, CA_COMMAND
, text
, command_word_completion_function
, cmatches
, ret
, tmatches
);
822 GEN_XCOMPS(flags
, CA_FILE
, text
, pcomp_filename_completion_function
, cmatches
, ret
, tmatches
);
823 GEN_XCOMPS(flags
, CA_USER
, text
, rl_username_completion_function
, cmatches
, ret
, tmatches
);
824 GEN_XCOMPS(flags
, CA_GROUP
, text
, bash_groupname_completion_function
, cmatches
, ret
, tmatches
);
825 GEN_XCOMPS(flags
, CA_SERVICE
, text
, bash_servicename_completion_function
, cmatches
, ret
, tmatches
);
827 /* And lastly, the special case for directories */
828 if (flags
& CA_DIRECTORY
)
830 t
= rl_filename_completion_desired
;
831 rl_completion_mark_symlink_dirs
= 1; /* override user preference */
832 cmatches
= bash_directory_completion_matches (text
);
833 /* If we did not want filename completion before this, and there are
834 no matches, turn off rl_filename_completion_desired so whatever
835 matches we get are not treated as filenames (it gets turned on by
836 rl_filename_completion_function unconditionally). */
837 if (t
== 0 && cmatches
== 0 && rl_filename_completion_desired
== 1)
838 rl_filename_completion_desired
= 0;
839 tmatches
= completions_to_stringlist (cmatches
);
840 ret
= strlist_append (ret
, tmatches
);
841 strvec_dispose (cmatches
);
842 strlist_dispose (tmatches
);
848 /* Generate a list of matches for CS->globpat. Unresolved: should this use
849 TEXT as a match prefix, or just go without? Currently, the code does not
850 use TEXT, just globs CS->globpat and returns the results. If we do decide
851 to use TEXT, we should call quote_string_for_globbing before the call to
854 gen_globpat_matches (cs
, text
)
860 sl
= strlist_create (0);
861 sl
->list
= glob_filename (cs
->globpat
, 0);
862 if (GLOB_FAILED (sl
->list
))
863 sl
->list
= (char **)NULL
;
865 sl
->list_len
= sl
->list_size
= strvec_len (sl
->list
);
869 /* Perform the shell word expansions on CS->words and return the results.
870 Again, this ignores TEXT. */
872 gen_wordlist_matches (cs
, text
)
879 char *ntxt
; /* dequoted TEXT to use in comparisons */
881 if (cs
->words
== 0 || cs
->words
[0] == '\0')
882 return ((STRINGLIST
*)NULL
);
884 /* This used to be a simple expand_string(cs->words, 0), but that won't
885 do -- there's no way to split a simple list into individual words
886 that way, since the shell semantics say that word splitting is done
887 only on the results of expansion. split_at_delims also handles embedded
888 quoted strings and preserves the quotes for the expand_words_shellexp
889 function call that follows. */
890 /* XXX - this is where this function spends most of its time */
891 l
= split_at_delims (cs
->words
, strlen (cs
->words
), (char *)NULL
, -1, 0, (int *)NULL
, (int *)NULL
);
893 return ((STRINGLIST
*)NULL
);
894 /* This will jump back to the top level if the expansion fails... */
895 l2
= expand_words_shellexp (l
);
898 nw
= list_length (l2
);
899 sl
= strlist_create (nw
+ 1);
901 ntxt
= bash_dequote_text (text
);
902 tlen
= STRLEN (ntxt
);
904 for (nw
= 0, l
= l2
; l
; l
= l
->next
)
906 if (tlen
== 0 || STREQN (l
->word
->word
, ntxt
, tlen
))
907 sl
->list
[nw
++] = STRDUP (l
->word
->word
);
909 sl
->list
[sl
->list_len
= nw
] = (char *)NULL
;
919 bind_comp_words (lwords
)
924 v
= find_variable ("COMP_WORDS");
926 v
= make_new_array_variable ("COMP_WORDS");
928 VUNSETATTR (v
, att_readonly
);
929 if (array_p (v
) == 0)
930 v
= convert_var_to_array (v
);
931 v
= assign_array_var_from_word_list (v
, lwords
, 0);
933 VUNSETATTR (v
, att_invisible
);
936 #endif /* ARRAY_VARS */
939 bind_compfunc_variables (line
, ind
, lwords
, cw
, exported
)
945 char ibuf
[INT_STRLEN_BOUND(int) + 1];
951 /* Set the variables that the function expects while it executes. Maybe
952 these should be in the function environment (temporary_env). */
953 v
= bind_variable ("COMP_LINE", line
, 0);
955 VSETATTR(v
, att_exported
);
957 /* Post bash-4.2: COMP_POINT is characters instead of bytes. */
960 llen
= MB_STRLEN (line
);
962 value
= inttostr (llen
, ibuf
, sizeof(ibuf
));
963 v
= bind_int_variable ("COMP_POINT", value
);
965 VSETATTR(v
, att_exported
);
967 value
= inttostr (rl_completion_type
, ibuf
, sizeof (ibuf
));
968 v
= bind_int_variable ("COMP_TYPE", value
);
970 VSETATTR(v
, att_exported
);
972 value
= inttostr (rl_completion_invoking_key
, ibuf
, sizeof (ibuf
));
973 v
= bind_int_variable ("COMP_KEY", value
);
975 VSETATTR(v
, att_exported
);
977 /* Since array variables can't be exported, we don't bother making the
982 v
= bind_comp_words (lwords
);
983 value
= inttostr (cw
, ibuf
, sizeof(ibuf
));
984 bind_int_variable ("COMP_CWORD", value
);
988 array_needs_making
= 1;
992 unbind_compfunc_variables (exported
)
995 unbind_variable ("COMP_LINE");
996 unbind_variable ("COMP_POINT");
997 unbind_variable ("COMP_TYPE");
998 unbind_variable ("COMP_KEY");
1000 unbind_variable ("COMP_WORDS");
1001 unbind_variable ("COMP_CWORD");
1004 array_needs_making
= 1;
1007 /* Build the list of words to pass to a function or external command
1008 as arguments. When the function or command is invoked,
1010 $0 == function or command being invoked
1012 $2 == word to be completed (possibly null)
1015 Functions can access all of the words in the current command line
1016 with the COMP_WORDS array. External commands cannot; they have to
1017 make do with the COMP_LINE and COMP_POINT variables. */
1020 build_arg_list (cmd
, cname
, text
, lwords
, ind
)
1027 WORD_LIST
*ret
, *cl
, *l
;
1031 ret
= (WORD_LIST
*)NULL
;
1032 w
= make_word (cmd
);
1033 ret
= make_word_list (w
, (WORD_LIST
*)NULL
); /* $0 */
1035 w
= make_word (cname
); /* $1 */
1036 cl
= ret
->next
= make_word_list (w
, (WORD_LIST
*)NULL
);
1038 w
= make_word (text
);
1039 cl
->next
= make_word_list (w
, (WORD_LIST
*)NULL
); /* $2 */
1042 /* Search lwords for current word */
1043 for (l
= lwords
, i
= 1; l
&& i
< ind
-1; l
= l
->next
, i
++)
1045 w
= (l
&& l
->word
) ? copy_word (l
->word
) : make_word ("");
1046 cl
->next
= make_word_list (w
, (WORD_LIST
*)NULL
);
1051 /* Build a command string with
1052 $0 == cs->funcname (function to execute for completion list)
1053 $1 == command name (command being completed)
1054 $2 = word to be completed (possibly null)
1056 and run in the current shell. The function should put its completion
1057 list into the array variable COMPREPLY. We build a STRINGLIST
1058 from the results and return it.
1060 Since the shell function should return its list of matches in an array
1061 variable, this does nothing if arrays are not compiled into the shell. */
1064 gen_shell_function_matches (cs
, cmd
, text
, line
, ind
, lwords
, nw
, cw
, foundp
)
1079 sh_parser_state_t ps
;
1080 sh_parser_state_t
* restrict pps
;
1081 #if defined (ARRAY_VARS)
1089 funcname
= cs
->funcname
;
1090 f
= find_function (funcname
);
1093 internal_error (_("completion: function `%s' not found"), funcname
);
1096 return ((STRINGLIST
*)NULL
);
1099 #if !defined (ARRAY_VARS)
1100 return ((STRINGLIST
*)NULL
);
1103 /* We pass cw - 1 because command_line_to_word_list returns indices that are
1104 1-based, while bash arrays are 0-based. */
1105 bind_compfunc_variables (line
, ind
, lwords
, cw
- 1, 0);
1107 cmdlist
= build_arg_list (funcname
, cmd
, text
, lwords
, cw
);
1110 save_parser_state (pps
);
1111 begin_unwind_frame ("gen-shell-function-matches");
1112 add_unwind_protect (restore_parser_state
, (char *)pps
);
1113 add_unwind_protect (dispose_words
, (char *)cmdlist
);
1114 add_unwind_protect (unbind_compfunc_variables
, (char *)0);
1116 fval
= execute_shell_function (f
, cmdlist
);
1118 discard_unwind_frame ("gen-shell-function-matches");
1119 restore_parser_state (pps
);
1121 found
= fval
!= EX_NOTFOUND
;
1122 if (fval
== EX_RETRYFAIL
)
1123 found
|= PCOMP_RETRYFAIL
;
1127 /* Now clean up and destroy everything. */
1128 dispose_words (cmdlist
);
1129 unbind_compfunc_variables (0);
1131 /* The list of completions is returned in the array variable COMPREPLY. */
1132 v
= find_variable ("COMPREPLY");
1134 return ((STRINGLIST
*)NULL
);
1135 if (array_p (v
) == 0)
1136 v
= convert_var_to_array (v
);
1138 VUNSETATTR (v
, att_invisible
);
1141 if (found
== 0 || (found
& PCOMP_RETRYFAIL
) || a
== 0 || array_empty (a
))
1142 sl
= (STRINGLIST
*)NULL
;
1145 /* XXX - should we filter the list of completions so only those matching
1146 TEXT are returned? Right now, we do not. */
1147 sl
= strlist_create (0);
1148 sl
->list
= array_to_argv (a
);
1149 sl
->list_len
= sl
->list_size
= array_num_elements (a
);
1152 /* XXX - should we unbind COMPREPLY here? */
1153 unbind_variable ("COMPREPLY");
1159 /* Build a command string with
1160 $0 == cs->command (command to execute for completion list)
1161 $1 == command name (command being completed)
1162 $2 = word to be completed (possibly null)
1164 and run in with command substitution. Parse the results, one word
1165 per line, with backslashes allowed to escape newlines. Build a
1166 STRINGLIST from the results and return it. */
1169 gen_command_matches (cs
, cmd
, text
, line
, ind
, lwords
, nw
, cw
)
1178 char *csbuf
, *cscmd
, *t
;
1179 int cmdlen
, cmdsize
, n
, ws
, we
;
1180 WORD_LIST
*cmdlist
, *cl
;
1184 bind_compfunc_variables (line
, ind
, lwords
, cw
, 1);
1185 cmdlist
= build_arg_list (cs
->command
, cmd
, text
, lwords
, cw
);
1187 /* Estimate the size needed for the buffer. */
1188 n
= strlen (cs
->command
);
1190 for (cl
= cmdlist
->next
; cl
; cl
= cl
->next
)
1191 cmdsize
+= STRLEN (cl
->word
->word
) + 3;
1194 /* allocate the string for the command and fill it in. */
1195 cscmd
= (char *)xmalloc (cmdsize
+ 1);
1197 strcpy (cscmd
, cs
->command
); /* $0 */
1199 cscmd
[cmdlen
++] = ' ';
1200 for (cl
= cmdlist
->next
; cl
; cl
= cl
->next
) /* $1, $2, $3, ... */
1202 t
= sh_single_quote (cl
->word
->word
? cl
->word
->word
: "");
1204 RESIZE_MALLOCED_BUFFER (cscmd
, cmdlen
, n
+ 2, cmdsize
, 64);
1205 strcpy (cscmd
+ cmdlen
, t
);
1208 cscmd
[cmdlen
++] = ' ';
1211 cscmd
[cmdlen
] = '\0';
1213 tw
= command_substitute (cscmd
, 0);
1214 csbuf
= tw
? tw
->word
: (char *)NULL
;
1216 dispose_word_desc (tw
);
1218 /* Now clean up and destroy everything. */
1219 dispose_words (cmdlist
);
1221 unbind_compfunc_variables (1);
1223 if (csbuf
== 0 || *csbuf
== '\0')
1226 return ((STRINGLIST
*)NULL
);
1229 /* Now break CSBUF up at newlines, with backslash allowed to escape a
1230 newline, and put the individual words into a STRINGLIST. */
1231 sl
= strlist_create (16);
1232 for (ws
= 0; csbuf
[ws
]; )
1235 while (csbuf
[we
] && csbuf
[we
] != '\n')
1237 if (csbuf
[we
] == '\\' && csbuf
[we
+1] == '\n')
1241 t
= substring (csbuf
, ws
, we
);
1242 if (sl
->list_len
>= sl
->list_size
- 1)
1243 strlist_resize (sl
, sl
->list_size
+ 16);
1244 sl
->list
[sl
->list_len
++] = t
;
1245 while (csbuf
[we
] == '\n') we
++;
1248 sl
->list
[sl
->list_len
] = (char *)NULL
;
1255 command_line_to_word_list (line
, llen
, sentinel
, nwp
, cwp
)
1257 int llen
, sentinel
, *nwp
, *cwp
;
1263 delims
= "()<>;&| \t\n"; /* shell metacharacters break words */
1265 delims
= rl_completer_word_break_characters
;
1267 ret
= split_at_delims (line
, llen
, delims
, sentinel
, SD_NOQUOTEDELIM
, nwp
, cwp
);
1271 /* Evaluate COMPSPEC *cs and return all matches for WORD. */
1274 gen_compspec_completions (cs
, cmd
, word
, start
, end
, foundp
)
1281 STRINGLIST
*ret
, *tmatches
;
1283 int llen
, nw
, cw
, found
, foundf
;
1291 debug_printf ("gen_compspec_completions (%s, %s, %d, %d)", cmd
, word
, start
, end
);
1292 debug_printf ("gen_compspec_completions: %s -> %p", cmd
, cs
);
1294 ret
= gen_action_completions (cs
, word
);
1296 if (ret
&& progcomp_debug
)
1298 debug_printf ("gen_action_completions (%p, %s) -->", cs
, word
);
1299 strlist_print (ret
, "\t");
1304 /* Now we start generating completions based on the other members of CS. */
1307 tmatches
= gen_globpat_matches (cs
, word
);
1313 debug_printf ("gen_globpat_matches (%p, %s) -->", cs
, word
);
1314 strlist_print (tmatches
, "\t");
1318 ret
= strlist_append (ret
, tmatches
);
1319 strlist_dispose (tmatches
);
1320 rl_filename_completion_desired
= 1;
1326 tmatches
= gen_wordlist_matches (cs
, word
);
1332 debug_printf ("gen_wordlist_matches (%p, %s) -->", cs
, word
);
1333 strlist_print (tmatches
, "\t");
1337 ret
= strlist_append (ret
, tmatches
);
1338 strlist_dispose (tmatches
);
1342 lwords
= (WORD_LIST
*)NULL
;
1343 line
= (char *)NULL
;
1344 if (cs
->command
|| cs
->funcname
)
1346 /* If we have a command or function to execute, we need to first break
1347 the command line into individual words, find the number of words,
1348 and find the word in the list containing the word to be completed. */
1349 line
= substring (rl_line_buffer
, start
, end
);
1353 debug_printf ("command_line_to_word_list (%s, %d, %d, %p, %p)",
1354 line
, llen
, rl_point
- start
, &nw
, &cw
);
1356 lwords
= command_line_to_word_list (line
, llen
, rl_point
- start
, &nw
, &cw
);
1357 /* If we skipped a NULL word at the beginning of the line, add it back */
1358 if (lwords
&& lwords
->word
&& cmd
[0] == 0 && lwords
->word
->word
[0] != 0)
1360 lw
= make_bare_word (cmd
);
1361 lwords
= make_word_list (lw
, lwords
);
1366 if (lwords
== 0 && llen
> 0)
1367 debug_printf ("ERROR: command_line_to_word_list returns NULL");
1368 else if (progcomp_debug
)
1370 debug_printf ("command_line_to_word_list -->");
1372 print_word_list (lwords
, "!");
1383 tmatches
= gen_shell_function_matches (cs
, cmd
, word
, line
, rl_point
- start
, lwords
, nw
, cw
, &foundf
);
1391 debug_printf ("gen_shell_function_matches (%p, %s, %s, %p, %d, %d) -->", cs
, cmd
, word
, lwords
, nw
, cw
);
1392 strlist_print (tmatches
, "\t");
1396 ret
= strlist_append (ret
, tmatches
);
1397 strlist_dispose (tmatches
);
1403 tmatches
= gen_command_matches (cs
, cmd
, word
, line
, rl_point
- start
, lwords
, nw
, cw
);
1409 debug_printf ("gen_command_matches (%p, %s, %s, %p, %d, %d) -->", cs
, cmd
, word
, lwords
, nw
, cw
);
1410 strlist_print (tmatches
, "\t");
1414 ret
= strlist_append (ret
, tmatches
);
1415 strlist_dispose (tmatches
);
1419 if (cs
->command
|| cs
->funcname
)
1422 dispose_words (lwords
);
1429 if (found
== 0 || (found
& PCOMP_RETRYFAIL
))
1431 strlist_dispose (ret
);
1437 tmatches
= filter_stringlist (ret
, cs
->filterpat
, word
);
1441 debug_printf ("filter_stringlist (%p, %s, %s) -->", ret
, cs
->filterpat
, word
);
1442 strlist_print (tmatches
, "\t");
1446 if (ret
&& ret
!= tmatches
)
1454 if (cs
->prefix
|| cs
->suffix
)
1455 ret
= strlist_prefix_suffix (ret
, cs
->prefix
, cs
->suffix
);
1457 /* If no matches have been generated and the user has specified that
1458 directory completion should be done as a default, call
1459 gen_action_completions again to generate a list of matching directory
1461 if ((ret
== 0 || ret
->list_len
== 0) && (cs
->options
& COPT_DIRNAMES
))
1463 tcs
= compspec_create ();
1464 tcs
->actions
= CA_DIRECTORY
;
1466 ret
= gen_action_completions (tcs
, word
);
1467 compspec_dispose (tcs
);
1469 else if (cs
->options
& COPT_PLUSDIRS
)
1471 tcs
= compspec_create ();
1472 tcs
->actions
= CA_DIRECTORY
;
1473 tmatches
= gen_action_completions (tcs
, word
);
1474 ret
= strlist_append (ret
, tmatches
);
1475 strlist_dispose (tmatches
);
1476 compspec_dispose (tcs
);
1483 pcomp_set_readline_variables (flags
, nval
)
1486 /* If the user specified that the compspec returns filenames, make
1487 sure that readline knows it. */
1488 if (flags
& COPT_FILENAMES
)
1489 rl_filename_completion_desired
= nval
;
1490 /* If the user doesn't want a space appended, tell readline. */
1491 if (flags
& COPT_NOSPACE
)
1492 rl_completion_suppress_append
= nval
;
1493 /* The value here is inverted, since the default is on and the `noquote'
1494 option is supposed to turn it off */
1495 if (flags
& COPT_NOQUOTE
)
1496 rl_filename_quoting_desired
= 1 - nval
;
1499 /* Set or unset FLAGS in the options word of the current compspec.
1500 SET_OR_UNSET is 1 for setting, 0 for unsetting. */
1502 pcomp_set_compspec_options (cs
, flags
, set_or_unset
)
1504 int flags
, set_or_unset
;
1506 if (cs
== 0 && ((cs
= pcomp_curcs
) == 0))
1509 cs
->options
|= flags
;
1511 cs
->options
&= ~flags
;
1515 gen_progcomp_completions (ocmd
, cmd
, word
, start
, end
, foundp
, retryp
, lastcs
)
1520 int *foundp
, *retryp
;
1523 COMPSPEC
*cs
, *oldcs
;
1527 cs
= progcomp_search (ocmd
);
1529 if (cs
== 0 || cs
== *lastcs
)
1539 compspec_dispose (*lastcs
);
1540 cs
->refcount
++; /* XXX */
1543 cs
= compspec_copy (cs
);
1545 oldcs
= pcomp_curcs
;
1546 oldcmd
= pcomp_curcmd
;
1551 ret
= gen_compspec_completions (cs
, cmd
, word
, start
, end
, foundp
);
1553 pcomp_curcs
= oldcs
;
1554 pcomp_curcmd
= oldcmd
;
1556 /* We need to conditionally handle setting *retryp here */
1558 *retryp
= foundp
&& (*foundp
& PCOMP_RETRYFAIL
);
1562 *foundp
&= ~PCOMP_RETRYFAIL
;
1563 *foundp
|= cs
->options
;
1566 compspec_dispose (cs
);
1570 /* The driver function for the programmable completion code. Returns a list
1571 of matches for WORD, which is an argument to command CMD. START and END
1572 bound the command currently being completed in rl_line_buffer. */
1574 programmable_completions (cmd
, word
, start
, end
, foundp
)
1577 int start
, end
, *foundp
;
1579 COMPSPEC
*cs
, *lastcs
;
1581 char **rmatches
, *t
;
1582 int found
, retry
, count
;
1591 /* We look at the basename of CMD if the full command does not have
1592 an associated COMPSPEC. */
1593 ret
= gen_progcomp_completions (cmd
, cmd
, word
, start
, end
, &found
, &retry
, &lastcs
);
1596 t
= strrchr (cmd
, '/');
1598 ret
= gen_progcomp_completions (t
, cmd
, word
, start
, end
, &found
, &retry
, &lastcs
);
1602 ret
= gen_progcomp_completions (DEFAULTCMD
, cmd
, word
, start
, end
, &found
, &retry
, &lastcs
);
1608 internal_warning ("programmable_completion: %s: possible retry loop", cmd
);
1616 rmatches
= ret
->list
;
1620 rmatches
= (char **)NULL
;
1625 if (lastcs
) /* XXX - should be while? */
1626 compspec_dispose (lastcs
);
1631 #endif /* PROGRAMMABLE_COMPLETION */