mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
This combines 20 cleanup commits from the dev branch. All changed files: - Clean up pointer defererences to sh. - Remove shp arguments from functions. Other notable changes: src/cmd/ksh93/include/shell.h, src/cmd/ksh93/sh/init.c: - On second thought, get rid of the function version of sh_getinterp() as libshell ABI compatibility is moot. We've already been breaking that by reordering the sh struct, so there is no way it's going to work without recompiling. src/cmd/ksh93/sh/name.c: - De-obfuscate the relationship between nv_scan() and scanfilter(). The former just calls the latter as a static function, there's no need to do that via a function pointer and void* type conversions. src/cmd/ksh93/bltins/typeset.c, src/cmd/ksh93/sh/name.c, src/cmd/ksh93/sh/nvdisc.c: - 'struct adata' and 'struct tdata', defined as local struct types in these files, need to have their first three fields in common, the first being a pointer to sh. This is because scanfilter() in name.c accesses these fields via a type conversion. So the sh field needed to be removed in all three at the same time. TODO: de-obfuscate: good practice definition via a header file. src/cmd/ksh93/sh/path.c: - Naming consistency: reserve the path_ function name prefix for externs and rename statics with that prefix. - The default path was sometimes referred to as the standard path. To use one term, rename std_path to defpath and onstdpath() to ondefpath(). - De-obfuscate SHOPT_PFSH conditional code by only calling pf_execve() (was path_pfexecve()) if that is compiled in. src/cmd/ksh93/include/streval.h, src/cmd/ksh93/sh/streval.c: - Rename extern strval() to arith_strval() for consistency. src/cmd/ksh93/sh/string.c: - Remove outdated/incorrect isxdigit() fallback; '#ifnded isxdigit' is not a correct test as isxdigit() is specified as a function. Plus, it's part of C89/C90 which we now require. (re:ac8991e5) src/cmd/ksh93/sh/suid_exec.c: - Replace an incorrect reference to shgd->current_pid with getpid(); it cannot work as (contrary to its misleading directory placement) suid_exec is an independent libast program with no link to ksh or libshell at all. However, no one noticed because this was in fallback code for ancient systems without setreuid(2). Since that standard function was specified in POSIX Issue 4 Version 2 from 1994, we should remove that fallback code sometime as part of another obsolete code cleanup operation to avoid further bit rot. (re:843b546c) src/cmd/ksh93/bltins/print.c: genformat(): - Remove preformat[] which was always empty and had no effect. src/cmd/ksh93/shell.3: - Minor copy-edit. - Remove documentation for nonexistent sh.infile_name. A search through ast-open-archive[*] reveals this never existed at all. - Document sh.savexit (== $?). src/cmd/ksh93/shell.3, src/cmd/ksh93/include/shell.h, src/cmd/ksh93/sh/init.c: - Remove sh.gd/shgd; this is now unused and was never documented or exposed in the shell.h public interface. - sh_sigcheck() was documented in shell.3 as taking no arguments whereas in the actual code it took a shp argument. I decided to go with the documentation. - That leaves sh_parse() as the only documented function that still takes an shp argument. I'm just going to go ahead and remove it for consistency, reverting sh_parse() to its pre-2003 spec. - Remove undocumented/unused sh_bltin_tree() function which simply returned sh.bltin_tree. - Bump SH_VERSION to 20220106.
142 lines
4.2 KiB
C
142 lines
4.2 KiB
C
/***********************************************************************
|
|
* *
|
|
* This software is part of the ast package *
|
|
* Copyright (c) 1982-2011 AT&T Intellectual Property *
|
|
* Copyright (c) 2020-2021 Contributors to ksh 93u+m *
|
|
* and is licensed under the *
|
|
* Eclipse Public License, Version 1.0 *
|
|
* by AT&T Intellectual Property *
|
|
* *
|
|
* A copy of the License is available at *
|
|
* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
* *
|
|
* Information and Software Systems Research *
|
|
* AT&T Research *
|
|
* Florham Park NJ *
|
|
* *
|
|
* David Korn <dgk@research.att.com> *
|
|
* *
|
|
***********************************************************************/
|
|
#ifndef ARG_RAW
|
|
/*
|
|
* struct to hold a word argument
|
|
* Written by David Korn
|
|
*
|
|
*/
|
|
|
|
#include <stak.h>
|
|
|
|
struct ionod
|
|
{
|
|
unsigned iofile;
|
|
char *ioname;
|
|
struct ionod *ionxt;
|
|
struct ionod *iolst;
|
|
char *iodelim;
|
|
off_t iooffset;
|
|
long iosize;
|
|
char *iovname;
|
|
};
|
|
|
|
struct comnod
|
|
{
|
|
int comtyp;
|
|
struct ionod *comio;
|
|
struct argnod *comarg;
|
|
struct argnod *comset;
|
|
void *comnamp;
|
|
void *comnamq;
|
|
void *comstate;
|
|
int comline;
|
|
};
|
|
|
|
#define COMBITS 4
|
|
#define COMMSK ((1<<COMBITS)-1)
|
|
#define COMSCAN (01<<COMBITS)
|
|
#define COMFIXED (02<<COMBITS)
|
|
|
|
struct slnod /* struct for link list of stacks */
|
|
{
|
|
struct slnod *slnext;
|
|
struct slnod *slchild;
|
|
Stak_t *slptr;
|
|
/* slpad aligns struct functnod = struct slnod + 1 on some architectures */
|
|
struct slnod *slpad;
|
|
};
|
|
|
|
/*
|
|
* This struct is used to hold $* lists and arrays
|
|
*/
|
|
|
|
struct dolnod
|
|
{
|
|
int dolrefcnt; /* reference count */
|
|
int dolmax; /* size of dolval array */
|
|
int dolnum; /* number of elements */
|
|
int dolbot; /* current first element */
|
|
struct dolnod *dolnxt; /* used when list are chained */
|
|
char *dolval[1]; /* array of value pointers */
|
|
};
|
|
|
|
/*
|
|
* This struct is used to hold word arguments of variable size during
|
|
* parsing and during expansion. The flags indicate what processing
|
|
* is required on the argument.
|
|
*/
|
|
|
|
struct argnod
|
|
{
|
|
union
|
|
{
|
|
struct argnod *ap;
|
|
char *cp;
|
|
} argnxt;
|
|
union
|
|
{
|
|
struct argnod *ap;
|
|
char *cp;
|
|
int len;
|
|
} argchn;
|
|
unsigned char argflag;
|
|
char argval[4];
|
|
};
|
|
|
|
|
|
|
|
/* The following should evaluate to the offset of argval in argnod */
|
|
#define ARGVAL offsetof(struct argnod,argval[0])
|
|
#define sh_argstr(ap) ((ap)->argflag&ARG_RAW?sh_fmtq((ap)->argval):(ap)->argval)
|
|
#define ARG_SPARE 1
|
|
|
|
|
|
/* legal argument flags */
|
|
#define ARG_RAW 0x1 /* string needs no processing */
|
|
#define ARG_MAKE 0x2 /* bit set during argument expansion */
|
|
#define ARG_COMSUB 0x2 /* command sub */
|
|
#define ARG_MAC 0x4 /* string needs macro expansion */
|
|
#define ARG_EXP 0x8 /* string needs file expansion */
|
|
#define ARG_ASSIGN 0x10 /* argument is an assignment */
|
|
#define ARG_QUOTED 0x20 /* word contained quote characters */
|
|
#define ARG_MESSAGE 0x40 /* contains international string */
|
|
#define ARG_APPEND 0x80 /* for += assignment */
|
|
/* The following can be passed as options to sh_macexpand() */
|
|
#define ARG_ARITH 0x100 /* arithmetic expansion */
|
|
#define ARG_OPTIMIZE 0x200 /* try to optimize */
|
|
#define ARG_NOGLOB 0x400 /* no file name expansion */
|
|
#define ARG_ARRAYOK 0x1000 /* $x[sub] ==> ${x[sub]} */
|
|
|
|
extern struct dolnod *sh_argcreate(char*[]);
|
|
extern char *sh_argdolminus(void*);
|
|
extern int sh_argopts(int,char*[]);
|
|
|
|
|
|
extern const char e_heading[];
|
|
extern const char e_sptbnl[];
|
|
extern const char e_subst[];
|
|
extern const char e_option[];
|
|
extern const char e_exec[];
|
|
extern const char e_devfdNN[];
|
|
extern const char e_devfdstd[];
|
|
|
|
#endif /* ARG_RAW */
|