1/* alias.c, created from alias.def. */
2#line 34 "alias.def"
3
4#include <config.h>
5
6#if defined (ALIAS)
7
8#if defined (HAVE_UNISTD_H)
9#  ifdef _MINIX
10#    include <sys/types.h>
11#  endif
12#  include <unistd.h>
13#endif
14
15#  include "../bashansi.h"
16#  include "../bashintl.h"
17
18#  include <stdio.h>
19#  include "../shell.h"
20#  include "../alias.h"
21#  include "common.h"
22#  include "bashgetopt.h"
23
24/* Flags for print_alias */
25#define AL_REUSABLE	0x01
26
27static void print_alias __P((alias_t *, int));
28
29extern int posixly_correct;
30
31/* Hack the alias command in a Korn shell way. */
32int
33alias_builtin (list)
34     WORD_LIST *list;
35{
36  int any_failed, offset, pflag, dflags;
37  alias_t **alias_list, *t;
38  char *name, *value;
39
40  dflags = posixly_correct ? 0 : AL_REUSABLE;
41  pflag = 0;
42  reset_internal_getopt ();
43  while ((offset = internal_getopt (list, "p")) != -1)
44    {
45      switch (offset)
46	{
47	case 'p':
48	  pflag = 1;
49	  dflags |= AL_REUSABLE;
50	  break;
51	default:
52	  builtin_usage ();
53	  return (EX_USAGE);
54	}
55    }
56
57  list = loptend;
58
59  if (list == 0 || pflag)
60    {
61      if (aliases == 0)
62	return (EXECUTION_SUCCESS);
63
64      alias_list = all_aliases ();
65
66      if (alias_list == 0)
67	return (EXECUTION_SUCCESS);
68
69      for (offset = 0; alias_list[offset]; offset++)
70	print_alias (alias_list[offset], dflags);
71
72      free (alias_list);	/* XXX - Do not free the strings. */
73
74      if (list == 0)
75	return (EXECUTION_SUCCESS);
76    }
77
78  any_failed = 0;
79  while (list)
80    {
81      name = list->word->word;
82
83      for (offset = 0; name[offset] && name[offset] != '='; offset++)
84	;
85
86      if (offset && name[offset] == '=')
87	{
88	  name[offset] = '\0';
89	  value = name + offset + 1;
90
91	  if (legal_alias_name (name, 0) == 0)
92	    {
93	      builtin_error (_("`%s': invalid alias name"), name);
94	      any_failed++;
95	    }
96	  else
97	    add_alias (name, value);
98	}
99      else
100	{
101	  t = find_alias (name);
102	  if (t)
103	    print_alias (t, dflags);
104	  else
105	    {
106	      sh_notfound (name);
107	      any_failed++;
108	    }
109	}
110      list = list->next;
111    }
112
113  return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
114}
115#endif /* ALIAS */
116
117#line 155 "alias.def"
118
119#if defined (ALIAS)
120/* Remove aliases named in LIST from the aliases database. */
121int
122unalias_builtin (list)
123     register WORD_LIST *list;
124{
125  register alias_t *alias;
126  int opt, aflag;
127
128  aflag = 0;
129  reset_internal_getopt ();
130  while ((opt = internal_getopt (list, "a")) != -1)
131    {
132      switch (opt)
133	{
134	case 'a':
135	  aflag = 1;
136	  break;
137	default:
138	  builtin_usage ();
139	  return (EX_USAGE);
140	}
141    }
142
143  list = loptend;
144
145  if (aflag)
146    {
147      delete_all_aliases ();
148      return (EXECUTION_SUCCESS);
149    }
150
151  if (list == 0)
152    {
153      builtin_usage ();
154      return (EX_USAGE);
155    }
156
157  aflag = 0;
158  while (list)
159    {
160      alias = find_alias (list->word->word);
161
162      if (alias)
163	remove_alias (alias->name);
164      else
165	{
166	  sh_notfound (list->word->word);
167	  aflag++;
168	}
169
170      list = list->next;
171    }
172
173  return (aflag ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
174}
175
176/* Output ALIAS in such a way as to allow it to be read back in. */
177static void
178print_alias (alias, flags)
179     alias_t *alias;
180     int flags;
181{
182  char *value;
183
184  value = sh_single_quote (alias->value);
185  if (flags & AL_REUSABLE)
186    printf ("alias ");
187  printf ("%s=%s\n", alias->name, value);
188  free (value);
189
190  fflush (stdout);
191}
192#endif /* ALIAS */
193