1427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes/* $OpenBSD: sh.h,v 1.33 2013/12/18 13:53:12 millert Exp $ */ 25155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: shf.h,v 1.6 2005/12/11 18:53:51 deraadt Exp $ */ 3c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* $OpenBSD: table.h,v 1.8 2012/02/19 07:52:30 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 $ */ 6811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser/* $OpenBSD: lex.h,v 1.13 2013/03/03 19:11:34 guenther Exp $ */ 7427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes/* $OpenBSD: proto.h,v 1.35 2013/09/04 15:49:19 millert 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/*- 12c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 13427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes * 2011, 2012, 2013, 2014 145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Thorsten Glaser <tg@mirbsd.org> 155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Provided that these terms and disclaimer and all copyright notices 175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * are retained or reproduced in an accompanying document, permission 1803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * is granted to deal in this work without restriction, including un‐ 195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * limited rights to use, publicly perform, distribute, sell, modify, 205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * merge, give away, or sublicence. 215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 2203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to 235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * the utmost extent permitted by applicable law, neither express nor 245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * implied; without malicious intent or gross negligence. In no event 255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * may a licensor, author or contributor be held liable for indirect, 265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * direct, other damage, loss, or other issues arising in any way out 275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of dealing in the work, even if advised of the possibility of such 285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * damage or existence of a defect, except proven that it results out 2903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * of said person’s immediate fault when using the work as intended. 305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef __dietlibc__ 335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* XXX imake style */ 3403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define _BSD_SOURCE /* live, BSD, live❣ */ 355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_PARAM_H 385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/param.h> 395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/types.h> 41c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if HAVE_BOTH_TIME_H 425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/time.h> 43c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#include <time.h> 44c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#elif HAVE_SYS_TIME_H 45c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#include <sys/time.h> 46c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#elif HAVE_TIME_H 47c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#include <time.h> 48c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/ioctl.h> 505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_SYSMACROS_H 515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/sysmacros.h> 525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_MKDEV_H 545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/mkdev.h> 555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_SYS_MMAN_H 575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/mman.h> 585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 59c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if HAVE_SYS_RESOURCE_H 605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/resource.h> 61c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/stat.h> 635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <sys/wait.h> 645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <dirent.h> 655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <errno.h> 665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <fcntl.h> 675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_LIBGEN_H 685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <libgen.h> 695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_LIBUTIL_H 715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <libutil.h> 725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <limits.h> 745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_PATHS_H 755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <paths.h> 765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <pwd.h> 785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <setjmp.h> 795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <signal.h> 805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdarg.h> 815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stddef.h> 825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_STDINT_H 835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdint.h> 845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdio.h> 865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <stdlib.h> 875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <string.h> 885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_STRINGS_H 895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <strings.h> 905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 91c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if HAVE_TERMIOS_H 925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <termios.h> 93c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 94c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* shudder… */ 95c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#include <termio.h> 96c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 97c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef _ISC_UNIX 98c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* XXX imake style */ 99c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#include <sys/sioctl.h> 100c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 1015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ULIMIT_H 1025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <ulimit.h> 1035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <unistd.h> 1055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_VALUES_H 1065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include <values.h> 1075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __attribute__ 1105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_BOUNDED 111427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define MKSH_A_BOUNDED(x,y,z) __attribute__((__bounded__(x, y, z))) 1125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_BOUNDED(x,y,z) /* nothing */ 1145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_FORMAT 116427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define MKSH_A_FORMAT(x,y,z) __attribute__((__format__(x, y, z))) 1175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_FORMAT(x,y,z) /* nothing */ 1195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_NORETURN 12103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define MKSH_A_NORETURN __attribute__((__noreturn__)) 1225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_NORETURN /* nothing */ 1245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 125427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#if HAVE_ATTRIBUTE_PURE 126427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define MKSH_A_PURE __attribute__((__pure__)) 127427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#else 128427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define MKSH_A_PURE /* nothing */ 129427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#endif 1305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_UNUSED 13103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define MKSH_A_UNUSED __attribute__((__unused__)) 1325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_UNUSED /* nothing */ 1345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_ATTRIBUTE_USED 13603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define MKSH_A_USED __attribute__((__used__)) 1375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_A_USED /* nothing */ 1395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(MirBSD) && (MirBSD >= 0x09A1) && \ 1425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru defined(__ELF__) && defined(__GNUC__) && \ 1435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !defined(__llvm__) && !defined(__NWCC__) 1445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * We got usable __IDSTRING __COPYRIGHT __RCSID __SCCSID macros 1465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * which work for all cases; no need to redefine them using the 1475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * "portable" macros from below when we might have the "better" 1485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * gcc+ELF specific macros or other system dependent ones. 1495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 1505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 1515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __IDSTRING 1525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __IDSTRING_CONCAT 1535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __IDSTRING_EXPAND 1545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __COPYRIGHT 1555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __RCSID 1565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef __SCCSID 1575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p 1585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p) 15903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#ifdef MKSH_DONT_EMIT_IDSTRING 16003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define __IDSTRING(prefix, string) /* nothing */ 16103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#else 1625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __IDSTRING(prefix, string) \ 1635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static const char __IDSTRING_EXPAND(__LINE__,prefix) [] \ 1645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_USED = "@(""#)" #prefix ": " string 16503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 1665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __COPYRIGHT(x) __IDSTRING(copyright,x) 1675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __RCSID(x) __IDSTRING(rcsid,x) 1685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define __SCCSID(x) __IDSTRING(sccsid,x) 1695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef EXTERN 172ae04631768fefc45c2d18865ec88872853421a52Elliott Hughes__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.697 2014/10/07 15:22:17 tg Exp $"); 1735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 174ae04631768fefc45c2d18865ec88872853421a52Elliott Hughes#define MKSH_VERSION "R50 2014/10/07" 1755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 176c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* arithmetic types: C implementation */ 177c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_CAN_INTTYPES 178c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_CAN_UCBINTS 179c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef signed int int32_t; 180c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef unsigned int uint32_t; 181c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 182c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef u_int32_t uint32_t; 183c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 184c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 1855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 186c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* arithmetic types: shell arithmetics */ 187c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_LEGACY_MODE 188c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* 189c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * POSIX demands these to be the C environment's long type 190c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 191c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef long mksh_ari_t; 192c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef unsigned long mksh_uari_t; 193c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 194c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* 195c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * These types are exactly 32 bit wide; signed and unsigned 196c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * integer wraparound, even across division and modulo, for 197c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * any shell code using them, is guaranteed. 198c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 199c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef int32_t mksh_ari_t; 200c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef uint32_t mksh_uari_t; 201c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 2025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 203c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* boolean type (no <stdbool.h> deliberately) */ 204c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef unsigned char mksh_bool; 205c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef bool 206c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* false MUST equal the same 0 as written by static storage initialisation */ 207c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef false 208c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef true 209c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* access macros for boolean type */ 210c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define bool mksh_bool 211c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* values must have identity mapping between mksh_bool and short */ 212c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define false 0 213c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define true 1 214c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* make any-type into bool or short */ 215c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define tobool(cond) ((cond) ? true : false) 2165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 217c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* char (octet) type: C implementation */ 218c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_CAN_INT8TYPE 219c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_CAN_UCBINT8 220c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef unsigned char uint8_t; 221c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 222c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef u_int8_t uint8_t; 2235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 224c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 225c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 226c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* other standard types */ 2275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_RLIM_T 229c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef unsigned long rlim_t; 2305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_SIG_T 2335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef sig_t 2345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef void (*sig_t)(int); 2355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 237c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_TYPEDEF_SIG_ATOMIC_T 238c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef MKSH_TYPEDEF_SIG_ATOMIC_T sig_atomic_t; 2395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 241c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_TYPEDEF_SSIZE_T 242c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef MKSH_TYPEDEF_SSIZE_T ssize_t; 2435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 244c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 245c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* un-do vendor damage */ 246c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 247c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef BAD /* AIX defines that somewhere */ 248c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef PRINT /* LynxOS defines that somewhere */ 249c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef flock /* SCO UnixWare defines that to flock64 but ENOENT */ 250c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 251c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 252c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_INCLUDES_ONLY 253c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 254c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* extra types */ 255c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 256c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_GETRUSAGE 257c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef rusage 258c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef RUSAGE_SELF 259c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef RUSAGE_CHILDREN 260c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define rusage mksh_rusage 261c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define RUSAGE_SELF 0 262c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define RUSAGE_CHILDREN -1 263c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 264c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstruct rusage { 265c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser struct timeval ru_utime; 266c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser struct timeval ru_stime; 267c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser}; 2685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* extra macros */ 2715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef timerclear 2735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define timerclear(tvp) \ 2745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { \ 2755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (tvp)->tv_sec = (tvp)->tv_usec = 0; \ 2765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (/* CONSTCOND */ 0) 2775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef timeradd 2795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define timeradd(tvp, uvp, vvp) \ 2805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { \ 2815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 2825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 2835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((vvp)->tv_usec >= 1000000) { \ 2845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec++; \ 2855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec -= 1000000; \ 2865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 2875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (/* CONSTCOND */ 0) 2885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 2895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef timersub 2905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define timersub(tvp, uvp, vvp) \ 2915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { \ 2925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 2935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 2945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((vvp)->tv_usec < 0) { \ 2955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_sec--; \ 2965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vvp)->tv_usec += 1000000; \ 2975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 2985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (/* CONSTCOND */ 0) 2995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isdigit(c) (((c) >= '0') && ((c) <= '9')) 3025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_islower(c) (((c) >= 'a') && ((c) <= 'z')) 3035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isupper(c) (((c) >= 'A') && ((c) <= 'Z')) 3045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_tolower(c) (((c) >= 'A') && ((c) <= 'Z') ? (c) - 'A' + 'a' : (c)) 3055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_toupper(c) (((c) >= 'a') && ((c) <= 'z') ? (c) - 'a' + 'A' : (c)) 306427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define ksh_isdash(s) (((s)[0] == '-') && ((s)[1] == '\0')) 3075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isspace(c) ((((c) >= 0x09) && ((c) <= 0x0D)) || ((c) == 0x20)) 308c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define ksh_min(x,y) ((x) < (y) ? (x) : (y)) 309c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define ksh_max(x,y) ((x) > (y) ? (x) : (y)) 3105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 311c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH__NO_PATH_MAX 3125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef PATH_MAX 3135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 3145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef PATH_MAX 3155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define PATH_MAX 1024 3165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef SIZE_MAX 3195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef SIZE_T_MAX 3205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SIZE_MAX SIZE_T_MAX 3215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 3225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SIZE_MAX ((size_t)-1) 3235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef S_ISLNK 3265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define S_ISLNK(m) ((m & 0170000) == 0120000) 3275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef S_ISSOCK 3295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define S_ISSOCK(m) ((m & 0170000) == 0140000) 3305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 33103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#if !defined(S_ISCDF) && defined(S_CDF) 33203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define S_ISCDF(m) (S_ISDIR(m) && ((m) & S_CDF)) 33303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 3345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef DEFFILEMODE 3355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) 3365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef NSIG 3395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(_NSIG) 3405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NSIG _NSIG 3415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#elif defined(SIGMAX) 3425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NSIG (SIGMAX+1) 343c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#elif defined(_SIGMAX) 344c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define NSIG (_SIGMAX+1) 345427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#else 346427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes# error Please have your platform define NSIG. 347427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define NSIG 64 348427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#endif 3495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 350427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes 351427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes/* get rid of this (and awk/printf(1) in Build.sh) later */ 352427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#if (NSIG < 1) 353427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes# error Your NSIG value is not positive. 354427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#unset NSIG 355427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define NSIG 64 3565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* OS-dependent additions (functions, variables, by OS) */ 3605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_FLOCK_DECL 3625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int flock(int, int); 3635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 365c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_GETTIMEOFDAY 366c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_TIME(tv) do { \ 367c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (tv).tv_usec = 0; \ 368c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (tv).tv_sec = time(NULL); \ 369c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} while (/* CONSTCOND */ 0) 370c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 371c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_TIME(tv) gettimeofday(&(tv), NULL) 372c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 373c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 3745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_GETRUSAGE 3755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int getrusage(int, struct rusage *); 3765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 378c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_MEMMOVE 379c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* we assume either memmove or bcopy exist, at the moment */ 380c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define memmove(dst, src, len) bcopy((src), (dst), (len)) 3815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 383c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !HAVE_REVOKE_DECL 384c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserextern int revoke(const char *); 3855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 387c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if defined(DEBUG) || !HAVE_STRERROR 388811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#undef strerror 389c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define strerror /* poisoned */ dontuse_strerror 390c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define cstrerror /* replaced */ cstrerror 391c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserextern const char *cstrerror(int); 392c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 393c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define cstrerror(errnum) ((const char *)strerror(errnum)) 3945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !HAVE_STRLCPY 3975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t strlcpy(char *, const char *, size_t); 3985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 3995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef __INTERIX 4015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* XXX imake style */ 4025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define makedev mkdev 4035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int __cdecl seteuid(uid_t); 4045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern int __cdecl setegid(gid_t); 4055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 407c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if defined(__COHERENT__) 408c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef O_ACCMODE 409c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* this need not work everywhere, take care */ 410c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) 411c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 412c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 413c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 414427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#ifndef O_BINARY 415427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define O_BINARY 0 416427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#endif 417427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes 418c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH__NO_SYMLINK 419c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef S_ISLNK 420c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define S_ISLNK(m) (/* CONSTCOND */ 0) 421c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_lstat stat 422c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 423c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_lstat lstat 424c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 425c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 426c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if HAVE_TERMIOS_H 427c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_ttyst struct termios 428c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_tcget(fd,st) tcgetattr((fd), (st)) 429c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_tcset(fd,st) tcsetattr((fd), TCSADRAIN, (st)) 430c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 431c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_ttyst struct termio 432c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_tcget(fd,st) ioctl((fd), TCGETA, (st)) 433c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mksh_tcset(fd,st) ioctl((fd), TCSETAW, (st)) 434c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 4355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 436427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#ifndef ISTRIP 437427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define ISTRIP 0 4385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* some useful #defines */ 4425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef EXTERN 44303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra# define E_INIT(i) = i 4445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 44503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra# define E_INIT(i) 4465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# define EXTERN extern 4475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# define EXTERN_DEFINED 4485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 4495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* define bit in flag */ 45103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define BIT(i) (1 << (i)) 4525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define NELEM(a) (sizeof(a) / sizeof((a)[0])) 4535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 45503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Make MAGIC a char that might be printed to make bugs more obvious, but 4565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * not a char that is used often. Also, can't use the high bit as it causes 457c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * portability problems (calling strchr(x, 0x80 | 'x') is error prone). 4585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 4595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MAGIC (7) /* prefix for *?[!{,} during expand */ 4605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ISMAGIC(c) ((unsigned char)(c) == MAGIC) 4615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *safe_prompt; /* safe prompt if PS1 substitution fails */ 463c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 464c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_LEGACY_MODE 465c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define KSH_VERSIONNAME "LEGACY" 466c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 467c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define KSH_VERSIONNAME "MIRBSD" 468c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 469c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN const char initvsn[] E_INIT("KSH_VERSION=@(#)" KSH_VERSIONNAME \ 470c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser " KSH " MKSH_VERSION); 4715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSH_VERSION (initvsn + /* "KSH_VERSION=@(#)" */ 16) 4725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char digits_uc[] E_INIT("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 47403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char digits_lc[] E_INIT("0123456789abcdefghijklmnopqrstuvwxyz"); 4755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 4775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Evil hack for const correctness due to API brokenness 4785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 4795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruunion mksh_cchack { 4805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *rw; 4815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *ro; 4825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 4835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruunion mksh_ccphack { 4845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **rw; 4855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **ro; 4865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 4875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 488811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser/* 489811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser * Evil hack since casting uint to sint is implementation-defined 490811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser */ 491811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glasertypedef union { 492811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser mksh_ari_t i; 493811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser mksh_uari_t u; 494811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser} mksh_ari_u; 495811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 4965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* for const debugging */ 4975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(DEBUG) && defined(__GNUC__) && !defined(__ICC) && \ 4985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !defined(__INTEL_COMPILER) && !defined(__SUNPRO_C) 4995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *ucstrchr(char *, int); 5005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *ucstrstr(char *, const char *); 5015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef strchr 5025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strchr ucstrchr 5035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strstr ucstrstr 5045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrchr(s,c) ({ \ 5055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union mksh_cchack in, out; \ 5065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 5075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru in.ro = (s); \ 5085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru out.rw = ucstrchr(in.rw, (c)); \ 5095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (out.ro); \ 5105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}) 5115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrstr(b,l) ({ \ 5125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union mksh_cchack in, out; \ 5135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 5145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru in.ro = (b); \ 5155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru out.rw = ucstrstr(in.rw, (l)); \ 5165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (out.ro); \ 5175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}) 5185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrchr(s,c) (cstrchr((s), (c)) != NULL) 5195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrstr(b,l) (cstrstr((b), (l)) != NULL) 5205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else /* !DEBUG, !gcc */ 5215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrchr(s,c) ((const char *)strchr((s), (c))) 5225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define cstrstr(s,c) ((const char *)strstr((s), (c))) 5235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrchr(s,c) (strchr((s), (c)) != NULL) 5245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define vstrstr(b,l) (strstr((b), (l)) != NULL) 525c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 526c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 527c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if defined(DEBUG) || defined(__COVERITY__) 528c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mkssert(e) do { if (!(e)) exit(255); } while (/* CONSTCOND */ 0) 529c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef DEBUG_LEAKS 530c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define DEBUG_LEAKS 531c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 532c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 533c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define mkssert(e) do { } while (/* CONSTCOND */ 0) 534c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 535c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 536ae04631768fefc45c2d18865ec88872853421a52Elliott Hughes#if (!defined(MKSH_BUILDMAKEFILE4BSD) && !defined(MKSH_BUILDSH)) || (MKSH_BUILD_R != 504) 537c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#error Must run Build.sh to compile this. 538811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserextern void thiswillneverbedefinedIhope(void); 539c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserint 540c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserim_sorry_dave(void) 541c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser{ 542c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* I’m sorry, Dave. I’m afraid I can’t do that. */ 543c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser return (thiswillneverbedefinedIhope()); 544c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} 5455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 5465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* use this ipv strchr(s, 0) but no side effects in s! */ 5485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strnul(s) ((s) + strlen(s)) 5495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define utf_ptradjx(src, dst) do { \ 5515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (dst) = (src) + utf_ptradj(src); \ 5525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 5535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 554c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if defined(MKSH_SMALL) && !defined(MKSH_SMALL_BUT_FAST) 555c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define strdupx(d, s, ap) do { \ 556c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (d) = strdup_i((s), (ap)); \ 5575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 558c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define strndupx(d, s, n, ap) do { \ 559c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (d) = strndup_i((s), (n), (ap)); \ 5605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 5615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 5625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* be careful to evaluate arguments only once! */ 5635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strdupx(d, s, ap) do { \ 5645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *strdup_src = (s); \ 5655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *strdup_dst = NULL; \ 5665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 5675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strdup_src != NULL) { \ 5685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t strdup_len = strlen(strdup_src) + 1; \ 5695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdup_dst = alloc(strdup_len, (ap)); \ 5705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(strdup_dst, strdup_src, strdup_len); \ 5715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 5725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (d) = strdup_dst; \ 5735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 5745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define strndupx(d, s, n, ap) do { \ 5755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *strdup_src = (s); \ 5765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *strdup_dst = NULL; \ 5775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru \ 5785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strdup_src != NULL) { \ 5795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t strndup_len = (n); \ 5805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdup_dst = alloc(strndup_len + 1, (ap)); \ 5815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(strdup_dst, strdup_src, strndup_len); \ 5825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdup_dst[strndup_len] = '\0'; \ 5835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 5845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (d) = strdup_dst; \ 5855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 5865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 5875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 588c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_LEGACY_MODE 589c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_NO_CMDLINE_EDITING 590c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define MKSH_NO_CMDLINE_EDITING /* defined */ 591c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 592c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_CONSERVATIVE_FDS 593c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define MKSH_CONSERVATIVE_FDS /* defined */ 594c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 595c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#undef MKSH_S_NOVI 596c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define MKSH_S_NOVI 1 5975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 5985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 6005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_CONSERVATIVE_FDS 6015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_CONSERVATIVE_FDS /* defined */ 6025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 6035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_NOPWNAM 6045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_NOPWNAM /* defined */ 6055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 6065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_S_NOVI 6075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_S_NOVI 1 6085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 6095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 6105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_S_NOVI 6125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_S_NOVI 0 6135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 6145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 61503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#if defined(MKSH_NOPROSPECTOFWORK) && !defined(MKSH_UNEMPLOYED) 61603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define MKSH_UNEMPLOYED 1 61703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 61803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 619c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* these shall be smaller than 100 */ 620c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_CONSERVATIVE_FDS 621c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define NUFILE 32 /* Number of user-accessible files */ 622c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define FDBASE 10 /* First file usable by Shell */ 623c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 624c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define NUFILE 56 /* Number of user-accessible files */ 625c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define FDBASE 24 /* First file usable by Shell */ 626c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 627c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 6285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * simple grouping allocator 6305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 63203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 63303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 0. OS API: where to get memory from and how to free it (grouped) */ 63403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 63503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* malloc(3)/realloc(3) -> free(3) for use by the memory allocator */ 63603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define malloc_osi(sz) malloc(sz) 63703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define realloc_osi(p,sz) realloc((p), (sz)) 63803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define free_osimalloc(p) free(p) 63903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 64003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* malloc(3)/realloc(3) -> free(3) for use by mksh code */ 64103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define malloc_osfunc(sz) malloc(sz) 64203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define realloc_osfunc(p,sz) realloc((p), (sz)) 64303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define free_osfunc(p) free(p) 64403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 64503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#if HAVE_MKNOD 64603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* setmode(3) -> free(3) */ 64703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define free_ossetmode(p) free(p) 64803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 64903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 650c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH__NO_PATH_MAX 65103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* GNU libc: get_current_dir_name(3) -> free(3) */ 65203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define free_gnu_gcdn(p) free(p) 65303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 65403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 65503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 6565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1. internal structure */ 6575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct lalloc { 6585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct lalloc *next; 6595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 6605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 2. sizes */ 6625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALLOC_ITEM struct lalloc 6635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALLOC_SIZE (sizeof(ALLOC_ITEM)) 6645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 3. group structure (only the same for lalloc.c) */ 6665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct lalloc Area; 6675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Area aperm; /* permanent object space */ 6705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define APERM &aperm 6715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ATEMP &e->area 6725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * flags (the order of these enums MUST match the order in misc.c(options[])) 6755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum sh_flag { 6775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHFLAGS_ENUMS 678427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#include "sh_flags.gen" 6795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru FNFLAGS /* (place holder: how many flags are there) */ 6805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 6815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 68203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Flag(f) (shell_flags[(int)(f)]) 6835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UTFMODE Flag(FUNICODE) 6845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * parsing & execution environment 687c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * 688c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * note that kshlongjmp MUST NOT be passed 0 as second argument! 6895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 690c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_NO_SIGSETJMP 691c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define kshjmp_buf jmp_buf 692c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define kshsetjmp(jbuf) _setjmp(jbuf) 693c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define kshlongjmp _longjmp 694c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#else 695c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define kshjmp_buf sigjmp_buf 696c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define kshsetjmp(jbuf) sigsetjmp((jbuf), 0) 697c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define kshlongjmp siglongjmp 698c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 699c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 700c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstruct sretrace_info; 701c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstruct yyrecursive_state; 702c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 703c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN struct sretrace_info *retrace_info E_INIT(NULL); 704c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN int subshell_nesting_type E_INIT(0); 705c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 7065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern struct env { 70703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ALLOC_ITEM alloc_INT; /* internal, do not touch */ 7085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area area; /* temporary allocation area */ 7095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct env *oenv; /* link to previous environment */ 7105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct block *loc; /* local variables and functions */ 7115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short *savefd; /* original redirected fds */ 7125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct temp *temps; /* temp files */ 713c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* saved parser recursion state */ 714c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser struct yyrecursive_state *yyrecursive_statep; 715c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser kshjmp_buf jbuf; /* long jump back to env creator */ 716c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser uint8_t type; /* environment type - see below */ 717c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser uint8_t flags; /* EF_* */ 7185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} *e; 7195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* struct env.type values */ 7215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_NONE 0 /* dummy environment */ 7225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_PARSE 1 /* parsing command # */ 7235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_FUNC 2 /* executing function # */ 7245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_INCL 3 /* including a file via . # */ 7255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_EXEC 4 /* executing command tree */ 7265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_LOOP 5 /* executing for/while # */ 7275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_ERRH 6 /* general error handler # */ 728c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define E_GONE 7 /* hidden in child */ 7295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* # indicates env has valid jbuf (see unwind()) */ 7305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* struct env.flag values */ 7325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EF_BRKCONT_PASS BIT(1) /* set if E_LOOP must pass break/continue on */ 7335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EF_FAKE_SIGDIE BIT(2) /* hack to get info from unwind to quitenv */ 7345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Do breaks/continues stop at env type e? */ 736c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define STOP_BRKCONT(t) ((t) == E_NONE || (t) == E_PARSE || \ 737c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (t) == E_FUNC || (t) == E_INCL) 7385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Do returns stop at env type e? */ 7395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define STOP_RETURN(t) ((t) == E_FUNC || (t) == E_INCL) 7405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 741c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* values for kshlongjmp(e->jbuf, i) */ 742c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* note that i MUST NOT be zero */ 7435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LRETURN 1 /* return statement */ 7445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LEXIT 2 /* exit statement */ 7455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LERROR 3 /* errorf() called */ 7465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LLEAVE 4 /* untrappable exit/error */ 7475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LINTR 5 /* ^C noticed */ 7485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LBREAK 6 /* break statement */ 7495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LCONTIN 7 /* continue statement */ 7505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LSHELL 8 /* return to interactive shell() */ 7515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LAEXPR 9 /* error in arithmetic expression */ 7525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 75303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* sort of shell global state */ 75403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN pid_t procpid; /* PID of executing process */ 75503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN int exstat; /* exit status */ 75603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN int subst_exstat; /* exit status of last $(..)/`..` */ 75703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN struct tbl *vp_pipest; /* global PIPESTATUS array */ 75803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN short trap_exstat; /* exit status before running a trap */ 75903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN uint8_t trap_nested; /* running nested traps */ 76003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN uint8_t shell_flags[FNFLAGS]; 76103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char *kshname; /* $0 */ 76203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN struct { 76303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra uid_t kshuid_v; /* real UID of shell */ 76403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra uid_t ksheuid_v; /* effective UID of shell */ 76503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra gid_t kshgid_v; /* real GID of shell */ 76603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra gid_t kshegid_v; /* effective GID of shell */ 76703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra pid_t kshpgrp_v; /* process group of shell */ 76803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra pid_t kshppid_v; /* PID of parent of shell */ 76903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra pid_t kshpid_v; /* $$, shell PID */ 77003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra} rndsetupstate; 77103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 77203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define kshpid rndsetupstate.kshpid_v 77303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define kshpgrp rndsetupstate.kshpgrp_v 77403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define kshuid rndsetupstate.kshuid_v 77503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define ksheuid rndsetupstate.ksheuid_v 77603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define kshgid rndsetupstate.kshgid_v 77703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define kshegid rndsetupstate.kshegid_v 77803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define kshppid rndsetupstate.kshppid_v 7795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* option processing */ 7825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_CMDLINE 0x01 /* command line */ 7835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_SET 0x02 /* set builtin */ 7845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_SPECIAL 0x04 /* a special variable changing */ 7855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_INTERNAL 0x08 /* set internally by shell */ 7865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_FIRSTTIME 0x10 /* as early as possible, once */ 7875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OF_ANY (OF_CMDLINE | OF_SET | OF_SPECIAL | OF_INTERNAL) 7885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 78903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* null value for variable; comparison pointer for unset */ 79003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN char null[] E_INIT(""); 7915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* helpers for string pooling */ 79203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char Tintovfl[] E_INIT("integer overflow %zu %c %zu prevented"); 793811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten GlaserEXTERN const char Toomem[] E_INIT("can't allocate %zu data bytes"); 79403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#if defined(__GNUC__) 79503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* trust this to have string pooling; -Wformat bitches otherwise */ 79603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Tsynerr "syntax error" 79703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#else 79803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char Tsynerr[] E_INIT("syntax error"); 79903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 80003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char Tselect[] E_INIT("select"); 80103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char Tr_fc_e_dash[] E_INIT("r=fc -e -"); 80203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Tfc_e_dash (Tr_fc_e_dash + 2) /* "fc -e -" */ 80303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Zfc_e_dash 7 /* strlen(Tfc_e_dash) */ 80403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char Tlocal_typeset[] E_INIT("local=typeset"); 80503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define T_typeset (Tlocal_typeset + 5) /* "=typeset" */ 80603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Ttypeset (Tlocal_typeset + 6) /* "typeset" */ 807811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten GlaserEXTERN const char Talias[] E_INIT("alias"); 808811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten GlaserEXTERN const char Tunalias[] E_INIT("unalias"); 80903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char Tsgset[] E_INIT("*=set"); 81003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Tset (Tsgset + 2) /* "set" */ 811c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN const char Tsgunset[] E_INIT("*=unset"); 812c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define Tunset (Tsgunset + 2) /* "unset" */ 813c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN const char Tsgexport[] E_INIT("*=export"); 814c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define Texport (Tsgexport + 2) /* "export" */ 815c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN const char Tsgreadonly[] E_INIT("*=readonly"); 816c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define Treadonly (Tsgreadonly + 2) /* "readonly" */ 81703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char Tgbuiltin[] E_INIT("=builtin"); 81803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Tbuiltin (Tgbuiltin + 1) /* "builtin" */ 81903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN const char T_function[] E_INIT(" function"); 82003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define Tfunction (T_function + 1) /* "function" */ 821c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN const char TC_LEX1[] E_INIT("|&;<>() \t\n"); 822c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define TC_IFSWS (TC_LEX1 + 7) /* space tab newline */ 823c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 824c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef uint8_t Temp_type; 825c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* expanded heredoc */ 826c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define TT_HEREDOC_EXP 0 827c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* temporary file used for history editing (fc -e) */ 828c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define TT_HIST_EDIT 1 829c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* temporary file used during in-situ command substitution */ 830c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define TT_FUNSUB 2 8315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* temp/heredoc files. The file is removed when the struct is freed. */ 8335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct temp { 8345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct temp *next; 8355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct shf *shf; 836c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* pid of process parsed here-doc */ 837c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser pid_t pid; 8385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Temp_type type; 839c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* actually longer: name (variable length) */ 840c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char tffn[3]; 8415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 8425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * stdio and our IO routines 8455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 847811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define shl_xtrace (&shf_iob[0]) /* for set -x */ 8485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shl_stdout (&shf_iob[1]) 8495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shl_out (&shf_iob[2]) 850c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef DF 851c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define shl_dbg (&shf_iob[3]) /* for DF() */ 852c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 85303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN bool shl_stdout_ok; 8545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * trap handlers 8575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct trap { 8595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *name; /* short name */ 8605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *mess; /* descriptive name */ 8615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *trap; /* trap command */ 8625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sig_t cursig; /* current handler (valid if TF_ORIG_* set) */ 8635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sig_t shtrap; /* shell signal handler */ 8645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int signal; /* signal number */ 8655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* TF_* */ 8665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru volatile sig_atomic_t set; /* trap pending */ 8675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Trap; 8685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for Trap.flags */ 8705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_SHELL_USES BIT(0) /* shell uses signal, user can't change */ 8715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_USER_SET BIT(1) /* user has (tried to) set trap */ 8725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_ORIG_IGN BIT(2) /* original action was SIG_IGN */ 8735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_ORIG_DFL BIT(3) /* original action was SIG_DFL */ 8745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_EXEC_IGN BIT(4) /* restore SIG_IGN just before exec */ 8755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_EXEC_DFL BIT(5) /* restore SIG_DFL just before exec */ 8765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_DFL_INTR BIT(6) /* when received, default action is LINTR */ 8775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_TTY_INTR BIT(7) /* tty generated signal (see j_waitj) */ 8785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_CHANGED BIT(8) /* used by runtrap() to detect trap changes */ 8795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TF_FATAL BIT(9) /* causes termination if not trapped */ 8805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for setsig()/setexecsig() flags argument */ 8825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_MASK 0x3 /* how to restore a signal before an exec() */ 8835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_CURR 0 /* leave current handler in place */ 8845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_ORIG 1 /* restore original handler */ 8855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_DFL 2 /* restore to SIG_DFL */ 8865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_RESTORE_IGN 3 /* restore to SIG_IGN */ 8875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_FORCE BIT(3) /* set signal even if original signal ignored */ 8885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_USER BIT(4) /* user is doing the set (ie, trap command) */ 8895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SS_SHTRAP BIT(5) /* trap for internal use (ALRM, CHLD, WINCH) */ 8905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 89103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define ksh_SIGEXIT 0 /* for trap EXIT */ 89203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define ksh_SIGERR NSIG /* for trap ERR */ 8935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN volatile sig_atomic_t trap; /* traps pending? */ 8955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN volatile sig_atomic_t intrsig; /* pending trap interrupts command */ 89603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN volatile sig_atomic_t fatal_trap; /* received a fatal signal */ 8975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern Trap sigtraps[NSIG+1]; 8985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* got_winch = 1 when we need to re-adjust the window size */ 9005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef SIGWINCH 90103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN volatile sig_atomic_t got_winch E_INIT(1); 9025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 9035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define got_winch true 9045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * TMOUT support 9085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 9095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for ksh_tmout_state */ 9105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum tmout_enum { 9115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TMOUT_EXECUTING = 0, /* executing commands */ 9125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TMOUT_READING, /* waiting for input */ 9135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TMOUT_LEAVING /* have timed out */ 9145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 9155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN unsigned int ksh_tmout; 91603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN enum tmout_enum ksh_tmout_state E_INIT(TMOUT_EXECUTING); 9175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* For "You have stopped jobs" message */ 919c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN bool really_exit; 9205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * fast character classes 9235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 9245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_ALPHA BIT(0) /* a-z_A-Z */ 9255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_DIGIT BIT(1) /* 0-9 */ 9265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_LEX1 BIT(2) /* \t \n\0|&;<>() */ 9275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_VAR1 BIT(3) /* *@#!$-? */ 9285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_IFSWS BIT(4) /* \t \n (IFS white space) */ 9295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_SUBOP1 BIT(5) /* "=-+?" */ 9305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_QUOTE BIT(6) /* \t\n "#$&'()*;<=>?[\]`| (needing quoting) */ 9315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_IFS BIT(7) /* $IFS */ 9325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_SUBOP2 BIT(8) /* "#%" (magic, see below) */ 9335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern unsigned char chtypes[]; 9355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 93603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define ctype(c, t) tobool( ((t) == C_SUBOP2) ? \ 9375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (((c) == '#' || (c) == '%') ? 1 : 0) : \ 93803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra (chtypes[(unsigned char)(c)] & (t)) ) 9395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isalphx(c) ctype((c), C_ALPHA) 9405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ksh_isalnux(c) ctype((c), C_ALPHA | C_DIGIT) 9415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 94203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN int ifs0 E_INIT(' '); /* for "$*" */ 9435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Argument parsing for built-in commands and getopts command */ 9455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Values for Getopt.flags */ 9475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GF_ERROR BIT(0) /* call errorf() if there is an error */ 9485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GF_PLUSOPT BIT(1) /* allow +c as an option */ 9495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GF_NONAME BIT(2) /* don't print argv[0] in errors */ 9505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Values for Getopt.info */ 9525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GI_MINUS BIT(0) /* an option started with -... */ 9535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GI_PLUS BIT(1) /* an option started with +... */ 9545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define GI_MINUSMINUS BIT(2) /* arguments were ended with -- */ 9555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 95603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* in case some OS defines these */ 95703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#undef optarg 95803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#undef optind 95903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 9605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct { 96103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra const char *optarg; 96203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int optind; 96303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int uoptind; /* what user sees in $OPTIND */ 96403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int flags; /* see GF_* */ 96503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int info; /* see GI_* */ 96603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra unsigned int p; /* 0 or index into argv[optind - 1] */ 96703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char buf[2]; /* for bad option OPTARG value */ 9685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Getopt; 9695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Getopt builtin_opt; /* for shell builtin commands */ 9715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Getopt user_opt; /* parsing state for getopts builtin command */ 9725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* This for co-processes */ 9745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 97503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* something that won't (realisticly) wrap */ 97603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condratypedef int32_t Coproc_id; 97703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 9785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct coproc { 9795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru void *job; /* 0 or job of co-process using input pipe */ 9805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int read; /* pipe from co-process's stdout */ 9815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int readw; /* other side of read (saved temporarily) */ 9825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int write; /* pipe to co-process's stdin */ 9835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int njobs; /* number of live jobs using output pipe */ 9845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Coproc_id id; /* id of current output pipe */ 9855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 9865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct coproc coproc; 9875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 98803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#ifndef MKSH_NOPROSPECTOFWORK 98903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* used in jobs.c and by coprocess stuff in exec.c and select() calls */ 9905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN sigset_t sm_default, sm_sigchld; 99103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 9925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* name of called builtin function (used by error functions) */ 9945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *builtin_argv0; 99503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* flags of called builtin (SPEC_BI, etc.) */ 99603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN uint32_t builtin_flag; 9975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 99803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* current working directory */ 9995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char *current_wd; 10005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1001811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser/* input line size */ 1002811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define LINE (4096 - ALLOC_SIZE) 100303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 100403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Minimum required space to work with on a line - if the prompt leaves 100503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * less space than this on a line, the prompt is truncated. 10065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MIN_EDIT_SPACE 7 100803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 100903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Minimum allowed value for x_cols: 2 for prompt, 3 for " < " at end of line 10105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MIN_COLS (2 + MIN_EDIT_SPACE + 3) 10125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MIN_LINS 3 101303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN mksh_ari_t x_cols E_INIT(80); /* tty columns */ 1014c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN mksh_ari_t x_lins E_INIT(24); /* tty lines */ 10155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 101603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 10175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Determine the location of the system (common) profile */ 101803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 1019c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_DEFAULT_PROFILEDIR 102003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#if defined(ANDROID) 1021c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define MKSH_DEFAULT_PROFILEDIR "/system/etc" 102203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#else 1023c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define MKSH_DEFAULT_PROFILEDIR "/etc" 1024c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 102503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 102603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 1027c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define MKSH_SYSTEM_PROFILE MKSH_DEFAULT_PROFILEDIR "/profile" 1028c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define MKSH_SUID_PROFILE MKSH_DEFAULT_PROFILEDIR "/suid_profile" 102903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 10305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Used by v_evaluate() and setstr() to control action when error occurs */ 1032c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define KSH_UNWIND_ERROR 0 /* unwind the stack (kshlongjmp) */ 10335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSH_RETURN_ERROR 1 /* return 1/0 for success/failure */ 10345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 10365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Shell file I/O routines 10375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 103903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define SHF_BSIZE 512 10405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 104103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define shf_fileno(shf) ((shf)->fd) 10425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_setfileno(shf,nfd) ((shf)->fd = (nfd)) 1043c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define shf_getc_i(shf) ((shf)->rnleft > 0 ? \ 10445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (shf)->rnleft--, *(shf)->rp++ : \ 10455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_getchar(shf)) 1046c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define shf_putc_i(c, shf) ((shf)->wnleft == 0 ? \ 10475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_putchar((c), (shf)) : \ 10485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ((shf)->wnleft--, *(shf)->wp++ = (c))) 10495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_eof(shf) ((shf)->flags & SHF_EOF) 10505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_error(shf) ((shf)->flags & SHF_ERROR) 105103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define shf_errno(shf) ((shf)->errnosv) 10525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define shf_clearerr(shf) ((shf)->flags &= ~(SHF_EOF | SHF_ERROR)) 10535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Flags passed to shf_*open() */ 10555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_RD 0x0001 10565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_WR 0x0002 10575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_RDWR (SHF_RD|SHF_WR) 10585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ACCMODE 0x0003 /* mask */ 10595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_GETFL 0x0004 /* use fcntl() to figure RD/WR flags */ 10605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_UNBUF 0x0008 /* unbuffered I/O */ 10615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_CLEXEC 0x0010 /* set close on exec flag */ 10625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_MAPHI 0x0020 /* make fd > FDBASE (and close orig) 10635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * (shf_open() only) */ 10645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_DYNAMIC 0x0040 /* string: increase buffer as needed */ 10655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_INTERRUPT 0x0080 /* EINTR in read/write causes error */ 10665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Flags used internally */ 10675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_STRING 0x0100 /* a string, not a file */ 10685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ALLOCS 0x0200 /* shf and shf->buf were alloc()ed */ 10695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ALLOCB 0x0400 /* shf->buf was alloc()ed */ 10705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_ERROR 0x0800 /* read()/write() error */ 10715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_EOF 0x1000 /* read eof (sticky) */ 10725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_READING 0x2000 /* currently reading: rnleft,rp valid */ 10735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SHF_WRITING 0x4000 /* currently writing: wnleft,wp valid */ 10745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf { 10775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; /* area shf/buf were allocated in */ 10785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *rp; /* read: current position in buffer */ 10795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *wp; /* write: current position in buffer */ 10805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf; /* buffer */ 108103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t bsize; /* actual size of buf */ 108203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t rbsize; /* size of buffer (1 if SHF_UNBUF) */ 108303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t rnleft; /* read: how much data left in buffer */ 108403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t wbsize; /* size of buffer (0 if SHF_UNBUF) */ 108503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t wnleft; /* write: how much space left in buffer */ 10865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* see SHF_* */ 10875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int fd; /* file descriptor */ 108803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int errnosv; /* saved value of errno after error */ 10895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern struct shf shf_iob[]; 10925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct table { 10945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; /* area to allocate entries */ 10955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl **tbls; /* hashed table items */ 109603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t nfree; /* free table entries */ 109703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra uint8_t tshift; /* table size (2^tshift) */ 10985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 110003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* table item */ 110103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastruct tbl { 110203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Area to allocate from */ 110303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra Area *areap; 110403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* value */ 11055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 110603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char *s; /* string */ 110703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra mksh_ari_t i; /* integer */ 110803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra mksh_uari_t u; /* unsigned integer */ 110903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int (*f)(const char **); /* built-in command */ 111003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra struct op *t; /* "function" tree */ 111103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } val; 11125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 11135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *array; /* array values */ 11145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *fpath; /* temporary path to undef function */ 11155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u; 11165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 111703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int field; /* field with for -L/-R/-Z */ 111803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int errnov; /* CEXEC/CTALIAS */ 11195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u2; 11205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 11215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uint32_t hval; /* hash(name) */ 11225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru uint32_t index; /* index for an array */ 11235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } ua; 112403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 112503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * command type (see below), base (if INTEGER), 112603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * offset from val.s of value (if EXPORT) 112703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 112803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int type; 112903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* flags (see below) */ 113003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra uint32_t flag; 113103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 113203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* actually longer: name (variable length) */ 113303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char name[4]; 11345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 11355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1136c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN struct tbl vtemp; 1137c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 11385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* common flag bits */ 11395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALLOC BIT(0) /* val.s has been allocated */ 11405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DEFINED BIT(1) /* is defined in block */ 11415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ISSET BIT(2) /* has value, vp->val.[si] */ 11425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPORT BIT(3) /* exported variable/function */ 11435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TRACE BIT(4) /* var: user flagged, func: execution tracing */ 11445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* (start non-common flags at 8) */ 11455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* flag bits used for variables */ 11465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SPECIAL BIT(8) /* PATH, IFS, SECONDS, etc */ 11475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INTEGER BIT(9) /* val.i contains integer value */ 11485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define RDONLY BIT(10) /* read-only variable */ 11495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOCAL BIT(11) /* for local typeset() */ 11505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ARRAY BIT(13) /* array */ 11515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LJUST BIT(14) /* left justify */ 11525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define RJUST BIT(15) /* right justify */ 11535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ZEROFIL BIT(16) /* 0 filled if RJUSTIFY, strip 0s if LJUSTIFY */ 11545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LCASEV BIT(17) /* convert to lower case */ 11555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UCASEV_AL BIT(18) /* convert to upper case / autoload function */ 11565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INT_U BIT(19) /* unsigned integer */ 115703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define INT_L BIT(20) /* long integer (no-op but used as magic) */ 11585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IMPORT BIT(21) /* flag to typeset(): no arrays, must have = */ 11595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOCAL_COPY BIT(22) /* with LOCAL - copy attrs from existing var */ 11605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPRINEVAL BIT(23) /* contents currently being evaluated */ 11615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPRLVALUE BIT(24) /* useable as lvalue (temp flag) */ 11625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AINDEX BIT(25) /* array index >0 = ua.index filled in */ 11635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ASSOC BIT(26) /* ARRAY ? associative : reference */ 11645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* flag bits used for taliases/builtins/aliases/keywords/functions */ 11655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KEEPASN BIT(8) /* keep command assignments (eg, var=x cmd) */ 11665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FINUSE BIT(9) /* function being executed */ 11675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FDELETE BIT(10) /* function deleted while it was executing */ 11685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FKSH BIT(11) /* function defined with function x (vs x()) */ 11695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SPEC_BI BIT(12) /* a POSIX special builtin */ 117003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 117103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Attributes that can be set by the user (used to decide if an unset 117203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * param should be repoted by set/typeset). Does not include ARRAY or 117303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * LOCAL. 11745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 11755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define USERATTRIB (EXPORT|INTEGER|RDONLY|LJUST|RJUST|ZEROFIL|\ 11765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru LCASEV|UCASEV_AL|INT_U|INT_L) 11775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define arrayindex(vp) ((unsigned long)((vp)->flag & AINDEX ? \ 11795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (vp)->ua.index : 0)) 11805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1181427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesenum namerefflag { 118203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra SRF_NOP, 118303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra SRF_ENABLE, 118403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra SRF_DISABLE 1185427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes}; 118603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 11875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* command types */ 11885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CNONE 0 /* undefined */ 11895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CSHELL 1 /* built-in */ 11905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CFUNC 2 /* function */ 11915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CEXEC 4 /* executable command */ 11925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CALIAS 5 /* alias */ 11935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CKEYWD 6 /* keyword */ 11945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CTALIAS 7 /* tracked alias */ 11955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Flags for findcom()/comexec() */ 11975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FC_SPECBI BIT(0) /* special builtin */ 1198811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define FC_FUNC BIT(1) /* function */ 1199811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define FC_NORMBI BIT(2) /* not special builtin */ 1200811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define FC_BI (FC_SPECBI | FC_NORMBI) 1201811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define FC_PATH BIT(3) /* do path search */ 1202811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define FC_DEFPATH BIT(4) /* use default path in path search */ 12035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AF_ARGV_ALLOC 0x1 /* argv[] array allocated */ 12065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AF_ARGS_ALLOCED 0x2 /* argument strings allocated */ 12075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AI_ARGV(a, i) ((i) == 0 ? (a).argv[0] : (a).argv[(i) - (a).skip]) 120803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define AI_ARGC(a) ((a).ai_argc - (a).skip) 12095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Argument info. Used for $#, $* for shell, functions, includes, etc. */ 12115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct arg_info { 12125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **argv; 12135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* AF_* */ 121403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int ai_argc; 12155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int skip; /* first arg is argv[0], second is argv[1 + skip] */ 12165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 12175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 12195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * activation record for function blocks 12205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct block { 12225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area area; /* area to allocate things */ 12235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **argv; 12245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *error; /* error handler */ 12255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *exit; /* exit handler */ 12265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct block *next; /* enclosing block */ 12275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct table vars; /* local variables */ 12285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct table funs; /* local functions */ 12295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Getopt getopts_state; 12305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int argc; 12315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* see BF_* */ 12325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 12335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Values for struct block.flags */ 12355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define BF_DOGETOPTS BIT(0) /* save/restore getopts state */ 12365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 12385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Used by ktwalk() and ktnext() routines. 12395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tstate { 12415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl **next; 12425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ssize_t left; 12435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 12445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table taliases; /* tracked aliases */ 12465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table builtins; /* built-in commands */ 12475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table aliases; /* aliases */ 12485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table keywords; /* keywords */ 12495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_NOPWNAM 12505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct table homedirs; /* homedir() cache */ 12515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 12525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct builtin { 12545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *name; 12555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int (*func)(const char **); 12565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 12575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruextern const struct builtin mkshbuiltins[]; 12595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values for set_prompt() */ 12615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define PS1 0 /* command */ 12625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define PS2 1 /* command continuation */ 12635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char *path; /* copy of either PATH or def_path */ 12655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *def_path; /* path to use if PATH not set */ 12665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN char *tmpdir; /* TMPDIR value */ 12675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN const char *prompt; 12685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int cur_prompt; /* PS1 or PS2 */ 12695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN int current_lineno; /* LINENO value */ 12705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 12725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Description of a command or an operation on commands. 12735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct op { 12755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **args; /* arguments to a command */ 12765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **vars; /* variable assignments */ 12775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct ioword **ioact; /* IO actions (eg, < > >>) */ 12785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct op *left, *right; /* descendents */ 12795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *str; /* word for case; identifier for for, 12805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * select, and functions; 12815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * path to execute for TEXEC; 12825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * time hook for TCOM. 12835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int lineno; /* TCOM/TFUNC: LINENO for this */ 12855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short type; /* operation type, see below */ 128603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* WARNING: newtp(), tcopy() use evalflags = 0 to clear union */ 128703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra union { 128803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* TCOM: arg expansion eval() flags */ 128903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra short evalflags; 129003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* TFUNC: function x (vs x()) */ 129103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra short ksh_func; 129203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* TPAT: termination character */ 129303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char charflag; 12945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u; 12955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 12965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Tree.type values */ 12985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEOF 0 12995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TCOM 1 /* command */ 13005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TPAREN 2 /* (c-list) */ 13015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TPIPE 3 /* a | b */ 13025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TLIST 4 /* a ; b */ 13035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TOR 5 /* || */ 13045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TAND 6 /* && */ 13055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TBANG 7 /* ! */ 13065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TDBRACKET 8 /* [[ .. ]] */ 13075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TFOR 9 13085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TSELECT 10 13095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TCASE 11 13105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TIF 12 13115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TWHILE 13 13125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TUNTIL 14 13135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TELIF 15 13145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TPAT 16 /* pattern in case */ 13155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TBRACE 17 /* {c-list} */ 13165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TASYNC 18 /* c & */ 13175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TFUNCT 19 /* function name { command; } */ 13185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TTIME 20 /* time pipeline */ 13195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEXEC 21 /* fork/exec eval'd TCOM */ 13205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TCOPROC 22 /* coprocess |& */ 13215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 13235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * prefix codes for words in command tree 13245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EOS 0 /* end of string */ 13265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CHAR 1 /* unquoted character */ 13275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define QCHAR 2 /* quoted character */ 13285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define COMSUB 3 /* $() substitution (0 terminated) */ 13295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EXPRSUB 4 /* $(()) substitution (0 terminated) */ 13305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OQUOTE 5 /* opening " or ' */ 13315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CQUOTE 6 /* closing " or ' */ 13325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OSUBST 7 /* opening ${ subst (followed by { or X) */ 13335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CSUBST 8 /* closing } of above (followed by } or X) */ 13345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define OPAT 9 /* open pattern: *(, @(, etc. */ 13355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SPAT 10 /* separate pattern: | */ 13365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CPAT 11 /* close pattern: ) */ 13375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ADELIM 12 /* arbitrary delimiter: ${foo:2:3} ${foo/bar/baz} */ 1338c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define FUNSUB 14 /* ${ foo;} substitution (NUL terminated) */ 1339811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define VALSUB 15 /* ${|foo;} substitution (NUL terminated) */ 13405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 13425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * IO redirection 13435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct ioword { 134503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int unit; /* unit affected */ 134603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int flag; /* action (below) */ 134703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char *name; /* file name (unused if heredoc) */ 134803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char *delim; /* delimiter for <<,<<- */ 134903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char *heredoc; /* content of heredoc */ 13505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 13515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* ioword.flag - type of redirection */ 135303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOTYPE 0xF /* type: bits 0:3 */ 135403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOREAD 0x1 /* < */ 135503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOWRITE 0x2 /* > */ 135603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IORDWR 0x3 /* <>: todo */ 135703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOHERE 0x4 /* << (here file) */ 135803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOCAT 0x5 /* >> */ 135903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IODUP 0x6 /* <&/>& */ 136003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOEVAL BIT(4) /* expand in << */ 136103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOSKIP BIT(5) /* <<-, skip ^\t* */ 136203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOCLOB BIT(6) /* >|, override -o noclobber */ 136303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IORDUP BIT(7) /* x<&y (as opposed to x>&y) */ 136403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IONAMEXP BIT(8) /* name has been expanded */ 136503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOBASH BIT(9) /* &> etc. */ 136603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IOHERESTR BIT(10) /* <<< (here string) */ 136703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define IONDELIM BIT(11) /* null delimiter (<<) */ 13685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* execute/exchild flags */ 13705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XEXEC BIT(0) /* execute without forking */ 13715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFORK BIT(1) /* fork before executing */ 13725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XBGND BIT(2) /* command & */ 13735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPIPEI BIT(3) /* input is pipe */ 13745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPIPEO BIT(4) /* output is pipe */ 13755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XXCOM BIT(5) /* `...` command */ 13765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPCLOSE BIT(6) /* exchild: close close_fd in parent */ 13775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCCLOSE BIT(7) /* exchild: close close_fd in child */ 13785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XERROK BIT(8) /* non-zero exit ok (for set -e) */ 13795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCOPROC BIT(9) /* starting a co-process */ 13805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XTIME BIT(10) /* timing TCOM command */ 138103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define XPIPEST BIT(11) /* want PIPESTATUS */ 13825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 13845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * flags to control expansion of words (assumed by t->evalflags to fit 13855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * in a short) 13865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOBLANK BIT(0) /* perform blank interpretation */ 13885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOGLOB BIT(1) /* expand [?* */ 13895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOPAT BIT(2) /* quote *?[ */ 13905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOTILDE BIT(3) /* normal ~ expansion (first char) */ 13915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DONTRUNCOMMAND BIT(4) /* do not run $(command) things */ 13925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOASNTILDE BIT(5) /* assignment ~ expansion (after =, :) */ 139303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define DOBRACE BIT(6) /* used by expand(): do brace expansion */ 139403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define DOMAGIC BIT(7) /* used by expand(): string contains MAGIC */ 139503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define DOTEMP BIT(8) /* dito: in word part of ${..[%#=?]..} */ 13965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOVACHECK BIT(9) /* var assign check (for typeset, set, etc) */ 13975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DOMARKDIRS BIT(10) /* force markdirs behaviour */ 1398c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define DOTCOMEXEC BIT(11) /* not an eval flag, used by sh -c hack */ 1399b4542e99ca8562aa584e15df8ef35356ff8c10feElliott Hughes#define DOASNFIELD BIT(12) /* is assignment, change field handling */ 14005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 140103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define X_EXTRA 20 /* this many extra bytes in X string */ 14025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct XString { 14045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *end, *beg; /* end, begin of string */ 14055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t len; /* length */ 14065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; /* area to allocate/free from */ 14075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} XString; 14085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef char *XStringP; 14105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* initialise expandable string */ 14125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XinitN(xs, length, area) do { \ 14135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).len = (length); \ 14145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).areap = (area); \ 14155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).beg = alloc((xs).len + X_EXTRA, (xs).areap); \ 14165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xs).end = (xs).beg + (xs).len; \ 14175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 14185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xinit(xs, xp, length, area) do { \ 14195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XinitN((xs), (length), (area)); \ 14205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (xp) = (xs).beg; \ 14215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 14225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* stuff char into string */ 14245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xput(xs, xp, c) (*xp++ = (c)) 14255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* check if there are at least n bytes left */ 14275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XcheckN(xs, xp, n) do { \ 142803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t more = ((xp) + (n)) - (xs).end; \ 14295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (more > 0) \ 1430427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes (xp) = Xcheck_grow(&(xs), (xp), (size_t)more); \ 14315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 14325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* check for overflow, expand string */ 14345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xcheck(xs, xp) XcheckN((xs), (xp), 1) 14355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* free string */ 14375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xfree(xs, xp) afree((xs).beg, (xs).areap) 14385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* close, return string */ 14405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xclose(xs, xp) aresize((xs).beg, (xp) - (xs).beg, (xs).areap) 14415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* begin of string */ 14435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xstring(xs, xp) ((xs).beg) 14445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xnleft(xs, xp) ((xs).end - (xp)) /* may be less than 0 */ 14465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xlength(xs, xp) ((xp) - (xs).beg) 14475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xsize(xs, xp) ((xs).end - (xs).beg) 14485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xsavepos(xs, xp) ((xp) - (xs).beg) 14495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Xrestpos(xs, xp, n) ((xs).beg + (n)) 14505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1451c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserchar *Xcheck_grow(XString *, const char *, size_t); 14525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 14545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * expandable vector of generic pointers 14555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 14565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1457c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasertypedef struct { 1458c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* begin of allocated area */ 1459c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser void **beg; 1460c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* currently used number of entries */ 1461c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t len; 1462c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* allocated number of entries */ 1463c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t siz; 14645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} XPtrV; 14655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1466c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define XPinit(x, n) do { \ 1467c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (x).siz = (n); \ 1468c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (x).len = 0; \ 1469c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (x).beg = alloc2((x).siz, sizeof(void *), ATEMP); \ 1470c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} while (/* CONSTCOND */ 0) \ 1471c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 1472c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define XPput(x, p) do { \ 1473c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if ((x).len == (x).siz) { \ 1474c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (x).beg = aresize2((x).beg, (x).siz, \ 1475c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2 * sizeof(void *), ATEMP); \ 1476c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (x).siz <<= 1; \ 14775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 1478c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (x).beg[(x).len++] = (p); \ 14795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 14805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPptrv(x) ((x).beg) 1482c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define XPsize(x) ((x).len) 148303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define XPclose(x) aresize2((x).beg, XPsize(x), sizeof(void *), ATEMP) 14845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XPfree(x) afree((x).beg, ATEMP) 14855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1486c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* 1487c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Lexer internals 1488c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 14895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct source Source; 14915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct source { 14925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *str; /* input pointer */ 14935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *start; /* start of current buffer */ 14945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 14955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char **strv; /* string [] */ 14965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct shf *shf; /* shell file */ 14975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *tblp; /* alias (SF_HASALIAS) */ 14985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *freeme; /* also for SREREAD */ 14995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } u; 15005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *file; /* input file name */ 15015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int type; /* input type */ 15025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int line; /* line number */ 15035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int errline; /* line the error occurred on (0 if not set) */ 15045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int flags; /* SF_* */ 15055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Area *areap; 15065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Source *next; /* stacked source */ 15075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XString xs; /* input buffer */ 15085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char ugbuf[2]; /* buffer for ungetsc() (SREREAD) and 15095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * alias (SALIAS) */ 15105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 15115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Source.type values */ 15135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SEOF 0 /* input EOF */ 15145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SFILE 1 /* file input */ 15155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SSTDIN 2 /* read stdin */ 15165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SSTRING 3 /* string */ 15175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SWSTR 4 /* string without \n */ 15185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SWORDS 5 /* string[] */ 15195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SWORDSEP 6 /* string[] separator */ 15205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SALIAS 7 /* alias expansion */ 15215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SREREAD 8 /* read ahead to be re-scanned */ 1522c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define SSTRINGCMDLINE 9 /* string from "mksh -c ..." */ 15235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Source.flags values */ 15255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_ECHO BIT(0) /* echo input to shlout */ 15265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_ALIAS BIT(1) /* faking space at end of alias */ 15275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_ALIASEND BIT(2) /* faking space at end of alias */ 15285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SF_TTY BIT(3) /* type == SSTDIN & it is a tty */ 152903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define SF_HASALIAS BIT(4) /* u.tblp valid (SALIAS, SEOF) */ 1530c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define SF_MAYEXEC BIT(5) /* special sh -c optimisation hack */ 15315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef union { 15335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 15345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 15355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **wp; 15365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct op *o; 15375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct ioword *iop; 15385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} YYSTYPE; 15395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* If something is added here, add it to tokentab[] in syn.c as well */ 15415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LWORD 256 15425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOGAND 257 /* && */ 15435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LOGOR 258 /* || */ 15445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define BREAK 259 /* ;; */ 15455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IF 260 15465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define THEN 261 15475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ELSE 262 15485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ELIF 263 15495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FI 264 15505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CASE 265 15515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ESAC 266 15525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FOR 267 15535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SELECT 268 15545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define WHILE 269 15555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UNTIL 270 15565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DO 271 15575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DONE 272 15585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IN 273 15595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define FUNCTION 274 15605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TIME 275 15615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define REDIR 276 15625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MDPAREN 277 /* (( )) */ 15635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define BANG 278 /* ! */ 15645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define DBRACKET 279 /* [[ .. ]] */ 15655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define COPROC 280 /* |& */ 156603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define BRKEV 281 /* ;| */ 156703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define BRKFT 282 /* ;& */ 15685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define YYERRCODE 300 15695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* flags to yylex */ 15715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CONTIN BIT(0) /* skip new lines to complete command */ 15725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ONEWORD BIT(1) /* single word for substitute() */ 15735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ALIAS BIT(2) /* recognise alias */ 15745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KEYWORD BIT(3) /* recognise keywords */ 15755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LETEXPR BIT(4) /* get expression inside (( )) */ 15765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARASN BIT(5) /* check for var=word */ 15775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ARRAYVAR BIT(6) /* parse x[1 & 2] as one word */ 15785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ESACONLY BIT(7) /* only accept esac keyword */ 15795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CMDWORD BIT(8) /* parsing simple command (alias related) */ 15805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define HEREDELIM BIT(9) /* parsing <<,<<- delimiter */ 15815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define LQCHAR BIT(10) /* source string contains QCHAR */ 1582c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define HEREDOC BIT(11) /* parsing a here document body */ 15835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 158403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define HERES 10 /* max number of << in line */ 15855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#undef CTRL 15875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define CTRL(x) ((x) == '?' ? 0x7F : (x) & 0x1F) /* ASCII */ 15885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define UNCTRL(x) ((x) ^ 0x40) /* ASCII */ 1589427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#define ISCTRL(x) (((signed char)((uint8_t)(x) + 1)) < 33) 15905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1591c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define IDENT 64 1592c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 15935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN Source *source; /* yyparse/yylex source */ 159403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN YYSTYPE yylval; /* result from yylex */ 159503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN struct ioword *heres[HERES], **herep; 1596c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN char ident[IDENT + 1]; 15975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1598c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN char **history; /* saved commands */ 1599c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN char **histptr; /* last history item */ 1600c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN mksh_ari_t histsize; /* history size */ 16015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* user and system time of last j_waitjed job */ 16035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEXTERN struct timeval j_usrtime, j_systime; 16045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1605c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define notok2mul(max, val, c) (((val) != 0) && ((c) != 0) && \ 1606c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (((max) / (c)) < (val))) 1607c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define notok2add(max, val, c) ((val) > ((max) - (c))) 1608c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define notoktomul(val, cnst) notok2mul(SIZE_MAX, (val), (cnst)) 1609c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define notoktoadd(val, cnst) notok2add(SIZE_MAX, (val), (cnst)) 161003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define checkoktoadd(val, cnst) do { \ 161103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (notoktoadd((val), (cnst))) \ 161203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra internal_errorf(Tintovfl, (size_t)(val), \ 161303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra '+', (size_t)(cnst)); \ 161403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra} while (/* CONSTCOND */ 0) 161503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 161603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 16175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* lalloc.c */ 16185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid ainit(Area *); 16195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid afreeall(Area *); 16205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* these cannot fail and can take NULL (not for ap) */ 162103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define alloc(n, ap) aresize(NULL, (n), (ap)) 162203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define alloc2(m, n, ap) aresize2(NULL, (m), (n), (ap)) 16235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid *aresize(void *, size_t, Area *); 162403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid *aresize2(void *, size_t, size_t, Area *); 16255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid afree(void *, Area *); /* can take NULL */ 16265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* edit.c */ 1627c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_NO_CMDLINE_EDITING 16285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 16295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint x_bind(const char *, const char *, bool, bool); 16305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 16315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint x_bind(const char *, const char *, bool); 16325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 16335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid x_init(void); 1634c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef DEBUG_LEAKS 1635c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid x_done(void); 1636c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 1637811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserint x_read(char *); 1638c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 1639c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid x_mkraw(int, mksh_ttyst *, bool); 16405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* eval.c */ 16415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *substitute(const char *, int); 16425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar **eval(const char **, int); 16435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *evalstr(const char *cp, int); 16445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *evalonestr(const char *cp, int); 16455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *debunk(char *, const char *, size_t); 16465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid expand(const char *, XPtrV *, int); 1647c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserint glob_str(char *, XPtrV *, bool); 1648c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserchar *tilde(char *); 16495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* exec.c */ 16505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint execute(struct op * volatile, volatile int, volatile int * volatile); 16515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shcomexec(const char **); 16525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *findfunc(const char *, uint32_t, bool); 16535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint define(const char *, struct op *); 165403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraconst char *builtin(const char *, int (*)(const char **)); 16555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *findcom(const char *, int); 165603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid flushcom(bool); 165703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraconst char *search_path(const char *, const char *, int, int *); 1658c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid pr_menu(const char * const *); 1659c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid pr_list(char * const *); 16605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* expr.c */ 16615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint evaluate(const char *, mksh_ari_t *, int, bool); 16625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint v_evaluate(struct tbl *, const char *, volatile int, bool); 16635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* UTF-8 stuff */ 16645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t utf_mbtowc(unsigned int *, const char *); 16655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusize_t utf_wctomb(char *, unsigned int); 16665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint utf_widthadj(const char *, const char **); 1667427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughessize_t utf_mbswidth(const char *) MKSH_A_PURE; 1668427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesconst char *utf_skipcols(const char *, int) MKSH_A_PURE; 1669427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughessize_t utf_ptradj(const char *) MKSH_A_PURE; 1670427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesint utf_wcwidth(unsigned int) MKSH_A_PURE; 167103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraint ksh_access(const char *, int); 1672c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstruct tbl *tempvar(void); 16735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* funcs.c */ 16745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_hash(const char **); 16755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_pwd(const char **); 16765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_print(const char **); 16775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_PRINTF_BUILTIN 16785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_printf(const char **); 16795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 16805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_whence(const char **); 16815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_command(const char **); 16825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_typeset(const char **); 16835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_alias(const char **); 16845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_unalias(const char **); 16855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_let(const char **); 16865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_jobs(const char **); 16875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_UNEMPLOYED 16885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_fgbg(const char **); 16895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 16905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_kill(const char **); 16915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid getopts_reset(int); 16925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_getopts(const char **); 1693c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_NO_CMDLINE_EDITING 16945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_bind(const char **); 1695c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 16965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_shift(const char **); 16975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_umask(const char **); 16985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_dot(const char **); 16995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_wait(const char **); 17005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_read(const char **); 17015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_eval(const char **); 17025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_trap(const char **); 17035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_brkcont(const char **); 17045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_exitreturn(const char **); 17055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_set(const char **); 17065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_unset(const char **); 17075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_ulimit(const char **); 17085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_times(const char **); 17095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint timex(struct op *, int, volatile int *); 17105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid timex_hook(struct op *, char ** volatile *); 17115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_exec(const char **); 171203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* dummy function (just need pointer value), special case in comexec() */ 171303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define c_builtin shcomexec 17145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_test(const char **); 17155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_MKNOD 17165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_mknod(const char **); 17175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 17185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_realpath(const char **); 17195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_rename(const char **); 172003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraint c_cat(const char **); 172103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraint c_sleep(const char **); 17225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* histrap.c */ 17235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid init_histvec(void); 17245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid hist_init(Source *); 17255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_PERSISTENT_HISTORY 17265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid hist_finish(void); 17275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 17285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid histsave(int *, const char *, bool, bool); 17295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !defined(MKSH_SMALL) && HAVE_PERSISTENT_HISTORY 17305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubool histsync(void); 17315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 17325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint c_fc(const char **); 1733c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid sethistsize(mksh_ari_t); 17345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if HAVE_PERSISTENT_HISTORY 17355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid sethistfile(const char *); 17365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1737c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if !defined(MKSH_NO_CMDLINE_EDITING) && !MKSH_S_NOVI 1738427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hugheschar **histpos(void) MKSH_A_PURE; 17395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint histnum(int); 1740c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 1741427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesint findhist(int, int, const char *, bool) MKSH_A_PURE; 17425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar **hist_get_newest(bool); 17435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid inittraps(void); 17445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid alarm_init(void); 1745c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserTrap *gettrap(const char *, bool); 17465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid trapsig(int); 17475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid intrcheck(void); 17485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint fatal_trap_check(void); 17495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint trap_pending(void); 17505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid runtraps(int intr); 175103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid runtrap(Trap *, bool); 17525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid cleartraps(void); 17535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid restoresigs(void); 17545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid settrap(Trap *, const char *); 17555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint block_pipe(void); 17565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid restore_pipe(int); 17575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint setsig(Trap *, sig_t, int); 17585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid setexecsig(Trap *, int); 1759c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if HAVE_FLOCK || HAVE_LOCK_FCNTL 1760c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid mksh_lockfd(int); 1761c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid mksh_unlkfd(int); 1762c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 17635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* jobs.c */ 17645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_init(void); 17655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_exit(void); 17665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_UNEMPLOYED 17675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_change(void); 17685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 17695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint exchild(struct op *, int, volatile int *, int); 17705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid startlast(void); 17715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint waitlast(void); 17725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint waitfor(const char *, int *); 17735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_kill(const char *, int); 17745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_UNEMPLOYED 17755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_resume(const char *, int); 17765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1777427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#if !defined(MKSH_UNEMPLOYED) && HAVE_GETSID 1778427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesvoid j_suspend(void); 1779427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes#endif 17805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_jobs(const char *, int, int); 17815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid j_notify(void); 17825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querupid_t j_async(void); 17835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint j_stopped_running(void); 17845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* lex.c */ 17855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint yylex(int); 1786c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid yyskiputf8bom(void); 17875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid yyerror(const char *, ...) 17885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NORETURN 178903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 17905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruSource *pushs(int, Area *); 17915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid set_prompt(int, Source *); 1792811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserint pprompt(const char *, int); 17935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* main.c */ 1794c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserint include(const char *, int, const char **, bool); 17955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint command(const char *, int); 1796c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserint shell(Source * volatile, volatile bool); 1797c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* argument MUST NOT be 0 */ 17985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid unwind(int) MKSH_A_NORETURN; 17995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid newenv(int); 18005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid quitenv(struct shf *); 18015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid cleanup_parents_env(void); 18025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid cleanup_proc_env(void); 18035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid errorf(const char *, ...) 18045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NORETURN 180503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 180603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid errorfx(int, const char *, ...) 180703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_NORETURN 180803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 2, 3); 18095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid warningf(bool, const char *, ...) 181003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 2, 3); 18115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid bi_errorf(const char *, ...) 181203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 1813c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define errorfz() errorf(NULL) 1814c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define errorfxz(rc) errorfx((rc), NULL) 1815c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define bi_errorfz() bi_errorf(NULL) 18165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid internal_errorf(const char *, ...) 18175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NORETURN 181803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 18195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid internal_warningf(const char *, ...) 182003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 18215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid error_prefix(bool); 18225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid shellf(const char *, ...) 182303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 18245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid shprintf(const char *, ...) 182503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 18265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint can_seek(int); 18275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initio(void); 18285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint ksh_dup2(int, int, bool); 18295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querushort savefd(int); 18305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid restfd(int, int); 18315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid openpipe(int *); 18325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid closepipe(int *); 18335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint check_fd(const char *, int, const char **); 18345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_init(void); 18355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_read_close(int); 18365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_readw_close(int); 18375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_write_close(int); 18385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint coproc_getfd(int, const char **); 18395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid coproc_cleanup(int); 18405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct temp *maketemp(Area *, Temp_type, struct temp **); 184103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid ktinit(Area *, struct table *, uint8_t); 184203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastruct tbl *ktscan(struct table *, const char *, uint32_t, struct tbl ***); 184303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* table, name (key) to search for, hash(n) */ 184403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define ktsearch(tp, s, h) ktscan((tp), (s), (h), NULL) 18455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *ktenter(struct table *, const char *, uint32_t); 18465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define ktdelete(p) do { p->flag = 0; } while (/* CONSTCOND */ 0) 18475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid ktwalk(struct tstate *, struct table *); 18485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *ktnext(struct tstate *); 18495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl **ktsort(struct table *); 1850c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef DF 1851c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid DF(const char *, ...) 1852c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser MKSH_A_FORMAT(__printf__, 1, 2); 1853c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 18545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* misc.c */ 18555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid setctypes(const char *, int); 18565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initctypes(void); 1857427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughessize_t option(const char *) MKSH_A_PURE; 18585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *getoptions(void); 1859c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid change_flag(enum sh_flag, int, bool); 1860811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaservoid change_xtrace(unsigned char, bool); 18615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint parse_args(const char **, int, bool *); 18625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint getn(const char *, int *); 18635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint gmatchx(const char *, const char *, bool); 1864427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesint has_globbing(const char *, const char *) MKSH_A_PURE; 1865427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesint xstrcmp(const void *, const void *) MKSH_A_PURE; 18665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid ksh_getopt_reset(Getopt *, int); 18675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint ksh_getopt(const char **, Getopt *, const char *); 1868c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid print_value_quoted(struct shf *, const char *); 186903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrachar *quote_value(const char *); 1870c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid print_columns(struct shf *, unsigned int, 1871c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char *(*)(char *, size_t, unsigned int, const void *), 187203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra const void *, size_t, size_t, bool); 18735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid strip_nuls(char *, int); 187403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrassize_t blocking_read(int, char *, size_t) 187503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_BOUNDED(__buffer__, 2, 3); 18765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint reset_nonblock(int); 187703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrachar *ksh_get_wd(void); 187803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrachar *do_realpath(const char *); 18795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid simplify_path(char *); 188003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid set_current_wd(const char *); 188103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraint c_cd(const char **); 1882c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if defined(MKSH_SMALL) && !defined(MKSH_SMALL_BUT_FAST) 1883c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserchar *strdup_i(const char *, Area *); 1884c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserchar *strndup_i(const char *, size_t, Area *); 18855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 18865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint unbksl(bool, int (*)(void), void (*)(int)); 18875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* shf.c */ 18885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf *shf_open(const char *, int, int, int); 18895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf *shf_fdopen(int, int, struct shf *); 18905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct shf *shf_reopen(int, int, struct shf *); 189103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastruct shf *shf_sopen(char *, ssize_t, int, struct shf *); 18925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_close(struct shf *); 18935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_fdclose(struct shf *); 18945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *shf_sclose(struct shf *); 18955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_flush(struct shf *); 189603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrassize_t shf_read(char *, ssize_t, struct shf *); 189703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrachar *shf_getse(char *, ssize_t, struct shf *); 18985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_getchar(struct shf *s); 18995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_ungetc(int, struct shf *); 1900c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if defined(MKSH_SMALL) && !defined(MKSH_SMALL_BUT_FAST) 190103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraint shf_getc(struct shf *); 190203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraint shf_putc(int, struct shf *); 190303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#else 1904c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define shf_getc shf_getc_i 1905c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define shf_putc shf_putc_i 190603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 19075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint shf_putchar(int, struct shf *); 190803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrassize_t shf_puts(const char *, struct shf *); 190903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrassize_t shf_write(const char *, ssize_t, struct shf *); 191003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrassize_t shf_fprintf(struct shf *, const char *, ...) 191103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 2, 3); 191203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrassize_t shf_snprintf(char *, ssize_t, const char *, ...) 191303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 3, 4) 191403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_BOUNDED(__string__, 1, 2); 19155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *shf_smprintf(const char *, ...) 191603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 1, 2); 191703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrassize_t shf_vfprintf(struct shf *, const char *, va_list) 191803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_FORMAT(__printf__, 2, 0); 19195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* syn.c */ 19205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initkeywords(void); 192103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastruct op *compile(Source *, bool); 192203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrabool parse_usec(const char *, struct timeval *); 1923c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserchar *yyrecursive(int); 1924c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid yyrecursive_pop(bool); 19255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* tree.c */ 192603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid fptreef(struct shf *, int, const char *, ...); 192703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrachar *snptreef(char *, ssize_t, const char *, ...); 19285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct op *tcopy(struct op *, Area *); 19295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *wdcopy(const char *, Area *); 19305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruconst char *wdscan(const char *, int); 193103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define WDS_TPUTS BIT(0) /* tputS (dumpwdvar) mode */ 193203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define WDS_KEEPQ BIT(1) /* keep quote characters */ 193303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define WDS_MAGIC BIT(2) /* make MAGIC */ 193403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrachar *wdstrip(const char *, int); 19355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid tfree(struct op *, Area *); 193603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid dumpchar(struct shf *, int); 193703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid dumptree(struct shf *, struct op *); 193803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid dumpwdvar(struct shf *, const char *); 1939c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid dumpioact(struct shf *shf, struct op *t); 194003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid vistree(char *, size_t, struct op *) 194103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra MKSH_A_BOUNDED(__string__, 1, 2); 194203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid fpFUNCTf(struct shf *, int, bool, const char *, struct op *); 19435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* var.c */ 19445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid newblock(void); 19455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid popblock(void); 19465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid initvar(void); 1947c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstruct block *varsearch(struct block *, struct tbl **, const char *, uint32_t); 19485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *global(const char *); 19495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *local(const char *, bool); 19505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *str_val(struct tbl *); 19515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint setstr(struct tbl *, const char *, int); 19525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct tbl *setint_v(struct tbl *, struct tbl *, bool); 19535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid setint(struct tbl *, mksh_ari_t); 1954c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid setint_n(struct tbl *, mksh_ari_t, int); 1955c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstruct tbl *typeset(const char *, uint32_t, uint32_t, int, int); 19565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid unset(struct tbl *, int); 1957427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesconst char *skip_varname(const char *, bool) MKSH_A_PURE; 1958427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesconst char *skip_wdvarname(const char *, bool) MKSH_A_PURE; 1959427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesint is_wdvarname(const char *, bool) MKSH_A_PURE; 1960427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesint is_wdvarassign(const char *) MKSH_A_PURE; 196103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastruct tbl *arraysearch(struct tbl *, uint32_t); 19625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar **makenv(void); 19635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid change_winsz(void); 1964427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughessize_t array_ref_len(const char *) MKSH_A_PURE; 19655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruchar *arrayname(const char *); 19665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querumksh_uari_t set_array(const char *, bool, const char **); 1967427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesuint32_t hash(const void *) MKSH_A_PURE; 1968427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesuint32_t chvt_rndsetup(const void *, size_t) MKSH_A_PURE; 1969c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasermksh_ari_t rndget(void); 1970811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaservoid rndset(unsigned long); 1971427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughesvoid rndpush(const void *); 19725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum Test_op { 197403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* non-operator */ 197503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra TO_NONOP = 0, 19765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* unary operators */ 19775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_STNZE, TO_STZER, TO_OPTION, 19785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILAXST, 19795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILEXST, 19805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILREG, TO_FILBDEV, TO_FILCDEV, TO_FILSYM, TO_FILFIFO, TO_FILSOCK, 19815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILCDF, TO_FILID, TO_FILGID, TO_FILSETG, TO_FILSTCK, TO_FILUID, 19825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_FILRD, TO_FILGZ, TO_FILTT, TO_FILSETU, TO_FILWR, TO_FILEX, 19835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* binary operators */ 19845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_STEQL, TO_STNEQ, TO_STLT, TO_STGT, TO_INTEQ, TO_INTNE, TO_INTGT, 19855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_INTGE, TO_INTLT, TO_INTLE, TO_FILEQ, TO_FILNT, TO_FILOT, 19865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* not an operator */ 19875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TO_NONNULL /* !TO_NONOP */ 19885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 19895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef enum Test_op Test_op; 19905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Used by Test_env.isa() (order important - used to index *_tokens[] arrays) */ 19925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum Test_meta { 19935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_OR, /* -o or || */ 19945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_AND, /* -a or && */ 19955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_NOT, /* ! */ 19965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_OPAREN, /* ( */ 19975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_CPAREN, /* ) */ 19985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_UNOP, /* unary operator */ 19995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_BINOP, /* binary operator */ 20005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru TM_END /* end of input */ 20015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 20025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef enum Test_meta Test_meta; 20035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEF_ERROR BIT(0) /* set if we've hit an error */ 20055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define TEF_DBRACKET BIT(1) /* set if [[ .. ]] test */ 20065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct test_env { 20085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru union { 200903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra const char **wp; /* used by ptest_* */ 201003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra XPtrV *av; /* used by dbtestp_* */ 20115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } pos; 201203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra const char **wp_end; /* used by ptest_* */ 20135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Test_op (*isa)(struct test_env *, Test_meta); 20145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *(*getopnd) (struct test_env *, Test_op, bool); 20155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int (*eval)(struct test_env *, Test_op, const char *, const char *, bool); 20165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru void (*error)(struct test_env *, int, const char *); 201703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int flags; /* TEF_* */ 20185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Test_env; 20195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2020c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserextern const char * const dbtest_tokens[]; 20215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2022427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott HughesTest_op test_isop(Test_meta, const char *) MKSH_A_PURE; 20235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint test_eval(Test_env *, Test_op, const char *, const char *, bool); 20245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint test_parse(Test_env *); 20255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2026427d76ccc44aea287b51b233f0254a6107b2b3d1Elliott Hughes/* tty_fd is not opened O_BINARY, it's thus never read/written */ 202703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN int tty_fd E_INIT(-1); /* dup'd tty file descriptor */ 202803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy CondraEXTERN bool tty_devtty; /* true if tty_fd is from /dev/tty */ 2029c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN mksh_ttyst tty_state; /* saved tty state */ 2030c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten GlaserEXTERN bool tty_hasstate; /* true if tty_state is valid */ 20315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2032c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserextern int tty_init_fd(void); /* initialise tty_fd, tty_devtty */ 20335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* be sure not to interfere with anyone else's idea about EXTERN */ 20355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef EXTERN_DEFINED 20365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# undef EXTERN_DEFINED 20375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru# undef EXTERN 20385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 203903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#undef E_INIT 20405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif /* !MKSH_INCLUDES_ONLY */ 2042