1 /***********************************************************************
2  *                                                                      *
3  *               This software is part of the ast package               *
4  *          Copyright (c) 1982-2014 AT&T Intellectual Property          *
5  *                      and is licensed under the                       *
6  *                 Eclipse Public License, Version 1.0                  *
7  *                    by AT&T Intellectual Property                     *
8  *                                                                      *
9  *                A copy of the License is available at                 *
10  *          http://www.eclipse.org/org/documents/epl-v10.html           *
11  *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12  *                                                                      *
13  *              Information and Software Systems Research               *
14  *                            AT&T Research                             *
15  *                           Florham Park NJ                            *
16  *                                                                      *
17  *                    David Korn <dgkorn@gmail.com>                     *
18  *                                                                      *
19  ***********************************************************************/
20 #ifndef _BUILTINS_H
21 #define _BUILTINS_H 1
22 
23 #include <stdbool.h>
24 
25 #include "cdt.h"
26 #include "name.h"
27 #include "option.h"
28 #include "shtable.h"
29 
30 // These definitions must be kept in sync with `shtab_builtins[]` in
31 // src/cmd/ksh93/data/builtins.c
32 #define SYSEXEC (shgd->bltin_cmds + 0)
33 #define SYSSET (shgd->bltin_cmds + 1)
34 // #define SYSCOLON (shgd->bltin_cmds + 2)
35 #define SYSTRUE (shgd->bltin_cmds + 3)
36 #define SYSCOMMAND (shgd->bltin_cmds + 4)
37 // #define SYSCD (shgd->bltin_cmds + 5)
38 #define SYSBREAK (shgd->bltin_cmds + 6)
39 #define SYSCONT (shgd->bltin_cmds + 7)
40 #define SYSTYPESET (shgd->bltin_cmds + 8)
41 #define SYSTEST (shgd->bltin_cmds + 9)
42 // #define SYSBRACKET (shgd->bltin_cmds + 10)
43 #define SYSLET (shgd->bltin_cmds + 11)
44 #define SYSEXPORT (shgd->bltin_cmds + 12)
45 #define SYSDOT (shgd->bltin_cmds + 13)
46 #define SYSRETURN (shgd->bltin_cmds + 14)
47 #define SYSENUM (shgd->bltin_cmds + 15)
48 // #define SYSDECLARE (shgd->bltin_cmds + 16)
49 #define SYSLOCAL (shgd->bltin_cmds + 17)
50 
51 // This structure is used by `typeset`, `export`, `readonly`.
52 struct tdata {
53     Shell_t *sh;
54     Namval_t *tp;
55     const char *wctname;
56     Sfio_t *outfile;
57     char *prefix;
58     char *tname;
59     char *help;
60     char aflag;
61     bool pflag;
62     int argnum;
63     nvflag_t scanmask;
64     Dt_t *scanroot;
65     char **argnam;
66     int indent;
67     int noref;
68 };
69 
70 // This structure is used by `echo`, `print`, `printf`.
71 struct print {
72     int fd;
73     bool raw;
74     bool verbose;
75     bool vals_are_vars;
76     bool write_to_hist;
77     bool no_newline;
78     const char *format;
79     const char *fmt_type;
80     const char *msg;
81     Namval_t *var_name;
82     Sfio_t *outfile;
83 };
84 
85 extern int sh_print(char **argv, Shell_t *shp, struct print *pp);
86 extern int setall(char **, nvflag_t, Dt_t *, struct tdata *);
87 extern void print_scan(Sfio_t *file, nvflag_t flag, Dt_t *root, bool omit_attrs, struct tdata *tp);
88 extern void builtin_print_help(Shell_t *shp, const char *cmd);
89 extern void builtin_unknown_option(Shell_t *shp, const char *cmd, const char *opt);
90 extern void builtin_missing_argument(Shell_t *shp, const char *cmd, const char *opt);
91 extern void builtin_usage_error(Shell_t *shp, const char *cmd, const char *fmt, ...);
92 
93 // Entry points for shell special builtins.
94 extern int b_alias(int, char *[], Shbltin_t *);
95 extern int b_break(int, char *[], Shbltin_t *);
96 extern int b_continue(int, char *[], Shbltin_t *);
97 extern int b_enum(int, char *[], Shbltin_t *);
98 extern int b_exec(int, char *[], Shbltin_t *);
99 extern int b_exit(int, char *[], Shbltin_t *);
100 extern int b_export(int, char *[], Shbltin_t *);
101 extern int b_eval(int, char *[], Shbltin_t *);
102 extern int b_return(int, char *[], Shbltin_t *);
103 extern int b_true(int, char *[], Shbltin_t *);
104 extern int b_false(int, char *[], Shbltin_t *);
105 extern int b_readonly(int, char *[], Shbltin_t *);
106 extern int b_set(int, char *[], Shbltin_t *);
107 extern int b_shift(int, char *[], Shbltin_t *);
108 extern int b_source(int, char *[], Shbltin_t *);
109 extern int b_trap(int, char *[], Shbltin_t *);
110 extern int b_typeset(int, char *[], Shbltin_t *);
111 extern int b_unset(int, char *[], Shbltin_t *);
112 extern int b_unalias(int, char *[], Shbltin_t *);
113 
114 // The following are for job control.
115 #if defined(SIGCLD) || defined(SIGCHLD)
116 extern int b_jobs(int, char *[], Shbltin_t *);
117 extern int b_kill(int, char *[], Shbltin_t *);
118 #ifdef SIGTSTP
119 extern int b_bg(int, char *[], Shbltin_t *);
120 extern int b_fg(int, char *[], Shbltin_t *);
121 extern int b_disown(int, char *[], Shbltin_t *);
122 #endif  // SIGTSTP
123 #endif
124 
125 // The following utilities are built-in because of side-effects.
126 extern int b_builtin(int, char *[], Shbltin_t *);
127 extern int b_cd(int, char *[], Shbltin_t *);
128 extern int b_command(int, char *[], Shbltin_t *);
129 extern int b_getopts(int, char *[], Shbltin_t *);
130 extern int b_hist(int, char *[], Shbltin_t *);
131 extern int b_let(int, char *[], Shbltin_t *);
132 extern int b_read(int, char *[], Shbltin_t *);
133 extern int b_ulimit(int, char *[], Shbltin_t *);
134 extern int b_umask(int, char *[], Shbltin_t *);
135 extern int b_wait(int, char *[], Shbltin_t *);
136 extern int b_whence(int, char *[], Shbltin_t *);
137 
138 extern int b_print(int, char *[], Shbltin_t *);
139 extern int b_printf(int, char *[], Shbltin_t *);
140 extern int b_pwd(int, char *[], Shbltin_t *);
141 extern int b_sleep(int, char *[], Shbltin_t *);
142 extern int b_test(int, char *[], Shbltin_t *);
143 extern int b_times(int, char *[], Shbltin_t *);
144 extern int b_echo(int, char *[], Shbltin_t *);
145 extern int b_complete(int, char *[], Shbltin_t *);
146 
147 // Used by `b_whence()` and `b_command()`.
148 #define WHENCE_P_FLAG (1 << 0)
149 #define WHENCE_V_FLAG (1 << 1)
150 #define WHENCE_A_FLAG (1 << 2)
151 #define WHENCE_F_FLAG (1 << 3)
152 #define WHENCE_X_FLAG (1 << 4)
153 #define WHENCE_Q_FLAG (1 << 5)
154 #define WHENCE_T_FLAG (1 << 6)
155 int whence(Shell_t *, char **, int);
156 
157 extern const char e_badfun[];
158 extern const char e_baddisc[];
159 extern const char e_nofork[];
160 extern const char e_nosignal[];
161 extern const char e_nolabels[];
162 extern const char e_notimp[];
163 extern const char e_nosupport[];
164 extern const char e_badbase[];
165 extern const char e_overlimit[];
166 
167 extern const char e_eneedsarg[];
168 extern const char e_oneoperand[];
169 extern const char e_toodeep[];
170 extern const char e_badname[];
171 extern const char e_badsyntax[];
172 extern const char e_histopen[];
173 extern const char e_condition[];
174 extern const char e_badrange[];
175 extern const char e_trap[];
176 extern const char e_direct[];
177 extern const char e_defedit[];
178 extern const char e_cneedsarg[];
179 extern const char e_defined[];
180 
181 // For option parsing.
182 extern const char sh_set[];
183 extern const char sh_optbreak[];
184 extern const char sh_optbuiltin[];
185 extern const char sh_optcd[];
186 extern const char sh_optcommand[];
187 extern const char sh_optcont[];
188 extern const char sh_optdot[];
189 extern const char sh_optecho[];
190 extern const char sh_opteval[];
191 extern const char sh_optexec[];
192 extern const char sh_optexit[];
193 extern const char sh_optexport[];
194 extern const char sh_optgetopts[];
195 extern const char sh_optbg[];
196 extern const char sh_optcomplete[];
197 extern const char sh_optcut[];
198 extern const char sh_optdisown[];
199 extern const char sh_optenum[];
200 extern const char sh_optenum_type[];
201 extern const char sh_optfg[];
202 extern const char sh_opthist[];
203 extern const char sh_optjobs[];
204 extern const char sh_optkill[];
205 extern const char sh_optksh_mini[];
206 extern const char sh_optlet[];
207 extern const char sh_optprint[];
208 extern const char sh_optprintf[];
209 extern const char sh_optpwd[];
210 extern const char sh_optread[];
211 extern const char sh_optreadonly[];
212 extern const char sh_optreturn[];
213 extern const char sh_optset[];
214 extern const char sh_optshcomp[];
215 extern const char sh_optshift[];
216 extern const char sh_optsleep[];
217 extern const char sh_optsync[];
218 extern const char sh_opttest[];
219 extern const char sh_opttrap[];
220 extern const char sh_opttype[];
221 extern const char sh_opttypeset[];
222 extern const char sh_optulimit[];
223 extern const char sh_optumask[];
224 extern const char sh_optunalias[];
225 extern const char sh_optwait[];
226 extern const char sh_optunset[];
227 extern const char sh_optwhence[];
228 extern const char sh_opttimes[];
229 // Optional builtins from src/lib/libcmd.
230 extern const char sh_optbasename[];
231 extern const char sh_optcat[];
232 extern const char sh_optchmod[];
233 extern const char sh_optcmp[];
234 extern const char sh_optcut[];
235 extern const char sh_opthead[];
236 extern const char sh_optdirname[];
237 extern const char sh_optlogname[];
238 extern const char sh_optmkdir[];
239 extern const char sh_optsync[];
240 extern const char sh_optuname[];
241 extern const char sh_optwc[];
242 
243 extern const char e_dict[];
244 
245 #endif  // _BUILTINS_H
246