5f7bfe741c4eee858e8a395c7e9abd6add1e77de
[platform/upstream/bash.git] / builtins / alias.def
1 This file is alias.def, from which is created alias.c
2 It implements the builtins "alias" and "unalias" in Bash.
3
4 Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
5
6 This file is part of GNU Bash, the Bourne Again SHell.
7
8 Bash is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with Bash; see the file COPYING.  If not, write to the Free Software
20 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
21
22 $BUILTIN alias
23 $FUNCTION alias_builtin
24 $DEPENDS_ON ALIAS
25 $PRODUCES alias.c
26 $SHORT_DOC alias [-p] [name[=value] ... ]
27 `alias' with no arguments or with the -p option prints the list
28 of aliases in the form alias NAME=VALUE on standard output.
29 Otherwise, an alias is defined for each NAME whose VALUE is given.
30 A trailing space in VALUE causes the next word to be checked for
31 alias substitution when the alias is expanded.  Alias returns
32 true unless a NAME is given for which no alias has been defined.
33 $END
34
35 #include <config.h>
36
37 #if defined (ALIAS)
38
39 #if defined (HAVE_UNISTD_H)
40 #  ifdef _MINIX
41 #    include <sys/types.h>
42 #  endif
43 #  include <unistd.h>
44 #endif
45
46 #  include "../bashansi.h"
47
48 #  include <stdio.h>
49 #  include "../shell.h"
50 #  include "../alias.h"
51 #  include "common.h"
52 #  include "bashgetopt.h"
53
54 extern int interactive;
55 static void print_alias ();
56
57 /* Hack the alias command in a Korn shell way. */
58 int
59 alias_builtin (list)
60      WORD_LIST *list;
61 {
62   int any_failed, offset, pflag;
63   alias_t **alias_list, *t;
64   char *name, *value;
65
66   pflag = 0;
67   reset_internal_getopt ();
68   while ((offset = internal_getopt (list, "p")) != -1)
69     {
70       switch (offset)
71         {
72         case 'p':
73           pflag = 1;
74           break;
75         default:
76           builtin_usage ();
77           return (EX_USAGE);
78         }
79     }
80
81   list = loptend;
82
83   if (list == 0 || pflag)
84     {
85       if (aliases == 0)
86         return (EXECUTION_SUCCESS);
87
88       alias_list = all_aliases ();
89
90       if (alias_list == 0)
91         return (EXECUTION_SUCCESS);
92
93       for (offset = 0; alias_list[offset]; offset++)
94         print_alias (alias_list[offset]);
95
96       free (alias_list);        /* XXX - Do not free the strings. */
97
98       if (list == 0)
99         return (EXECUTION_SUCCESS);
100     }
101
102   any_failed = 0;
103   while (list)
104     {
105       name = list->word->word;
106
107       for (offset = 0; name[offset] && name[offset] != '='; offset++)
108         ;
109
110       if (offset && name[offset] == '=')
111         {
112           name[offset] = '\0';
113           value = name + offset + 1;
114
115           add_alias (name, value);
116         }
117       else
118         {
119           t = find_alias (name);
120           if (t)
121             print_alias (t);
122           else
123             {
124               builtin_error ("`%s' not found", name);
125               any_failed++;
126             }
127         }
128       list = list->next;
129     }
130
131   return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
132 }
133 #endif /* ALIAS */
134
135 $BUILTIN unalias
136 $FUNCTION unalias_builtin
137 $DEPENDS_ON ALIAS
138 $SHORT_DOC unalias [-a] [name ...]
139 Remove NAMEs from the list of defined aliases.  If the -a option is given,
140 then remove all alias definitions.
141 $END
142
143 #if defined (ALIAS)
144 /* Remove aliases named in LIST from the aliases database. */
145 int
146 unalias_builtin (list)
147      register WORD_LIST *list;
148 {
149   register alias_t *alias;
150   int opt, aflag;
151
152   aflag = 0;
153   reset_internal_getopt ();
154   while ((opt = internal_getopt (list, "a")) != -1)
155     {
156       switch (opt)
157         {
158         case 'a':
159           aflag = 1;
160           break;
161         default:
162           builtin_usage ();
163           return (EX_USAGE);
164         }
165     }
166
167   list = loptend;
168
169   if (aflag)
170     {
171       delete_all_aliases ();
172       return (EXECUTION_SUCCESS);
173     }
174
175   aflag = 0;
176   while (list)
177     {
178       alias = find_alias (list->word->word);
179
180       if (alias)
181         remove_alias (alias->name);
182       else
183         {
184           builtin_error ("`%s': not an alias", list->word->word);
185           aflag++;
186         }
187
188       list = list->next;
189     }
190
191   return (aflag ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
192 }
193
194 /* Output ALIAS in such a way as to allow it to be read back in. */
195 static void
196 print_alias (alias)
197      alias_t *alias;
198 {
199   char *value;
200
201   value = sh_single_quote (alias->value);
202   printf ("alias %s=%s\n", alias->name, value);
203   free (value);
204
205   fflush (stdout);
206 }
207 #endif /* ALIAS */