]> git.ipfire.org Git - thirdparty/bash.git/blame - pcomplib.c
Imported from ../bash-4.0-rc1.tar.gz.
[thirdparty/bash.git] / pcomplib.c
CommitLineData
bb70624e
JA
1/* pcomplib.c - library functions for programmable completion. */
2
3185942a 3/* Copyright (C) 1999-2009 Free Software Foundation, Inc.
bb70624e
JA
4
5 This file is part of GNU Bash, the Bourne Again SHell.
6
3185942a
JA
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.
bb70624e 11
3185942a
JA
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.
bb70624e 16
3185942a
JA
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/>.
19*/
bb70624e
JA
20
21#include <config.h>
22
23#if defined (PROGRAMMABLE_COMPLETION)
24
25#include "bashansi.h"
26#include <stdio.h>
27
28#if defined (HAVE_UNISTD_H)
29# ifdef _MINIX
30# include <sys/types.h>
31# endif
32# include <unistd.h>
33#endif
34
b80f6443
JA
35#include "bashintl.h"
36
bb70624e
JA
37#include "shell.h"
38#include "pcomplete.h"
39
7117c2d2 40#define COMPLETE_HASH_BUCKETS 32 /* must be power of two */
bb70624e
JA
41
42#define STRDUP(x) ((x) ? savestring (x) : (char *)NULL)
43
44HASH_TABLE *prog_completes = (HASH_TABLE *)NULL;
45
f73dda09
JA
46static void free_progcomp __P((PTR_T));
47
bb70624e 48COMPSPEC *
7117c2d2 49compspec_create ()
bb70624e
JA
50{
51 COMPSPEC *ret;
52
53 ret = (COMPSPEC *)xmalloc (sizeof (COMPSPEC));
54 ret->refcount = 0;
55
56 ret->actions = (unsigned long)0;
28ef6c31 57 ret->options = (unsigned long)0;
bb70624e
JA
58
59 ret->globpat = (char *)NULL;
60 ret->words = (char *)NULL;
61 ret->prefix = (char *)NULL;
62 ret->suffix = (char *)NULL;
63 ret->funcname = (char *)NULL;
64 ret->command = (char *)NULL;
65 ret->filterpat = (char *)NULL;
66
67 return ret;
68}
69
70void
7117c2d2 71compspec_dispose (cs)
bb70624e
JA
72 COMPSPEC *cs;
73{
74 cs->refcount--;
75 if (cs->refcount == 0)
76 {
77 FREE (cs->globpat);
78 FREE (cs->words);
79 FREE (cs->prefix);
80 FREE (cs->suffix);
81 FREE (cs->funcname);
82 FREE (cs->command);
83 FREE (cs->filterpat);
84
85 free (cs);
86 }
87}
88
89COMPSPEC *
7117c2d2 90compspec_copy (cs)
bb70624e
JA
91 COMPSPEC *cs;
92{
93 COMPSPEC *new;
94
95 new = (COMPSPEC *)xmalloc (sizeof (COMPSPEC));
96
97 new->refcount = cs->refcount;
98 new->actions = cs->actions;
28ef6c31 99 new->options = cs->options;
bb70624e
JA
100
101 new->globpat = STRDUP (cs->globpat);
102 new->words = STRDUP (cs->words);
103 new->prefix = STRDUP (cs->prefix);
104 new->suffix = STRDUP (cs->suffix);
105 new->funcname = STRDUP (cs->funcname);
106 new->command = STRDUP (cs->command);
107 new->filterpat = STRDUP (cs->filterpat);
108
109 return new;
110}
111
112void
7117c2d2 113progcomp_create ()
bb70624e 114{
7117c2d2
JA
115 if (prog_completes == 0)
116 prog_completes = hash_create (COMPLETE_HASH_BUCKETS);
bb70624e
JA
117}
118
119int
7117c2d2 120progcomp_size ()
bb70624e 121{
7117c2d2 122 return (HASH_ENTRIES (prog_completes));
bb70624e
JA
123}
124
125static void
126free_progcomp (data)
f73dda09 127 PTR_T data;
bb70624e
JA
128{
129 COMPSPEC *cs;
130
131 cs = (COMPSPEC *)data;
7117c2d2 132 compspec_dispose (cs);
bb70624e
JA
133}
134
135void
7117c2d2
JA
136progcomp_flush ()
137{
138 if (prog_completes)
139 hash_flush (prog_completes, free_progcomp);
140}
141
142void
143progcomp_dispose ()
bb70624e
JA
144{
145 if (prog_completes)
7117c2d2
JA
146 hash_dispose (prog_completes);
147 prog_completes = (HASH_TABLE *)NULL;
bb70624e
JA
148}
149
150int
7117c2d2 151progcomp_remove (cmd)
bb70624e
JA
152 char *cmd;
153{
154 register BUCKET_CONTENTS *item;
155
156 if (prog_completes == 0)
157 return 1;
158
7117c2d2 159 item = hash_remove (cmd, prog_completes, 0);
bb70624e
JA
160 if (item)
161 {
7117c2d2
JA
162 if (item->data)
163 free_progcomp (item->data);
bb70624e
JA
164 free (item->key);
165 free (item);
166 return (1);
167 }
168 return (0);
169}
170
171int
7117c2d2 172progcomp_insert (cmd, cs)
bb70624e
JA
173 char *cmd;
174 COMPSPEC *cs;
175{
176 register BUCKET_CONTENTS *item;
177
bb70624e 178 if (cs == NULL)
b80f6443 179 programming_error (_("progcomp_insert: %s: NULL COMPSPEC"), cmd);
7117c2d2
JA
180
181 if (prog_completes == 0)
182 progcomp_create ();
bb70624e 183
b80f6443 184 cs->refcount++;
7117c2d2 185 item = hash_insert (cmd, prog_completes, 0);
bb70624e
JA
186 if (item->data)
187 free_progcomp (item->data);
188 else
189 item->key = savestring (cmd);
7117c2d2 190 item->data = cs;
b80f6443 191
bb70624e
JA
192 return 1;
193}
194
195COMPSPEC *
7117c2d2 196progcomp_search (cmd)
28ef6c31 197 const char *cmd;
bb70624e
JA
198{
199 register BUCKET_CONTENTS *item;
200 COMPSPEC *cs;
201
202 if (prog_completes == 0)
203 return ((COMPSPEC *)NULL);
204
7117c2d2 205 item = hash_search (cmd, prog_completes, 0);
bb70624e
JA
206
207 if (item == NULL)
208 return ((COMPSPEC *)NULL);
209
210 cs = (COMPSPEC *)item->data;
211
212 return (cs);
213}
214
215void
7117c2d2
JA
216progcomp_walk (pfunc)
217 hash_wfunc *pfunc;
bb70624e 218{
7117c2d2 219 if (prog_completes == 0 || pfunc == 0 || HASH_ENTRIES (prog_completes) == 0)
bb70624e
JA
220 return;
221
7117c2d2 222 hash_walk (prog_completes, pfunc);
bb70624e
JA
223}
224
225#endif /* PROGRAMMABLE_COMPLETION */