1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 11:42:21 +00:00

tweak: make better use of funptr() macro and sh.bltinfun pointer

src/cmd/ksh93/include/name.h:
- Include the ususally-wanted (Shbltin_f) typecast in funptr().

Various files:
- Change several direct foo->nvalue.bfp usages to funptr(np).
- Reduce explicit typecasts after the name.h change.
- To determine if we are (or just were) running a certain built-in
  command, instead of comparing sh.bltindata.bnode with a builtin
  table node, use sh.bltinfun to directly compare the builtin's
  function; this is more readable and efficient.
This commit is contained in:
Martijn Dekker 2022-06-20 22:21:31 +01:00
parent 05fc199c95
commit cae9af5eec
9 changed files with 16 additions and 16 deletions

View file

@ -1229,7 +1229,7 @@ int b_builtin(int argc,char *argv[],Shbltin_t *context)
{
if(nv_isattr(np,BLT_SPC))
errmsg = "restricted name";
addr = (Shbltin_f)np->nvalue.bfp;
addr = funptr(np);
}
if(!dlete && !addr && !(np=sh_addbuiltin(arg,(Shbltin_f)0 ,0)))
errmsg = "not found";

View file

@ -149,7 +149,7 @@ struct Ufunction
#define is_abuiltin(n) (nv_isattr(n,NV_BLTIN|NV_INTEGER)==NV_BLTIN)
#define is_afunction(n) (nv_isattr(n,NV_FUNCTION|NV_REF)==NV_FUNCTION)
#define nv_funtree(n) ((n)->nvalue.rp->ptree)
#define funptr(n) ((n)->nvalue.bfp)
#define funptr(n) ((Shbltin_f)(n)->nvalue.bfp)
/* NAMNOD MACROS */
/* ... for attributes */

View file

@ -406,7 +406,7 @@ static Sfdouble_t arith(const char **ptr, struct lval *lvalue, int type, Sfdoubl
char lastbase=0, *val = xp, oerrno = errno;
lvalue->eflag = 0;
errno = 0;
if(!sh_isoption(sh.bltindata.bnode==SYSLET ? SH_LETOCTAL : SH_POSIX))
if(!sh_isoption(sh.bltinfun==b_let ? SH_LETOCTAL : SH_POSIX))
{
/* Skip leading zeros to avoid parsing as octal */
while(*val=='0' && isdigit(val[1]))
@ -529,7 +529,7 @@ static Sfdouble_t arith(const char **ptr, struct lval *lvalue, int type, Sfdoubl
Sfdouble_t sh_strnum(register const char *str, char** ptr, int mode)
{
register Sfdouble_t d;
char base = (sh_isoption(sh.bltindata.bnode==SYSLET ? SH_LETOCTAL : SH_POSIX) ? 0 : 10), *last;
char base = (sh_isoption(sh.bltinfun==b_let ? SH_LETOCTAL : SH_POSIX) ? 0 : 10), *last;
if(*str==0)
{
d = 0.0;

View file

@ -534,7 +534,7 @@ void sh_exit(register int xno)
register int sig=0;
register Sfio_t* pool;
/* POSIX requires exit status >= 2 for error in 'test'/'[' */
if(xno == 1 && (sh.bltindata.bnode==SYSTEST || sh.bltindata.bnode==SYSBRACKET))
if(xno==1 && sh.bltinfun==b_test)
sh.exitval = 2;
else
sh.exitval = xno;

View file

@ -1113,7 +1113,7 @@ Namval_t *sh_addbuiltin(const char *path, Shbltin_f bltin, void *extra)
int offset=staktell();
if(extra==(void*)1)
name = path;
else if((name = path_basename(path))==path && bltin!=(Shbltin_f)SYSTYPESET->nvalue.bfp && (nq=nv_bfsearch(name,sh.bltin_tree,(Namval_t**)0,&cp)))
else if((name = path_basename(path))==path && bltin!=b_typeset && (nq=nv_bfsearch(name,sh.bltin_tree,(Namval_t**)0,&cp)))
path = name = stakptr(offset);
else if(sh.bltin_dir && extra!=(void*)1)
{
@ -1152,7 +1152,7 @@ Namval_t *sh_addbuiltin(const char *path, Shbltin_f bltin, void *extra)
if(nv_isattr(np,BLT_SPC))
return(np);
if(!bltin)
bltin = (Shbltin_f)np->nvalue.bfp;
bltin = funptr(np);
if(np->nvenv)
dtdelete(sh.bltin_tree,np);
if(extra == (void*)1)

View file

@ -799,7 +799,7 @@ void nv_addtype(Namval_t *np, const char *optstr, Optdisc_t *op, size_t optsz)
#endif /* SHOPT_NAMESPACE */
if((bp=nv_search(name,sh.fun_tree,NV_NOSCOPE)) && !bp->nvalue.ip)
nv_delete(bp,sh.fun_tree,0);
bp = sh_addbuiltin(name, (Shbltin_f)mp->nvalue.bfp, (void*)cp);
bp = sh_addbuiltin(name, funptr(mp), cp);
nv_onattr(bp,nv_isattr(mp,NV_PUBLIC));
nv_onattr(np, NV_RDONLY);
}

View file

@ -241,7 +241,7 @@ static void check_typedef(struct comnod *tp, char intypeset)
dcl_tree = dtopen(&_Nvdisc, Dtoset);
dtview(sh.bltin_tree, dcl_tree);
}
nv_onattr(sh_addbuiltin(cp, (Shbltin_f)SYSTRUE->nvalue.bfp, NIL(void*)), NV_BLTIN|BLT_DCL);
nv_onattr(sh_addbuiltin(cp, b_true, NIL(void*)), NV_BLTIN|BLT_DCL);
}
}
/*
@ -1563,7 +1563,7 @@ static Shnode_t *simple(Lex_t *lexp,int flag, struct ionod *io)
cmdarg++;
else if(np==SYSEXEC || np==SYSREDIR)
lexp->inexec = 1;
else if(np->nvalue.bfp==(Nambfp_f)b_getopts)
else if(funptr(np)==b_getopts)
opt_get |= FOPTGET;
}
}

View file

@ -821,7 +821,7 @@ Pathcomp_t *path_absolute(register const char *name, Pathcomp_t *pp, int flag)
sh_addlib(dll,stakptr(m),oldpp);
if(dll &&
(addr=(Shbltin_f)dlllook(dll,stakptr(n))) &&
(!(np = sh_addbuiltin(stakptr(PATH_OFFSET),NiL,NiL)) || np->nvalue.bfp!=(Nambfp_f)addr) &&
(!(np = sh_addbuiltin(stakptr(PATH_OFFSET),NiL,NiL)) || funptr(np)!=addr) &&
(np = sh_addbuiltin(stakptr(PATH_OFFSET),addr,NiL)))
{
np->nvenv = dll;
@ -869,7 +869,7 @@ Pathcomp_t *path_absolute(register const char *name, Pathcomp_t *pp, int flag)
if(np)
{
n = np->nvflag;
np = sh_addbuiltin(stakptr(PATH_OFFSET),(Shbltin_f)np->nvalue.bfp,nv_context(np));
np = sh_addbuiltin(stakptr(PATH_OFFSET),funptr(np),nv_context(np));
np->nvflag = n;
}
}

View file

@ -394,7 +394,7 @@ static int p_comarg(register struct comnod *com)
bp->ptr = nv_context(np);
bp->data = com->comstate;
bp->flags = SH_END_OPTIM;
((Shbltin_f)funptr(np))(0,(char**)0, bp);
(funptr(np))(0, NIL(char**), bp);
bp->ptr = save_ptr;
bp->data = save_data;
}
@ -1046,7 +1046,7 @@ int sh_exec(register const Shnode_t *t, int flags)
else if(checkopt(com,'a'))
flgs |= NV_IARRAY;
}
if(np && np->nvalue.bfp==SYSTYPESET->nvalue.bfp)
if(np && funptr(np)==b_typeset)
{
/* command calls b_typeset(); treat as a typeset variant */
flgs |= NV_UNATTR; /* unset previous attributes before assigning */
@ -1297,7 +1297,7 @@ int sh_exec(register const Shnode_t *t, int flags)
error_info.id = *com;
if(argn)
sh.exitval = 0;
sh.bltinfun = (Shbltin_f)funptr(np);
sh.bltinfun = funptr(np);
bp->bnode = np;
bp->vnode = nq;
bp->ptr = nv_context(np);
@ -3303,7 +3303,7 @@ int sh_fun(Namval_t *np, Namval_t *nq, char *argv[])
opt_info.index = opt_info.offset = 0;
opt_info.disc = 0;
sh.exitval = 0;
sh.exitval = ((Shbltin_f)funptr(np))(n,argv,bp);
sh.exitval = (funptr(np))(n,argv,bp);
}
sh_popcontext(buffp);
if(jmpval>SH_JMPCMD)