da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Shell arithmetic - uses streval library
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t *scope(Shell_t *shp,register Namval_t *np,register struct lval *lvalue,int assign)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Dt_t *sdict = (shp->st.real_fun? shp->st.real_fun->sdict:0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(cp>=lvalue->expr && cp < lvalue->expr+lvalue->elen)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* do binding to node now */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((!(np = nv_open(cp,shp->var_tree,assign|NV_VARNAME|NV_NOADD|NV_NOFAIL)) || nv_isnull(np)) && sh_macfun(shp,cp, offset = staktell()))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz np = nv_open(cp,shp->var_tree,assign|NV_VARNAME);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if((lvalue->emode&ARITH_COMP) && dtvnext(root) && ((mp=nv_search(cp,root,flags))||(sdict && (mp=nv_search(cp,sdict,flags)))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Sfdouble_t arith(const char **ptr, struct lval *lvalue, int type, Sfdouble_t n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Sfdouble_t r= 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c = *str;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c=='.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c!='.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin str = nv_endsubscript((Namval_t*)0,cp=str,NV_SUBQUOTE)-1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c=='(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fsize<=(sizeof(tp->fname)-2)) for(tp=shtab_math; *tp->fname; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tp->fname[1]==c && tp->fname[fsize+1]==0 && strncmp(&tp->fname[1],*ptr,fsize)==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(r);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Dt_t *root = (lvalue->emode&ARITH_COMP)?shp->var_base:shp->var_tree;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c=='[')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((cp[0] == 'i' || cp[0] == 'I') && (cp[1] == 'n' || cp[1] == 'N') && (cp[2] == 'f' || cp[2] == 'F') && cp[3] == 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if ((cp[0] == 'n' || cp[0] == 'N') && (cp[1] == 'a' || cp[1] == 'A') && (cp[2] == 'n' || cp[2] == 'N') && cp[3] == 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(!(np = nv_open(*ptr,root,NV_NOASSIGN|NV_VARNAME|dot)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /* bind subscript later */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c=='[')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(c==GETDECIMAL(0) || c=='e' || c == 'E' || lastbase ==
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(((lvalue->emode&2) || lvalue->level>1 || sh_isoption(SH_NOUNSET)) && nv_isnull(np) && !nv_isattr(np,NV_INTEGER))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isattr(np,NV_INTEGER|NV_BINARY)==(NV_INTEGER|NV_BINARY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(r);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit((lvalue->emode&3)!=0),lvalue->value,*ptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(r);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * convert number defined by string to a Sfdouble_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ptr is set to the last character processed
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if mode>0, an error will be fatal with value <mode>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinSfdouble_t sh_strnum(register const char *str, char** ptr, int mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_lexbadchar,*last,str);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(d);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep = arith_compile(str,(char**)&ptr,arith,ARITH_COMP|1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((void*)ep);