summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/common/sh/arith.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libshell/common/sh/arith.c')
-rw-r--r--usr/src/lib/libshell/common/sh/arith.c396
1 files changed, 0 insertions, 396 deletions
diff --git a/usr/src/lib/libshell/common/sh/arith.c b/usr/src/lib/libshell/common/sh/arith.c
deleted file mode 100644
index 684670aae6..0000000000
--- a/usr/src/lib/libshell/common/sh/arith.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/***********************************************************************
-* *
-* This software is part of the ast package *
-* Copyright (c) 1982-2010 AT&T Intellectual Property *
-* and is licensed under the *
-* Common Public License, Version 1.0 *
-* by AT&T Intellectual Property *
-* *
-* A copy of the License is available at *
-* http://www.opensource.org/licenses/cpl1.0.txt *
-* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
-* *
-* Information and Software Systems Research *
-* AT&T Research *
-* Florham Park NJ *
-* *
-* David Korn <dgk@research.att.com> *
-* *
-***********************************************************************/
-#pragma prototyped
-/*
- * Shell arithmetic - uses streval library
- * David Korn
- * AT&T Labs
- */
-
-#include "defs.h"
-#include "lexstates.h"
-#include "name.h"
-#include "streval.h"
-#include "variables.h"
-
-#ifndef LLONG_MAX
-#define LLONG_MAX LONG_MAX
-#endif
-
-static Sfdouble_t NaN, Inf, Fun;
-static Namval_t Infnod =
-{
- { 0 },
- "Inf",
- NV_NOFREE|NV_LDOUBLE,NV_RDONLY
-};
-
-static Namval_t NaNnod =
-{
- { 0 },
- "NaN",
- NV_NOFREE|NV_LDOUBLE,NV_RDONLY
-};
-
-static Namval_t FunNode =
-{
- { 0 },
- "?",
- NV_NOFREE|NV_LDOUBLE,NV_RDONLY
-};
-
-static Namval_t *scope(Shell_t *shp,register Namval_t *np,register struct lval *lvalue,int assign)
-{
- register int flag = lvalue->flag;
- register char *sub=0, *cp=(char*)np;
- register Namval_t *mp;
- int flags = HASH_NOSCOPE|HASH_SCOPE|HASH_BUCKET;
- int nosub = lvalue->nosub;
- Dt_t *sdict = (shp->st.real_fun? shp->st.real_fun->sdict:0);
- Dt_t *root = shp->var_tree;
- assign = assign?NV_ASSIGN:NV_NOASSIGN;
- lvalue->nosub = 0;
- if(cp>=lvalue->expr && cp < lvalue->expr+lvalue->elen)
- {
- int offset;
- /* do binding to node now */
- int c = cp[flag];
- cp[flag] = 0;
- if((!(np = nv_open(cp,shp->var_tree,assign|NV_VARNAME|NV_NOADD|NV_NOFAIL)) || nv_isnull(np)) && sh_macfun(shp,cp, offset = staktell()))
- {
- Fun = sh_arith(sub=stakptr(offset));
- FunNode.nvalue.ldp = &Fun;
- cp[flag] = c;
- return(&FunNode);
- }
- if(!np && assign)
- np = nv_open(cp,shp->var_tree,assign|NV_VARNAME);
- if(!np)
- return(0);
- root = shp->last_root;
- cp[flag] = c;
- if(cp[flag+1]=='[')
- flag++;
- else
- flag = 0;
- cp = (char*)np;
- }
- if((lvalue->emode&ARITH_COMP) && dtvnext(root) && ((mp=nv_search(cp,root,flags))||(sdict && (mp=nv_search(cp,sdict,flags)))))
- {
- while(nv_isref(mp))
- {
- sub = nv_refsub(mp);
- mp = nv_refnode(mp);
- }
- np = mp;
- }
- if(!nosub && (flag || sub))
- {
- if(!sub)
- sub = (char*)&lvalue->expr[flag];
- nv_endsubscript(np,sub,NV_ADD|NV_SUBQUOTE);
- }
- return(np);
-}
-
-static Sfdouble_t arith(const char **ptr, struct lval *lvalue, int type, Sfdouble_t n)
-{
- Shell_t *shp = &sh;
- register Sfdouble_t r= 0;
- char *str = (char*)*ptr;
- register char *cp;
- switch(type)
- {
- case ASSIGN:
- {
- register Namval_t *np = (Namval_t*)(lvalue->value);
- np = scope(shp,np,lvalue,1);
- nv_putval(np, (char*)&n, NV_LDOUBLE);
- r=nv_getnum(np);
- lvalue->value = (char*)np;
- break;
- }
- case LOOKUP:
- {
- register int c = *str;
- register char *xp=str;
- lvalue->value = (char*)0;
- if(c=='.')
- str++;
- c = mbchar(str);
- if(isaletter(c))
- {
- register Namval_t *np;
- int dot=0;
- while(1)
- {
- while(xp=str, c=mbchar(str), isaname(c));
- str = xp;
- if(c=='[' && dot==NV_NOADD)
- {
- str = nv_endsubscript((Namval_t*)0,str,0);
- c = *str;
- }
- if(c!='.')
- break;
- dot=NV_NOADD;
- if((c = *++str) !='[')
- continue;
- str = nv_endsubscript((Namval_t*)0,cp=str,NV_SUBQUOTE)-1;
- if(sh_checkid(cp+1,(char*)0))
- str -=2;
- }
- if(c=='(')
- {
- int fsize = str- (char*)(*ptr);
- const struct mathtab *tp;
- c = **ptr;
- lvalue->fun = 0;
- if(fsize<=(sizeof(tp->fname)-2)) for(tp=shtab_math; *tp->fname; tp++)
- {
- if(*tp->fname > c)
- break;
- if(tp->fname[1]==c && tp->fname[fsize+1]==0 && strncmp(&tp->fname[1],*ptr,fsize)==0)
- {
- lvalue->fun = tp->fnptr;
- lvalue->nargs = *tp->fname;
- break;
- }
- }
- if(lvalue->fun)
- break;
- lvalue->value = (char*)ERROR_dictionary(e_function);
- return(r);
- }
- if((lvalue->emode&ARITH_COMP) && dot)
- {
- lvalue->value = (char*)*ptr;
- lvalue->flag = str-lvalue->value;
- break;
- }
- *str = 0;
- if(sh_isoption(SH_NOEXEC))
- np = L_ARGNOD;
- else
- {
- int offset = staktell();
- char *saveptr = stakfreeze(0);
- Dt_t *root = (lvalue->emode&ARITH_COMP)?shp->var_base:shp->var_tree;
- *str = c;
- while(c=='[' || c=='.')
- {
- if(c=='[')
- {
- str = nv_endsubscript(np,cp=str,0);
- if((c= *str)!='[' && c!='.')
- {
- str = cp;
- c = '[';
- break;
- }
- }
- else
- {
- dot = NV_NOADD|NV_NOFAIL;
- str++;
- while(xp=str, c=mbchar(str), isaname(c));
- str = xp;
- }
- }
- *str = 0;
- cp = (char*)*ptr;
- if ((cp[0] == 'i' || cp[0] == 'I') && (cp[1] == 'n' || cp[1] == 'N') && (cp[2] == 'f' || cp[2] == 'F') && cp[3] == 0)
- {
- Inf = strtold("Inf", NiL);
- Infnod.nvalue.ldp = &Inf;
- np = &Infnod;
- }
- else if ((cp[0] == 'n' || cp[0] == 'N') && (cp[1] == 'a' || cp[1] == 'A') && (cp[2] == 'n' || cp[2] == 'N') && cp[3] == 0)
- {
- NaN = strtold("NaN", NiL);
- NaNnod.nvalue.ldp = &NaN;
- np = &NaNnod;
- }
- else if(!(np = nv_open(*ptr,root,NV_NOASSIGN|NV_VARNAME|dot)))
- {
- lvalue->value = (char*)*ptr;
- lvalue->flag = str-lvalue->value;
- }
- if(saveptr != stakptr(0))
- stakset(saveptr,offset);
- else
- stakseek(offset);
- }
- *str = c;
- if(!np && lvalue->value)
- break;
- lvalue->value = (char*)np;
- /* bind subscript later */
- if(nv_isattr(np,NV_DOUBLE)==NV_DOUBLE)
- lvalue->isfloat=1;
- lvalue->flag = 0;
- if(c=='[')
- {
- lvalue->flag = (str-lvalue->expr);
- do
- str = nv_endsubscript(np,str,0);
- while((c= *str)=='[');
- break;
- }
- }
- else
- {
- char lastbase=0, *val = xp, oerrno = errno;
- errno = 0;
- r = strtonll(val,&str, &lastbase,-1);
- if(*str=='8' || *str=='9')
- {
- lastbase=10;
- errno = 0;
- r = strtonll(val,&str, &lastbase,-1);
- }
- if(lastbase<=1)
- lastbase=10;
- if(*val=='0')
- {
- while(*val=='0')
- val++;
- if(*val==0 || *val=='.' || *val=='x' || *val=='X')
- val--;
- }
- if(r==LLONG_MAX && errno)
- c='e';
- else
- c = *str;
- if(c==GETDECIMAL(0) || c=='e' || c == 'E' || lastbase ==
- 16 && (c == 'p' || c == 'P'))
- {
- lvalue->isfloat=1;
- r = strtold(val,&str);
- }
- else if(lastbase==10 && val[1])
- {
- if(val[2]=='#')
- val += 3;
- if((str-val)>2*sizeof(Sflong_t))
- {
- Sfdouble_t rr;
- rr = strtold(val,&str);
- if(rr!=r)
- {
- r = rr;
- lvalue->isfloat=1;
- }
- }
- }
- errno = oerrno;
- }
- break;
- }
- case VALUE:
- {
- register Namval_t *np = (Namval_t*)(lvalue->value);
- if(sh_isoption(SH_NOEXEC))
- return(0);
- np = scope(shp,np,lvalue,0);
- if(!np)
- {
- if(sh_isoption(SH_NOUNSET))
- {
- *ptr = lvalue->value;
- goto skip;
- }
- return(0);
- }
- if(((lvalue->emode&2) || lvalue->level>1 || sh_isoption(SH_NOUNSET)) && nv_isnull(np) && !nv_isattr(np,NV_INTEGER))
- {
- *ptr = nv_name(np);
- skip:
- lvalue->value = (char*)ERROR_dictionary(e_notset);
- lvalue->emode |= 010;
- return(0);
- }
- r = nv_getnum(np);
- if(nv_isattr(np,NV_INTEGER|NV_BINARY)==(NV_INTEGER|NV_BINARY))
- lvalue->isfloat= (r!=(Sflong_t)r);
- else if(nv_isattr(np,NV_DOUBLE)==NV_DOUBLE)
- lvalue->isfloat=1;
- return(r);
- }
-
- case MESSAGE:
- sfsync(NIL(Sfio_t*));
-#if 0
- if(warn)
- errormsg(SH_DICT,ERROR_warn(0),lvalue->value,*ptr);
- else
-#endif
- errormsg(SH_DICT,ERROR_exit((lvalue->emode&3)!=0),lvalue->value,*ptr);
- }
- *ptr = str;
- return(r);
-}
-
-/*
- * convert number defined by string to a Sfdouble_t
- * ptr is set to the last character processed
- * if mode>0, an error will be fatal with value <mode>
- */
-
-Sfdouble_t sh_strnum(register const char *str, char** ptr, int mode)
-{
- register Sfdouble_t d;
- char base=0, *last;
- if(*str==0)
- {
- if(ptr)
- *ptr = (char*)str;
- return(0);
- }
- errno = 0;
- d = strtonll(str,&last,&base,-1);
- if(*last || errno)
- {
- if(!last || *last!='.' || last[1]!='.')
- d = strval(str,&last,arith,mode);
- if(!ptr && *last && mode>0)
- errormsg(SH_DICT,ERROR_exit(1),e_lexbadchar,*last,str);
- }
- else if (!d && *str=='-')
- d = -0.0;
- if(ptr)
- *ptr = last;
- return(d);
-}
-
-Sfdouble_t sh_arith(register const char *str)
-{
- return(sh_strnum(str, (char**)0, 1));
-}
-
-void *sh_arithcomp(register char *str)
-{
- const char *ptr = str;
- Arith_t *ep;
- ep = arith_compile(str,(char**)&ptr,arith,ARITH_COMP|1);
- if(*ptr)
- errormsg(SH_DICT,ERROR_exit(1),e_lexbadchar,*ptr,str);
- return((void*)ep);
-}