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