sh.h revision 5155f1c7438ef540d7b25eb70aa1639579795b07
15155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: sh.h,v 1.30 2010/01/04 18:07:11 deraadt Exp $ */ 25155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: shf.h,v 1.6 2005/12/11 18:53:51 deraadt Exp $ */ 35155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: table.h,v 1.7 2005/12/11 20:31:21 otto Exp $ */ 45155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: tree.h,v 1.10 2005/03/28 21:28:22 deraadt Exp $ */ 55155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: expand.h,v 1.6 2005/03/30 17:16:37 deraadt Exp $ */ 65155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: lex.h,v 1.11 2006/05/29 18:22:24 otto Exp $ */ 75155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: proto.h,v 1.33 2010/05/19 17:36:08 jasper Exp $ */ 85155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: c_test.h,v 1.4 2004/12/20 11:34:26 otto Exp $ */ 95155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: tty.h,v 1.5 2004/12/20 11:34:26 otto Exp $ */ 105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/*- 125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Thorsten Glaser <tg@mirbsd.org> 145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Provided that these terms and disclaimer and all copyright notices 165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * are retained or reproduced in an accompanying document, permission 175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * is granted to deal in this work without restriction, including un- 185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * limited rights to use, publicly perform, distribute, sell, modify, 195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * merge, give away, or sublicence. 205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to 225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * the utmost extent permitted by applicable law, neither express nor 235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * implied; without malicious intent or gross negligence. In no event 245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * may a licensor, author or contributor be held liable for indirect, 255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * direct, other damage, loss, or other issues arising in any way out 265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of dealing in the work, even if advised of the possibility of such 275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * damage or existence of a defect, except proven that it results out 285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of said person's immediate fault when using the work as intended. 295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef __dietlibc__ 325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* XXX imake style */ 335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define _BSD_SOURCE /* live, BSD, live! */ 345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_PARAM_H 375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/param.h> 385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/types.h> 405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/time.h> 415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/ioctl.h> 425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_SYSMACROS_H 435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/sysmacros.h> 445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_MKDEV_H 465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/mkdev.h> 475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_MMAN_H 495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/mman.h> 505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/resource.h> 525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/stat.h> 535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/wait.h> 545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <dirent.h> 555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <errno.h> 565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <fcntl.h> 575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_LIBGEN_H 585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <libgen.h> 595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_LIBUTIL_H 615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <libutil.h> 625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <limits.h> 645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_PATHS_H 655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <paths.h> 665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <pwd.h> 685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <setjmp.h> 695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <signal.h> 705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdarg.h> 715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_STDBOOL_H 725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdbool.h> 735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stddef.h> 755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_STDINT_H 765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdint.h> 775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdio.h> 795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdlib.h> 805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <string.h> 815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_STRINGS_H 825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <strings.h> 835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <termios.h> 855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <time.h> 865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ULIMIT_H 875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <ulimit.h> 885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <unistd.h> 905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_VALUES_H 915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <values.h> 925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __attribute__ 955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_BOUNDED 965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_BOUNDED(x,y,z) __attribute__((bounded (x, y, z))) 975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_BOUNDED(x,y,z) /* nothing */ 995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_FORMAT 1015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_FORMAT(x,y,z) __attribute__((format (x, y, z))) 1025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_FORMAT(x,y,z) /* nothing */ 1045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_NONNULL 1065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_NONNULL(a) __attribute__(a) 1075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_NONNULL(a) /* nothing */ 1095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_NORETURN 1115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_NORETURN __attribute__((noreturn)) 1125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_NORETURN /* nothing */ 1145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_UNUSED 1165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_UNUSED __attribute__((unused)) 1175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_UNUSED /* nothing */ 1195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_USED 1215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_USED __attribute__((used)) 1225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_USED /* nothing */ 1245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(MirBSD) && (MirBSD >= 0x09A1) && \ 1275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru defined(__ELF__) && defined(__GNUC__) && \ 1285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !defined(__llvm__) && !defined(__NWCC__) 1295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * We got usable __IDSTRING __COPYRIGHT __RCSID __SCCSID macros 1315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * which work for all cases; no need to redefine them using the 1325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * "portable" macros from below when we might have the "better" 1335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * gcc+ELF specific macros or other system dependent ones. 1345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 1355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __IDSTRING 1375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __IDSTRING_CONCAT 1385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __IDSTRING_EXPAND 1395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __COPYRIGHT 1405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __RCSID 1415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __SCCSID 1425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p 1435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p) 1445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __IDSTRING(prefix, string) \ 1455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static const char __IDSTRING_EXPAND(__LINE__,prefix) [] \ 1465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_USED = "@(""#)" #prefix ": " string 1475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __COPYRIGHT(x) __IDSTRING(copyright,x) 1485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __RCSID(x) __IDSTRING(rcsid,x) 1495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __SCCSID(x) __IDSTRING(sccsid,x) 1505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef EXTERN 1535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.405 2010/08/24 15:19:54 tg Exp $"); 1545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_VERSION "R39 2010/08/24" 1565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_INCLUDES_ONLY 1585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* extra types */ 1605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_GETRUSAGE 1625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef rusage 1635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef RUSAGE_SELF 1645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef RUSAGE_CHILDREN 1655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define rusage mksh_rusage 1665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define RUSAGE_SELF 0 1675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define RUSAGE_CHILDREN -1 1685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct rusage { 1705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct timeval ru_utime; 1715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct timeval ru_stime; 1725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 1735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_RLIM_T 1765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef long rlim_t; 1775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_SIG_T 1805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef sig_t 1815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef void (*sig_t)(int); 1825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_STDBOOL_H 1855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* kludge, but enough for mksh */ 1865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef int bool; 1875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define false 0 1885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define true 1 1895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_CAN_INTTYPES 1925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_CAN_UCBINTS 1935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef signed int int32_t; 1945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef unsigned int uint32_t; 1955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef u_int32_t uint32_t; 1975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_CAN_INT8TYPE 2015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_CAN_UCBINT8 2025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef unsigned char uint8_t; 2035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 2045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef u_int8_t uint8_t; 2055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* extra macros */ 2095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef timerclear 2115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define timerclear(tvp) \ 2125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { \ 2135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (tvp)->tv_sec = (tvp)->tv_usec = 0; \ 2145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (/* CONSTCOND */ 0) 2155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef timeradd 2175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define timeradd(tvp, uvp, vvp) \ 2185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { \ 2195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 2205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 2215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((vvp)->tv_usec >= 1000000) { \ 2225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec++; \ 2235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec -= 1000000; \ 2245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 2255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (/* CONSTCOND */ 0) 2265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef timersub 2285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define timersub(tvp, uvp, vvp) \ 2295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { \ 2305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 2315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 2325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((vvp)->tv_usec < 0) { \ 2335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec--; \ 2345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec += 1000000; \ 2355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 2365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (/* CONSTCOND */ 0) 2375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isdigit(c) (((c) >= '0') && ((c) <= '9')) 2405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_islower(c) (((c) >= 'a') && ((c) <= 'z')) 2415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isupper(c) (((c) >= 'A') && ((c) <= 'Z')) 2425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_tolower(c) (((c) >= 'A') && ((c) <= 'Z') ? (c) - 'A' + 'a' : (c)) 2435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_toupper(c) (((c) >= 'a') && ((c) <= 'z') ? (c) - 'a' + 'A' : (c)) 2445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isdash(s) (((s) != NULL) && ((s)[0] == '-') && ((s)[1] == '\0')) 2455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isspace(c) ((((c) >= 0x09) && ((c) <= 0x0D)) || ((c) == 0x20)) 2465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef NO_PATH_MAX 2485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef PATH_MAX 2495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 2505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef PATH_MAX 2515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define PATH_MAX 1024 2525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef SIZE_MAX 2555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef SIZE_T_MAX 2565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SIZE_MAX SIZE_T_MAX 2575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 2585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SIZE_MAX ((size_t)-1) 2595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef S_ISLNK 2625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define S_ISLNK(m) ((m & 0170000) == 0120000) 2635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef S_ISSOCK 2655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define S_ISSOCK(m) ((m & 0170000) == 0140000) 2665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef DEFFILEMODE 2685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) 2695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !defined(MAP_FAILED) 2725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* XXX imake style */ 2735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# if defined(__linux) 2745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MAP_FAILED ((void *)-1) 2755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# elif defined(__bsdi__) || defined(__osf__) || defined(__ultrix) 2765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MAP_FAILED ((caddr_t)-1) 2775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# endif 2785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef NSIG 2815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(_NSIG) 2825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NSIG _NSIG 2835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#elif defined(SIGMAX) 2845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NSIG (SIGMAX+1) 2855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef BAD /* AIX defines that somewhere */ 2895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* OS-dependent additions (functions, variables, by OS) */ 2915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_FLOCK_DECL 2935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int flock(int, int); 2945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_GETRUSAGE 2975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int getrusage(int, struct rusage *); 2985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_REVOKE_DECL 3015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int revoke(const char *); 3025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_SETMODE 3055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querumode_t getmode(const void *, mode_t); 3065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid *setmode(const char *); 3075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef __ultrix 3105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* XXX imake style */ 3115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint strcasecmp(const char *, const char *); 3125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_STRCASESTR 3155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst char *stristr(const char *, const char *); 3165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_STRLCPY 3195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t strlcpy(char *, const char *, size_t); 3205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_SYS_SIGLIST_DECL 3235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern const char *const sys_siglist[]; 3245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef __INTERIX 3275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* XXX imake style */ 3285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define makedev mkdev 3295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int __cdecl seteuid(uid_t); 3305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int __cdecl setegid(gid_t); 3315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* remove redundances */ 3345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(MirBSD) && (MirBSD >= 0x08A8) 3365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_mirbsd_wcwidth 3375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define utf_wcwidth(i) wcwidth((__WCHAR_TYPE__)i) 3385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int wcwidth(__WCHAR_TYPE__); 3395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* some useful #defines */ 3435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef EXTERN 3445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# define I__(i) = i 3455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 3465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# define I__(i) 3475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# define EXTERN extern 3485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# define EXTERN_DEFINED 3495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NELEM(a) (sizeof(a) / sizeof((a)[0])) 3525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define BIT(i) (1 << (i)) /* define bit in flag */ 3535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Table flag type - needs > 16 and < 32 bits */ 3555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef int32_t Tflag; 3565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* arithmetics types */ 3585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef int32_t mksh_ari_t; 3595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef uint32_t mksh_uari_t; 3605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* these shall be smaller than 100 */ 3625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_CONSERVATIVE_FDS 3635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NUFILE 32 /* Number of user-accessible files */ 3645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FDBASE 10 /* First file usable by Shell */ 3655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 3665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NUFILE 56 /* Number of user-accessible files */ 3675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FDBASE 24 /* First file usable by Shell */ 3685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Make MAGIC a char that might be printed to make bugs more obvious, but 3715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * not a char that is used often. Also, can't use the high bit as it causes 3725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * portability problems (calling strchr(x, 0x80|'x') is error prone). 3735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 3745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MAGIC (7) /* prefix for *?[!{,} during expand */ 3755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ISMAGIC(c) ((unsigned char)(c) == MAGIC) 3765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NOT '!' /* might use ^ (ie, [!...] vs [^..]) */ 3775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LINE 4096 /* input line size */ 3795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *safe_prompt; /* safe prompt if PS1 substitution fails */ 3815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char initvsn[] I__("KSH_VERSION=@(#)MIRBSD KSH " MKSH_VERSION); 3825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSH_VERSION (initvsn + /* "KSH_VERSION=@(#)" */ 16) 3835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char digits_uc[] I__("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 3855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char digits_lc[] I__("0123456789abcdefghijklmnopqrstuvwxyz"); 3865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 3885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Evil hack for const correctness due to API brokenness 3895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 3905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruunion mksh_cchack { 3915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *rw; 3925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *ro; 3935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 3945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruunion mksh_ccphack { 3955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **rw; 3965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **ro; 3975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 3985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* for const debugging */ 4005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(DEBUG) && defined(__GNUC__) && !defined(__ICC) && \ 4015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !defined(__INTEL_COMPILER) && !defined(__SUNPRO_C) 4025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *ucstrchr(char *, int); 4035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *ucstrstr(char *, const char *); 4045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef strchr 4055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strchr ucstrchr 4065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strstr ucstrstr 4075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrchr(s,c) ({ \ 4085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union mksh_cchack in, out; \ 4095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 4105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru in.ro = (s); \ 4115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru out.rw = ucstrchr(in.rw, (c)); \ 4125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (out.ro); \ 4135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}) 4145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrstr(b,l) ({ \ 4155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union mksh_cchack in, out; \ 4165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 4175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru in.ro = (b); \ 4185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru out.rw = ucstrstr(in.rw, (l)); \ 4195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (out.ro); \ 4205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}) 4215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrchr(s,c) (cstrchr((s), (c)) != NULL) 4225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrstr(b,l) (cstrstr((b), (l)) != NULL) 4235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define mkssert(e) ((e) ? (void)0 : exit(255)) 4245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else /* !DEBUG, !gcc */ 4255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrchr(s,c) ((const char *)strchr((s), (c))) 4265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrstr(s,c) ((const char *)strstr((s), (c))) 4275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrchr(s,c) (strchr((s), (c)) != NULL) 4285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrstr(b,l) (strstr((b), (l)) != NULL) 4295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define mkssert(e) ((void)0) 4305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* use this ipv strchr(s, 0) but no side effects in s! */ 4335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strnul(s) ((s) + strlen(s)) 4345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define utf_ptradjx(src, dst) do { \ 4365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (dst) = (src) + utf_ptradj(src); \ 4375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 4385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 4405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strdupx(d, s, ap) do { \ 4415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (d) = strdup_((s), (ap)); \ 4425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 4435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strndupx(d, s, n, ap) do { \ 4445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (d) = strndup_((s), (n), (ap)); \ 4455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 4465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 4475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* be careful to evaluate arguments only once! */ 4485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strdupx(d, s, ap) do { \ 4495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *strdup_src = (s); \ 4505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *strdup_dst = NULL; \ 4515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 4525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strdup_src != NULL) { \ 4535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t strdup_len = strlen(strdup_src) + 1; \ 4545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdup_dst = alloc(strdup_len, (ap)); \ 4555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(strdup_dst, strdup_src, strdup_len); \ 4565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 4575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (d) = strdup_dst; \ 4585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 4595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strndupx(d, s, n, ap) do { \ 4605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *strdup_src = (s); \ 4615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *strdup_dst = NULL; \ 4625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 4635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strdup_src != NULL) { \ 4645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t strndup_len = (n); \ 4655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdup_dst = alloc(strndup_len + 1, (ap)); \ 4665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(strdup_dst, strdup_src, strndup_len); \ 4675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdup_dst[strndup_len] = '\0'; \ 4685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 4695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (d) = strdup_dst; \ 4705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 4715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_STRCASESTR 4745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define stristr(b,l) ((const char *)strcasestr((b), (l))) 4755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 4785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_CONSERVATIVE_FDS 4795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_CONSERVATIVE_FDS /* defined */ 4805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_NOPWNAM 4825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_NOPWNAM /* defined */ 4835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_S_NOVI 4855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_S_NOVI 1 4865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_S_NOVI 4905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_S_NOVI 0 4915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 4945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * simple grouping allocator 4955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 4965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1. internal structure */ 4985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct lalloc { 4995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct lalloc *next; 5005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 5015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 2. sizes */ 5035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALLOC_ITEM struct lalloc 5045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALLOC_SIZE (sizeof(ALLOC_ITEM)) 5055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 3. group structure (only the same for lalloc.c) */ 5075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct lalloc Area; 5085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Area aperm; /* permanent object space */ 5115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define APERM &aperm 5125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ATEMP &e->area 5135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 5155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * flags (the order of these enums MUST match the order in misc.c(options[])) 5165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum sh_flag { 5185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHFLAGS_ENUMS 5195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "sh_flags.h" 5205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru FNFLAGS /* (place holder: how many flags are there) */ 5215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 5225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Flag(f) (kshstate_v.shell_flags_[(int)(f)]) 5245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UTFMODE Flag(FUNICODE) 5255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 5275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * parsing & execution environment 5285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern struct env { 5305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ALLOC_ITEM __alloc_i; /* internal, do not touch */ 5315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area area; /* temporary allocation area */ 5325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct env *oenv; /* link to previous environment */ 5335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct block *loc; /* local variables and functions */ 5345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short *savefd; /* original redirected fds */ 5355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct temp *temps; /* temp files */ 5365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sigjmp_buf jbuf; /* long jump back to env creator */ 5375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short type; /* environment type - see below */ 5385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short flags; /* EF_* */ 5395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} *e; 5405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* struct env.type values */ 5425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_NONE 0 /* dummy environment */ 5435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_PARSE 1 /* parsing command # */ 5445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_FUNC 2 /* executing function # */ 5455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_INCL 3 /* including a file via . # */ 5465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_EXEC 4 /* executing command tree */ 5475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_LOOP 5 /* executing for/while # */ 5485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_ERRH 6 /* general error handler # */ 5495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* # indicates env has valid jbuf (see unwind()) */ 5505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* struct env.flag values */ 5525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EF_FUNC_PARSE BIT(0) /* function being parsed */ 5535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EF_BRKCONT_PASS BIT(1) /* set if E_LOOP must pass break/continue on */ 5545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EF_FAKE_SIGDIE BIT(2) /* hack to get info from unwind to quitenv */ 5555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Do breaks/continues stop at env type e? */ 5575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define STOP_BRKCONT(t) ((t) == E_NONE || (t) == E_PARSE \ 5585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru || (t) == E_FUNC || (t) == E_INCL) 5595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Do returns stop at env type e? */ 5605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define STOP_RETURN(t) ((t) == E_FUNC || (t) == E_INCL) 5615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for siglongjmp(e->jbuf, 0) */ 5635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LRETURN 1 /* return statement */ 5645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LEXIT 2 /* exit statement */ 5655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LERROR 3 /* errorf() called */ 5665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LLEAVE 4 /* untrappable exit/error */ 5675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LINTR 5 /* ^C noticed */ 5685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LBREAK 6 /* break statement */ 5695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LCONTIN 7 /* continue statement */ 5705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LSHELL 8 /* return to interactive shell() */ 5715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LAEXPR 9 /* error in arithmetic expression */ 5725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 5745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * some kind of global shell state, for change_random() mostly 5755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct mksh_kshstate_v { 5785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* for change_random */ 5795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct timeval cr_tv; /* timestamp */ 5805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const void *cr_dp; /* argument address */ 5815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t cr_dsz; /* argument length */ 5825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uint32_t lcg_state_; /* previous LCG state */ 5835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* global state */ 5845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pid_t procpid_; /* PID of executing process */ 5855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int exstat_; /* exit status */ 5865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int subst_exstat_; /* exit status of last $(..)/`..` */ 5875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct env env_; /* top-level parsing & execution env. */ 5885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uint8_t shell_flags_[FNFLAGS]; 5895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} kshstate_v; 5905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct mksh_kshstate_f { 5915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *kshname_; /* $0 */ 5925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pid_t kshpid_; /* $$, shell PID */ 5935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pid_t kshpgrp_; /* process group of shell */ 5945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uid_t ksheuid_; /* effective UID of shell */ 5955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pid_t kshppid_; /* PID of parent of shell */ 5965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uint32_t h; /* some kind of hash */ 5975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} kshstate_f; 5985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define kshname kshstate_f.kshname_ 5995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define kshpid kshstate_f.kshpid_ 6005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define procpid kshstate_v.procpid_ 6015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define kshpgrp kshstate_f.kshpgrp_ 6025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksheuid kshstate_f.ksheuid_ 6035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define kshppid kshstate_f.kshppid_ 6045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define exstat kshstate_v.exstat_ 6055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define subst_exstat kshstate_v.subst_exstat_ 6065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* evil hack: return hash(kshstate_f concat (kshstate_f'.h:=hash(arg))) */ 6085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruuint32_t evilhash(const char *); 6095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* option processing */ 6125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_CMDLINE 0x01 /* command line */ 6135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_SET 0x02 /* set builtin */ 6145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_SPECIAL 0x04 /* a special variable changing */ 6155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_INTERNAL 0x08 /* set internally by shell */ 6165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_FIRSTTIME 0x10 /* as early as possible, once */ 6175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_ANY (OF_CMDLINE | OF_SET | OF_SPECIAL | OF_INTERNAL) 6185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shoption { 6205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *name; /* long name of option */ 6215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char c; /* character flag (if any) */ 6225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char flags; /* OF_* */ 6235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 6245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern const struct shoption options[]; 6255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* null value for variable; comparision pointer for unset */ 6275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char null[] I__(""); 6285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* helpers for string pooling */ 6295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define T_synerr "syntax error" 6305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char r_fc_e_[] I__("r=fc -e -"); 6315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define fc_e_ (r_fc_e_ + 2) /* "fc -e -" */ 6325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define fc_e_n 7 /* strlen(fc_e_) */ 6335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char T_local_typeset[] I__("local=typeset"); 6345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define T__typeset (T_local_typeset + 5) /* "=typeset" */ 6355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define T_typeset (T_local_typeset + 6) /* "typeset" */ 6365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum temp_type { 6385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TT_HEREDOC_EXP, /* expanded heredoc */ 6395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TT_HIST_EDIT /* temp file used for history editing (fc -e) */ 6405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 6415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef enum temp_type Temp_type; 6425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* temp/heredoc files. The file is removed when the struct is freed. */ 6435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct temp { 6445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct temp *next; 6455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct shf *shf; 6465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *name; 6475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int pid; /* pid of process parsed here-doc */ 6485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Temp_type type; 6495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 6505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * stdio and our IO routines 6535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shl_spare (&shf_iob[0]) /* for c_read()/c_print() */ 6565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shl_stdout (&shf_iob[1]) 6575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shl_out (&shf_iob[2]) 6585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int shl_stdout_ok; 6595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * trap handlers 6625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct trap { 6645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *name; /* short name */ 6655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *mess; /* descriptive name */ 6665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *trap; /* trap command */ 6675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sig_t cursig; /* current handler (valid if TF_ORIG_* set) */ 6685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sig_t shtrap; /* shell signal handler */ 6695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int signal; /* signal number */ 6705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* TF_* */ 6715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru volatile sig_atomic_t set; /* trap pending */ 6725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Trap; 6735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for Trap.flags */ 6755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_SHELL_USES BIT(0) /* shell uses signal, user can't change */ 6765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_USER_SET BIT(1) /* user has (tried to) set trap */ 6775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_ORIG_IGN BIT(2) /* original action was SIG_IGN */ 6785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_ORIG_DFL BIT(3) /* original action was SIG_DFL */ 6795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_EXEC_IGN BIT(4) /* restore SIG_IGN just before exec */ 6805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_EXEC_DFL BIT(5) /* restore SIG_DFL just before exec */ 6815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_DFL_INTR BIT(6) /* when received, default action is LINTR */ 6825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_TTY_INTR BIT(7) /* tty generated signal (see j_waitj) */ 6835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_CHANGED BIT(8) /* used by runtrap() to detect trap changes */ 6845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_FATAL BIT(9) /* causes termination if not trapped */ 6855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for setsig()/setexecsig() flags argument */ 6875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_MASK 0x3 /* how to restore a signal before an exec() */ 6885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_CURR 0 /* leave current handler in place */ 6895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_ORIG 1 /* restore original handler */ 6905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_DFL 2 /* restore to SIG_DFL */ 6915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_IGN 3 /* restore to SIG_IGN */ 6925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_FORCE BIT(3) /* set signal even if original signal ignored */ 6935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_USER BIT(4) /* user is doing the set (ie, trap command) */ 6945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_SHTRAP BIT(5) /* trap for internal use (ALRM, CHLD, WINCH) */ 6955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SIGEXIT_ 0 /* for trap EXIT */ 6975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SIGERR_ NSIG /* for trap ERR */ 6985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN volatile sig_atomic_t trap; /* traps pending? */ 7005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN volatile sig_atomic_t intrsig; /* pending trap interrupts command */ 7015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN volatile sig_atomic_t fatal_trap;/* received a fatal signal */ 7025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern Trap sigtraps[NSIG+1]; 7035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* got_winch = 1 when we need to re-adjust the window size */ 7055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef SIGWINCH 7065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN volatile sig_atomic_t got_winch I__(1); 7075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 7085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define got_winch true 7095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 7105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 7125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * TMOUT support 7135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 7145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for ksh_tmout_state */ 7155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum tmout_enum { 7165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TMOUT_EXECUTING = 0, /* executing commands */ 7175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TMOUT_READING, /* waiting for input */ 7185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TMOUT_LEAVING /* have timed out */ 7195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 7205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN unsigned int ksh_tmout; 7215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN enum tmout_enum ksh_tmout_state I__(TMOUT_EXECUTING); 7225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* For "You have stopped jobs" message */ 7245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int really_exit; 7255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 7275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * fast character classes 7285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 7295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_ALPHA BIT(0) /* a-z_A-Z */ 7305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_DIGIT BIT(1) /* 0-9 */ 7315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_LEX1 BIT(2) /* \t \n\0|&;<>() */ 7325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_VAR1 BIT(3) /* *@#!$-? */ 7335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_IFSWS BIT(4) /* \t \n (IFS white space) */ 7345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_SUBOP1 BIT(5) /* "=-+?" */ 7355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_QUOTE BIT(6) /* \t\n "#$&'()*;<=>?[\]`| (needing quoting) */ 7365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_IFS BIT(7) /* $IFS */ 7375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_SUBOP2 BIT(8) /* "#%" (magic, see below) */ 7385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern unsigned char chtypes[]; 7405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ctype(c, t) !!( ((t) == C_SUBOP2) ? \ 7425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (((c) == '#' || (c) == '%') ? 1 : 0) : \ 7435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (chtypes[(unsigned char)(c)]&(t)) ) 7445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isalphx(c) ctype((c), C_ALPHA) 7455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isalnux(c) ctype((c), C_ALPHA | C_DIGIT) 7465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int ifs0 I__(' '); /* for "$*" */ 7485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Argument parsing for built-in commands and getopts command */ 7505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Values for Getopt.flags */ 7525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GF_ERROR BIT(0) /* call errorf() if there is an error */ 7535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GF_PLUSOPT BIT(1) /* allow +c as an option */ 7545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GF_NONAME BIT(2) /* don't print argv[0] in errors */ 7555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Values for Getopt.info */ 7575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GI_MINUS BIT(0) /* an option started with -... */ 7585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GI_PLUS BIT(1) /* an option started with +... */ 7595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GI_MINUSMINUS BIT(2) /* arguments were ended with -- */ 7605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct { 7625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *optarg; 7635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int optind; 7645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int uoptind;/* what user sees in $OPTIND */ 7655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* see GF_* */ 7665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int info; /* see GI_* */ 7675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned int p; /* 0 or index into argv[optind - 1] */ 7685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char buf[2]; /* for bad option OPTARG value */ 7695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Getopt; 7705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Getopt builtin_opt; /* for shell builtin commands */ 7725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Getopt user_opt; /* parsing state for getopts builtin command */ 7735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* This for co-processes */ 7755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef int32_t Coproc_id; /* something that won't (realisticly) wrap */ 7775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct coproc { 7785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru void *job; /* 0 or job of co-process using input pipe */ 7795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int read; /* pipe from co-process's stdout */ 7805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int readw; /* other side of read (saved temporarily) */ 7815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int write; /* pipe to co-process's stdin */ 7825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int njobs; /* number of live jobs using output pipe */ 7835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Coproc_id id; /* id of current output pipe */ 7845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 7855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct coproc coproc; 7865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Used in jobs.c and by coprocess stuff in exec.c */ 7885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN sigset_t sm_default, sm_sigchld; 7895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* name of called builtin function (used by error functions) */ 7915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *builtin_argv0; 7925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Tflag builtin_flag; /* flags of called builtin (SPEC_BI, etc.) */ 7935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* current working directory, and size of memory allocated for same */ 7955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char *current_wd; 7965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN size_t current_wd_size; 7975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Minimum required space to work with on a line - if the prompt leaves less 7995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * space than this on a line, the prompt is truncated. 8005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MIN_EDIT_SPACE 7 8025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Minimum allowed value for x_cols: 2 for prompt, 3 for " < " at end of line 8035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MIN_COLS (2 + MIN_EDIT_SPACE + 3) 8055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MIN_LINS 3 8065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN mksh_ari_t x_cols I__(80); /* tty columns */ 8075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN mksh_ari_t x_lins I__(-1); /* tty lines */ 8085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* These to avoid bracket matching problems */ 8105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OPAREN '(' 8115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CPAREN ')' 8125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OBRACK '[' 8135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CBRACK ']' 8145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OBRACE '{' 8155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CBRACE '}' 8165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Determine the location of the system (common) profile */ 8185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSH_SYSTEM_PROFILE "/etc/profile" 8195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Used by v_evaluate() and setstr() to control action when error occurs */ 8215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSH_UNWIND_ERROR 0 /* unwind the stack (longjmp) */ 8225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSH_RETURN_ERROR 1 /* return 1/0 for success/failure */ 8235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Shell file I/O routines 8265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_BSIZE 512 8295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_fileno(shf) ((shf)->fd) 8315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_setfileno(shf,nfd) ((shf)->fd = (nfd)) 8325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 8335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_getc(struct shf *); 8345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_putc(int, struct shf *); 8355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 8365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_getc(shf) ((shf)->rnleft > 0 ? \ 8375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (shf)->rnleft--, *(shf)->rp++ : \ 8385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_getchar(shf)) 8395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_putc(c, shf) ((shf)->wnleft == 0 ? \ 8405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_putchar((c), (shf)) : \ 8415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ((shf)->wnleft--, *(shf)->wp++ = (c))) 8425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 8435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_eof(shf) ((shf)->flags & SHF_EOF) 8445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_error(shf) ((shf)->flags & SHF_ERROR) 8455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_errno(shf) ((shf)->errno_) 8465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_clearerr(shf) ((shf)->flags &= ~(SHF_EOF | SHF_ERROR)) 8475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Flags passed to shf_*open() */ 8495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_RD 0x0001 8505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_WR 0x0002 8515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_RDWR (SHF_RD|SHF_WR) 8525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ACCMODE 0x0003 /* mask */ 8535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_GETFL 0x0004 /* use fcntl() to figure RD/WR flags */ 8545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_UNBUF 0x0008 /* unbuffered I/O */ 8555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_CLEXEC 0x0010 /* set close on exec flag */ 8565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_MAPHI 0x0020 /* make fd > FDBASE (and close orig) 8575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * (shf_open() only) */ 8585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_DYNAMIC 0x0040 /* string: increase buffer as needed */ 8595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_INTERRUPT 0x0080 /* EINTR in read/write causes error */ 8605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Flags used internally */ 8615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_STRING 0x0100 /* a string, not a file */ 8625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ALLOCS 0x0200 /* shf and shf->buf were alloc()ed */ 8635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ALLOCB 0x0400 /* shf->buf was alloc()ed */ 8645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ERROR 0x0800 /* read()/write() error */ 8655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_EOF 0x1000 /* read eof (sticky) */ 8665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_READING 0x2000 /* currently reading: rnleft,rp valid */ 8675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_WRITING 0x4000 /* currently writing: wnleft,wp valid */ 8685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf { 8715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; /* area shf/buf were allocated in */ 8725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *rp; /* read: current position in buffer */ 8735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *wp; /* write: current position in buffer */ 8745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf; /* buffer */ 8755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* see SHF_* */ 8765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int rbsize; /* size of buffer (1 if SHF_UNBUF) */ 8775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int rnleft; /* read: how much data left in buffer */ 8785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int wbsize; /* size of buffer (0 if SHF_UNBUF) */ 8795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int wnleft; /* write: how much space left in buffer */ 8805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int fd; /* file descriptor */ 8815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int errno_; /* saved value of errno after error */ 8825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int bsize; /* actual size of buf */ 8835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 8845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern struct shf shf_iob[]; 8865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct table { 8885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; /* area to allocate entries */ 8895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl **tbls; /* hashed table items */ 8905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short size, nfree; /* hash size (always 2^^n), free entries */ 8915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 8925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl { /* table item */ 8945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; /* area to allocate from */ 8955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 8965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *s; /* string */ 8975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mksh_ari_t i; /* integer */ 8985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mksh_uari_t u; /* unsigned integer */ 8995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int (*f)(const char **);/* int function */ 9005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct op *t; /* "function" tree */ 9015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } val; /* value */ 9025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 9035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *array; /* array values */ 9045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *fpath; /* temporary path to undef function */ 9055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u; 9065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 9075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int field; /* field with for -L/-R/-Z */ 9085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int errno_; /* CEXEC/CTALIAS */ 9095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u2; 9105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int type; /* command type (see below), base (if INTEGER), 9115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * or offset from val.s of value (if EXPORT) */ 9125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Tflag flag; /* flags */ 9135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 9145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uint32_t hval; /* hash(name) */ 9155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uint32_t index; /* index for an array */ 9165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } ua; 9175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char name[4]; /* name -- variable length */ 9185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 9195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* common flag bits */ 9215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALLOC BIT(0) /* val.s has been allocated */ 9225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DEFINED BIT(1) /* is defined in block */ 9235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ISSET BIT(2) /* has value, vp->val.[si] */ 9245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPORT BIT(3) /* exported variable/function */ 9255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TRACE BIT(4) /* var: user flagged, func: execution tracing */ 9265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* (start non-common flags at 8) */ 9275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* flag bits used for variables */ 9285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SPECIAL BIT(8) /* PATH, IFS, SECONDS, etc */ 9295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INTEGER BIT(9) /* val.i contains integer value */ 9305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define RDONLY BIT(10) /* read-only variable */ 9315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOCAL BIT(11) /* for local typeset() */ 9325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ARRAY BIT(13) /* array */ 9335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LJUST BIT(14) /* left justify */ 9345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define RJUST BIT(15) /* right justify */ 9355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ZEROFIL BIT(16) /* 0 filled if RJUSTIFY, strip 0s if LJUSTIFY */ 9365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LCASEV BIT(17) /* convert to lower case */ 9375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UCASEV_AL BIT(18) /* convert to upper case / autoload function */ 9385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INT_U BIT(19) /* unsigned integer */ 9395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INT_L BIT(20) /* long integer (no-op) */ 9405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IMPORT BIT(21) /* flag to typeset(): no arrays, must have = */ 9415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOCAL_COPY BIT(22) /* with LOCAL - copy attrs from existing var */ 9425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPRINEVAL BIT(23) /* contents currently being evaluated */ 9435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPRLVALUE BIT(24) /* useable as lvalue (temp flag) */ 9445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AINDEX BIT(25) /* array index >0 = ua.index filled in */ 9455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ASSOC BIT(26) /* ARRAY ? associative : reference */ 9465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* flag bits used for taliases/builtins/aliases/keywords/functions */ 9475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KEEPASN BIT(8) /* keep command assignments (eg, var=x cmd) */ 9485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FINUSE BIT(9) /* function being executed */ 9495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FDELETE BIT(10) /* function deleted while it was executing */ 9505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FKSH BIT(11) /* function defined with function x (vs x()) */ 9515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SPEC_BI BIT(12) /* a POSIX special builtin */ 9525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define REG_BI BIT(13) /* a POSIX regular builtin */ 9535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Attributes that can be set by the user (used to decide if an unset param 9545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * should be repoted by set/typeset). Does not include ARRAY or LOCAL. 9555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 9565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define USERATTRIB (EXPORT|INTEGER|RDONLY|LJUST|RJUST|ZEROFIL|\ 9575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru LCASEV|UCASEV_AL|INT_U|INT_L) 9585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define arrayindex(vp) ((unsigned long)((vp)->flag & AINDEX ? \ 9605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vp)->ua.index : 0)) 9615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* command types */ 9635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CNONE 0 /* undefined */ 9645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CSHELL 1 /* built-in */ 9655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CFUNC 2 /* function */ 9665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CEXEC 4 /* executable command */ 9675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CALIAS 5 /* alias */ 9685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CKEYWD 6 /* keyword */ 9695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CTALIAS 7 /* tracked alias */ 9705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Flags for findcom()/comexec() */ 9725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_SPECBI BIT(0) /* special builtin */ 9735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_FUNC BIT(1) /* function builtin */ 9745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_REGBI BIT(2) /* regular builtin */ 9755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_UNREGBI BIT(3) /* un-regular builtin (!special,!regular) */ 9765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_BI (FC_SPECBI|FC_REGBI|FC_UNREGBI) 9775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_PATH BIT(4) /* do path search */ 9785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_DEFPATH BIT(5) /* use default path in path search */ 9795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AF_ARGV_ALLOC 0x1 /* argv[] array allocated */ 9825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AF_ARGS_ALLOCED 0x2 /* argument strings allocated */ 9835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AI_ARGV(a, i) ((i) == 0 ? (a).argv[0] : (a).argv[(i) - (a).skip]) 9845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AI_ARGC(a) ((a).argc_ - (a).skip) 9855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Argument info. Used for $#, $* for shell, functions, includes, etc. */ 9875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct arg_info { 9885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **argv; 9895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* AF_* */ 9905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int argc_; 9915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int skip; /* first arg is argv[0], second is argv[1 + skip] */ 9925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 9935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * activation record for function blocks 9965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 9975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct block { 9985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area area; /* area to allocate things */ 9995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **argv; 10005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *error; /* error handler */ 10015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *exit; /* exit handler */ 10025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct block *next; /* enclosing block */ 10035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct table vars; /* local variables */ 10045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct table funs; /* local functions */ 10055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Getopt getopts_state; 10065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int argc; 10075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* see BF_* */ 10085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Values for struct block.flags */ 10115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define BF_DOGETOPTS BIT(0) /* save/restore getopts state */ 10125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 10145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Used by ktwalk() and ktnext() routines. 10155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tstate { 10175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl **next; 10185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ssize_t left; 10195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table taliases; /* tracked aliases */ 10225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table builtins; /* built-in commands */ 10235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table aliases; /* aliases */ 10245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table keywords; /* keywords */ 10255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_NOPWNAM 10265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table homedirs; /* homedir() cache */ 10275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 10285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct builtin { 10305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *name; 10315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int (*func)(const char **); 10325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern const struct builtin mkshbuiltins[]; 10355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for set_prompt() */ 10375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define PS1 0 /* command */ 10385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define PS2 1 /* command continuation */ 10395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char *path; /* copy of either PATH or def_path */ 10415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *def_path; /* path to use if PATH not set */ 10425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char *tmpdir; /* TMPDIR value */ 10435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *prompt; 10445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int cur_prompt; /* PS1 or PS2 */ 10455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int current_lineno; /* LINENO value */ 10465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NOBLOCK ((struct op *)NULL) 10485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NOWORD ((char *)NULL) 10495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NOWORDS ((char **)NULL) 10505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 10525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Description of a command or an operation on commands. 10535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct op { 10555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **args; /* arguments to a command */ 10565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **vars; /* variable assignments */ 10575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct ioword **ioact; /* IO actions (eg, < > >>) */ 10585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct op *left, *right; /* descendents */ 10595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *str; /* word for case; identifier for for, 10605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * select, and functions; 10615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * path to execute for TEXEC; 10625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * time hook for TCOM. 10635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int lineno; /* TCOM/TFUNC: LINENO for this */ 10655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short type; /* operation type, see below */ 10665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { /* WARNING: newtp(), tcopy() use evalflags = 0 to clear union */ 10675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short evalflags; /* TCOM: arg expansion eval() flags */ 10685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short ksh_func; /* TFUNC: function x (vs x()) */ 10695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u; 10705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Tree.type values */ 10735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEOF 0 10745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TCOM 1 /* command */ 10755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TPAREN 2 /* (c-list) */ 10765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TPIPE 3 /* a | b */ 10775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TLIST 4 /* a ; b */ 10785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TOR 5 /* || */ 10795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TAND 6 /* && */ 10805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TBANG 7 /* ! */ 10815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TDBRACKET 8 /* [[ .. ]] */ 10825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TFOR 9 10835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TSELECT 10 10845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TCASE 11 10855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TIF 12 10865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TWHILE 13 10875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TUNTIL 14 10885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TELIF 15 10895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TPAT 16 /* pattern in case */ 10905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TBRACE 17 /* {c-list} */ 10915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TASYNC 18 /* c & */ 10925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TFUNCT 19 /* function name { command; } */ 10935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TTIME 20 /* time pipeline */ 10945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEXEC 21 /* fork/exec eval'd TCOM */ 10955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TCOPROC 22 /* coprocess |& */ 10965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 10985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * prefix codes for words in command tree 10995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 11005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EOS 0 /* end of string */ 11015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CHAR 1 /* unquoted character */ 11025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define QCHAR 2 /* quoted character */ 11035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define COMSUB 3 /* $() substitution (0 terminated) */ 11045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPRSUB 4 /* $(()) substitution (0 terminated) */ 11055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OQUOTE 5 /* opening " or ' */ 11065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CQUOTE 6 /* closing " or ' */ 11075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OSUBST 7 /* opening ${ subst (followed by { or X) */ 11085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CSUBST 8 /* closing } of above (followed by } or X) */ 11095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OPAT 9 /* open pattern: *(, @(, etc. */ 11105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SPAT 10 /* separate pattern: | */ 11115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CPAT 11 /* close pattern: ) */ 11125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ADELIM 12 /* arbitrary delimiter: ${foo:2:3} ${foo/bar/baz} */ 11135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 11155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * IO redirection 11165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 11175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct ioword { 11185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int unit; /* unit affected */ 11195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flag; /* action (below) */ 11205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *name; /* file name (unused if heredoc) */ 11215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *delim; /* delimiter for <<,<<- */ 11225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *heredoc;/* content of heredoc */ 11235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 11245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* ioword.flag - type of redirection */ 11265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOTYPE 0xF /* type: bits 0:3 */ 11275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOREAD 0x1 /* < */ 11285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOWRITE 0x2 /* > */ 11295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IORDWR 0x3 /* <>: todo */ 11305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOHERE 0x4 /* << (here file) */ 11315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOCAT 0x5 /* >> */ 11325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IODUP 0x6 /* <&/>& */ 11335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOEVAL BIT(4) /* expand in << */ 11345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOSKIP BIT(5) /* <<-, skip ^\t* */ 11355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOCLOB BIT(6) /* >|, override -o noclobber */ 11365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IORDUP BIT(7) /* x<&y (as opposed to x>&y) */ 11375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IONAMEXP BIT(8) /* name has been expanded */ 11385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IOBASH BIT(9) /* &> etc. */ 11395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* execute/exchild flags */ 11415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XEXEC BIT(0) /* execute without forking */ 11425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFORK BIT(1) /* fork before executing */ 11435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XBGND BIT(2) /* command & */ 11445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPIPEI BIT(3) /* input is pipe */ 11455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPIPEO BIT(4) /* output is pipe */ 11465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPIPE (XPIPEI|XPIPEO) /* member of pipe */ 11475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XXCOM BIT(5) /* `...` command */ 11485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPCLOSE BIT(6) /* exchild: close close_fd in parent */ 11495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCCLOSE BIT(7) /* exchild: close close_fd in child */ 11505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XERROK BIT(8) /* non-zero exit ok (for set -e) */ 11515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCOPROC BIT(9) /* starting a co-process */ 11525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XTIME BIT(10) /* timing TCOM command */ 11535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 11555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * flags to control expansion of words (assumed by t->evalflags to fit 11565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * in a short) 11575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 11585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOBLANK BIT(0) /* perform blank interpretation */ 11595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOGLOB BIT(1) /* expand [?* */ 11605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOPAT BIT(2) /* quote *?[ */ 11615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOTILDE BIT(3) /* normal ~ expansion (first char) */ 11625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DONTRUNCOMMAND BIT(4) /* do not run $(command) things */ 11635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOASNTILDE BIT(5) /* assignment ~ expansion (after =, :) */ 11645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOBRACE_ BIT(6) /* used by expand(): do brace expansion */ 11655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOMAGIC_ BIT(7) /* used by expand(): string contains MAGIC */ 11665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOTEMP_ BIT(8) /* ditto : in word part of ${..[%#=?]..} */ 11675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOVACHECK BIT(9) /* var assign check (for typeset, set, etc) */ 11685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOMARKDIRS BIT(10) /* force markdirs behaviour */ 11695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 11715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The arguments of [[ .. ]] expressions are kept in t->args[] and flags 11725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * indicating how the arguments have been munged are kept in t->vars[]. 11735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The contents of t->vars[] are stuffed strings (so they can be treated 11745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * like all other t->vars[]) in which the second character is the one that 11755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * is examined. The DB_* defines are the values for these second characters. 11765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 11775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DB_NORM 1 /* normal argument */ 11785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DB_OR 2 /* || -> -o conversion */ 11795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DB_AND 3 /* && -> -a conversion */ 11805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DB_BE 4 /* an inserted -BE */ 11815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DB_PAT 5 /* a pattern argument */ 11825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define X_EXTRA 8 /* this many extra bytes in X string */ 11845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct XString { 11865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *end, *beg; /* end, begin of string */ 11875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t len; /* length */ 11885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; /* area to allocate/free from */ 11895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} XString; 11905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef char *XStringP; 11925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* initialise expandable string */ 11945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XinitN(xs, length, area) do { \ 11955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).len = (length); \ 11965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).areap = (area); \ 11975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).beg = alloc((xs).len + X_EXTRA, (xs).areap); \ 11985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).end = (xs).beg + (xs).len; \ 11995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 12005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xinit(xs, xp, length, area) do { \ 12015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XinitN((xs), (length), (area)); \ 12025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xp) = (xs).beg; \ 12035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 12045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* stuff char into string */ 12065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xput(xs, xp, c) (*xp++ = (c)) 12075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* check if there are at least n bytes left */ 12095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XcheckN(xs, xp, n) do { \ 12105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int more = ((xp) + (n)) - (xs).end; \ 12115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (more > 0) \ 12125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xp) = Xcheck_grow_(&(xs), (xp), more); \ 12135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 12145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* check for overflow, expand string */ 12165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xcheck(xs, xp) XcheckN((xs), (xp), 1) 12175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* free string */ 12195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xfree(xs, xp) afree((xs).beg, (xs).areap) 12205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* close, return string */ 12225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xclose(xs, xp) aresize((xs).beg, (xp) - (xs).beg, (xs).areap) 12235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* begin of string */ 12255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xstring(xs, xp) ((xs).beg) 12265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xnleft(xs, xp) ((xs).end - (xp)) /* may be less than 0 */ 12285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xlength(xs, xp) ((xp) - (xs).beg) 12295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xsize(xs, xp) ((xs).end - (xs).beg) 12305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xsavepos(xs, xp) ((xp) - (xs).beg) 12315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xrestpos(xs, xp, n) ((xs).beg + (n)) 12325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *Xcheck_grow_(XString *, const char *, unsigned int); 12345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 12365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * expandable vector of generic pointers 12375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct XPtrV { 12405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru void **cur; /* next avail pointer */ 12415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru void **beg, **end; /* begin, end of vector */ 12425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} XPtrV; 12435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPinit(x, n) do { \ 12455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru void **vp__; \ 12465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vp__ = alloc((n) * sizeof(void *), ATEMP); \ 12475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (x).cur = (x).beg = vp__; \ 12485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (x).end = vp__ + (n); \ 12495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 12505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPput(x, p) do { \ 12525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((x).cur >= (x).end) { \ 12535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t n = XPsize(x); \ 12545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (x).beg = aresize((x).beg, \ 12555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n * 2 * sizeof(void *), ATEMP); \ 12565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (x).cur = (x).beg + n; \ 12575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (x).end = (x).cur + n; \ 12585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 12595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *(x).cur++ = (p); \ 12605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 12615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPptrv(x) ((x).beg) 12635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPsize(x) ((x).cur - (x).beg) 12645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPclose(x) aresize((x).beg, XPsize(x) * sizeof(void *), ATEMP) 12655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPfree(x) afree((x).beg, ATEMP) 12665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IDENT 64 12685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct source Source; 12705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct source { 12715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *str; /* input pointer */ 12725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *start; /* start of current buffer */ 12735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 12745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **strv; /* string [] */ 12755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct shf *shf; /* shell file */ 12765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *tblp; /* alias (SF_HASALIAS) */ 12775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *freeme; /* also for SREREAD */ 12785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u; 12795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *file; /* input file name */ 12805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int type; /* input type */ 12815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int line; /* line number */ 12825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int errline; /* line the error occurred on (0 if not set) */ 12835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* SF_* */ 12845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; 12855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Source *next; /* stacked source */ 12865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XString xs; /* input buffer */ 12875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char ugbuf[2]; /* buffer for ungetsc() (SREREAD) and 12885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * alias (SALIAS) */ 12895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 12905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Source.type values */ 12925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SEOF 0 /* input EOF */ 12935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SFILE 1 /* file input */ 12945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SSTDIN 2 /* read stdin */ 12955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SSTRING 3 /* string */ 12965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SWSTR 4 /* string without \n */ 12975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SWORDS 5 /* string[] */ 12985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SWORDSEP 6 /* string[] separator */ 12995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SALIAS 7 /* alias expansion */ 13005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SREREAD 8 /* read ahead to be re-scanned */ 13015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Source.flags values */ 13035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_ECHO BIT(0) /* echo input to shlout */ 13045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_ALIAS BIT(1) /* faking space at end of alias */ 13055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_ALIASEND BIT(2) /* faking space at end of alias */ 13065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_TTY BIT(3) /* type == SSTDIN & it is a tty */ 13075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_FIRST BIT(4) /* initial state (to ignore UTF-8 BOM) */ 13085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_HASALIAS BIT(5) /* u.tblp valid (SALIAS, SEOF) */ 13095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef union { 13115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 13125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 13135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **wp; 13145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct op *o; 13155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct ioword *iop; 13165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} YYSTYPE; 13175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* If something is added here, add it to tokentab[] in syn.c as well */ 13195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LWORD 256 13205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOGAND 257 /* && */ 13215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOGOR 258 /* || */ 13225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define BREAK 259 /* ;; */ 13235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IF 260 13245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define THEN 261 13255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ELSE 262 13265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ELIF 263 13275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FI 264 13285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CASE 265 13295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ESAC 266 13305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FOR 267 13315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SELECT 268 13325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define WHILE 269 13335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UNTIL 270 13345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DO 271 13355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DONE 272 13365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IN 273 13375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FUNCTION 274 13385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TIME 275 13395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define REDIR 276 13405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MDPAREN 277 /* (( )) */ 13415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define BANG 278 /* ! */ 13425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DBRACKET 279 /* [[ .. ]] */ 13435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define COPROC 280 /* |& */ 13445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define YYERRCODE 300 13455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* flags to yylex */ 13475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CONTIN BIT(0) /* skip new lines to complete command */ 13485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ONEWORD BIT(1) /* single word for substitute() */ 13495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALIAS BIT(2) /* recognise alias */ 13505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KEYWORD BIT(3) /* recognise keywords */ 13515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LETEXPR BIT(4) /* get expression inside (( )) */ 13525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARASN BIT(5) /* check for var=word */ 13535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ARRAYVAR BIT(6) /* parse x[1 & 2] as one word */ 13545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ESACONLY BIT(7) /* only accept esac keyword */ 13555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CMDWORD BIT(8) /* parsing simple command (alias related) */ 13565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define HEREDELIM BIT(9) /* parsing <<,<<- delimiter */ 13575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LQCHAR BIT(10) /* source string contains QCHAR */ 13585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define HEREDOC BIT(11) /* parsing a here document */ 13595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LETARRAY BIT(12) /* copy expression inside =( ) */ 13605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define HERES 10 /* max << in line */ 13625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef CTRL 13645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CTRL(x) ((x) == '?' ? 0x7F : (x) & 0x1F) /* ASCII */ 13655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UNCTRL(x) ((x) ^ 0x40) /* ASCII */ 13665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Source *source; /* yyparse/yylex source */ 13685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN YYSTYPE yylval; /* result from yylex */ 13695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct ioword *heres [HERES], **herep; 13705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char ident [IDENT+1]; 13715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define HISTORYSIZE 500 /* size of saved history */ 13735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char **history; /* saved commands */ 13755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char **histptr; /* last history item */ 13765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int histsize; /* history size */ 13775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* user and system time of last j_waitjed job */ 13795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct timeval j_usrtime, j_systime; 13805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* lalloc.c */ 13825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid ainit(Area *); 13835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid afreeall(Area *); 13845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* these cannot fail and can take NULL (not for ap) */ 13855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define alloc(n, ap) aresize(NULL, (n), (ap)) 13865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid *aresize(void *, size_t, Area *); 13875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid afree(void *, Area *); /* can take NULL */ 13885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* edit.c */ 13895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 13905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint x_bind(const char *, const char *, bool, bool); 13915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 13925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint x_bind(const char *, const char *, bool); 13935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 13945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid x_init(void); 13955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint x_read(char *, size_t); 13965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* eval.c */ 13975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *substitute(const char *, int); 13985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar **eval(const char **, int); 13995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *evalstr(const char *cp, int); 14005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *evalonestr(const char *cp, int); 14015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *debunk(char *, const char *, size_t); 14025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid expand(const char *, XPtrV *, int); 14035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint glob_str(char *, XPtrV *, int); 14045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* exec.c */ 14055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint execute(struct op * volatile, volatile int, volatile int * volatile); 14065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shcomexec(const char **); 14075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *findfunc(const char *, uint32_t, bool); 14085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint define(const char *, struct op *); 14095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid builtin(const char *, int (*)(const char **)); 14105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *findcom(const char *, int); 14115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid flushcom(int); 14125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst char *search(const char *, const char *, int, int *); 14135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint search_access(const char *, int, int *); 14145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint pr_menu(const char * const *); 14155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint pr_list(char * const *); 14165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* expr.c */ 14175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint evaluate(const char *, mksh_ari_t *, int, bool); 14185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint v_evaluate(struct tbl *, const char *, volatile int, bool); 14195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* UTF-8 stuff */ 14205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t utf_mbtowc(unsigned int *, const char *); 14215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t utf_wctomb(char *, unsigned int); 14225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint utf_widthadj(const char *, const char **); 14235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint utf_mbswidth(const char *); 14245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst char *utf_skipcols(const char *, int); 14255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t utf_ptradj(const char *); 14265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_mirbsd_wcwidth 14275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint utf_wcwidth(unsigned int); 14285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 14295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* funcs.c */ 14305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_hash(const char **); 14315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_cd(const char **); 14325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_pwd(const char **); 14335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_print(const char **); 14345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_PRINTF_BUILTIN 14355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_printf(const char **); 14365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 14375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_whence(const char **); 14385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_command(const char **); 14395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_typeset(const char **); 14405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_alias(const char **); 14415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_unalias(const char **); 14425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_let(const char **); 14435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_jobs(const char **); 14445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_UNEMPLOYED 14455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_fgbg(const char **); 14465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 14475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_kill(const char **); 14485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid getopts_reset(int); 14495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_getopts(const char **); 14505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_bind(const char **); 14515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_label(const char **); 14525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_shift(const char **); 14535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_umask(const char **); 14545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_dot(const char **); 14555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_wait(const char **); 14565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_read(const char **); 14575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_eval(const char **); 14585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_trap(const char **); 14595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_brkcont(const char **); 14605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_exitreturn(const char **); 14615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_set(const char **); 14625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_unset(const char **); 14635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_ulimit(const char **); 14645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_times(const char **); 14655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint timex(struct op *, int, volatile int *); 14665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid timex_hook(struct op *, char ** volatile *); 14675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_exec(const char **); 14685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_builtin(const char **); 14695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_test(const char **); 14705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_MKNOD 14715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_mknod(const char **); 14725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 14735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_realpath(const char **); 14745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_rename(const char **); 14755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* histrap.c */ 14765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid init_histvec(void); 14775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid hist_init(Source *); 14785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_PERSISTENT_HISTORY 14795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid hist_finish(void); 14805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 14815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid histsave(int *, const char *, bool, bool); 14825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !defined(MKSH_SMALL) && HAVE_PERSISTENT_HISTORY 14835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubool histsync(void); 14845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 14855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_fc(const char **); 14865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid sethistsize(int); 14875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_PERSISTENT_HISTORY 14885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid sethistfile(const char *); 14895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 14905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar **histpos(void); 14915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint histnum(int); 14925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint findhist(int, int, const char *, int); 14935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint findhistrel(const char *); 14945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar **hist_get_newest(bool); 14955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid inittraps(void); 14965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid alarm_init(void); 14975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruTrap *gettrap(const char *, int); 14985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid trapsig(int); 14995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid intrcheck(void); 15005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint fatal_trap_check(void); 15015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint trap_pending(void); 15025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid runtraps(int intr); 15035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid runtrap(Trap *); 15045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid cleartraps(void); 15055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid restoresigs(void); 15065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid settrap(Trap *, const char *); 15075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint block_pipe(void); 15085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid restore_pipe(int); 15095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint setsig(Trap *, sig_t, int); 15105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid setexecsig(Trap *, int); 15115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* jobs.c */ 15125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_init(void); 15135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_exit(void); 15145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_UNEMPLOYED 15155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_change(void); 15165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 15175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint exchild(struct op *, int, volatile int *, int); 15185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid startlast(void); 15195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint waitlast(void); 15205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint waitfor(const char *, int *); 15215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_kill(const char *, int); 15225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_UNEMPLOYED 15235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_resume(const char *, int); 15245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 15255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_jobs(const char *, int, int); 15265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_njobs(void); 15275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_notify(void); 15285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querupid_t j_async(void); 15295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_stopped_running(void); 15305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* lex.c */ 15315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint yylex(int); 15325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid yyerror(const char *, ...) 15335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NORETURN 15345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 15355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruSource *pushs(int, Area *); 15365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid set_prompt(int, Source *); 15375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid pprompt(const char *, int); 15385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint promptlen(const char *); 15395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* main.c */ 15405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint include(const char *, int, const char **, int); 15415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint command(const char *, int); 15425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shell(Source *volatile, int volatile); 15435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid unwind(int) MKSH_A_NORETURN; 15445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid newenv(int); 15455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid quitenv(struct shf *); 15465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid cleanup_parents_env(void); 15475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid cleanup_proc_env(void); 15485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid errorf(const char *, ...) 15495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NORETURN 15505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 15515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid warningf(bool, const char *, ...) 15525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 2, 3); 15535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid bi_errorf(const char *, ...) 15545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 15555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define errorfz() errorf("\1") 15565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define bi_errorfz() bi_errorf("\1") 15575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid internal_verrorf(const char *, va_list) 15585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 0); 15595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid internal_errorf(const char *, ...) 15605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NORETURN 15615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 15625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid internal_warningf(const char *, ...) 15635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 15645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid error_prefix(bool); 15655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid shellf(const char *, ...) 15665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 15675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid shprintf(const char *, ...) 15685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 15695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint can_seek(int); 15705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initio(void); 15715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint ksh_dup2(int, int, bool); 15725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querushort savefd(int); 15735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid restfd(int, int); 15745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid openpipe(int *); 15755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid closepipe(int *); 15765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint check_fd(const char *, int, const char **); 15775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_init(void); 15785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_read_close(int); 15795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_readw_close(int); 15805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_write_close(int); 15815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint coproc_getfd(int, const char **); 15825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_cleanup(int); 15835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct temp *maketemp(Area *, Temp_type, struct temp **); 15845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define hash(s) oaathash_full((const uint8_t *)(s)) 15855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruuint32_t oaathash_full(register const uint8_t *); 15865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruuint32_t hashmem(const void *, size_t); 15875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid ktinit(struct table *, Area *, size_t); 15885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *ktsearch(struct table *, const char *, uint32_t); 15895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *ktenter(struct table *, const char *, uint32_t); 15905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ktdelete(p) do { p->flag = 0; } while (/* CONSTCOND */ 0) 15915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid ktwalk(struct tstate *, struct table *); 15925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *ktnext(struct tstate *); 15935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl **ktsort(struct table *); 15945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* misc.c */ 15955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid setctypes(const char *, int); 15965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initctypes(void); 15975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t option(const char *); 15985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *getoptions(void); 15995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid change_flag(enum sh_flag, int, unsigned int); 16005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint parse_args(const char **, int, bool *); 16015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint getn(const char *, int *); 16025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint bi_getn(const char *, int *); 16035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint gmatchx(const char *, const char *, bool); 16045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint has_globbing(const char *, const char *); 16055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst unsigned char *pat_scan(const unsigned char *, const unsigned char *, int); 16065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint xstrcmp(const void *, const void *); 16075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid ksh_getopt_reset(Getopt *, int); 16085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint ksh_getopt(const char **, Getopt *, const char *); 16095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid print_value_quoted(const char *); 16105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid print_columns(struct shf *, int, 16115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *(*)(char *, int, int, const void *), 16125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const void *, int, int, bool); 16135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid strip_nuls(char *, int); 16145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint blocking_read(int, char *, int) 16155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_BOUNDED(buffer, 2, 3); 16165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint reset_nonblock(int); 16175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *ksh_get_wd(size_t *); 16185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint make_path(const char *, const char *, char **, XString *, int *); 16195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid simplify_path(char *); 16205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid set_current_wd(char *); 16215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 16225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *strdup_(const char *, Area *); 16235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *strndup_(const char *, size_t, Area *); 16245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 16255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint unbksl(bool, int (*)(void), void (*)(int)); 16265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* shf.c */ 16275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf *shf_open(const char *, int, int, int); 16285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf *shf_fdopen(int, int, struct shf *); 16295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf *shf_reopen(int, int, struct shf *); 16305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf *shf_sopen(char *, int, int, struct shf *); 16315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_close(struct shf *); 16325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_fdclose(struct shf *); 16335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *shf_sclose(struct shf *); 16345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_flush(struct shf *); 16355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_read(char *, int, struct shf *); 16365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *shf_getse(char *, int, struct shf *); 16375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_getchar(struct shf *s); 16385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_ungetc(int, struct shf *); 16395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_putchar(int, struct shf *); 16405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_puts(const char *, struct shf *); 16415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_write(const char *, int, struct shf *); 16425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_fprintf(struct shf *, const char *, ...) 16435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 2, 3); 16445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_snprintf(char *, int, const char *, ...) 16455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 3, 4) 16465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_BOUNDED(string, 1, 2); 16475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *shf_smprintf(const char *, ...) 16485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 1, 2); 16495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_vfprintf(struct shf *, const char *, va_list) 16505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_FORMAT(printf, 2, 0); 16515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* syn.c */ 16525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initkeywords(void); 16535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct op *compile(Source *); 16545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* tree.c */ 16555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint fptreef(struct shf *, int, const char *, ...); 16565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *snptreef(char *, int, const char *, ...); 16575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct op *tcopy(struct op *, Area *); 16585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *wdcopy(const char *, Area *); 16595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst char *wdscan(const char *, int); 16605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *wdstrip(const char *, bool, bool); 16615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid tfree(struct op *, Area *); 16625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* var.c */ 16635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid newblock(void); 16645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid popblock(void); 16655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initvar(void); 16665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *global(const char *); 16675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *local(const char *, bool); 16685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *str_val(struct tbl *); 16695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint setstr(struct tbl *, const char *, int); 16705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *setint_v(struct tbl *, struct tbl *, bool); 16715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid setint(struct tbl *, mksh_ari_t); 16725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *typeset(const char *, Tflag, Tflag, int, int) 16735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NONNULL((nonnull (1))); 16745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid unset(struct tbl *, int); 16755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst char *skip_varname(const char *, int); 16765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst char *skip_wdvarname(const char *, int); 16775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint is_wdvarname(const char *, int); 16785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint is_wdvarassign(const char *); 16795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar **makenv(void); 16805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid change_random(const void *, size_t); 16815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid change_winsz(void); 16825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint array_ref_len(const char *); 16835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *arrayname(const char *); 16845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querumksh_uari_t set_array(const char *, bool, const char **); 16855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum Test_op { 16875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_NONOP = 0, /* non-operator */ 16885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* unary operators */ 16895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_STNZE, TO_STZER, TO_OPTION, 16905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILAXST, 16915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILEXST, 16925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILREG, TO_FILBDEV, TO_FILCDEV, TO_FILSYM, TO_FILFIFO, TO_FILSOCK, 16935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILCDF, TO_FILID, TO_FILGID, TO_FILSETG, TO_FILSTCK, TO_FILUID, 16945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILRD, TO_FILGZ, TO_FILTT, TO_FILSETU, TO_FILWR, TO_FILEX, 16955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* binary operators */ 16965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_STEQL, TO_STNEQ, TO_STLT, TO_STGT, TO_INTEQ, TO_INTNE, TO_INTGT, 16975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_INTGE, TO_INTLT, TO_INTLE, TO_FILEQ, TO_FILNT, TO_FILOT, 16985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* not an operator */ 16995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_NONNULL /* !TO_NONOP */ 17005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 17015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef enum Test_op Test_op; 17025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Used by Test_env.isa() (order important - used to index *_tokens[] arrays) */ 17045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum Test_meta { 17055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_OR, /* -o or || */ 17065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_AND, /* -a or && */ 17075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_NOT, /* ! */ 17085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_OPAREN, /* ( */ 17095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_CPAREN, /* ) */ 17105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_UNOP, /* unary operator */ 17115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_BINOP, /* binary operator */ 17125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_END /* end of input */ 17135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 17145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef enum Test_meta Test_meta; 17155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEF_ERROR BIT(0) /* set if we've hit an error */ 17175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEF_DBRACKET BIT(1) /* set if [[ .. ]] test */ 17185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct test_env { 17205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 17215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **wp;/* used by ptest_* */ 17225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPtrV *av; /* used by dbtestp_* */ 17235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } pos; 17245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **wp_end; /* used by ptest_* */ 17255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Test_op (*isa)(struct test_env *, Test_meta); 17265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *(*getopnd) (struct test_env *, Test_op, bool); 17275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int (*eval)(struct test_env *, Test_op, const char *, const char *, bool); 17285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru void (*error)(struct test_env *, int, const char *); 17295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* TEF_* */ 17305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Test_env; 17315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern const char *const dbtest_tokens[]; 17335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruTest_op test_isop(Test_meta, const char *); 17355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint test_eval(Test_env *, Test_op, const char *, const char *, bool); 17365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint test_parse(Test_env *); 17375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int tty_fd I__(-1); /* dup'd tty file descriptor */ 17395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int tty_devtty; /* true if tty_fd is from /dev/tty */ 17405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct termios tty_state; /* saved tty state */ 17415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern void tty_init(bool, bool); 17435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern void tty_close(void); 17445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* be sure not to interfere with anyone else's idea about EXTERN */ 17465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef EXTERN_DEFINED 17475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# undef EXTERN_DEFINED 17485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# undef EXTERN 17495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 17505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef I__ 17515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif /* !MKSH_INCLUDES_ONLY */ 1753