// -*- mode:C++ ; compile-command: "g++ -I.. -g -c ti89.cc -fno-strict-aliasing -DGIAC_GENERIC_CONSTANTS -DIN_GIAC -DHAVE_CONFIG_H" -*- #include "giacPCH.h" /* * Copyright (C) 2000,2007 B. Parisse, Institut Fourier, 38402 St Martin d'Heres * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using namespace std; #include #include #include #include // #include #include "misc.h" #include "usual.h" #include "sym2poly.h" #include "rpn.h" #include "prog.h" #include "derive.h" #include "subst.h" #include "intg.h" #include "vecteur.h" #include "ifactor.h" #include "solve.h" #include "modpoly.h" #include "permu.h" #include "sym2poly.h" #include "plot.h" #include "lin.h" #include "modpoly.h" #include "desolve.h" #include "alg_ext.h" #include "moyal.h" #include "ti89.h" #include "maple.h" #include "input_parser.h" #include "input_lexer.h" #include "giacintl.h" #ifdef HAVE_UNISTD_H #include #endif #ifndef NO_NAMESPACE_GIAC namespace giac { #endif // ndef NO_NAMESPACE_GIAC /* string printasti_not_implemented(const gen & feuille,const char * sommetstr){ if (feuille.type!=_VECT || feuille._VECTptr->size()!=2) return sommetstr+("("+feuille.print()+")"); vecteur & v=*feuille._VECTptr; if (v[0].type==_STRNG) return *v[0]._STRNGptr+"("+v[1].print()+")"; else return v[0].print()+"("+v[1].print()+")"; } */ static const char _ti_not_implemented_s[]="ti_not_implemented"; static define_unary_function_eval (__ti_not_implemented,&_nop,_ti_not_implemented_s); // never evaled define_unary_function_ptr( at_ti_not_implemented ,alias_at_ti_not_implemented ,&__ti_not_implemented); static const char _ti_endtag_s[]="ti_endtag"; static define_unary_function_eval (__ti_endtag,&_nop,_ti_endtag_s); // never evaled define_unary_function_ptr( at_ti_endtag ,alias_at_ti_endtag ,&__ti_endtag); gen _seq(const gen & g,GIAC_CONTEXT){ gen g1(g); if (g.type==_VECT && g.subtype==_SEQ__VECT && !g._VECTptr->empty()){ vecteur v(*g._VECTptr); if (v.size()>=2){ gen x(v[1]); if (is_equal(x) && x._SYMBptr->feuille.type==_VECT && !x._SYMBptr->feuille._VECTptr->empty()) x=x._SYMBptr->feuille._VECTptr->front(); if (v.front().is_symb_of_sommet(at_quote)) v.front()=v.front()._SYMBptr->feuille; //gen tmp(quote_eval(makevecteur(v.front()),makevecteur(x),contextptr)); //v.front()=tmp[0]; } else v.front()=eval(v.front(),eval_level(contextptr),contextptr); if (v.size()==2 && is_integral((g1=eval(v[1],eval_level(contextptr),contextptr))) && g1.val>=0){ vecteur res; int s=g1.val,l=eval_level(contextptr); res.reserve(s); gen v0=v[0]; for (int i=0;isize()!=2) return gensizeerr(contextptr); int n=0; gen e1(g._VECTptr->front()),b(g._VECTptr->back()),q; if (is_integer(e1) && is_integer(b) && is_strictly_greater(b,1,contextptr) && !is_zero(e1)){ while (is_zero(irem(e1,b,q))){ if (q.type==_ZINT) e1=*q._ZINTptr; else e1=q; ++n; } } return rdiv(ln(e1,contextptr),ln(b,contextptr),contextptr)+n; // return ln(g._VECTptr->front(),contextptr)/ln(g._VECTptr->back(),contextptr); } static const char _logb_s[]="logb"; static define_unary_function_eval (__logb,&_logb,_logb_s); define_unary_function_ptr5( at_logb ,alias_at_logb,&__logb,0,true); static string getType(const gen & g){ switch (g.type){ case _INT_: case _REAL: case _DOUBLE_: return "NUM"; case _VECT: if (ckmatrix(g)) return "MAT"; else return "LIST"; case _IDNT: return "VAR"; case _SYMB: if (g.is_symb_of_sommet(at_program)) return "FUNC"; else return "EXPR"; case _CPLX: return "EXPR"; case _STRNG: return "STR"; default: return "OTHER"; } } gen _getType(const gen & g,GIAC_CONTEXT){ return string2gen(getType(g),false); } static const char _getType_s[]="getType"; static define_unary_function_eval (__getType,&_getType,_getType_s); define_unary_function_ptr5( at_getType ,alias_at_getType,&__getType,0,true); gen _Define(const gen & g,GIAC_CONTEXT){ if (g.type!=_VECT || g._VECTptr->size()!=2) return gensizeerr(contextptr); vecteur & v=*g._VECTptr; gen g1=v.front(),g2=v.back(); if (!g1.is_symb_of_sommet(at_of)) return gensizeerr(contextptr); gen &g11=g1._SYMBptr->feuille; if (g11.type!=_VECT || g11._VECTptr->size()!=2) return gensizeerr(contextptr); gen gname=g11._VECTptr->front(),garg=g11._VECTptr->back(); return symb_sto(symb_program(garg,garg*zero,symb_bloc(g2),contextptr),gname); } static const char _colDim_s[]="colDim"; static define_unary_function_eval (__colDim,&_ncols,_colDim_s); define_unary_function_ptr5( at_colDim ,alias_at_colDim,&__colDim,0,true); static const char _rowDim_s[]="rowDim"; static define_unary_function_eval (__rowDim,&_nrows,_rowDim_s); define_unary_function_ptr5( at_rowDim ,alias_at_rowDim,&__rowDim,0,true); static const char _randMat_s[]="randMat"; static define_unary_function_eval (__randMat,&_ranm,_randMat_s); define_unary_function_ptr5( at_randMat ,alias_at_randMat,&__randMat,0,true); static const char _eigVc_s[]="eigVc"; static define_unary_function_eval (__eigVc,&_egv,_eigVc_s); define_unary_function_ptr5( at_eigVc ,alias_at_eigVc,&__eigVc,0,true); static const char _eigVl_s[]="eigVl"; static define_unary_function_eval (__eigVl,&_egvl,_eigVl_s); define_unary_function_ptr5( at_eigVl ,alias_at_eigVl,&__eigVl,0,true); static const char _transpose_s[]="transpose"; static define_unary_function_eval (__transpose,&_tran,_transpose_s); define_unary_function_ptr5( at_transpose ,alias_at_transpose,&__transpose,0,true); static const char _identity_s[]="identity"; static define_unary_function_eval (__identity,&_idn,_identity_s); define_unary_function_ptr5( at_identity ,alias_at_identity,&__identity,0,true); gen _isprime(const gen & args,GIAC_CONTEXT){ gen g=_is_prime(args,contextptr); if (is_undef(g)) return g; if (g.type==_VECT) return g; if (g==0){ g.subtype=_INT_BOOLEAN; return g; } g=plus_one; g.subtype=_INT_BOOLEAN; return g; } static const char _isprime_s[]="isprime"; static define_unary_function_eval (__isprime,&_isprime,_isprime_s); define_unary_function_ptr5( at_isprime ,alias_at_isprime,&__isprime,0,true); /* gen _Input(const gen & g){ vecteur v(gen2vecteur(g)); int s=v.size(); gen res; if (s==1) res=_inputform(symbolic(at_click,makesequence(v[0],0,v[0]))); else { if (s==2) res= _inputform(symbolic(at_click,makesequence(v[0],0,v[1]))); else res= __click.op(g); } __interactive.op(symbolic(at_print,makesequence(g,res))); return res; } */ gen _Input(const gen & args,GIAC_CONTEXT){ return _input(args,false,contextptr); } static const char _Input_s[]="Input"; static define_unary_function_eval2_quoted (__Input,&_Input,_Input_s,&printastifunction); define_unary_function_ptr5( at_Input ,alias_at_Input,&__Input,_QUOTE_ARGUMENTS,T_RETURN); static const char _lis_s[]="lis"; static define_unary_function_eval2_quoted (__lis,&_Input,_lis_s,&printastifunction); define_unary_function_ptr5( at_lis ,alias_at_lis,&__lis,_QUOTE_ARGUMENTS,T_RETURN); gen _InputStr(const gen & g,GIAC_CONTEXT){ vecteur v(gen2vecteur(g)); int s=int(v.size()); gen res; if (s==1) res= __click.op(makevecteur(string2gen(v[0].print(contextptr)),0,v[0],1),contextptr); else { if (s==2) res= __click.op(makevecteur(string2gen(eval(v[0],eval_level(contextptr),contextptr).print(contextptr)),v[1],1),contextptr); else res= _input(g,true,contextptr); } if (is_zero(res)) return gensizeerr(contextptr); return res; } /* gen _InputStr(const gen & args,GIAC_CONTEXT){ return _input(args,true,contextptr); } */ static const char _InputStr_s[]="InputStr"; static define_unary_function_eval2_quoted (__InputStr,&_InputStr,_InputStr_s,&printastifunction); define_unary_function_ptr5( at_InputStr ,alias_at_InputStr,&__InputStr,_QUOTE_ARGUMENTS,T_RETURN); static const char _lis_phrase_s[]="lis_phrase"; static define_unary_function_eval2_quoted (__lis_phrase,&_InputStr,_lis_phrase_s,&printastifunction); define_unary_function_ptr5( at_lis_phrase ,alias_at_lis_phrase,&__lis_phrase,_QUOTE_ARGUMENTS,T_RETURN); gen _Prompt(const gen & g,GIAC_CONTEXT){ gen res= _inputform(symbolic(at_click,makesequence(g,g,g)),contextptr); __interactive.op(symbolic(at_print,makesequence(g,res)),contextptr); return res; } static const char _Prompt_s[]="Prompt"; static define_unary_function_eval2_quoted (__Prompt,&_Prompt,_Prompt_s,&printastifunction); define_unary_function_ptr5( at_Prompt ,alias_at_Prompt,&__Prompt,_QUOTE_ARGUMENTS,T_RETURN); static const char _PopUp_s[]="PopUp"; static define_unary_function_eval2_quoted (__PopUp,&_choosebox,_PopUp_s,&printastifunction); define_unary_function_ptr5( at_PopUp ,alias_at_PopUp,&__PopUp,_QUOTE_ARGUMENTS,T_RETURN); gen _cSolve(const gen & g,GIAC_CONTEXT){ bool old_complex_mode=complex_mode(contextptr); complex_mode(true,contextptr); gen res=_solve(g,contextptr); complex_mode(old_complex_mode,contextptr); return res; } static const char _cSolve_s[]="cSolve"; static define_unary_function_eval_quoted (__cSolve,&_cSolve,_cSolve_s); define_unary_function_ptr5( at_cSolve ,alias_at_cSolve,&__cSolve,_QUOTE_ARGUMENTS,true); static const char _csolve_s[]="csolve"; static define_unary_function_eval_quoted (__csolve,&_cSolve,_csolve_s); define_unary_function_ptr5( at_csolve ,alias_at_csolve,&__csolve,_QUOTE_ARGUMENTS,true); static const char _resoudre_dans_C_s[]="resoudre_dans_C"; static define_unary_function_eval_quoted (__resoudre_dans_C,&_cSolve,_resoudre_dans_C_s); define_unary_function_ptr5( at_resoudre_dans_C ,alias_at_resoudre_dans_C,&__resoudre_dans_C,_QUOTE_ARGUMENTS,true); gen _cFactor(const gen & g,GIAC_CONTEXT){ bool old_complex_mode=complex_mode(contextptr); complex_mode(true,contextptr); gen res=_factor(g,contextptr); complex_mode(old_complex_mode,contextptr); return res; } static const char _cFactor_s[]="cFactor"; static define_unary_function_eval (__cFactor,&_cFactor,_cFactor_s); define_unary_function_ptr5( at_cFactor ,alias_at_cFactor,&__cFactor,0,true); static const char _cfactor_s[]="cfactor"; static define_unary_function_eval (__cfactor,&_cFactor,_cfactor_s); define_unary_function_ptr5( at_cfactor ,alias_at_cfactor,&__cfactor,0,true); static const char _factoriser_sur_C_s[]="factoriser_sur_C"; static define_unary_function_eval (__factoriser_sur_C,&_cFactor,_factoriser_sur_C_s); define_unary_function_ptr5( at_factoriser_sur_C ,alias_at_factoriser_sur_C,&__factoriser_sur_C,0,true); gen _cpartfrac(const gen & g,GIAC_CONTEXT){ bool old_complex_mode=complex_mode(contextptr); complex_mode(true,contextptr); gen res=_partfrac(g,contextptr); complex_mode(old_complex_mode,contextptr); return res; } static const char _cpartfrac_s[]="cpartfrac"; static define_unary_function_eval (__cpartfrac,&_cpartfrac,_cpartfrac_s); define_unary_function_ptr5( at_cpartfrac ,alias_at_cpartfrac,&__cpartfrac,0,true); gen _nSolve(const gen & g,GIAC_CONTEXT){ vecteur v(gen2vecteur(g)); if (v.size()!=2) return gensizeerr(contextptr); gen var=v[1],guess; if (var.type==_SYMB && (var._SYMBptr->sommet==at_equal || var._SYMBptr->sommet==at_equal2 || var._SYMBptr->sommet==at_same)){ guess=var._SYMBptr->feuille._VECTptr->back(); if (guess.is_symb_of_sommet(at_interval)) return _fsolve(g,contextptr); var=var._SYMBptr->feuille._VECTptr->front(); return newton(remove_equal(v[0]),var,guess,NEWTON_DEFAULT_ITERATION,1e-5,1e-12,!complex_mode(contextptr),1,0,1,0,1,contextptr); } else return newton(remove_equal(v[0]),var,0,NEWTON_DEFAULT_ITERATION,1e-5,1e-12,!complex_mode(contextptr),1,0,1,0,1,contextptr); } static const char _nSolve_s[]="nSolve"; static define_unary_function_eval (__nSolve,&_nSolve,_nSolve_s); define_unary_function_ptr5( at_nSolve ,alias_at_nSolve,&__nSolve,0,true); static gen zeros(const gen &g,bool complexmode,GIAC_CONTEXT){ vecteur v(solvepreprocess(g,complexmode,contextptr)); int s=int(v.size()); if (s>2) return gentoomanyargs("solve"); return solve(remove_equal(v.front()),v.back(),complexmode,contextptr); } gen _zeros(const gen & g,GIAC_CONTEXT){ return zeros(g,complex_mode(contextptr),contextptr); } static const char _zeros_s[]="zeros"; static define_unary_function_eval_quoted (__zeros,&_zeros,_zeros_s); define_unary_function_ptr5( at_zeros ,alias_at_zeros,&__zeros,_QUOTE_ARGUMENTS,true); gen _cZeros(const gen & g,GIAC_CONTEXT){ return zeros(g,true,contextptr); } static const char _cZeros_s[]="cZeros"; static define_unary_function_eval_quoted (__cZeros,&_cZeros,_cZeros_s); define_unary_function_ptr5( at_cZeros ,alias_at_cZeros,&__cZeros,_QUOTE_ARGUMENTS,true); static const char _czeros_s[]="czeros"; static define_unary_function_eval_quoted (__czeros,&_cZeros,_czeros_s); define_unary_function_ptr5( at_czeros ,alias_at_czeros,&__czeros,_QUOTE_ARGUMENTS,true); static gen getDenom(const gen & g,GIAC_CONTEXT){ vecteur num,den; prod2frac(g,num,den); return vecteur2prod(den); } gen _getDenom(const gen & g,GIAC_CONTEXT){ return apply(g,getDenom,contextptr); } static const char _getDenom_s[]="getDenom"; static define_unary_function_eval (__getDenom,&_getDenom,_getDenom_s); define_unary_function_ptr5( at_getDenom ,alias_at_getDenom,&__getDenom,0,true); static gen denom(const gen & g,GIAC_CONTEXT){ gen res=_fxnd(g,contextptr); if (res.type!=_VECT) return res; return res._VECTptr->back(); } gen _denom(const gen & g,GIAC_CONTEXT){ return apply(g,denom,contextptr); } static const char _denom_s[]="denom"; static define_unary_function_eval (__denom,&_denom,_denom_s); define_unary_function_ptr5( at_denom ,alias_at_denom,&__denom,0,true); static gen getNum(const gen & g,GIAC_CONTEXT){ vecteur num,den; prod2frac(g,num,den); return vecteur2prod(num); } gen _getNum(const gen & g,GIAC_CONTEXT){ return apply(g,getNum,contextptr); } static const char _getNum_s[]="getNum"; static define_unary_function_eval (__getNum,&_getNum,_getNum_s); define_unary_function_ptr5( at_getNum ,alias_at_getNum,&__getNum,0,true); static gen numer(const gen & g,GIAC_CONTEXT){ gen res=_fxnd(g,contextptr); if (res.type!=_VECT) return res; return res._VECTptr->front(); } gen _numer(const gen & g,GIAC_CONTEXT){ return apply(g,numer,contextptr); } static const char _numer_s[]="numer"; static define_unary_function_eval (__numer,&_numer,_numer_s); define_unary_function_ptr5( at_numer ,alias_at_numer,&__numer,0,true); static const char _propFrac_s[]="propFrac"; static define_unary_function_eval (__propFrac,&_propfrac,_propFrac_s); define_unary_function_ptr5( at_propFrac ,alias_at_propFrac,&__propFrac,0,true); static const char _tCollect_s[]="tCollect"; static define_unary_function_eval (__tCollect,&_tcollect,_tCollect_s); define_unary_function_ptr5( at_tCollect ,alias_at_tCollect,&__tCollect,0,true); gen _tExpand(const gen & g,GIAC_CONTEXT){ return _simplify(_texpand(g,contextptr),contextptr); } static const char _tExpand_s[]="tExpand"; static define_unary_function_eval (__tExpand,&_tExpand,_tExpand_s); define_unary_function_ptr5( at_tExpand ,alias_at_tExpand,&__tExpand,0,true); gen _comDenom(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT || g._VECTptr->size()<2 ) return ratnormal(g,contextptr); vecteur & v(*g._VECTptr); return _reorder(makesequence(v.front(),vecteur(v.begin()+1,v.end())),contextptr); } static const char _comDenom_s[]="comDenom"; static define_unary_function_eval (__comDenom,&_comDenom,_comDenom_s); define_unary_function_ptr5( at_comDenom ,alias_at_comDenom,&__comDenom,0,true); index_t rand_index(int dim,int tdeg,GIAC_CONTEXT){ index_t res(dim); index_t w(tdeg+dim); for (unsigned int i=0;i0;--i){ res[i] -= res[i-1]+1; } return res; } gen _randPoly(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); int vs=int(v.size()),deg=10; gen x=vx_var; gen f=0; if (vs>=3 && v[2].type==_INT_ && v[1].type==_INT_ && v[0].type==_VECT){ // randpoly(variables,total_degree,nterms,[law]) gen a=v[0],b=v[1]; v[0]=b; v[1]=v[2]; v[2]=a; } if (vs>=2 && v[1].type==_VECT && v[0].type==_VECT){ // randpoly(variables,partial_degrees,[law]) vecteur vars=*v[0]._VECTptr; vecteur degs=*v[1]._VECTptr; if (degs.size()!=vars.size() || vars.empty()) return gendimerr(contextptr); gen var=vars[0]; vars.erase(vars.begin()); gen deg=degs[0]; degs.erase(degs.begin()); if (deg.type!=_INT_ || deg.val<0) return gendimerr(contextptr); if (!vars.empty()){ gen res=0; for (int i=deg.val;i>=0;--i){ v[0]=vars; v[1]=degs; gen tmp=_randPoly(gen(v,_SEQ__VECT),contextptr); res += tmp*pow(var,i,contextptr); } return res; } v[0]=var; v[1]=deg; } if (vs>=3 && v[0].type==_INT_ && v[1].type==_INT_ && v[2].type==_VECT){ // randpoly(total_degree,nterms,variables,[law]) if (vs>=4) f=v[3]; if (vs==5){ if (f.type==_FUNC) f=symbolic(*f._FUNCptr,v.back()); else f=symb_of(f,v.back()); } if (vs>5){ if (f.type==_FUNC) f=symbolic(*f._FUNCptr,gen(vecteur(v.begin()+4,v.end()),_SEQ__VECT)); else f=symb_of(f,gen(vecteur(v.begin()+4,v.end()),_SEQ__VECT)); } int tdeg=v[0].val; int nterms=absint(v[1].val); int dim=int(v[2]._VECTptr->size()); vecteur w=vranm(nterms,f,contextptr); polynome p(dim); for (int i=0;i(w[i],current)); } p.tsort(); return _poly2symb(makesequence(p,v[2]),contextptr); } if (vs==1){ if (v[0].type==_INT_) deg=v[0].val; else { x=v[0]; deg=10; } } else { if (vs>=2){ if (v[0].type==_INT_){ deg=v[0].val; if (v[1].type==_IDNT) x=v[1]; else f=v[1]; } else { if (v[1].type==_INT_) deg=v[1].val; else f=v[1]; x=v[0]; } } if (vs>=3){ f=v[2]; } if (vs>=4 && v[2].type==_INT_ && v[3].type==_INT_){ vecteur w(absint(deg)+1,1); if (calc_mode(contextptr)==1 || abs_calc_mode(contextptr)==38){ if (v[2]==v[3]) return gensizeerr(contextptr); for (;;){ w[0]=int(giac_rand(contextptr)/(rand_max2+1.0)*(v[3].val-v[2].val+1)+v[2].val); if (w[0].val) break; } } for (unsigned i=1;i<=(unsigned)absint(deg);++i){ w[i]=int(giac_rand(contextptr)/(rand_max2+1.0)*(v[3].val-v[2].val+1)+v[2].val); } #ifdef GIAC_HAS_STO_38 return w; #else return symb_horner(w,x); #endif } if (vs==4){ if (f.type==_FUNC) f=symbolic(*f._FUNCptr,v.back()); else f=symb_of(f,v.back()); } if (vs>4){ if (f.type==_FUNC) f=symbolic(*f._FUNCptr,gen(vecteur(v.begin()+3,v.end()),_SEQ__VECT)); else f=symb_of(f,gen(vecteur(v.begin()+3,v.end()),_SEQ__VECT)); } } vecteur w; if (calc_mode(contextptr)==1 || abs_calc_mode(contextptr)==38){ for (int essai=0;essai<1000;++essai){ w=vranm(absint(deg)+1,f,contextptr); if (!is_zero(w.front())) break; } } else { w=vranm(absint(deg),f,contextptr); w.insert(w.begin(),1); } #ifdef GIAC_HAS_STO_38 return w; #else return (f.type==_VECT && f._VECTptr->empty())?gen(w,_POLY1__VECT):symb_horner(w,x); #endif } static const char _randPoly_s[]="randPoly"; static define_unary_function_eval (__randPoly,&_randPoly,_randPoly_s); define_unary_function_ptr5( at_randPoly ,alias_at_randPoly,&__randPoly,0,true); static const char _randpoly_s[]="randpoly"; static define_unary_function_eval (__randpoly,&_randPoly,_randpoly_s); define_unary_function_ptr5( at_randpoly ,alias_at_randpoly,&__randpoly,0,true); gen _nInt(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT || g._VECTptr->size()!=4) return gensizeerr(contextptr); return evalf(symbolic(at_integrate,g),1,contextptr); } static const char _nInt_s[]="nInt"; static define_unary_function_eval (__nInt,&_nInt,_nInt_s); define_unary_function_ptr5( at_nInt ,alias_at_nInt,&__nInt,0,true); gen _nDeriv(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<2) return gensizeerr(contextptr); gen step(0.001); if (v.size()>2) step=v[2]; return evalf(rdiv(subst(v[0],v[1],v[1]+step,false,contextptr)-subst(v[0],v[1],v[1]-step,false,contextptr),2*step,contextptr),1,contextptr); } static const char _nDeriv_s[]="nDeriv"; static define_unary_function_eval (__nDeriv,&_nDeriv,_nDeriv_s); define_unary_function_ptr5( at_nDeriv ,alias_at_nDeriv,&__nDeriv,0,true); gen _avgRC(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<2) return gensizeerr(contextptr); gen step(0.001); if (v.size()>2) step=v[2]; return evalf(rdiv(subst(v[0],v[1],v[1]+step,false,contextptr)-subst(v[0],v[1],v[1],false,contextptr),step,contextptr),1,contextptr); } static const char _avgRC_s[]="avgRC"; static define_unary_function_eval (__avgRC,&_avgRC,_avgRC_s); define_unary_function_ptr5( at_avgRC ,alias_at_avgRC,&__avgRC,0,true); gen _fMin(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()==1) v.push_back(vx_var); if (v.size()==4) // fMin(func,[constraints],[variables],[guess]) return fmin_cobyla(v[0],gen2vecteur(v[1]),gen2vecteur(v[2]),gen2vecteur(v[3]),undef,undef,contextptr); if (v.size()==5) // fMin(func,[constraints],[variables],[guess],eps) return fmin_cobyla(v[0],gen2vecteur(v[1]),gen2vecteur(v[2]),gen2vecteur(v[3]),v[4],undef,contextptr); if (v.size()==6) // fMin(func,[constraints],[variables],[guess],eps,maxiter) return fmin_cobyla(v[0],gen2vecteur(v[1]),gen2vecteur(v[2]),gen2vecteur(v[3]),v[4],v[5],contextptr); gen w(fminmax(v,4,contextptr)); if (is_undef(w)) return w; return solvepostprocess(w,v[1],contextptr); } static const char _fMin_s[]="fMin"; static define_unary_function_eval (__fMin,&_fMin,_fMin_s); define_unary_function_ptr5( at_fMin ,alias_at_fMin,&__fMin,0,true); gen _fMax(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()==1) v.push_back(vx_var); if (v.size()==4) // fMax(func,[constraints],[variables],[guess]) return fmin_cobyla(-v[0],gen2vecteur(v[1]),gen2vecteur(v[2]),gen2vecteur(v[3]),undef,undef,contextptr); if (v.size()==5) // fMax(func,[constraints],[variables],[guess],eps) return fmin_cobyla(-v[0],gen2vecteur(v[1]),gen2vecteur(v[2]),gen2vecteur(v[3]),v[4],undef,contextptr); if (v.size()==6) // fMax(func,[constraints],[variables],[guess],eps,maxiter) return fmin_cobyla(-v[0],gen2vecteur(v[1]),gen2vecteur(v[2]),gen2vecteur(v[3]),v[4],v[5],contextptr); gen w(fminmax(v,5,contextptr)); if (is_undef(w)) return w; return solvepostprocess(w,v[1],contextptr); } static const char _fMax_s[]="fMax"; static define_unary_function_eval (__fMax,&_fMax,_fMax_s); define_unary_function_ptr5( at_fMax ,alias_at_fMax,&__fMax,0,true); gen _taylor(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; /* if (xcas_mode(contextptr)==0) return _series(g); */ vecteur v(gen2vecteur(g)); if (v.empty()) return gentoofewargs("Taylor needs 3 args"); if (v.back().type==_INT_ && v.back().subtype==_INT_MAPLECONVERSION && v.back().val==_POLY1__VECT){ gen p=v.back(); v.pop_back(); gen res=_taylor(gen(v,_SEQ__VECT),contextptr); res=_convert(makesequence(res,p),contextptr); return res; } if (v.size()<2) v.push_back(vx_var); if (v.size()<3) v.push_back(5); else is_integral(v[2]); gen x0; if (v.size()==4) x0=v[3]; if (is_equal(v[1])) return _series(makesequence(v[0],v[1],v[2]),contextptr); return _series(makesequence(v[0],symbolic(at_equal,makesequence(v[1],x0)),v[2]),contextptr); } static const char _taylor_s[]="taylor"; static define_unary_function_eval (__taylor,&_taylor,_taylor_s); define_unary_function_ptr5( at_taylor ,alias_at_taylor,&__taylor,0,true); gen arclen(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (!v.empty() && v.front().type==_VECT){ // more than one arc? if (!v.front()._VECTptr->empty() && v.front()._VECTptr->back().is_symb_of_sommet(at_pnt)){ v.front()=v.front()._VECTptr->back(); *logptr(contextptr) << gettext("Selecting last arc") << endl; } } if (!v.empty() && v.front().is_symb_of_sommet(at_pnt)){ if (v.size()==1) return _perimetre(g,contextptr); if (v.size()!=3) return gensizeerr(contextptr); gen g=remove_at_pnt(v[0]); if (g.is_symb_of_sommet(at_cercle)){ gen centre,rayon; if (!centre_rayon(g,centre,rayon,true,contextptr)) return gensizeerr(contextptr); // don't care about radius return (v[2]-v[1])*rayon; } if (g.is_symb_of_sommet(at_curve) && g._SYMBptr->feuille.type==_VECT && g._SYMBptr->feuille._VECTptr->size()>1){ g=(*g._SYMBptr->feuille._VECTptr)[0]; if (g.type==_VECT && g._VECTptr->size()>2){ gen f=g._VECTptr->front(); if (g._VECTptr->size()>6) f=(*g._VECTptr)[6]; gen x=(*g._VECTptr)[1]; gen fprime=derive(f,x,contextptr); if (is_undef(fprime)) return fprime; fprime=abs(fprime,contextptr); if (v[1].is_symb_of_sommet(at_pnt)) v[1]=projection(v[0],v[1],contextptr); if (v[2].is_symb_of_sommet(at_pnt)) v[2]=projection(v[0],v[2],contextptr); if (is_greater(v[1],v[2],contextptr)) return _integrate(gen(makevecteur(fprime,x,v[2],v[1]),_SEQ__VECT),contextptr); return _integrate(gen(makevecteur(fprime,x,v[1],v[2]),_SEQ__VECT),contextptr); } } return gensizeerr(contextptr); } if (v.size()==3) v.insert(v.begin()+1,ggb_var(v.front())); if (v.size()!=4 || v[1].type!=_IDNT) return gentoofewargs("arcLen"); gen fprime=derive(v[0],v[1],contextptr); if (is_undef(fprime)) return fprime; if (fprime.type==_VECT) fprime=_l2norm(fprime,contextptr); else fprime=sqrt(normal(sq(fprime)+1,contextptr),contextptr); return _integrate(gen(makevecteur(fprime,v[1],v[2],v[3]),_SEQ__VECT),contextptr); } gen _arcLen(const gen & g,GIAC_CONTEXT){ bool b=complex_variables(contextptr); complex_variables(false,contextptr); gen res=arclen(g,contextptr); complex_variables(b,contextptr); return res; } static const char _arcLen_s[]="arcLen"; static define_unary_function_eval (__arcLen,&_arcLen,_arcLen_s); define_unary_function_ptr5( at_arcLen ,alias_at_arcLen,&__arcLen,0,true); static const char _arclen_s[]="arclen"; static define_unary_function_eval (__arclen,&_arcLen,_arclen_s); define_unary_function_ptr5( at_arclen ,alias_at_arclen,&__arclen,0,true); // find T,N,B,kappa,tau, Nsurkappa (center of osc circle-M) return dimension gen frenet(const gen &g,gen & M,gen & T, gen &N, gen &B, gen & kappa,gen &Nsurkappa,gen & tau,gen & t,bool compute_torsion,GIAC_CONTEXT){ if (g.is_symb_of_sommet(at_pnt)){ if (g._SYMBptr->feuille.type==_VECT && g._SYMBptr->feuille._VECTptr->size()>=2){ // element gen arg=(*g._SYMBptr->feuille._VECTptr)[1]; if (arg.type==_VECT) return frenet((*arg._VECTptr)[1],M,T,N,B,kappa,Nsurkappa,tau,t,compute_torsion,contextptr); } return frenet(remove_at_pnt(g),M,T,N,B,kappa,Nsurkappa,tau,t,compute_torsion,contextptr); } if (g.is_symb_of_sommet(at_curve)){ gen f=g._SYMBptr->feuille; gen res=frenet(f[0],M,T,N,B,kappa,Nsurkappa,tau,t,compute_torsion,contextptr); return res; } if (g.type!=_VECT || g._VECTptr->size()<2) return gensizeerr(contextptr); vecteur v=*g._VECTptr; gen f=v[0],x=v[1],x0=undef; if (f.is_symb_of_sommet(at_pnt)){ x0=v[1]; if (x0.is_symb_of_sommet(at_pnt)) x0=projection(f,x0,contextptr); f=remove_at_pnt(f); if (!f.is_symb_of_sommet(at_curve)) return gensizeerr(contextptr); f=f._SYMBptr->feuille[0]; x=f[1]; t=makesequence(x,f[2],f[3],f[4]); f=f[0]; } else t=x; if (v.size()==3) x0=v[2]; if (v.size()>3) t=gen(vecteur(v.begin()+1,v.begin()+4),_SEQ__VECT); if (f.type!=_VECT){ gen r,i; reim(f,r,i,contextptr); f=makevecteur(r,i); } M=f; int dim=int(f._VECTptr->size()); gen vitesse=derive(f,x,contextptr),v2=normal(l2norm2(vitesse),contextptr); gen sqrtv2=sqrt(v2,contextptr); // v=ds/dt T=vitesse/sqrtv2; gen accel=derive(vitesse,x,contextptr); if (dim==2 && T.type==_VECT && T._VECTptr->size()==2){ kappa=normal(vitesse[0]*accel[1]-vitesse[1]*accel[0],contextptr)/pow(v2,2)*sqrtv2; Nsurkappa=normal(v2/(vitesse[0]*accel[1]-vitesse[1]*accel[0])*makevecteur(-vitesse[1],vitesse[0]),contextptr); N=makevecteur(-T._VECTptr->back(),T._VECTptr->front()); } else { gen an=normal(accel-(scalar_product(accel,vitesse,contextptr)/v2)*vitesse,contextptr); // normal accel gen normean=_l2norm(an,contextptr); N=an/normean; kappa=normean/v2; Nsurkappa=normal(an*v2/l2norm2(an),contextptr); } if (dim!=3 || !compute_torsion) B=tau=undef; else { B=cross(T,N,contextptr); gen f3=derive(accel,x,contextptr); tau=_det(makesequence(vitesse,accel,f3),contextptr)/l2norm2(cross(vitesse,accel,contextptr)); } if (!is_undef(x0)){ M=subst(M,x,x0,false,contextptr); T=subst(T,x,x0,false,contextptr); N=subst(N,x,x0,false,contextptr); B=subst(B,x,x0,false,contextptr); tau=subst(tau,x,x0,false,contextptr); kappa=subst(kappa,x,x0,false,contextptr); Nsurkappa=subst(Nsurkappa,x,x0,false,contextptr); } return dim; } // curvature([x(t),y(t)],t) gen curvature(const gen & g,GIAC_CONTEXT){ if (g.is_symb_of_sommet(at_pnt)){ if (g._SYMBptr->feuille.type==_VECT && g._SYMBptr->feuille._VECTptr->size()>=2){ // element gen arg=(*g._SYMBptr->feuille._VECTptr)[1]; if (arg.type==_VECT) return curvature((*arg._VECTptr)[1],contextptr); } return curvature(remove_at_pnt(g),contextptr); } if (g.is_symb_of_sommet(at_curve)){ gen f=g._SYMBptr->feuille; return curvature(f[0],contextptr); } if (g.type!=_VECT || g._VECTptr->size()<2) return gensizeerr(contextptr); vecteur v=*g._VECTptr; gen f=v[0],x=v[1],x0(undef); if (f.is_symb_of_sommet(at_pnt)){ x0=v[1]; if (x0.is_symb_of_sommet(at_pnt)) x0=projection(f,x0,contextptr); f=remove_at_pnt(f); if (!f.is_symb_of_sommet(at_curve)) return gensizeerr(contextptr); f=f._SYMBptr->feuille[0]; x=f[1]; f=f[0]; } if (v.size()>=3) x0=v[2]; if (f.type!=_VECT){ gen r,i; reim(f,r,i,contextptr); if (is_zero(i)) f=makevecteur(x,r); else f=makevecteur(r,i); } int dim=int(f._VECTptr->size()); gen vitesse=derive(f,x,contextptr),v2=normal(l2norm2(vitesse),contextptr); gen sqrtv2=sqrt(v2,contextptr); // v=ds/dt gen accel=derive(vitesse,x,contextptr),res; if (dim==2) res= normal(vitesse[0]*accel[1]-vitesse[1]*accel[0],contextptr)/pow(v2,2)*sqrtv2; else { if (dim==3){ gen f3=cross(vitesse,accel,contextptr); res= _l2norm(f3,contextptr)/pow(v2,2)*sqrtv2; } else { gen an=accel-(scalar_product(accel,vitesse,contextptr)/v2)*vitesse; // normal res=_l2norm(an,contextptr)/v2; } } if (!is_undef(x0)) res=subst(res,x,x0,false,contextptr); return res; } gen _curvature(const gen & g,GIAC_CONTEXT){ bool b=complex_variables(contextptr); complex_variables(false,contextptr); gen res=curvature(g,contextptr); complex_variables(b,contextptr); return res; } static const char _curvature_s[]="curvature"; static define_unary_function_eval (__curvature,&_curvature,_curvature_s); define_unary_function_ptr5( at_curvature ,alias_at_curvature,&__curvature,0,true); gen _frenet(const gen & g,GIAC_CONTEXT){ bool b=complex_variables(contextptr); complex_variables(false,contextptr); gen t,M,T,N,B,kappa,Nsurkappa,tau,dim=frenet(g,M,T,N,B,kappa,Nsurkappa,tau,t,true,contextptr); complex_variables(b,contextptr); if (dim.type!=_INT_) return dim; if (dim.val==2) return makesequence(kappa,M+Nsurkappa,T,N); else return makesequence(kappa,M+Nsurkappa,tau,T,N,B); } static const char _frenet_s[]="frenet"; static define_unary_function_eval (__frenet,&_frenet,_frenet_s); define_unary_function_ptr5( at_frenet ,alias_at_frenet,&__frenet,0,true); gen _osculating_circle(const gen & args,GIAC_CONTEXT){ vecteur attributs(1,default_color(contextptr)); vecteur v(seq2vecteur(args)); int s=read_attributs(v,attributs,contextptr); if (s==0) return gendimerr(contextptr); gen g; if (s==1) g=v.front(); else g=gen(vecteur(v.begin(),v.begin()+s),_SEQ__VECT); bool b=complex_variables(contextptr); complex_variables(false,contextptr); gen t,M,T,N,B,kappa,Nsurkappa,tau,dim=frenet(g,M,T,N,B,kappa,Nsurkappa,tau,t,false,contextptr); complex_variables(b,contextptr); if (dim.type!=_INT_) return dim; if (dim.val==2) return put_attributs(_cercle(makesequence(_point(M,contextptr),_point(M+2*Nsurkappa,contextptr)),contextptr),attributs,contextptr); return gendimerr(contextptr); } static const char _osculating_circle_s[]="osculating_circle"; static define_unary_function_eval (__osculating_circle,&_osculating_circle,_osculating_circle_s); define_unary_function_ptr5( at_osculating_circle ,alias_at_osculating_circle,&__osculating_circle,0,true); gen _evolute(const gen & args,GIAC_CONTEXT){ vecteur attributs(1,default_color(contextptr)); vecteur v(seq2vecteur(args)); int s=read_attributs(v,attributs,contextptr); if (s==0) return gendimerr(contextptr); gen g; if (s==1) g=v.front(); else g=gen(vecteur(v.begin(),v.begin()+s),_SEQ__VECT); bool b=complex_variables(contextptr); complex_variables(false,contextptr); gen t,M,T,N,B,kappa,Nsurkappa,tau,dim=frenet(g,M,T,N,B,kappa,Nsurkappa,tau,t,false,contextptr); complex_variables(b,contextptr); if (dim.type!=_INT_) return dim; if (dim.val==2){ if (t.type==_VECT) t=gen(mergevecteur(vecteur(1,M+Nsurkappa),*t._VECTptr),_SEQ__VECT); else t=gen(makevecteur(M+Nsurkappa,t),_SEQ__VECT); return put_attributs(_plotparam(t,contextptr),attributs,contextptr); } return gendimerr(contextptr); } static const char _evolute_s[]="evolute"; static define_unary_function_eval (__evolute,&_evolute,_evolute_s); define_unary_function_ptr5( at_evolute ,alias_at_evolute,&__evolute,0,true); gen _dim(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (!ckmatrix(g)) return _size(g,contextptr); vecteur res(2); if (!g._VECTptr->empty()){ res[0]=int(g._VECTptr->size()); res[1]=int(g._VECTptr->front()._VECTptr->size()); } return res; } static const char _dim_s[]="dim"; static define_unary_function_eval (__dim,&_dim,_dim_s); define_unary_function_ptr5( at_dim ,alias_at_dim,&__dim,0,true); // FIXME: the print() should have an additionnal format argument // that would cover normal, tex, C, and formatted output static string format(const gen & g,const string & forme,GIAC_CONTEXT){ if (g.type == _ZINT){ string txt = g.print(); if (!forme.empty()){ char ch=forme[0]; if (tolower(ch) == 'f') return txt; if (forme.size()<2) return txt; unsigned int digits = atol(forme.substr(1,forme.size()-1).c_str()) - 1; if (tolower(ch) == 'e') digits ++; digits = digits < 2 ? 2 : digits; if (digits + 1 < txt.size()){ string tmp = txt.substr(0, 1) + "." + txt.substr(1, digits) + "e+" + print_INT_(int(txt.size()) - 1); return tmp; } } return txt; } else { gen tmp=evalf_double(g,eval_level(contextptr),contextptr); string saveforme=format_double(contextptr); format_double(contextptr)=forme; string s=tmp.print(contextptr); format_double(contextptr)=saveforme; return s; } } gen _format(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()!=2 || v[1].type!=_STRNG) return gensizeerr(contextptr); return string2gen(format(v.front(),*v[1]._STRNGptr,contextptr),false); } static const char _format_s[]="format"; static define_unary_function_eval (__format,&_format,_format_s); define_unary_function_ptr5( at_format ,alias_at_format,&__format,0,true); gen _inString(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<2 || v[0].type!=_STRNG || v[1].type!=_STRNG) return gensizeerr(contextptr); int shift = xcas_mode(contextptr)!=0 || abs_calc_mode(contextptr)==38; int debut=shift; if (v.size()>2 && v[2].type==_INT_) debut=v[2].val; return v[0]._STRNGptr->find(*v[1]._STRNGptr,debut-shift)+shift; } static const char _inString_s[]="inString"; static define_unary_function_eval (__inString,&_inString,_inString_s); define_unary_function_ptr5( at_inString ,alias_at_inString,&__inString,0,true); gen _left(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_SYMB && g._SYMBptr->feuille.type==_VECT && !g._SYMBptr->feuille._VECTptr->empty()) return g._SYMBptr->feuille._VECTptr->front(); #if defined HAVE_LIBMPFI && !defined NO_RTTI if (g.type==_REAL){ if (real_interval * ptr=dynamic_cast(g._REALptr)){ mpfr_t tmp; mpfr_init2(tmp,mpfi_get_prec(ptr->infsup)); mpfi_get_left(tmp,ptr->infsup); gen einf=real_object(tmp); mpfr_clear(tmp); return einf; } } #endif vecteur v(1,g); if (g.type==_VECT && g.subtype==_SEQ__VECT) v=*g._VECTptr; if (v.size()<2 || !is_integral(v[1]) || v[1].type!=_INT_) return g; if (v[0].type==_STRNG) return string2gen(v[0]._STRNGptr->substr(0,v[1].val),false); if (v[0].type==_VECT){ const_iterateur it=v[0]._VECTptr->begin(),itend=v[0]._VECTptr->end(); int length=giacmax(0,giacmin(int(itend-it),v[1].val)); return gen(vecteur(it,it+length),v[0].subtype); } return g; } static const char _left_s[]="left"; static define_unary_function_eval (__left,&_left,_left_s); define_unary_function_ptr5( at_left ,alias_at_left,&__left,0,true); static const char _gauche_s[]="gauche"; static define_unary_function_eval (__gauche,&_left,_gauche_s); define_unary_function_ptr5( at_gauche ,alias_at_gauche,&__gauche,0,true); gen _right(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_SYMB && g._SYMBptr->feuille.type==_VECT && !g._SYMBptr->feuille._VECTptr->empty()) return g._SYMBptr->feuille._VECTptr->back(); #if defined HAVE_LIBMPFI && !defined NO_RTTI if (g.type==_REAL){ if (real_interval * ptr=dynamic_cast(g._REALptr)){ mpfr_t tmp; mpfr_init2(tmp,mpfi_get_prec(ptr->infsup)); mpfi_get_right(tmp,ptr->infsup); gen einf=real_object(tmp); mpfr_clear(tmp); return einf; } } #endif vecteur v(1,g); if (g.type==_VECT && g.subtype==_SEQ__VECT) v=*g._VECTptr; if (v.size()<2 || !is_integral(v[1]) || v[1].type!=_INT_) return g; if (v[0].type==_STRNG){ string & s=*v[0]._STRNGptr; int l=int(s.size()); int m=giacmin(giacmax(v[1].val,0),l); return string2gen(s.substr(l-m,m),false); } if (v[0].type==_VECT){ const_iterateur it=v[0]._VECTptr->begin(),itend=v[0]._VECTptr->end(); int length=giacmax(0,giacmin(int(itend-it),v[1].val)); return gen(vecteur(itend-length,itend),v[0].subtype); } return g; } static const char _right_s[]="right"; static define_unary_function_eval (__right,&_right,_right_s); define_unary_function_ptr5( at_right ,alias_at_right,&__right,0,true); static const char _droit_s[]="droit"; static define_unary_function_eval (__droit,&_right,_droit_s); define_unary_function_ptr5( at_droit ,alias_at_droit,&__droit,0,true); gen _mid(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(1,g); if (g.type==_VECT && g.subtype==_SEQ__VECT) v=*g._VECTptr; if (v.size()<2 || v[1].type!=_INT_) return g; int shift = xcas_mode(contextptr)!=0 || abs_calc_mode(contextptr)==38; int debut=v[1].val-shift; int nbre=RAND_MAX; if (v.size()>2 && v[2].type==_INT_) nbre=v[2].val; if (v[0].type==_STRNG){ string & s=*v[0]._STRNGptr; if (debut>=signed(s.size()) || debut<0) return string2gen("",false); int m=giacmin(giacmax(nbre,0),int(s.size())); return string2gen(s.substr(debut,m),false); } if (v[0].type==_VECT){ const_iterateur it=v[0]._VECTptr->begin(),itend=v[0]._VECTptr->end(); if (debut>=itend-it || debut<0) return gen(vecteur(0),v[0].subtype); int length=giacmax(0,giacmin(int(itend-it)-debut,nbre)); return gen(vecteur(it+debut,it+debut+length),v[0].subtype); } return g; } static const char _mid_s[]="mid"; static define_unary_function_eval (__mid,&_mid,_mid_s); define_unary_function_ptr5( at_mid ,alias_at_mid,&__mid,0,true); gen _ord(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_VECT) return apply(g,_ord,contextptr); if (g.type!=_STRNG || !g._STRNGptr->size()) return gensizeerr(contextptr); return int((*g._STRNGptr)[0]); } static const char _ord_s[]="ord"; static define_unary_function_eval (__ord,&_ord,_ord_s); define_unary_function_ptr5( at_ord ,alias_at_ord,&__ord,0,true); static gen shiftrotate(const gen & g,bool right){ bool shift=right; vecteur v(1,g); if (g.type==_VECT && g.subtype==_SEQ__VECT) v=*g._VECTptr; int nbre=-1; /* if (shift) nbre=1; */ if (v.size()>1 && v[1].type==_INT_) nbre=v[1].val; if (nbre<0){ nbre=-nbre; right=!right; } gen & a=v[0]; if (a.type==_INT_){ if (right) return a.val >> nbre; else return a.val << nbre; } if (a.type==_VECT){ const_iterateur it=a._VECTptr->begin(),itend=a._VECTptr->end(); nbre=giacmin(nbre,int(itend-it)); if (shift){ if (right) return gen(mergevecteur(vecteur(it+nbre,itend),vecteur(nbre,0)),a.subtype); return gen(mergevecteur(vecteur(nbre,0),vecteur(it,itend-nbre)),a.subtype); } if (right) return gen(mergevecteur(vecteur(itend-nbre,itend),vecteur(it,itend-nbre)),a.subtype); return gen(mergevecteur(vecteur(it+nbre,itend),vecteur(it,it+nbre)),a.subtype); } if (a.type==_STRNG){ string & s=*a._STRNGptr; int l=int(s.size()); nbre=giacmin(nbre,l); if (shift){ if (right) return string2gen(s.substr(nbre,l-nbre)+string(nbre,' '),false); return string2gen(string(l-nbre,' ')+s.substr(0,nbre),false); } if (right) return string2gen(s.substr(l-nbre,nbre)+s.substr(0,l-nbre),false); return string2gen(s.substr(nbre,l-nbre)+s.substr(0,nbre),false); } return a; } gen _rotate(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return shiftrotate(g,false); } static const char _rotate_s[]="rotate"; static define_unary_function_eval (__rotate,&_rotate,_rotate_s); define_unary_function_ptr5( at_rotate ,alias_at_rotate,&__rotate,0,true); gen _shift(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return shiftrotate(g,true); } static const char _shift_s[]="shift"; static define_unary_function_eval (__shift,&_shift,_shift_s); define_unary_function_ptr5( at_shift ,alias_at_shift,&__shift,0,true); gen _augment(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return concat(g,false,contextptr); } static const char _augment_s[]="augment"; static define_unary_function_eval (__augment,&_augment,_augment_s); define_unary_function_ptr5( at_augment ,alias_at_augment,&__augment,0,true); gen _semi_augment(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return concat(g,true,contextptr); } static const char _semi_augment_s[]="semi_augment"; static define_unary_function_eval (__semi_augment,&_semi_augment,_semi_augment_s); define_unary_function_ptr5( at_semi_augment ,alias_at_semi_augment,&__semi_augment,0,true); static const char _crossP_s[]="crossP"; static define_unary_function_eval (__crossP,&_cross,_crossP_s); define_unary_function_ptr5( at_crossP ,alias_at_crossP,&__crossP,0,true); static const char _scalarProduct_s[]="scalarProduct"; static define_unary_function_eval (__scalarProduct,&_dotprod,_scalarProduct_s); define_unary_function_ptr5( at_scalarProduct ,alias_at_scalarProduct,&__scalarProduct,0,true); static const char _dotP_s[]="dotP"; static define_unary_function_eval (__dotP,&_dotprod,_dotP_s); define_unary_function_ptr5( at_dotP ,alias_at_dotP,&__dotP,0,true); gen _cumSum(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT) return gensizeerr(contextptr); vecteur & v=*g._VECTptr; if (g.subtype==_SEQ__VECT && v.size()==2){ if (v.back()==at_col) return _tran(_cumSum(_tran(v.front(),contextptr),contextptr),contextptr); if (v.back()==at_row) return _cumSum(v.front(),contextptr); } const_iterateur it=v.begin(),itend=v.end(); if (it==itend) return zero; vecteur res; res.reserve(itend-it); gen somme(it->type==_STRNG?string2gen("",false):zero*(*it)); for (;it!=itend;++it){ res.push_back(somme=somme+*it); } return gen(res,g.subtype); } static const char _cumSum_s[]="cumSum"; static define_unary_function_eval (__cumSum,&_cumSum,_cumSum_s); define_unary_function_ptr5( at_cumSum ,alias_at_cumSum,&__cumSum,0,true); static const char _cumsum_s[]="cumsum"; static define_unary_function_eval (__cumsum,&_cumSum,_cumsum_s); define_unary_function_ptr5( at_cumsum ,alias_at_cumsum,&__cumsum,0,true); static gen _rightapply(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT) return _right(g,contextptr); return apply(g,_rightapply,contextptr); } gen _exp2list(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (is_zero(g)) return vecteur(0); gen g1(g); if (!g1.is_symb_of_sommet(at_ou)) g1=eval(g,eval_level(contextptr),contextptr); g1=remove_and(g1,at_ou); g1=_rightapply(g1,contextptr); if (g1.type!=_VECT) return vecteur(1,g1); else return g1; } static const char _exp2list_s[]="exp2list"; static define_unary_function_eval_quoted (__exp2list,&_exp2list,_exp2list_s); define_unary_function_ptr5( at_exp2list ,alias_at_exp2list,&__exp2list,_QUOTE_ARGUMENTS,true); gen _list2exp(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT || g.subtype!=_SEQ__VECT || g._VECTptr->size()!=2 ) return gensizeerr(contextptr); gen gf=g._VECTptr->front(); if (gf.type==_VECT && gf._VECTptr->empty()) return change_subtype(0,_INT_BOOLEAN); int x=xcas_mode(contextptr); xcas_mode(3,contextptr); gen res=solvepostprocess(gf,g._VECTptr->back(),contextptr); xcas_mode(x,contextptr); return res; } static const char _list2exp_s[]="list2exp"; static define_unary_function_eval (__list2exp,&_list2exp,_list2exp_s); define_unary_function_ptr5( at_list2exp ,alias_at_list2exp,&__list2exp,0,true); gen _list2mat(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT) return gensizeerr(contextptr); vecteur v=*g._VECTptr; if (ckmatrix(g)){ for (unsigned i=0;ibegin(),itend=v[0]._VECTptr->end(); for (;it!=itend;it+=nbre){ if (itend-it_VECTptr); } return gen(res,subt); } static const char _mat2list_s[]="mat2list"; static define_unary_function_eval (__mat2list,&_mat2list,_mat2list_s); define_unary_function_ptr5( at_mat2list ,alias_at_mat2list,&__mat2list,0,true); gen _newList(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (absint(g.val) > LIST_SIZE_LIMIT) return genstabilityerr(contextptr); if (g.type!=_INT_) return gensizeerr(contextptr); return vecteur(absint(g.val)); } static const char _newList_s[]="newList"; static define_unary_function_eval (__newList,&_newList,_newList_s); define_unary_function_ptr5( at_newList ,alias_at_newList,&__newList,0,true); static gen polyEval(const gen & p,const gen & x){ if (x.type==_VECT) return apply2nd(p,x,polyEval); return horner(p,x); } gen _polyEval(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT || g._VECTptr->size()!=2) return gensizeerr(contextptr); vecteur & v=*g._VECTptr; return polyEval(v[0],v[1]); } static const char _polyEval_s[]="polyEval"; static define_unary_function_eval (__polyEval,&_polyEval,_polyEval_s); define_unary_function_ptr5( at_polyEval ,alias_at_polyEval,&__polyEval,0,true); gen _product(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_VECT){ if (g.subtype!=_SEQ__VECT) return prodsum(g.eval(eval_level(contextptr),contextptr),true); vecteur v=*g._VECTptr; maple_sum_product_unquote(v,contextptr); int s=int(v.size()); if (!adjust_int_sum_arg(v,s)) return gensizeerr(contextptr); if (v.size()==4 && (v[2].type!=_INT_ || v[3].type!=_INT_)){ if (v[1].type!=_IDNT){ if (v[1].type!=_SYMB || lidnt(v[1]).empty()) return prodsum(g.eval(eval_level(contextptr),contextptr),true); identificateur tmp("x"); v[0]=quotesubst(v[0],v[1],tmp,contextptr); v[1]=tmp; gen res=_product(gen(v,g.subtype),contextptr); return quotesubst(res,tmp,v[1],contextptr); } v=quote_eval(v,makevecteur(v[1]),contextptr); gen n=v[1]; vecteur lv(1,n); lvar(v[0],lv); if (is_zero(derive(vecteur(lv.begin()+1,lv.end()),n,contextptr),contextptr)){ v[0]=e2r(v[0],lv,contextptr); gen p1,p2; fxnd(v[0],p1,p2); return simplify(product(gen2polynome(p1,int(lv.size())),lv,n,v[2],v[3],contextptr)/product(gen2polynome(p2,int(lv.size())),lv,n,v[2],v[3],contextptr),contextptr); } } if (v.size()==4 && v[2].type==_INT_ && v[3].type==_INT_ && v[2].val>v[3].val){ if (v[3].val==v[2].val-1) return 1; #if defined RTOS_THREADX || defined BESTA_OS || defined USTL { gen a=v[2]; v[2]=v[3]; v[3]=a; } #else swap(v[2],v[3]); #endif v[2]=v[2]+1; v[3]=v[3]-1; return inv(seqprod(gen(v,_SEQ__VECT),1,contextptr),contextptr); } return seqprod(gen(v,_SEQ__VECT),1,contextptr); } gen tmp=g.eval(eval_level(contextptr),contextptr); if (tmp.type==_VECT) return _product(tmp,contextptr); return seqprod(g,1,contextptr); } static const char _product_s[]="product"; static define_unary_function_eval_quoted (__product,&_product,_product_s); define_unary_function_ptr5( at_product ,alias_at_product,&__product,_QUOTE_ARGUMENTS,true); // maple name for product static const char _mul_s[]="mul"; static define_unary_function_eval (__mul,&_product,_mul_s); define_unary_function_ptr5( at_mul ,alias_at_mul,&__mul,0,true); bool complex_sort(const gen & a,const gen & b,GIAC_CONTEXT){ if (a.type==_VECT && !a._VECTptr->empty() && b.type==_VECT && !b._VECTptr->empty()) return complex_sort(a._VECTptr->front(),b._VECTptr->front(),contextptr); if (a==b) return false; if (a.type==_CPLX && b.type==_CPLX){ if (*a._CPLXptr!=*b._CPLXptr) return is_strictly_greater(*b._CPLXptr,*a._CPLXptr,contextptr); return is_strictly_greater(*(b._CPLXptr+1),*(a._CPLXptr+1),contextptr); } if (a.type==_CPLX){ if (*a._CPLXptr!=b) return is_strictly_greater(b,*a._CPLXptr,contextptr); return is_strictly_greater(0,*(a._CPLXptr+1),contextptr); } if (b.type==_CPLX){ if (a!=*b._CPLXptr) return is_strictly_greater(*b._CPLXptr,a,contextptr); return is_strictly_greater(*(b._CPLXptr+1),0,contextptr); } gen g=inferieur_strict(a,b,contextptr); if (g.type!=_INT_) return a.islesscomplexthan(b); return g.val==1; } gen sortad(const vecteur & v,bool ascend,GIAC_CONTEXT){ if (v.empty()) return v; vecteur valeur=*eval(v,eval_level(contextptr),contextptr)._VECTptr; bool ismat=ckmatrix(valeur); if (!ismat) valeur=vecteur(1,valeur); valeur=mtran(valeur); #if 1 gen_sort_f_context(valeur.begin(),valeur.end(),complex_sort,contextptr); if (!ascend) reverse(valeur.begin(),valeur.end()); #else if (ascend) gen_sort_f(valeur.begin(),valeur.end(),first_ascend_sort); else gen_sort_f(valeur.begin(),valeur.end(),first_descend_sort); #endif valeur=mtran(valeur); if (!ismat) return valeur.front(); return valeur; } gen _SortA(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_VECT) return sortad(*g._VECTptr,true,contextptr); if (g.type!=_IDNT) return gensizeerr(contextptr); gen valeur=eval(g,eval_level(contextptr),contextptr); if (valeur.type!=_VECT) return gensizeerr(contextptr); return sto(sortad(*valeur._VECTptr,true,contextptr),g,contextptr); } static const char _SortA_s[]="SortA"; static define_unary_function_eval_quoted (__SortA,&_SortA,_SortA_s); define_unary_function_ptr5( at_SortA ,alias_at_SortA,&__SortA,_QUOTE_ARGUMENTS,T_RETURN); gen _sorta(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_VECT) return sortad(*g._VECTptr,true,contextptr); return gensizeerr(contextptr); } static const char _sorta_s[]="sorta"; static define_unary_function_eval (__sorta,&_sorta,_sorta_s); define_unary_function_ptr5( at_sorta ,alias_at_sorta,&__sorta,0,true); gen _SortD(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_VECT) return sortad(*g._VECTptr,false,contextptr); if (g.type!=_IDNT) return gensizeerr(contextptr); gen valeur=eval(g,eval_level(contextptr),contextptr); if (valeur.type!=_VECT) return gensizeerr(contextptr); return sto(sortad(*valeur._VECTptr,false,contextptr),g,contextptr); } static const char _SortD_s[]="SortD"; static define_unary_function_eval_quoted (__SortD,&_SortD,_SortD_s); define_unary_function_ptr5( at_SortD ,alias_at_SortD,&__SortD,_QUOTE_ARGUMENTS,T_RETURN); gen _sortd(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type==_VECT) return sortad(*g._VECTptr,false,contextptr); return gensizeerr(contextptr); } static const char _sortd_s[]="sortd"; static define_unary_function_eval (__sortd,&_sortd,_sortd_s); define_unary_function_ptr5( at_sortd ,alias_at_sortd,&__sortd,0,true); static const char _approx_s[]="approx"; static define_unary_function_eval (__approx,&_evalf,_approx_s); define_unary_function_ptr5( at_approx ,alias_at_approx,&__approx,0,true); static const char _ceiling_s[]="ceiling"; static define_unary_function_eval (__ceiling,&_ceil,_ceiling_s); define_unary_function_ptr5( at_ceiling ,alias_at_ceiling,&__ceiling,0,true); static const char _imag_s[]="imag"; static define_unary_function_eval (unary__imag,(const gen_op_context)im,_imag_s); define_unary_function_ptr5( at_imag ,alias_at_imag,&unary__imag,0,true); static const char _real_s[]="real"; static define_unary_function_eval (unary__real,(const gen_op_context)re,_real_s); define_unary_function_ptr5( at_real ,alias_at_real,&unary__real,0,true); static const char _intDiv_s[]="intDiv"; static define_unary_function_eval (__intDiv,(const gen_op_context)_iquo,_intDiv_s); define_unary_function_ptr5( at_intDiv ,alias_at_intDiv,&__intDiv,0,true); static const char _remain_s[]="remain"; static define_unary_function_eval (__remain,(const gen_op_context)_irem,_remain_s); define_unary_function_ptr5( at_remain ,alias_at_remain,&__remain,0,true); gen _int(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (xcas_mode(contextptr)==3) return _floor(evalf(g,1,contextptr),contextptr); else return _integrate(g,contextptr); } static const char _int_s[]="int"; static define_unary_function_eval (__int,(const gen_op_context)_int,_int_s); define_unary_function_ptr5( at_int ,alias_at_int,&__int,_QUOTE_ARGUMENTS,true); static const char _isPrime_s[]="isPrime"; static define_unary_function_eval (__isPrime,&_isprime,_isPrime_s); define_unary_function_ptr5( at_isPrime ,alias_at_isPrime,&__isPrime,0,true); static const char _nCr_s[]="nCr"; static define_unary_function_eval (__nCr,&_comb,_nCr_s); define_unary_function_ptr5( at_nCr ,alias_at_nCr,&__nCr,0,true); static const char _nPr_s[]="nPr"; static define_unary_function_eval (__nPr,&_perm,_nPr_s); define_unary_function_ptr5( at_nPr ,alias_at_nPr,&__nPr,0,true); gen _iPart(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (is_positive(g,contextptr)) return evalf(_floor(g,contextptr),eval_level(contextptr),contextptr); if (is_positive(-g,contextptr)) return -evalf(_floor(-g,contextptr),eval_level(contextptr),contextptr); if (g.type==_CPLX) return _iPart(re(g,contextptr),contextptr)+cst_i*_iPart(im(g,contextptr),contextptr); if (g.type==_VECT) return apply(g,_iPart,contextptr); return symbolic(at_iPart,g); } static const char _iPart_s[]="iPart"; static define_unary_function_eval (__iPart,&_iPart,_iPart_s); define_unary_function_ptr5( at_iPart ,alias_at_iPart,&__iPart,0,true); gen _Fill(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()!=2 || v[1].type!=_IDNT) return gensizeerr(contextptr); gen value(eval(v[1],eval_level(contextptr),contextptr)); if (value.type!=_VECT) return sto(v[0],v[1],contextptr); gen dim=_dim(value,contextptr); if (dim.type==_INT_) return sto(vecteur(dim.val,eval(v[0],eval_level(contextptr),contextptr)),v[1],contextptr); if (dim.type==_VECT){ vecteur & w=*dim._VECTptr; if (w.size()!=2 || w.front().type!=_INT_ || w.back().type!=_INT_) return gensizeerr(contextptr); return sto(vecteur(w[0].val,vecteur(w[1].val,eval(v[0],eval_level(contextptr),contextptr))),v[1],contextptr); } return gensizeerr(contextptr); } static const char _Fill_s[]="Fill"; static define_unary_function_eval_quoted (__Fill,&_Fill,_Fill_s); define_unary_function_ptr5( at_Fill ,alias_at_Fill,&__Fill,_QUOTE_ARGUMENTS,T_RETURN); gen _mRow(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()>1 && is_Ans(v[1])) v[1]=eval(v[1],1,contextptr); if (v.size()>1 && v[1].type==_IDNT){ gen v1=v[1]; gen args=eval(g,eval_level(contextptr),contextptr); if (ckmatrix(args[1])) return sto(_mRow(args,contextptr),v1,contextptr); } if (v.size()!=3 || !ckmatrix(v[1]) || v[2].type!=_INT_ ) return gentypeerr(contextptr); int s=int(v[1]._VECTptr->size()); int shift = xcas_mode(contextptr)!=0 || abs_calc_mode(contextptr)==38; int l=v[2].val-shift; if (l<0 || l>=s) return gendimerr(contextptr); vecteur w=*v[1]._VECTptr; w[l]=v[0]*w[l]; return w; } static const char _mRow_s[]="mRow"; static define_unary_function_eval (__mRow,&_mRow,_mRow_s); define_unary_function_ptr5( at_mRow ,alias_at_mRow,&__mRow,0,true); gen _mRowAdd(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()>1 && is_Ans(v[1])) v[1]=eval(v[1],1,contextptr); if (v.size()>1 && v[1].type==_IDNT){ gen v1=v[1]; gen args=eval(g,eval_level(contextptr),contextptr); if (ckmatrix(args[1])) return sto(_mRowAdd(args,contextptr),v1,contextptr); } if (v.size()!=4) return gentypeerr(contextptr); v[3]=_floor(v[3],contextptr); v[2]=_floor(v[2],contextptr); if (!ckmatrix(v[1]) || v[2].type!=_INT_ || v[3].type!=_INT_) return gentypeerr(contextptr); int s=int(v[1]._VECTptr->size()); int shift = xcas_mode(contextptr)!=0 || abs_calc_mode(contextptr)==38; int l1=v[2].val-shift,l2=v[3].val-shift; if (l1<0 || l1>=s || l2<0 || l2>=s) return gendimerr(contextptr); vecteur w=*v[1]._VECTptr; w[l2]=v[0]*w[l1]+w[l2]; return w; } static const char _mRowAdd_s[]="mRowAdd"; static define_unary_function_eval (__mRowAdd,&_mRowAdd,_mRowAdd_s); define_unary_function_ptr5( at_mRowAdd ,alias_at_mRowAdd,&__mRowAdd,0,true); gen _rowAdd(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (!v.empty() && is_Ans(v[0])) v[0]=eval(v[0],1,contextptr); if (!v.empty() && v[0].type==_IDNT){ gen v0=v[0]; gen args=eval(g,eval_level(contextptr),contextptr); if (ckmatrix(args)) return sto(_rowAdd(args,contextptr),v0,contextptr); } if (v.size()!=3) return gentypeerr(contextptr); v[1]=_floor(v[1],contextptr); v[2]=_floor(v[2],contextptr); if (!ckmatrix(v[0]) || v[1].type!=_INT_ || v[2].type!=_INT_) return gentypeerr(contextptr); int s=int(v[0]._VECTptr->size()); int shift = xcas_mode(contextptr)!=0 || abs_calc_mode(contextptr)==38; int l1=v[1].val-shift,l2=v[2].val-shift; if (l1<0 || l1>=s || l2<0 || l2>=s) return gendimerr(contextptr); vecteur w=*v[0]._VECTptr; w[l2]=w[l1]+w[l2]; return w; } static const char _rowAdd_s[]="rowAdd"; static define_unary_function_eval (__rowAdd,&_rowAdd,_rowAdd_s); define_unary_function_ptr5( at_rowAdd ,alias_at_rowAdd,&__rowAdd,0,true); gen _rowSwap(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (!v.empty() && is_Ans(v[0])) v[0]=eval(v[0],1,contextptr); if (!v.empty() && v[0].type==_IDNT){ gen v0=v[0]; gen args=eval(g,eval_level(contextptr),contextptr); if (ckmatrix(args[0])) return sto(_rowSwap(args,contextptr),v0,contextptr); } if (v.size()!=3) return gentypeerr(contextptr); v[1]=_floor(v[1],contextptr); v[2]=_floor(v[2],contextptr); if (!ckmatrix(v[0]) || v[1].type!=_INT_ || v[2].type!=_INT_) return gentypeerr(contextptr); int s=int(v[0]._VECTptr->size()); int shift = xcas_mode(contextptr)!=0 || abs_calc_mode(contextptr)==38; int l1=v[1].val-shift,l2=v[2].val-shift; if (l1<0 || l1>=s || l2<0 || l2>=s) return gendimerr(contextptr); vecteur w=*v[0]._VECTptr; swapgen(w[l2],w[l1]); return w; } static const char _rowSwap_s[]="rowSwap"; static define_unary_function_eval (__rowSwap,&_rowSwap,_rowSwap_s); define_unary_function_ptr5( at_rowSwap ,alias_at_rowSwap,&__rowSwap,0,true); static const char _rowswap_s[]="rowswap"; static define_unary_function_eval (__rowswap,&_rowSwap,_rowswap_s); define_unary_function_ptr5( at_rowswap ,alias_at_rowswap,&__rowswap,0,true); static const char _swaprow_s[]="swaprow"; static define_unary_function_eval (__swaprow,&_rowSwap,_swaprow_s); define_unary_function_ptr5( at_swaprow ,alias_at_swaprow,&__swaprow,0,true); gen _LU(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (abs_calc_mode(contextptr)==38){ gen args=evalf(g,eval_level(contextptr),contextptr); gen res=lu(args,contextptr); if (res.type==_VECT && res._VECTptr->size()==3){ vecteur & v = *res._VECTptr; gen tmpv=_permu2mat(v[0],contextptr); if (is_undef(tmpv)) return tmpv; return gen(makevecteur(v[1],v[2],tmpv),_LIST__VECT); } return res; } vecteur v(gen2vecteur(g)); gen res; if (v.size()==5) v.pop_back(); if (v.size()!=4 || !is_squarematrix(res=eval(v[0],eval_level(contextptr),contextptr)) || v[1].type!=_IDNT || v[2].type!=_IDNT || v[3].type!=_IDNT) return gentypeerr(contextptr); res=lu(res,contextptr); // P,L,U if (is_undef(res) || res.type!=_VECT || res.subtype!=_SEQ__VECT || res._VECTptr->size()!=3) return res; gen tmpsto=sto(res[1],v[1],contextptr); if (is_undef(tmpsto)) return tmpsto; tmpsto=sto(res[2],v[2],contextptr); if (is_undef(tmpsto)) return tmpsto; res=sto(_permu2mat(res[0],contextptr),v[3],contextptr); return res; } static const char _LU_s[]="LU"; static define_unary_function_eval_quoted (__LU,&_LU,_LU_s); define_unary_function_ptr5( at_LU ,alias_at_LU,&__LU,_QUOTE_ARGUMENTS,true); gen _QR(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (abs_calc_mode(contextptr)==38){ gen args=evalf(eval(g,1,contextptr),eval_level(contextptr),contextptr); gen res=qr(makevecteur(args,-1),contextptr); if (res.type==_VECT) res.subtype=_SEQ__VECT; return res; } vecteur v(gen2vecteur(g)); if (v.size()==4) v.pop_back(); gen res; if (v.size()!=3 || !is_squarematrix(res=eval(v[0],eval_level(contextptr),contextptr)) || v[1].type!=_IDNT || v[2].type!=_IDNT ) return gentypeerr(contextptr); gen res1=qr(res,contextptr); if (is_undef(res1) || !ckmatrix(res1[0]) || !ckmatrix(res1[1])) return res; gen tmpsto=sto(res1[0],v[1],contextptr); if (is_undef(tmpsto)) return tmpsto; return sto(res1[1],v[2],contextptr); } static const char _QR_s[]="QR"; static define_unary_function_eval_quoted (__QR,&_QR,_QR_s); define_unary_function_ptr5( at_QR ,alias_at_QR,&__QR,_QUOTE_ARGUMENTS,true); gen _newMat(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_VECT || g._VECTptr->size()!=2) return gentypeerr(contextptr); vecteur & v=*g._VECTptr; if (v[0].type!=_INT_ || v[1].type!=_INT_ ) return gensizeerr(contextptr); int l=absint(v[0].val),c=absint(v[1].val); if (l > LIST_SIZE_LIMIT || c > LIST_SIZE_LIMIT || longlong(l) * c > LIST_SIZE_LIMIT) return gendimerr(contextptr); return vecteur(l,vecteur(c)); } static const char _newMat_s[]="newMat"; static define_unary_function_eval (__newMat,&_newMat,_newMat_s); define_unary_function_ptr5( at_newMat ,alias_at_newMat,&__newMat,0,true); gen _ref(const gen & a_orig,GIAC_CONTEXT) { if ( a_orig.type==_STRNG && a_orig.subtype==-1) return a_orig; matrice a; bool convert_internal,minor_det,keep_pivot; int algorithm,last_col; if (!read_reduction_options(a_orig,a,convert_internal,algorithm,minor_det,keep_pivot,last_col)) return gensizeerr(contextptr); if (minor_det) return gensizeerr(gettext("minor_det option applies only to det")); gen det; vecteur pivots; matrice res; mrref(a,res,pivots,det,0,int(a.size()),0,int(a.front()._VECTptr->size()), /* fullreduction */0,0,true,1,0, contextptr); if (keep_pivot) return res; bool reducelast = a.size()!=a.front()._VECTptr->size()-1; mdividebypivot(res,reducelast?-1:-2); return res; } static const char _ref_s[]="ref"; static define_unary_function_eval (__ref,&giac::_ref,_ref_s); define_unary_function_ptr5( at_ref ,alias_at_ref,&__ref,0,true); vecteur gen2vecteur(const gen & g,int exclude){ if (g.type!=_VECT || g.subtype==exclude) return vecteur(1,g); return *g._VECTptr; } gen _subMat(const gen & g,GIAC_CONTEXT) { if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g,0)); if (v.empty() || !ckmatrix(v[0]) ) return gentypeerr(contextptr); int lignedeb=1,colonnedeb=1,lignefin=1,colonnefin=1; mdims(*v[0]._VECTptr,lignefin,colonnefin); int shift = xcas_mode(contextptr)!=0 || abs_calc_mode(contextptr)==38; if (v.size()>2 && v[1].is_symb_of_sommet(at_interval)){ gen f = v[1]._SYMBptr->feuille; if (f.type==_VECT && f._VECTptr->size()==2){ gen f1=f._VECTptr->front(); gen f2=f._VECTptr->back(); if (is_integral(f1) && is_integral(f2) && f1.type==_INT_ && f2.type==_INT_){ lignedeb=giacmax(1,f1.val+!shift); lignefin=giacmax(1,f2.val+!shift); } else gensizeerr(contextptr); } if (v[2].is_symb_of_sommet(at_interval)){ gen f = v[2]._SYMBptr->feuille; if (f.type==_VECT && f._VECTptr->size()==2){ gen f1=f._VECTptr->front(); gen f2=f._VECTptr->back(); if (is_integral(f1) && is_integral(f2) && f1.type==_INT_ && f2.type==_INT_){ colonnedeb=giacmax(1,f1.val+!shift); colonnefin=giacmax(1,f2.val+!shift); } else gensizeerr(contextptr); } } } if (v.size()>2 && v[1].type==_VECT && v[1]._VECTptr->size()==2 && v[2].type==_VECT && v[2]._VECTptr->size()==2){ gen f1=v[1]._VECTptr->front(); gen f2=v[1]._VECTptr->back(); gen f3=v[2]._VECTptr->front(); gen f4=v[2]._VECTptr->back(); if (is_integral(f1) && is_integral(f2) && f1.type==_INT_ && f2.type==_INT_ && is_integral(f3) && is_integral(f4) && f3.type==_INT_ && f4.type==_INT_){ lignedeb=giacmax(1,f1.val+!shift); colonnedeb=giacmax(1,f2.val+!shift); lignefin=giacmax(1,f3.val+!shift); colonnefin=giacmax(1,f4.val+!shift); } else gensizeerr(contextptr); } if (v.size()>1 && is_integral(v[1]) && v[1].type==_INT_) lignedeb=giacmax(1,v[1].val+!shift); if (v.size()>2 && is_integral(v[2]) && v[2].type==_INT_) colonnedeb=giacmax(1,v[2].val+!shift); if (v.size()>3 && is_integral(v[3]) && v[3].type==_INT_) lignefin=giacmax(giacmin(lignefin,v[3].val+!shift),lignedeb); if (v.size()>4 && is_integral(v[4]) && v[4].type==_INT_) colonnefin=giacmax(colonnedeb,giacmin(colonnefin,v[4].val+!shift)); return matrice_extract(*v[0]._VECTptr,lignedeb-1,colonnedeb-1,lignefin-lignedeb+1,colonnefin-colonnedeb+1); } static const char _subMat_s[]="subMat"; static define_unary_function_eval (__subMat,&giac::_subMat,_subMat_s); define_unary_function_ptr5( at_subMat ,alias_at_subMat,&__subMat,0,true); static const char _submatrix_s[]="submatrix"; static define_unary_function_eval (__submatrix,&giac::_subMat,_submatrix_s); define_unary_function_ptr5( at_submatrix ,alias_at_submatrix,&__submatrix,0,true); gen _unitV(const gen & g,GIAC_CONTEXT) { if ( g.type==_STRNG && g.subtype==-1) return g; return rdiv(g,_l2norm(g,contextptr),contextptr); } static const char _unitV_s[]="unitV"; static define_unary_function_eval (__unitV,&giac::_unitV,_unitV_s); define_unary_function_ptr5( at_unitV ,alias_at_unitV,&__unitV,0,true); gen L1norm(const gen & g,GIAC_CONTEXT){ if (g.type!=_VECT) return abs(g,contextptr); vecteur & v=*g._VECTptr; gen res; const_iterateur it=v.begin(),itend=v.end(); for (;it!=itend;++it) res=res+abs(*it,contextptr); return res; } gen _rowNorm(const gen & g,GIAC_CONTEXT) { if ( g.type==_STRNG && g.subtype==-1) return g; if (!ckmatrix(g)) return gentypeerr(contextptr); const_iterateur it=g._VECTptr->begin(),itend=g._VECTptr->end(); gen res; for (;it!=itend;++it){ res=max(res,L1norm(*it,contextptr),contextptr); } return res; } static const char _rowNorm_s[]="rowNorm"; static define_unary_function_eval (__rowNorm,&giac::_rowNorm,_rowNorm_s); define_unary_function_ptr5( at_rowNorm ,alias_at_rowNorm,&__rowNorm,0,true); static const char _rownorm_s[]="rownorm"; static define_unary_function_eval (__rownorm,&giac::_rowNorm,_rownorm_s); define_unary_function_ptr5( at_rownorm ,alias_at_rownorm,&__rownorm,0,true); gen _colNorm(const gen & g,GIAC_CONTEXT) { if ( g.type==_STRNG && g.subtype==-1) return g; if (!ckmatrix(g)) return gentypeerr(contextptr); return _rowNorm(mtran(*g._VECTptr),contextptr); } static const char _colNorm_s[]="colNorm"; static define_unary_function_eval (__colNorm,&giac::_colNorm,_colNorm_s); define_unary_function_ptr5( at_colNorm ,alias_at_colNorm,&__colNorm,0,true); static const char _colnorm_s[]="colnorm"; static define_unary_function_eval (__colnorm,&giac::_colNorm,_colnorm_s); define_unary_function_ptr5( at_colnorm ,alias_at_colnorm,&__colnorm,0,true); gen _ClrIO(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return __interactive.op(symbolic(at_ClrIO,0),contextptr); } static const char _ClrIO_s[]="ClrIO"; static define_unary_function_eval2 (__ClrIO,&_ClrIO,_ClrIO_s,&printastifunction); define_unary_function_ptr5( at_ClrIO ,alias_at_ClrIO,&__ClrIO,0,T_EXPRESSION); gen _Output(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()!=3 || v[0].type!=_INT_ || v[1].type!=_INT_ ) return gentypeerr(contextptr); return __interactive.op(g,contextptr); } static const char _Output_s[]="Output"; static define_unary_function_eval2 (__Output,&_Output,_Output_s,&printastifunction); define_unary_function_ptr5( at_Output ,alias_at_Output,&__Output,0,T_RETURN); gen _getKey(const gen & g,GIAC_CONTEXT){ if (interactive_op_tab && interactive_op_tab[4]) return interactive_op_tab[4](g,contextptr); if ( g.type==_STRNG && g.subtype==-1) return g; char ch; CERR << "Waiting for a keystroke in konsole screen" << endl; CIN >> ch; return int(ch); } static const char _getKey_s[]="getKey"; #if defined RTOS_THREADX || defined BESTA_OS static define_unary_function_eval(__getKey,&_getKey,_getKey_s); #else unary_function_eval __getKey(0,&_getKey,_getKey_s); #endif define_unary_function_ptr5( at_getKey ,alias_at_getKey,&__getKey,0,true); gen _CopyVar(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()!=2 || v[0].type!=_IDNT || v[1].type!=_IDNT ) return gentypeerr(contextptr); return sto(v[0].eval(1,contextptr),v[1],contextptr); } static const char _CopyVar_s[]="CopyVar"; static define_unary_function_eval2_quoted (__CopyVar,&_CopyVar,_CopyVar_s,&printastifunction); define_unary_function_ptr5( at_CopyVar ,alias_at_CopyVar,&__CopyVar,_QUOTE_ARGUMENTS,T_RETURN); gen _DelFold(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; gen res=_SetFold(0,contextptr); gen e=_purge(g,contextptr); if (is_undef(e)){ _SetFold(res,contextptr); return e; } return res; } static const char _DelFold_s[]="DelFold"; static define_unary_function_eval2_quoted (__DelFold,&_DelFold,_DelFold_s,&printastifunction); define_unary_function_ptr5( at_DelFold ,alias_at_DelFold,&__DelFold,_QUOTE_ARGUMENTS,T_RETURN); gen _DispG(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return __interactive.op(symbolic(at_DispG,0),contextptr); } static const char _DispG_s[]="DispG"; static define_unary_function_eval2 (__DispG,&_DispG,_DispG_s,&printastifunction); define_unary_function_ptr5( at_DispG ,alias_at_DispG,&__DispG,0,T_EXPRESSION); gen _DispHome(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return __interactive.op(symbolic(at_DispHome,0),contextptr); } static const char _DispHome_s[]="DispHome"; static define_unary_function_eval2 (__DispHome,&_DispHome,_DispHome_s,&printastifunction); define_unary_function_ptr5( at_DispHome ,alias_at_DispHome,&__DispHome,0,T_EXPRESSION); static const char _entry_s[]="entry"; static define_unary_function_eval (__entry,&_quest,_entry_s); define_unary_function_ptr5( at_entry ,alias_at_entry,&__entry,0,true); gen _Exec(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return string2gen("TI instruction not supported",false); } static const char _Exec_s[]="Exec"; static define_unary_function_eval2 (__Exec,&_Exec,_Exec_s,&printastifunction); define_unary_function_ptr5( at_Exec ,alias_at_Exec,&__Exec,0,T_RETURN); static const char _Get_s[]="Get"; static define_unary_function_eval2_quoted (__Get,&_Exec,_Get_s,&printastifunction); define_unary_function_ptr5( at_Get ,alias_at_Get,&__Get,_QUOTE_ARGUMENTS,T_RETURN); static const char _GetCalc_s[]="GetCalc"; static define_unary_function_eval2_quoted (__GetCalc,&_Exec,_GetCalc_s,&printastifunction); define_unary_function_ptr5( at_GetCalc ,alias_at_GetCalc,&__GetCalc,_QUOTE_ARGUMENTS,T_RETURN); gen _NewFold(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_IDNT) return gensizeerr(contextptr); _SetFold(0,contextptr); gen tmpsto=sto(gen(vecteur(1,vecteur(0)),_FOLDER__VECT),g,contextptr); if (is_undef(tmpsto)) return tmpsto; return _SetFold(g,contextptr); } static const char _NewFold_s[]="NewFold"; static define_unary_function_eval2_quoted (__NewFold,&_NewFold,_NewFold_s,&printastifunction); define_unary_function_ptr5( at_NewFold ,alias_at_NewFold,&__NewFold,_QUOTE_ARGUMENTS,T_RETURN); gen _GetFold(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return getfold(current_folder_name); } static const char _GetFold_s[]="GetFold"; static define_unary_function_eval2 (__GetFold,&_GetFold,_GetFold_s,&printastifunction); define_unary_function_ptr5( at_GetFold ,alias_at_GetFold,&__GetFold,0,T_EXPRESSION); gen _StoPic(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_IDNT) return gensizeerr(contextptr); return sto(__interactive.op(0,contextptr),g,contextptr); } static const char _StoPic_s[]="StoPic"; static define_unary_function_eval2_quoted (__StoPic,&_StoPic,_StoPic_s,&printastifunction); define_unary_function_ptr5( at_StoPic ,alias_at_StoPic,&__StoPic,_QUOTE_ARGUMENTS,T_RETURN); gen _RclPic(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_IDNT) return gensizeerr(contextptr); gen tmp=eval(g,eval_level(contextptr),contextptr); if (tmp.type!=_VECT) return gensizeerr(contextptr); return __interactive.op(symbolic(at_RclPic,tmp),contextptr); } static const char _RclPic_s[]="RclPic"; static define_unary_function_eval2_quoted (__RclPic,&_RclPic,_RclPic_s,&printastifunction); define_unary_function_ptr5( at_RclPic ,alias_at_RclPic,&__RclPic,_QUOTE_ARGUMENTS,T_RETURN); gen _RplcPic(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_IDNT) return gensizeerr(contextptr); gen tmp=eval(g,eval_level(contextptr),contextptr); if (tmp.type!=_VECT) return gensizeerr(contextptr); return __interactive.op(symbolic(at_RplcPic,tmp),contextptr); } static const char _RplcPic_s[]="RplcPic"; static define_unary_function_eval2_quoted (__RplcPic,&_RplcPic,_RplcPic_s,&printastifunction); define_unary_function_ptr5( at_RplcPic ,alias_at_RplcPic,&__RplcPic,_QUOTE_ARGUMENTS,T_RETURN); gen _ClrGraph(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return __interactive.op(symbolic(at_erase,0),contextptr); } static const char _ClrGraph_s[]="ClrGraph"; static define_unary_function_eval2 (__ClrGraph,&_ClrGraph,_ClrGraph_s,&printastifunction); define_unary_function_ptr5( at_ClrGraph ,alias_at_ClrGraph,&__ClrGraph,0,T_EXPRESSION); gen _ClrDraw(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return __interactive.op(symbolic(at_erase,0),contextptr); } static const char _ClrDraw_s[]="ClrDraw"; static define_unary_function_eval2 (__ClrDraw,&_ClrDraw,_ClrDraw_s,&printastifunction); define_unary_function_ptr5( at_ClrDraw ,alias_at_ClrDraw,&__ClrDraw,0,T_EXPRESSION); gen _PtOn(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return _point(g,contextptr); } static const char _PtOn_s[]="PtOn"; static define_unary_function_eval2 (__PtOn,&_PtOn,_PtOn_s,&printastifunction); define_unary_function_ptr5( at_PtOn ,alias_at_PtOn,&__PtOn,0,T_RETURN); gen _PtOff(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; gen tmp=_point(g,contextptr); if (tmp.type==_SYMB && tmp._SYMBptr->sommet==at_pnt) return symb_pnt(tmp[0],int(FL_WHITE),contextptr); else return tmp; } static const char _PtOff_s[]="PtOff"; static define_unary_function_eval2 (__PtOff,&_PtOff,_PtOff_s,&printastifunction); define_unary_function_ptr5( at_PtOff ,alias_at_PtOff,&__PtOff,0,T_RETURN); static const char _PxlOn_s[]="PxlOn"; static define_unary_function_eval2 (__PxlOn,&_pixon,_PxlOn_s,&printastifunction); define_unary_function_ptr5( at_PxlOn ,alias_at_PxlOn,&__PxlOn,0,T_RETURN); static const char _PxlOff_s[]="PxlOff"; static define_unary_function_eval2 (__PxlOff,&_pixoff,_PxlOff_s,&printastifunction); define_unary_function_ptr5( at_PxlOff ,alias_at_PxlOff,&__PxlOff,0,T_RETURN); gen _Line(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<4) return gensizeerr(contextptr); int couleur=FL_BLACK; if (v.size()==5 && v[4].val==0) couleur=FL_WHITE; return _couleur(makesequence(_segment(makesequence(v[0]+cst_i*v[1],v[2]+cst_i*v[3]),contextptr),couleur),contextptr); } static const char _Line_s[]="Line"; static define_unary_function_eval2 (__Line,&_Line,_Line_s,&printastifunction); define_unary_function_ptr5( at_Line ,alias_at_Line,&__Line,0,T_RETURN); gen _LineHorz(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<1) return gensizeerr(contextptr); int couleur=FL_BLACK; if (v.size()==2 && v[1].val==0) couleur=FL_WHITE; return _couleur(makesequence(_droite(makesequence(cst_i*v[0],1+cst_i*v[0]),contextptr),couleur),contextptr); } static const char _LineHorz_s[]="LineHorz"; static define_unary_function_eval2 (__LineHorz,&_LineHorz,_LineHorz_s,&printastifunction); define_unary_function_ptr5( at_LineHorz ,alias_at_LineHorz,&__LineHorz,0,T_RETURN); gen _LineVert(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<1) return gensizeerr(contextptr); int couleur=FL_BLACK; if (v.size()==2 && v[1].val==0) couleur=FL_WHITE; return _couleur(makesequence(_droite(makesequence(v[0],cst_i+v[0]),contextptr),couleur),contextptr); } static const char _LineVert_s[]="LineVert"; static define_unary_function_eval2 (__LineVert,&_LineVert,_LineVert_s,&printastifunction); define_unary_function_ptr5( at_LineVert ,alias_at_LineVert,&__LineVert,0,T_RETURN); gen _DrawSlp(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<3) return gensizeerr(contextptr); gen pt(v[0]+cst_i*v[1]); return _droite(makesequence(pt,pt+1+cst_i*v[2]),contextptr); } static const char _DrawSlp_s[]="DrawSlp"; static define_unary_function_eval2 (__DrawSlp,&_DrawSlp,_DrawSlp_s,&printastifunction); define_unary_function_ptr5( at_DrawSlp ,alias_at_DrawSlp,&__DrawSlp,0,T_RETURN); gen _Circle(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<3) return gensizeerr(contextptr); int couleur=FL_BLACK; if (v.size()==4 && v[3].val==0) couleur=FL_WHITE; gen centre(v[0]+cst_i*v[1]); return _couleur(makesequence(_cercle(makesequence(centre,v[2]),contextptr),couleur),contextptr); } static const char _Circle_s[]="Circle"; static define_unary_function_eval2 (__Circle,&_Circle,_Circle_s,&printastifunction); define_unary_function_ptr5( at_Circle ,alias_at_Circle,&__Circle,0,T_RETURN); gen _PtText(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<3) return gensizeerr(contextptr); gen tmp(v[1]+cst_i*v[2]); return _legende(makesequence(tmp,v[0]),contextptr); } static const char _PtText_s[]="PtText"; static define_unary_function_eval2 (__PtText,&_PtText,_PtText_s,&printastifunction); define_unary_function_ptr5( at_PtText ,alias_at_PtText,&__PtText,0,T_RETURN); gen _NewPic(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.size()<2|| !ckmatrix(v[0]) || v[1].type!=_IDNT) return gensizeerr(contextptr); vecteur w=*v[0]._VECTptr; iterateur it=w.begin(),itend=w.end(); for (;it!=itend;++it){ if (it->_VECTptr->size()!=2) return gensizeerr(contextptr); *it=symbolic(at_pnt,makevecteur(it->_VECTptr->front()+cst_i*it->_VECTptr->back(),int(FL_BLACK)),_PNT__VECT); } return sto(gen(w,_SEQ__VECT),v[1],contextptr); } static const char _NewPic_s[]="NewPic"; static define_unary_function_eval2 (__NewPic,&_NewPic,_NewPic_s,&printastifunction); define_unary_function_ptr5( at_NewPic ,alias_at_NewPic,&__NewPic,0,T_RETURN); vecteur zoom_save; gen _ZoomSto(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v; v.push_back(gnuplot_xmin); v.push_back(gnuplot_xmax); v.push_back(gnuplot_ymin); v.push_back(gnuplot_ymax); v.push_back(gnuplot_zmin); v.push_back(gnuplot_zmax); v.push_back(gnuplot_tmin); v.push_back(gnuplot_tmax); v.push_back(global_window_xmin); v.push_back(global_window_xmax); v.push_back(global_window_ymin); v.push_back(global_window_ymax); v.push_back(show_axes(contextptr)); zoom_save=v; return v; } static const char _ZoomSto_s[]="ZoomSto"; static define_unary_function_eval2 (__ZoomSto,&_ZoomSto,_ZoomSto_s,&printastifunction); define_unary_function_ptr5( at_ZoomSto ,alias_at_ZoomSto,&__ZoomSto,0,T_RETURN); gen _ZoomRcl(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v; if (g.type!=_VECT || g._VECTptr->size()<13) v=zoom_save; else v=*g._VECTptr; return _xyztrange(v,contextptr); } static const char _ZoomRcl_s[]="ZoomRcl"; static define_unary_function_eval2 (__ZoomRcl,&_ZoomRcl,_ZoomRcl_s,&printastifunction); define_unary_function_ptr5( at_ZoomRcl ,alias_at_ZoomRcl,&__ZoomRcl,0,T_RETURN); gen _deSolve(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); if (v.empty()) return gensizeerr(contextptr); if (v[0].is_symb_of_sommet(at_and)) v[0]=remove_and(v[0],at_and); return _desolve(gen(v,_SEQ__VECT),contextptr); } static const char _deSolve_s[]="deSolve"; static define_unary_function_eval2_quoted (__deSolve,&_deSolve,_deSolve_s,&printastifunction); define_unary_function_ptr5( at_deSolve ,alias_at_deSolve,&__deSolve,_QUOTE_ARGUMENTS,T_RETURN); gen _LineTan(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur attributs(1,default_color(contextptr)); vecteur v(seq2vecteur(g)); int s=read_attributs(v,attributs,contextptr); if (s<1 || s>3) return gensizeerr(contextptr); gen f(v[0]),x(vx_var),x0(0); if (s==3){ x=v[1]; x0=v[2]; } if (s==2){ x0=v[1]; if (is_equal(x0)){ gen & x0f=x0._SYMBptr->feuille; if (x0f.type==_VECT && x0f._VECTptr->size()==2){ x=x0f._VECTptr->front(); x0=x0f._VECTptr->back(); } } } gen fprime(derive(f,x,contextptr)); if (is_undef(fprime)) return fprime; gen M0(x0+cst_i*subst(f,x,x0,false,contextptr)); gen direction(1+cst_i*subst(fprime,x,x0,false,contextptr)); return put_attributs(_droite(makesequence(M0,M0+direction),contextptr),attributs,contextptr); } static const char _LineTan_s[]="LineTan"; static define_unary_function_eval2 (__LineTan,&_LineTan,_LineTan_s,&printastifunction); define_unary_function_ptr5( at_LineTan ,alias_at_LineTan,&__LineTan,0,T_RETURN); static const char _droite_tangente_s[]="droite_tangente"; static define_unary_function_eval2 (__droite_tangente,&_LineTan,_droite_tangente_s,&printastifunction); define_unary_function_ptr5( at_droite_tangente ,alias_at_droite_tangente,&__droite_tangente,0,true); static const char _tangente_s[]="tangente"; static define_unary_function_eval2 (__tangente,&_tangent,_tangente_s,&printastifunction); define_unary_function_ptr5( at_tangente ,alias_at_tangente,&__tangente,0,true); gen _CyclePic(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; vecteur v(gen2vecteur(g)); int s=int(v.size()); if (s<2 || v[0].type!=_STRNG || v[1].type!=_INT_) return gensizeerr(contextptr); int n=giacmax(absint(v[1].val),1); double delay=1.0; if (s>2 && v[2].type==_DOUBLE_) delay=v[2]._DOUBLE_val; delay=std::abs(delay*1e3); int d=int(delay); int ds=d/1000,ns=(d%1000)*1000000; #ifndef HAVE_NO_SYS_TIMES_H timespec t; // ,tr; t.tv_sec=ds; t.tv_nsec=ns; #endif int repete=1; if (s>3 && v[3].type==_INT_) repete=giacmax(absint(v[3].val),1); int direction=1; if (s>4 && is_minus_one(v[4])) direction=-1; string & orig_name = *v[0]._STRNGptr; for (int i=0;i=1;--j){ string name=orig_name+print_INT_(j); gen g(name,contextptr); if (g.type==_IDNT) _RplcPic(g,contextptr); #ifdef NSPIRE sleep(d); #else usleep(d*1000); #endif /* #ifdef WIN32 sleep(ds); #else #ifdef __APPLE__ usleep(2000); #else nanosleep(&t,&tr); #endif #endif */ } } } return zero; } static const char _CyclePic_s[]="CyclePic"; static define_unary_function_eval2 (__CyclePic,&_CyclePic,_CyclePic_s,&printastifunction); define_unary_function_ptr5( at_CyclePic ,alias_at_CyclePic,&__CyclePic,0,T_RETURN); gen _RandSeed(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; #if defined(NSPIRE_NEWLIB) || defined(VISUALC) || defined(__MINGW_H) || defined BESTA_OS || defined EMCC || defined NSPIRE srand(g.val); #else #ifndef GNUWINCE srandom(g.val); #endif #endif // visualc return g; } static const char _RandSeed_s[]="RandSeed"; static define_unary_function_eval2 (__RandSeed,&_RandSeed,_RandSeed_s,&printastifunction); define_unary_function_ptr5( at_RandSeed ,alias_at_RandSeed,&__RandSeed,0,T_RETURN); gen _Store(const gen & g,const context * contextptr){ if ( g.type==_STRNG && g.subtype==-1) return g; return _sto(g,contextptr); } static const char _Store_s[]="Store"; static define_unary_function_eval_quoted (__Store,&_Store,_Store_s); define_unary_function_ptr5( at_Store ,alias_at_Store,&__Store,_QUOTE_ARGUMENTS,true); gen exact_double(double d,double eps){ if (eps<1e-14) eps=1e-14; if (d<0) return -exact_double(-d,eps); if (d > (1<<30) ) return _floor(d,context0); if (d==0) return 0; if (d<1) return inv(exact_double(1/d,eps),context0); vector res; double eps1(1+eps); for (;!interrupted;){ #ifdef TIMEOUT control_c(); #endif if (ctrl_c || interrupted) { interrupted = true; ctrl_c=false; return gensizeerr(gettext("Stopped by user interruption.")); } res.push_back(int(d*eps1)); d=d-int(d*eps1); if (d<=eps) break; d=1/d; if (d > (1<<30)) break; eps=eps*d*d; } if (res.empty()) return gensizeerr(gettext("Stopped by user interruption.")); reverse(res.begin(),res.end()); vector::const_iterator it=res.begin(),itend=res.end(); gen x(*it); for (++it;it!=itend;++it){ x=*it+inv(x,context0); } return x; } gen exact(const gen & g,GIAC_CONTEXT){ switch (g.type){ case _DOUBLE_: return exact_double(g._DOUBLE_val,epsilon(contextptr)); case _REAL: return exact_double(evalf_double(g,1,contextptr)._DOUBLE_val,epsilon(contextptr)); #ifdef BCD case _FLOAT_: return exact_double(evalf_double(g,1,contextptr)._DOUBLE_val,1e-10); #endif case _CPLX: return exact(re(g,contextptr),contextptr)+cst_i*exact(im(g,contextptr),contextptr); case _SYMB: return symbolic(g._SYMBptr->sommet,exact(g._SYMBptr->feuille,contextptr)); case _VECT: return apply(g,exact,contextptr); default: return g; } } gen _exact(const gen & g,GIAC_CONTEXT){ #if 0 // def BCD return symb_quote(exact(g,contextptr)); #else return exact(g,contextptr); #endif } static const char _exact_s[]="exact"; static define_unary_function_eval (__exact,&_exact,_exact_s); define_unary_function_ptr5( at_exact ,alias_at_exact,&__exact,0,true); gen fPart(const gen & g,GIAC_CONTEXT){ if (is_undef(g)) return g; if (is_equal(g)) return apply_to_equal(g,fPart,contextptr); if (g.type==_VECT) return apply(g,fPart,contextptr); // if (is_strictly_positive(-g,contextptr)) return -fPart(-g,contextptr); // return g-_floor(g,contextptr); return g-_INT(g,contextptr); } static const char _fPart_s[]="fPart"; static define_unary_function_eval (__fPart,&fPart,_fPart_s); define_unary_function_ptr5( at_fPart ,alias_at_fPart,&__fPart,0,true); static const char _frac_s[]="frac"; static define_unary_function_eval (__frac,&fPart,_frac_s); define_unary_function_ptr5( at_frac ,alias_at_frac,&__frac,0,true); gen simult(const gen & g,GIAC_CONTEXT){ if (g.type!=_VECT || g._VECTptr->size()!=2) return gensizeerr(contextptr); vecteur & v=*g._VECTptr; gen m1(v[0]),m2(v[1]); if (!is_squarematrix(m1)|| !ckmatrix(m2) || m1._VECTptr->size()!=m2._VECTptr->size()) return gensizeerr(contextptr); matrice m=mtran(mergevecteur(mtran(*m1._VECTptr),mtran(*m2._VECTptr))); m=mrref(m,contextptr); mdividebypivot(m); int n,c; mdims(m,n,c); // check for identity for (int i=0;i128) conversion sign translated to to Store sign: => Different: != or <>, Greater or equal: >=, Lower or equal: <= i=sqrt(-1): use the i button of xcas transpose sign not translated (use transpose()) */ // FIXME SECURITY // archive is made of couples name/value static sym_string_tab read_ti_archive(const string & s,GIAC_CONTEXT){ vecteur v; #ifndef NSPIRE ifstream inf(s.c_str()); readargs_from_stream(inf,v,contextptr); #endif sym_string_tab res; const_iterateur it=v.begin(),itend=v.end(); for (;it!=itend;++it){ if (it->type!=_STRNG) continue; string name=*it->_STRNGptr; ++it; if (it==itend) break; gen value=*it; res[name]=value; } return res; } static void print_ti_archive(const string & s,const sym_string_tab & m){ #ifdef NSPIRE return; #else if (is_undef(check_secure())) return ; ofstream of(s.c_str()); sym_string_tab::const_iterator it=m.begin(),itend=m.end(); if (it==itend){ of << "[ ]" << endl; return; } of << "[" << string2gen(it->first,false) ; of << "," << it->second ; ++it; for (;it!=itend;++it){ of << "," << endl ; of << string2gen(it->first,false) ; of << "," << it->second ; } of << "]" << endl; #endif } gen _Archive(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; sym_string_tab arc(read_ti_archive("archive",contextptr)); if (g.type==_IDNT) arc[g.print(contextptr)]=eval(g,eval_level(contextptr),contextptr); else { if (g.type!=_VECT) return gensizeerr(contextptr); const_iterateur it=g._VECTptr->begin(),itend=g._VECTptr->end(); for (;it!=itend;++it){ if (it->type==_IDNT) arc[it->print(contextptr)]=eval(*it,eval_level(contextptr),contextptr); } } print_ti_archive("archive",arc); return 1; } static const char _Archive_s[]="Archive"; static define_unary_function_eval2_quoted (__Archive,&_Archive,_Archive_s,&printastifunction); define_unary_function_ptr5( at_Archive ,alias_at_Archive,&__Archive,_QUOTE_ARGUMENTS,T_RETURN); gen _Unarchiv(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; sym_string_tab arc(read_ti_archive("archive",contextptr)); gen tmpsto; if (g.type==_IDNT) return sto(arc[g.print(contextptr)],g,contextptr); else { if (g.type!=_VECT) return gensizeerr(contextptr); const_iterateur it=g._VECTptr->begin(),itend=g._VECTptr->end(); for (;it!=itend;++it){ if (it->type==_IDNT){ sto(arc[it->print(contextptr)],*it,contextptr); if (is_undef(tmpsto)) return tmpsto; } } } return 1; } static const char _Unarchiv_s[]="Unarchiv"; static define_unary_function_eval2_quoted (__Unarchiv,&_Unarchiv,_Unarchiv_s,&printastifunction); define_unary_function_ptr5( at_Unarchiv ,alias_at_Unarchiv,&__Unarchiv,_QUOTE_ARGUMENTS,T_RETURN); static const char _ti_then_s[]="ti_then"; static define_unary_function_eval (__ti_then,0,_ti_then_s); // never evaled define_unary_function_ptr( at_ti_then ,alias_at_ti_then ,&__ti_then); static const char _ti_elseif_s[]="ti_elseif"; static define_unary_function_eval (__ti_elseif,0,_ti_elseif_s); // never evaled define_unary_function_ptr( at_ti_elseif ,alias_at_ti_elseif ,&__ti_elseif); static const char _ti_else_try_s[]="ti_else_try"; static define_unary_function_eval (__ti_else_try,0,_ti_else_try_s); // never evaled define_unary_function_ptr( at_ti_else_try ,alias_at_ti_else_try ,&__ti_else_try); static const char _ti_else_s[]="ti_else"; static define_unary_function_eval (__ti_else,0,_ti_else_s); // never evaled define_unary_function_ptr( at_ti_else ,alias_at_ti_else ,&__ti_else); static gen ti_stop(const gen & g,GIAC_CONTEXT){ return gensizeerr(gettext("TI stop")); } static const char _ti_stop_s[]="ti_stop"; static define_unary_function_eval (__ti_stop,&ti_stop,_ti_stop_s); // never evaled define_unary_function_ptr( at_ti_stop ,alias_at_ti_stop ,&__ti_stop); // French structure keywords static string printassialorssinon(const gen & feuille,const char * sommetstr,GIAC_CONTEXT){ if (xcas_mode(contextptr)==3) return printasifte(feuille,sommetstr,contextptr); int l=language(contextptr); if ( (feuille.type!=_VECT) || (feuille._VECTptr->size()!=3) ) return localize("sialorssinon",l)+"("+feuille.print(contextptr)+')'; const_iterateur it=feuille._VECTptr->begin(); // ,itend=feuille._VECTptr->end(); string res(localize("si",l)+' '); res += sametoequal(*it).print(contextptr); ++it; res += ' '; res += localize("alors",l); res += ' '; debug_ptr(contextptr)->indent_spaces +=2; if ((it->type==_SYMB) && (it->_SYMBptr->sommet==at_bloc)) res += printasinnerbloc(it->_SYMBptr->feuille,contextptr); else res += it->print(contextptr) ; debug_ptr(contextptr)->indent_spaces -=2; res += ' '; res += localize("sinon",l); res += ' '; ++it; debug_ptr(contextptr)->indent_spaces +=2; if ( (it->type==_SYMB) && (it->_SYMBptr->sommet==at_bloc)) res += printasinnerbloc(it->_SYMBptr->feuille,contextptr); else res += it->print(contextptr) ; debug_ptr(contextptr)->indent_spaces -=2; res += indent(contextptr)+ localize("fsi",l); return res; } gen _sialorssinon(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return _ifte(g,contextptr); } static const char _sialorssinon_s[]="sialorssinon"; static define_unary_function_eval2_quoted (__sialorssinon,&_ifte,_sialorssinon_s,&printassialorssinon); define_unary_function_ptr5( at_sialorssinon ,alias_at_sialorssinon,&__sialorssinon,_QUOTE_ARGUMENTS,T_IFTE); static const char _si_s[]="si"; static define_unary_function_eval2_quoted (__si,&_ifte,_si_s,&printassialorssinon); define_unary_function_ptr5( at_si ,alias_at_si,&__si,_QUOTE_ARGUMENTS,T_IF); static const char _alors_s[]="alors"; static define_unary_function_eval_quoted (__alors,&_ifte,_alors_s); define_unary_function_ptr5( at_alors ,alias_at_alors,&__alors,_QUOTE_ARGUMENTS,T_THEN); static const char _sinon_s[]="sinon"; static define_unary_function_eval_quoted (__sinon,&_ifte,_sinon_s); define_unary_function_ptr5( at_sinon ,alias_at_sinon,&__sinon,_QUOTE_ARGUMENTS,T_ELSE); static string printaspour(const gen & feuille,const char * sommetstr,GIAC_CONTEXT){ if (xcas_mode(contextptr)==3) return printasfor(feuille,sommetstr,contextptr); if ( (feuille.type!=_VECT) || (feuille._VECTptr->size()!=4) ) return string(sommetstr)+('('+feuille.print(contextptr)+')'); int l=language(contextptr); const_iterateur it=feuille._VECTptr->begin(); //,itend=feuille._VECTptr->end(); string res; if (is_zero(*it,contextptr) && is_zero(*(it+2),contextptr)){ ++it; res += localize("tantque",l); res += ' '; res += sametoequal(*it).print(contextptr) + ' '; res += localize("faire",l); res += ' '; ++it; ++it; debug_ptr(contextptr)->indent_spaces += 2; if ((it->type==_SYMB) && (it->_SYMBptr->sommet==at_bloc)) res += printasinnerbloc(it->_SYMBptr->feuille,contextptr); else res += it->print(contextptr) ; debug_ptr(contextptr)->indent_spaces -= 2; return res+indent(contextptr)+' '+localize("ftantque",l)+';'; } else { if ( (it->type!=_SYMB) || (it->_SYMBptr->sommet!=at_sto) || ((it+2)->type!=_SYMB) || ((it+2)->_SYMBptr->sommet!=at_sto) || (it->_SYMBptr->feuille._VECTptr->back()!=(it+2)->_SYMBptr->feuille._VECTptr->back()) ){ res=localize("pour",l)+" ("; res += it->print(contextptr) + ';'; ++it; res += it->print(contextptr) + ';'; ++it; res += it->print(contextptr) + ") "; ++it; debug_ptr(contextptr)->indent_spaces += 2; res += it->print(contextptr) ; debug_ptr(contextptr)->indent_spaces -= 2; } else { gen var_name=it->_SYMBptr->feuille._VECTptr->back(); gen step=normal((it+2)->_SYMBptr->feuille._VECTptr->front()-var_name,contextptr); gen condition=*(it+1),limite; bool simple_loop=false,strict=true,ascending=true; if (condition.type==_SYMB){ const unary_function_ptr op=condition._SYMBptr->sommet; if (condition._SYMBptr->feuille.type==_VECT){ if (op==at_inferieur_strict) simple_loop=true; if (op==at_inferieur_egal){ strict=false; simple_loop=true; } if (op==at_superieur_strict){ simple_loop=(xcas_mode(contextptr)==2); ascending=false; } if (op==at_superieur_egal){ simple_loop=(xcas_mode(contextptr)==2); ascending=false; strict=false; } } if (simple_loop){ simple_loop=(condition._SYMBptr->feuille._VECTptr->front()==var_name); limite=condition._SYMBptr->feuille._VECTptr->back(); } } res =localize("pour",l)+' '; res += var_name.print(contextptr); res += ' '+localize("de",l)+' '; res += it->_SYMBptr->feuille._VECTptr->front().print(contextptr); if (simple_loop){ step = abs(step,contextptr); if (ascending) res += ' '+localize("jusque",l)+' '; else res += ' '+localize("downto",l)+' '; res += limite.print(contextptr); if (strict){ if (ascending) res +="+"; else res += "-"; res += step.print(contextptr); res += "/2"; } } if (!is_one(step)){ res += ' '+localize("by",l)+' '; res += step.print(contextptr); } if (!simple_loop){ res += ' '+localize("tantque",l)+' '; res += (it+1)->print(contextptr); } res += ' '+localize("faire",l)+' '; it += 3; if ((it->type==_SYMB) && (it->_SYMBptr->sommet==at_bloc)) res += printasinnerbloc(it->_SYMBptr->feuille,contextptr); else res += it->print(contextptr) ; return res + indent(contextptr)+' '+localize("fpour",l)+';'; } } if (res[res.size()-1]!='}') res += "; "; return res; } gen _pour(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; return _for(g,contextptr); } static const char _pour_s[]="pour"; static define_unary_function_eval2_quoted (__pour,&_for,_pour_s,&printaspour); define_unary_function_ptr5( at_pour ,alias_at_pour,&__pour,_QUOTE_ARGUMENTS,T_FOR); static const char _de_s[]="de"; static define_unary_function_eval_quoted (__de,&_for,_de_s); define_unary_function_ptr5( at_de ,alias_at_de,&__de,_QUOTE_ARGUMENTS,T_FROM); static const char _faire_s[]="faire"; static define_unary_function_eval_quoted (__faire,&_for,_faire_s); define_unary_function_ptr5( at_faire ,alias_at_faire,&__faire,_QUOTE_ARGUMENTS,T_DO); static const char _pas_s[]="pas"; static define_unary_function_eval_quoted (__pas,&_for,_pas_s); define_unary_function_ptr5( at_pas ,alias_at_pas,&__pas,_QUOTE_ARGUMENTS,T_BY); static const char _jusque_s[]="jusque"; static define_unary_function_eval_quoted (__jusque,&_for,_jusque_s); define_unary_function_ptr5( at_jusque ,alias_at_jusque,&__jusque,_QUOTE_ARGUMENTS,T_TO); static const char _tantque_s[]="tantque"; static define_unary_function_eval2_quoted (__tantque,&_for,_tantque_s,&printaspour); define_unary_function_ptr5( at_tantque ,alias_at_tantque,&__tantque,_QUOTE_ARGUMENTS,T_MUPMAP_WHILE); static const char _et_s[]="et"; static define_unary_function_eval_quoted (__et,&_and,_et_s); define_unary_function_ptr5( at_et ,alias_at_et,&__et,_QUOTE_ARGUMENTS,T_AND_OP); static const char _oufr_s[]="ou"; static define_unary_function_eval_quoted (__oufr,&_ou,_oufr_s); define_unary_function_ptr5( at_oufr ,alias_at_oufr,&__oufr,_QUOTE_ARGUMENTS,T_AND_OP); static const char _non_s[]="non"; static define_unary_function_eval (__non,&_not,_non_s); define_unary_function_ptr5( at_non ,alias_at_non,&__non,0,T_NOT); /* static const char _resultat_s[]="resultat"; static define_unary_function_eval_quoted (__resultat,&_nop,_resultat_s); define_unary_function_ptr5( at_resultat ,alias_at_resultat,&__resultat,_QUOTE_ARGUMENTS,T_RETURN); */ static const char _fonction_s[]="fonction"; static define_unary_function_eval_quoted (__fonction,&_for,_fonction_s); define_unary_function_ptr5( at_fonction ,alias_at_fonction,&__fonction,_QUOTE_ARGUMENTS,T_PROC); #if defined RTOS_THREADX || defined BESTA_OS || defined EMCC || defined __MINGW_H gen _unarchive_ti(const gen & g,GIAC_CONTEXT){ return undef; } #else static gen ti_decode_unsigned(octet * & ptr,GIAC_CONTEXT){ short l=(*ptr); --ptr; // Horner gen res; for (short i=0;i> 4; d=d*10+c1; c2=(*q) & 0x0F; d=d*10+c2; } // multiply by 10^-mantissa d=d*std::pow(10.0,double(mantissa)); return d; } static gen ti_decode_fraction(octet * & ptr,GIAC_CONTEXT){ --ptr; gen num=ti_decode_unsigned(ptr,contextptr); gen den=ti_decode_unsigned(ptr,contextptr); return fraction(num,den); } gen make_symbol(const string & s,GIAC_CONTEXT){ gen res; if (find_or_make_symbol(s,res,0,false,contextptr)==T_SYMBOL) return res; else return make_symbol("_"+s,contextptr); } static gen ti_decode_identificateur(octet * &ptr,GIAC_CONTEXT){ string s; octet c; for (;(c=*ptr)!=VAR_NAME_TAG;--ptr){ if (c>0x7f){ s="Z"+print_INT_(-char(c))+s; } else s = (char) c+s; } --ptr; int pos=int(s.find('\\')); int l=int(s.size()); gen res; if (pos>0 && pos+1sin(x) // or a bloc function/program with local var // in the second case we will have FUNC_ITAG 0x17 or PRGM_ITAG 0x19 0xE4 // if local var are there we will in addition have LOCAL_ITAG 0xE4 etc. vecteur prog; for (;*ptr!=END_OF_SEGMENT;) prog.push_back(ti_decode_tag(ptr,contextptr)); --ptr; if (prog.size()==1) return symb_program(gen(param,_SEQ__VECT),param*zero,prog.front(),contextptr); else return symb_program(gen(param,_SEQ__VECT),param*zero,prog,contextptr); } return gensizeerr(gettext("Can't find length of non tokenized programs")); } static gen ti_decode_sysvar_tag(octet * & ptr,GIAC_CONTEXT){ gen res; switch (*ptr){ case X_BAR_TAG: res=make_symbol("xmean",contextptr); break; case Y_BAR_TAG: res=make_symbol("ymean",contextptr); break; case SIGMA_X_TAG: res=make_symbol("Sx",contextptr); break; case SIGMA_X2_TAG: res=make_symbol("Sx2",contextptr); break; case SIGMA_Y_TAG: res=make_symbol("Sy",contextptr); break; case SIGMA_Y2_TAG: res=make_symbol("Sy2",contextptr); break; case SIGMA_XY_TAG: res=make_symbol("Sxy",contextptr); break; case SX_TAG: res=make_symbol("Sx",contextptr); break; case SY_TAG: res=make_symbol("Sy",contextptr); break; case SMLSIGMA_X_TAG: res=make_symbol("sx",contextptr); break; case SMLSIGMA_Y_TAG: res=make_symbol("sy",contextptr); break; case NSTAT_TAG: res=make_symbol("nStat",contextptr); break; case MINX_TAG: res=make_symbol("minX",contextptr); break; case MINY_TAG: res=make_symbol("minY",contextptr); break; case Q1_TAG: res=make_symbol("q1",contextptr); break; case MEDSTAT_TAG: res=make_symbol("medStat",contextptr); break; case Q3_TAG: res=make_symbol("q3",contextptr); break; case MAXX_TAG: res=make_symbol("maxX",contextptr); break; case MAXY_TAG: res=make_symbol("maxY",contextptr); break; case CORR_TAG: res=make_symbol("corr",contextptr); break; case R2_TAG: res=make_symbol("R2",contextptr); break; case MEDX1_TAG: res=make_symbol("mdex1",contextptr); break; case MEDX2_TAG: res=make_symbol("medx2",contextptr); break; case MEDX3_TAG: res=make_symbol("medx3",contextptr); break; case MEDY1_TAG: res=make_symbol("medy1",contextptr); break; case MEDY2_TAG: res=make_symbol("medy2",contextptr); break; case MEDY3_TAG: res=make_symbol("medy3",contextptr); break; case XC_TAG: res=make_symbol("xc",contextptr); break; case YC_TAG: res=make_symbol("yc",contextptr); break; case ZC_TAG: res=make_symbol("zc",contextptr); break; case TC_TAG: res=make_symbol("tc",contextptr); break; case RC_TAG: res=make_symbol("rc",contextptr); break; case THETA_C_TAG: res=make_symbol("qc",contextptr); break; case NC_TAG: res=make_symbol("nc",contextptr); break; case XFACT_TAG: res=make_symbol("xfact",contextptr); break; case YFACT_TAG: res=make_symbol("yfact",contextptr); break; case ZFACT_TAG: res=make_symbol("zfact",contextptr); break; case XMIN_TAG: res=make_symbol("xmin",contextptr); break; case XMAX_TAG: res=make_symbol("xmax",contextptr); break; case XSCL_TAG: res=make_symbol("xscl",contextptr); break; case YMIN_TAG: res=make_symbol("ymin",contextptr); break; case YMAX_TAG: res=make_symbol("ymax",contextptr); break; case YSCL_TAG: res=make_symbol("yscl",contextptr); break; case DELTA_X_TAG: res=make_symbol("Dx",contextptr); break; case DELTA_Y_TAG: res=make_symbol("Dy",contextptr); break; case XRES_TAG: res=make_symbol("xres",contextptr); break; case XGRID_TAG: res=make_symbol("xgrid",contextptr); break; case YGRID_TAG: res=make_symbol("ygrid",contextptr); break; case ZMIN_TAG: res=make_symbol("zmin",contextptr); break; case ZMAX_TAG: res=make_symbol("zmax",contextptr); break; case ZSCL_TAG: res=make_symbol("zscl",contextptr); break; case EYE_THETA_TAG: res=make_symbol("eyeq",contextptr); break; case EYE_PHI_TAG: res=make_symbol("eyeF",contextptr); break; case THETA_MIN_TAG: res=make_symbol("qmin",contextptr); break; case THETA_MAX_TAG: res=make_symbol("qmax",contextptr); break; case THETA_STEP_TAG: res=make_symbol("qstep",contextptr); break; case TMIN_TAG: res=make_symbol("tmin",contextptr); break; case TMAX_TAG: res=make_symbol("tmax",contextptr); break; case TSTEP_TAG: res=make_symbol("tstep",contextptr); break; case NMIN_TAG: res=make_symbol("nmin",contextptr); break; case NMAX_TAG: res=make_symbol("nmax",contextptr); break; case PLOTSTRT_TAG: res=make_symbol("plotStrt",contextptr); break; case PLOTSTEP_TAG: res=make_symbol("plotStep",contextptr); break; case ZXMIN_TAG: res=make_symbol("zxmin",contextptr); break; case ZXMAX_TAG: res=make_symbol("zxmax",contextptr); break; case ZXSCL_TAG: res=make_symbol("zxscl",contextptr); break; case ZYMIN_TAG: res=make_symbol("zymin",contextptr); break; case ZYMAX_TAG: res=make_symbol("zymax",contextptr); break; case ZYSCL_TAG: res=make_symbol("zyscl",contextptr); break; case ZXRES_TAG: res=make_symbol("zxres",contextptr); break; case Z_THETA_MIN_TAG: res=make_symbol("zqmin",contextptr); break; case Z_THETA_MAX_TAG: res=make_symbol("zqmax",contextptr); break; case Z_THETA_STEP_TAG: res=make_symbol("zqstep",contextptr); break; case ZTMIN_TAG: res=make_symbol("ztmin",contextptr); break; case ZTMAX_TAG: res=make_symbol("ztmax",contextptr); break; case ZTSTEP_TAG: res=make_symbol("ztsep",contextptr); break; case ZXGRID_TAG: res=make_symbol("zxgrid",contextptr); break; case ZYGRID_TAG: res=make_symbol("zygrid",contextptr); break; case ZZMIN_TAG: res=make_symbol("zzmin",contextptr); break; case ZZMAX_TAG: res=make_symbol("zzmax",contextptr); break; case ZZSCL_TAG: res=make_symbol("zzscl",contextptr); break; case ZEYE_THETA_TAG: res=make_symbol("zeyeq",contextptr); break; case ZEYE_PHI_TAG: res=make_symbol("zeyeF",contextptr); break; case ZNMIN_TAG: res=make_symbol("znmin",contextptr); break; case ZNMAX_TAG: res=make_symbol("znmax",contextptr); break; case ZPLTSTEP_TAG: res=make_symbol("zpltstep",contextptr); break; case ZPLTSTRT_TAG: res=make_symbol("zpltstrt",contextptr); break; case SEED1_TAG: res=make_symbol("seed1",contextptr); break; case SEED2_TAG: res=make_symbol("seed2",contextptr); break; case OK_TAG: res=make_symbol("ok",contextptr); break; case ERRORNUM_TAG: res=make_symbol("errornum",contextptr); break; case SYSMATH_TAG: res=make_symbol("sysMath",contextptr); break; case SYSDATA_TAG: res=make_symbol("sysData",contextptr); break; case REGEQ_TAG: res=make_symbol("regEq",contextptr); break; case REGCOEF_TAG: res=make_symbol("regCoef",contextptr); break; case TBLINPUT_TAG: res=make_symbol("tblInput",contextptr); break; case TBLSTART_TAG: res=make_symbol("tblStart",contextptr); break; case DELTA_TBL_TAG: res=make_symbol("Dtbl",contextptr); break; case FLDPIC_TAG: res=make_symbol("fldpic",contextptr); break; case EYE_PSI_TAG: res=make_symbol("eyeY",contextptr); break; case TPLOT_TAG: res=make_symbol("tplot",contextptr); break; case DIFTOL_TAG: res=make_symbol("diftol",contextptr); break; case ZEYE_PSI_TAG: res=make_symbol("zeyeY",contextptr); break; case T0_TAG: res=make_symbol("t0",contextptr); break; case DTIME_TAG: res=make_symbol("dtime",contextptr); break; case NCURVES_TAG: res=make_symbol("ncurves",contextptr); break; case FLDRES_TAG: res=make_symbol("fldres",contextptr); break; case ESTEP_TAG: res=make_symbol("Estep",contextptr); break; case ZT0DE_TAG: res=make_symbol("zt0de",contextptr); break; case ZTMAXDE_TAG: res=make_symbol("ztmaxde",contextptr); break; case ZTSTEPDE_TAG: res=make_symbol("ztstepde",contextptr); break; case ZTPLOTDE_TAG: res=make_symbol("ztplotde",contextptr); break; case NCONTOUR_TAG: res=make_symbol("ncontout",contextptr); default: return gensizeerr(gettext("Unknown sysvar tag")+print_INT_(*ptr)); } --ptr; return res; } static gen ti_decode_unary(octet * & ptr,const unary_function_ptr * u,GIAC_CONTEXT){ --ptr; gen g=ti_decode_tag(ptr,contextptr); return symbolic(u,g); } static gen ti_decode_binary(octet * & ptr,const unary_function_ptr * u,bool normal_order=true,GIAC_CONTEXT=0){ --ptr; gen g1=ti_decode_tag(ptr,contextptr); gen g2=ti_decode_tag(ptr,contextptr); if (normal_order) return symbolic(u,makesequence(g1,g2)); else return symbolic(u,makesequence(g2,g1)); } static gen ti_decode_nary(octet * & ptr,const unary_function_ptr * u,int n,GIAC_CONTEXT){ --ptr; vecteur arg; for (;*ptr!=END_TAG;) arg.push_back(ti_decode_tag(ptr,contextptr)); --ptr; return symbolic(u,gen(arg,_SEQ__VECT)); } static gen ti_decode_arb_real(octet * & ptr,bool real,GIAC_CONTEXT){ unsigned int i=*ptr; --ptr; string s; gen res; if (real) s="at_"; else s="at_n"; s += print_INT_(i); find_or_make_symbol(s,res,0,false,contextptr); return res; } static gen ti_decode_not_implemented(octet * & ptr,const string & s,int i,GIAC_CONTEXT){ gen gs(string2gen(s,false)); gen g; if (i==1) g=ti_decode_unary(ptr,at_ti_not_implemented,contextptr); else { if (i==2) g=ti_decode_binary(ptr,at_ti_not_implemented,true,contextptr); else g=ti_decode_nary(ptr,at_ti_not_implemented,-i,contextptr); } gen gf=g._SYMBptr->feuille; if (gf.type==_VECT) gf.subtype=_SEQ__VECT; return symbolic(at_ti_not_implemented,makesequence(gs,gf)); } // secondary or extension tag static gen ti_secondary_tag(octet * & ptr,GIAC_CONTEXT){ switch (*ptr){ case INDIR_TAG: return ti_decode_unary(ptr,at_hash,contextptr); case GETKEY_TAG: return ti_decode_not_implemented(ptr,"getKey",-0,contextptr); // --ptr; // return symbolic(at_getKey,vecteur(0)); case GETFOLD_TAG: return ti_decode_not_implemented(ptr,"getFold",-0,contextptr); // --ptr; // return symbolic(at_GetFold,vecteur(0)); case SWITCH_TAG: return ti_decode_nary(ptr,at_window_switch,0,contextptr); case UNITCONV_TAG: return ti_decode_not_implemented(ptr,"UnitConv",2,contextptr); case ORD_TAG: return ti_decode_unary(ptr,at_ord,contextptr); case EXPR_TAG: return ti_decode_unary(ptr,at_expr,contextptr); case CHAR_TAG: return ti_decode_unary(ptr,at_char,contextptr); case STRING_TAG: return ti_decode_unary(ptr,at_string,contextptr); case SETFOLD_TAG: return ti_decode_unary(ptr,at_SetFold,contextptr); case GETTYPE_TAG: return ti_decode_unary(ptr,at_getType,contextptr); case GETMODE_TAG: return ti_decode_not_implemented(ptr,"getMode",1,contextptr); case PTTEST_TAG: return ti_decode_not_implemented(ptr,"ptTest",2,contextptr); case PXLTEST_TAG: return ti_decode_not_implemented(ptr,"PxlTest",2,contextptr); case SETGRAPH_TAG: return ti_decode_not_implemented(ptr,"setGraph",2,contextptr); case SETTABLE_TAG: return ti_decode_not_implemented(ptr,"setTable",2,contextptr); case SETMODE_TAG: return ti_decode_not_implemented(ptr,"setMode",-1,contextptr); case FORMAT_TAG: return ti_decode_nary(ptr,at_format,1,contextptr); case INSTRING_TAG: return ti_decode_nary(ptr,at_inString,2,contextptr); case APPEND_TAG: return ti_decode_binary(ptr,at_append,false,contextptr); case DD_TAG: return ti_decode_not_implemented(ptr,"DD",1,contextptr); case EXPR2DMS_TAG: return ti_decode_not_implemented(ptr,"->DMS",1,contextptr); case VEC2RECT_TAG: return ti_decode_not_implemented(ptr,">Rect",1,contextptr); case VEC2POLAR_TAG: return ti_decode_not_implemented(ptr,">Polar",1,contextptr); case VEC2CYLIND_TAG: return ti_decode_not_implemented(ptr,">Cylind",1,contextptr); case VEC2SPHERE_TAG: return ti_decode_not_implemented(ptr,">Sphere",1,contextptr); case PARENTH_START_TAG: case PARENTH_END_TAG: case MAT_START_TAG: case MAT_END_TAG: case LIST_START_TAG: case LIST_END_TAG: case COMMA_TAG: case SEMICOLON_TAG: case COMPLEX_ANGLE_TAG: case SINGLE_QUOTE_TAG: case QUOTE_TAG: return gensizeerr(gettext("Parser internal token")); case POLCPLX_TAG: // FIXME not clear if 2 or (2 or more args) return ti_decode_not_implemented(ptr,"polCplx",-2,contextptr); // return ti_decode_not_implemented(ptr,"polCplx",2,contextptr); case TMPCNV_TAG: return ti_decode_not_implemented(ptr,"tmpCnv",2,contextptr); case DELTA_TMPCNV_TAG: return ti_decode_not_implemented(ptr,"DtmpCnv",2,contextptr); case GETUNITS_TAG: return ti_decode_not_implemented(ptr,"getUnits",-0,contextptr); // --ptr; // return string2gen("getUnits",false); case SETUNITS_TAG: return ti_decode_not_implemented(ptr,"setUnits",1,contextptr); case BIN_TAG: return ti_decode_not_implemented(ptr,"0b",1,contextptr); case HEX_TAG: return ti_decode_not_implemented(ptr,"0h",1,contextptr); case INT2BIN_TAG: return ti_decode_not_implemented(ptr,">Bin",1,contextptr); case INT2DEC_TAG: return ti_decode_not_implemented(ptr,">Dec",1,contextptr); case INT2HEX_TAG: return ti_decode_not_implemented(ptr,">Hex",1,contextptr); case DET_TOL_TAG: return ti_decode_binary(ptr,at_det,true,contextptr); case REF_TOL_TAG: return ti_decode_binary(ptr,at_ref,true,contextptr); case RREF_TOL_TAG: return ti_decode_binary(ptr,at_rref,true,contextptr); case SIMULT_TOL_TAG: return ti_decode_nary(ptr,at_simult,3,contextptr); case GETCONFG_TAG: return ti_decode_not_implemented(ptr,"getConfg",-0,contextptr); // --ptr; // return string2gen("getConfg",false); case V_AUGMENT_TAG: return ti_decode_binary(ptr,at_semi_augment,true,contextptr); case VARIANCE_TWOARG_TAG: return ti_decode_binary(ptr,at_variance,true,contextptr); default: return gensizeerr(gettext("Unknown secondary tag")+print_INT_(*ptr)); } return 0; } static gen ti_decode_ifthen(const vecteur & arg0,GIAC_CONTEXT){ vecteur arg(arg0); gen gif,gthen,gelse; int i=equalposcomp(arg,at_ti_then); if (!i){ gif=arg.front(); arg=vecteur(arg.begin()+1,arg.end()); } else { gif=symb_bloc(vecteur(arg.begin(),arg.begin()+i-1)); arg=vecteur(arg.begin()+i,arg.end()); } // elseif? i=equalposcomp(arg,at_ti_elseif); if (i){ gthen=symb_bloc(vecteur(arg.begin(),arg.begin()+i-1)); arg=vecteur(arg.begin()+i,arg.end()); return symb_ifte(gif,gthen,ti_decode_ifthen(arg,contextptr)); } // no more elseif found, search for else i=equalposcomp(arg,at_ti_else); if (!i) gelse=undef; else { gelse=symb_bloc(vecteur(arg.begin()+i,arg.end())); arg=vecteur(arg.begin(),arg.begin()+i-1); } gthen=symb_bloc(arg); return symb_ifte(gif,gthen,gelse); } static gen ti_decode_ifthen(octet * & ptr,GIAC_CONTEXT){ vecteur arg(ti_decode_list(ptr,ENDIF_ITAG,COMMAND_TAG,contextptr)); return ti_decode_ifthen(arg,contextptr); } static gen ti_decode_if(octet * & ptr,GIAC_CONTEXT){ gen test(ti_decode_tag(ptr,contextptr)); ti_decode_newline(ptr,contextptr); gen ifclause(ti_decode_tag(ptr,contextptr)); ti_decode_newline(ptr,contextptr); return symb_ifte(test,ifclause,undef); } static gen ti_decode_loop(octet * & ptr,GIAC_CONTEXT){ vecteur arg(ti_decode_list(ptr,ENDLOOP_ITAG,COMMAND_TAG,contextptr)); ptr -= 2; // skip size return symb_for(zero,plus_one,zero,symb_bloc(arg)); } static gen ti_decode_for(octet * & ptr,GIAC_CONTEXT){ gen gcompteur(ti_decode_tag(ptr,contextptr)); gen gdebut(ti_decode_tag(ptr,contextptr)); gen gfin(ti_decode_tag(ptr,contextptr)); gen gstep(plus_one); if (*ptr==END_TAG) --ptr; else { if (!ti_decode_newline(ptr,contextptr)){ gstep=ti_decode_tag(ptr,contextptr); if (*ptr==END_TAG) --ptr; } } ti_decode_newline(ptr,contextptr); vecteur arg(ti_decode_list(ptr,ENDFOR_ITAG,COMMAND_TAG,contextptr)); ptr -= 2; // skip size if (ck_is_strictly_positive(gstep,contextptr)) return symb_for(symb_sto(gdebut,gcompteur),symb_inferieur_egal(gcompteur,gfin),symb_sto(gcompteur+gstep,gcompteur),symb_bloc(arg)); else return symb_for(symb_sto(gdebut,gcompteur),symb_superieur_egal(gcompteur,gfin),symb_sto(gcompteur+gstep,gcompteur),symb_bloc(arg)); } static gen ti_decode_while(octet * & ptr,GIAC_CONTEXT){ gen test(ti_decode_tag(ptr,contextptr)); ti_decode_newline(ptr,contextptr); vecteur arg(ti_decode_list(ptr,ENDWHILE_ITAG,COMMAND_TAG,contextptr)); ptr -= 2; // skip size return symb_for(zero,test,zero,symb_bloc(arg)); } static gen ti_decode_try(octet * & ptr,GIAC_CONTEXT){ vecteur arg(ti_decode_list(ptr,ENDTRY_ITAG,COMMAND_TAG,contextptr)); ptr -= 2; // skip size int i=equalposcomp(arg,at_ti_else_try); gen gtry=symb_bloc(vecteur(arg.begin()+i,arg.end())); gen gelse=symb_bloc(vecteur(arg.begin(),arg.begin()+i-1)); return symb_try_catch(makevecteur(gtry,at_break,gelse)); } static gen ti_decode_func(octet * & ptr,octet end,GIAC_CONTEXT){ vecteur localvar; ti_decode_newline(ptr,contextptr); if (*ptr==COMMENT_TAG){ // skip comment --ptr; while (!*ptr) --ptr; ti_decode_string(ptr,contextptr); ti_decode_newline(ptr,contextptr); } if (*(ptr-1)==LOCAL_ITAG && *ptr==COMMAND_TAG){ // check local ptr -=2; localvar=ti_decode_list(ptr,END_TAG,contextptr); } vecteur arg(ti_decode_list(ptr,end,COMMAND_TAG,contextptr)); if (localvar.empty()) return symb_bloc(arg); else return symb_local(localvar,arg,contextptr); } static gen ti_decode_dialog(octet * & ptr,GIAC_CONTEXT){ vecteur arg(ti_decode_list(ptr,ENDDLOG_ITAG,COMMAND_TAG,contextptr)); return symbolic(at_Dialog,arg); } static gen ti_decode_custom(octet * & ptr,GIAC_CONTEXT){ vecteur arg(ti_decode_list(ptr,ENDCUSTM_ITAG,COMMAND_TAG,contextptr)); return symbolic(at_ti_not_implemented,arg); } static gen ti_decode_toolbar(octet * & ptr,GIAC_CONTEXT){ vecteur arg(ti_decode_list(ptr,ENDTBAR_ITAG,COMMAND_TAG,contextptr)); return symbolic(at_ti_not_implemented,arg); } static gen ti_decode_local(octet * & ptr,GIAC_CONTEXT){ // decode list until ENDFUNC or ENDPRGM COMMAND_TAG vecteur res; for (;;){ ti_decode_newline(ptr,contextptr); if ( (*(ptr-1)==ENDPRGM_ITAG || *(ptr-1)==ENDFUNC_ITAG) && *ptr==COMMAND_TAG) break; res.push_back(ti_decode_tag(ptr,contextptr)); } // do not decrement ptr, keep the end tags for func_itag or prgm_itag // split res using first end_tag int i=equalposcomp(res,at_ti_endtag); if (!i) return gensizeerr(gettext("empty local declaration")); gen gloc=vecteur(res.begin(),res.begin()+i-1); gen gbloc=vecteur(res.begin()+i,res.end()); return symb_local(gloc,gbloc,contextptr); } // command or instruction tag static gen ti_command_tag(octet * & ptr,GIAC_CONTEXT){ switch (*ptr){ case CLRDRAW_ITAG: --ptr; return symbolic(at_ClrDraw,vecteur(0)); case CLRGRAPH_ITAG: --ptr; return symbolic(at_ClrGraph,vecteur(0)); case CLRIO_ITAG: --ptr; return symbolic(at_ClrIO,vecteur(0)); case CLRHOME_ITAG: // FIXME --ptr; return symbolic(at_ti_not_implemented,string2gen("ClrHome",false)); case CLRTABLE_ITAG: --ptr; return symbolic(at_ti_not_implemented,string2gen("ClrTable",false)); case DISPG_ITAG: --ptr; return symbolic(at_DispG,vecteur(0)); case DISPTBL_ITAG: --ptr; return symbolic(at_ti_not_implemented,string2gen("DispTbl",false)); case CYCLE_ITAG: --ptr; // maybe ptr -= 3 to skip offset return symbolic(at_continue,zero); case CUSTOM_ITAG: --ptr; return ti_decode_custom(ptr,contextptr); case DIALOG_ITAG: --ptr; return ti_decode_dialog(ptr,contextptr); case TOOLBAR_ITAG: --ptr; return ti_decode_toolbar(ptr,contextptr); case ELSE_ITAG: --ptr; return at_ti_else; case ENDCUSTM_ITAG: case ENDDLOG_ITAG: case ENDFOR_ITAG: case ENDFUNC_ITAG: case ENDIF_ITAG: case ENDLOOP_ITAG: case ENDPRGM_ITAG: case ENDTBAR_ITAG: case ENDTRY_ITAG: case ENDWHILE_ITAG: return gensizeerr(gettext("End structure ")+print_INT_(*ptr)+" "+print_INT_(*(ptr-2))+" "+print_INT_(*(ptr-1))); case EXIT_ITAG: ptr -=3 ; // skip offset return symbolic(at_break,zero); case FUNC_ITAG: --ptr; return ti_decode_func(ptr,ENDFUNC_ITAG,contextptr); case PRGM_ITAG: --ptr; return ti_decode_func(ptr,ENDPRGM_ITAG,contextptr); case LOOP_ITAG: --ptr; return ti_decode_loop(ptr,contextptr); case STOP_ITAG: --ptr; // maybe ptr -=3 to skip itag return at_ti_stop; case THEN_ITAG: --ptr; return at_ti_then; case TRY_ITAG: --ptr; return ti_decode_try(ptr,contextptr); case SHOWSTAT_ITAG: --ptr; return string2gen("showStat",false); case TRACE_ITAG: --ptr; return string2gen("Trace",false); case ZOOMBOX_ITAG: --ptr; return string2gen("ZoomBox",false); case ZOOMDATA_ITAG: --ptr; return string2gen("ZoomData",false); case ZOOMDEC_ITAG: --ptr; return string2gen("ZoomDec",false); case ZOOMFIT_ITAG: --ptr; return string2gen("ZoomFit",false); case ZOOMIN_ITAG: --ptr; return string2gen("ZoomIn",false); case ZOOMINT_ITAG: --ptr; return string2gen("ZoomInt",false); case ZOOMOUT_ITAG: --ptr; return string2gen("ZoomOut",false); case ZOOMPREV_ITAG: --ptr; return string2gen("ZoomPrev",false); case ZOOMRCL_ITAG: --ptr; return string2gen("ZoomRcl",false); case ZOOMSQR_ITAG: --ptr; return string2gen("ZoomSqr",false); case ZOOMSTD_ITAG: --ptr; return string2gen("ZoomStd",false); case ZOOMSTO_ITAG: --ptr; return string2gen("ZoomSto",false); case ZOOMTRIG_ITAG: // FIXME --ptr; return string2gen("ZoomTrig",false); case DRAWFUNC_ITAG: return ti_decode_unary(ptr,at_plotfunc,contextptr); case DRAWINV_ITAG: // FIXME return ti_decode_unary(ptr,at_DrawInv,contextptr); // return ti_decode_unary(ptr,at_ti_drawinv,contextptr); case GOTO_ITAG: return ti_decode_unary(ptr,at_goto,contextptr); case LBL_ITAG: return ti_decode_unary(ptr,at_label,contextptr); case GET_ITAG: return ti_decode_unary(ptr,at_Get,contextptr); case SEND_ITAG: return ti_decode_not_implemented(ptr,"Send",1,contextptr); case GETCALC_ITAG: return ti_decode_unary(ptr,at_GetCalc,contextptr); case SENDCALC_ITAG: return ti_decode_not_implemented(ptr,"SendCalc",1,contextptr); case NEWFOLD_ITAG: return ti_decode_unary(ptr,at_NewFold,contextptr); case PRINTOBJ_ITAG: //FIXME return ti_decode_not_implemented(ptr,"printObj",1,contextptr); case RCLGDB_ITAG: return ti_decode_not_implemented(ptr,"RclGDB",1,contextptr); case STOGDB_ITAG: return ti_decode_not_implemented(ptr,"StoGDB",1,contextptr); case ELSEIF_ITAG: --ptr; return at_ti_elseif; case IF_ITAG: --ptr; return ti_decode_if(ptr,contextptr); case IFTHEN_ITAG: --ptr; return ti_decode_ifthen(ptr,contextptr); case WHILE_ITAG: --ptr; return ti_decode_while(ptr,contextptr); case RANDSEED_ITAG: return ti_decode_unary(ptr,at_RandSeed,contextptr); case COPYVAR_ITAG: return ti_decode_binary(ptr,at_CopyVar,true,contextptr); case RENAME_ITAG: return ti_decode_not_implemented(ptr,"Rename",2,contextptr); case STYLE_ITAG: return ti_decode_not_implemented(ptr,"Style",2,contextptr); case LINETAN_ITAG: return ti_decode_binary(ptr,at_LineTan,true,contextptr); case FILL_ITAG: return ti_decode_not_implemented(ptr,"Fill",2,contextptr); case REQUEST_ITAG: return ti_decode_binary(ptr,at_Request,true,contextptr); case POPUP_ITAG: return ti_decode_binary(ptr,at_PopUp,true,contextptr); case PTCHG_ITAG: return ti_decode_not_implemented(ptr,"PtChg",2,contextptr); case PTOFF_ITAG: return ti_decode_binary(ptr,at_PtOff,true,contextptr); case PTON_ITAG: return ti_decode_binary(ptr,at_PtOn,true,contextptr); case PXLCHG_ITAG: return ti_decode_not_implemented(ptr,"PxlChg",2,contextptr); case PXLOFF_ITAG: return ti_decode_binary(ptr,at_PxlOff,true,contextptr); case PXLON_ITAG: return ti_decode_binary(ptr,at_PxlOn,true,contextptr); case MOVEVAR_ITAG: return ti_decode_not_implemented(ptr,"MoveVar",-3,contextptr); case DROPDOWN_ITAG: return ti_decode_nary(ptr,at_DropDown,3,contextptr); case OUTPUT_ITAG: return ti_decode_nary(ptr,at_Output,3,contextptr); case PTTEXT_ITAG: return ti_decode_nary(ptr,at_PtText,3,contextptr); case PXLTEXT_ITAG: return ti_decode_not_implemented(ptr,"PxlText",-3,contextptr); case DRAWSLP_ITAG: return ti_decode_nary(ptr,at_DrawSlp,3,contextptr); case PAUSE_ITAG: return ti_decode_nary(ptr,at_Pause,0,contextptr); case RETURN_ITAG: return ti_decode_nary(ptr,at_return,0,contextptr); case INPUT_ITAG: return ti_decode_nary(ptr,at_Input,2,contextptr); case PLOTSOFF_ITAG: return ti_decode_not_implemented(ptr,"PlotsOff",-0,contextptr); case PLOTSON_ITAG: return ti_decode_not_implemented(ptr,"PlotsOn",-0,contextptr); case ONEVAR_ITAG: return ti_decode_not_implemented(ptr,"OneVar",-1,contextptr); case TITLE_ITAG: return ti_decode_nary(ptr,at_Title,1,contextptr); case ITEM_ITAG: return ti_decode_not_implemented(ptr,"Item",-1,contextptr); case INPUTSTR_ITAG: return ti_decode_nary(ptr,at_InputStr,3,contextptr); case LINEHORZ_ITAG: return ti_decode_nary(ptr,at_LineHorz,4,contextptr); case LINEVERT_ITAG: return ti_decode_nary(ptr,at_LineVert,4,contextptr); case PXLHORZ_ITAG: return ti_decode_not_implemented(ptr,"PxlHorz",-1,contextptr); case PXLVERT_ITAG: return ti_decode_not_implemented(ptr,"PxlVert",-1,contextptr); case ANDPIC_ITAG: return ti_decode_not_implemented(ptr,"AndPic",-1,contextptr); case XORPIC_ITAG: return ti_decode_not_implemented(ptr,"XorPic",-1,contextptr); case DRAWPOL_ITAG: return ti_decode_not_implemented(ptr,"DrawPol",-1,contextptr); case TABLE_ITAG: return ti_decode_not_implemented(ptr,"Table",-1,contextptr); case RCLPIC_ITAG: return ti_decode_nary(ptr,at_RclPic,1,contextptr); case RPLCPIC_ITAG: return ti_decode_nary(ptr,at_RplcPic,1,contextptr); case TEXT_ITAG: return ti_decode_nary(ptr,at_Text,1,contextptr); case STOPIC_ITAG: return ti_decode_nary(ptr,at_StoPic,1,contextptr); case GRAPH_ITAG: return ti_decode_nary(ptr,at_Graph,1,contextptr); case NEWPIC_ITAG: return ti_decode_nary(ptr,at_NewPic,1,contextptr); case DRAWPARM_ITAG: return ti_decode_nary(ptr,at_DrawParm,2,contextptr); case CYCLEPIC_ITAG: return ti_decode_nary(ptr,at_CyclePic,2,contextptr); case CUBICREG_ITAG: return ti_decode_not_implemented(ptr,"CubicReg",-2,contextptr); case EXPREG_ITAG: return ti_decode_not_implemented(ptr,"ExpReg",-2,contextptr); case LINREG_ITAG: return ti_decode_not_implemented(ptr,"LinReg",-2,contextptr); case LNREG_ITAG: return ti_decode_not_implemented(ptr,"LnReg",-2,contextptr); case MEDMED_ITAG: return ti_decode_not_implemented(ptr,"MedMed",-2,contextptr); case POWERREG_ITAG: return ti_decode_not_implemented(ptr,"PowerReg",-2,contextptr); case QUADREG_ITAG: return ti_decode_not_implemented(ptr,"QuadReg",-2,contextptr); case QUARTREG_ITAG: return ti_decode_not_implemented(ptr,"QuartReg",-2,contextptr); case SINREG_ITAG: return ti_decode_not_implemented(ptr,"SinReg",-2,contextptr); case LOGISTIC_ITAG: return ti_decode_not_implemented(ptr,"Logistic",-2,contextptr); case TWOVAR_ITAG: return ti_decode_not_implemented(ptr,"TwoVar",-2,contextptr); case SHADE_ITAG: return ti_decode_not_implemented(ptr,"Shade",-2,contextptr); case FOR_ITAG: --ptr; return ti_decode_for(ptr,contextptr); case CIRCLE_ITAG: return ti_decode_nary(ptr,at_Circle,2,contextptr); case LINE_ITAG: return ti_decode_nary(ptr,at_Line,2,contextptr); case DISP_ITAG: return ti_decode_nary(ptr,at_print,1,contextptr); case PXLCRCL_ITAG: return ti_decode_not_implemented(ptr,"PxlCrcl",-3,contextptr); case NEWPLOT_ITAG: return ti_decode_not_implemented(ptr,"NewPlot",-0,contextptr); case PXLLINE_ITAG: return ti_decode_not_implemented(ptr,"PxlLine",-4,contextptr); case FNOFF_ITAG: return ti_decode_not_implemented(ptr,"FnOff",-0,contextptr); case FNON_ITAG: return ti_decode_not_implemented(ptr,"FnOn",-0,contextptr); case LOCAL_ITAG: --ptr; return ti_decode_local(ptr,contextptr); case DELFOLD_ITAG: // FIXME might be nary or unary!!! return ti_decode_unary(ptr,at_DelFold,contextptr); case DELVAR_ITAG: return ti_decode_nary(ptr,at_DelVar,0,contextptr); case PROMPT_ITAG: return ti_decode_nary(ptr,at_Prompt,0,contextptr); case SORTA_ITAG: return ti_decode_nary(ptr,at_SortA,1,contextptr); case SORTD_ITAG: return ti_decode_nary(ptr,at_SortD,1,contextptr); case LOCK_ITAG: return ti_decode_not_implemented(ptr,"Lock",-1,contextptr); case UNLOCK_ITAG: // FIXME maybe unary op return ti_decode_not_implemented(ptr,"Unlock",-1,contextptr); case NEWDATA_ITAG: return ti_decode_not_implemented(ptr,"NewData",-2,contextptr); case DEFINE_ITAG: return _Define(ti_decode_binary(ptr,at_nop,true,contextptr)._SYMBptr->feuille,contextptr); case ELSE_TRY_ITAG: --ptr; return at_ti_else_try; case CLRERR_ITAG: --ptr; return string2gen("ClrErr",false); case PASSERR_ITAG: --ptr; return string2gen("PassErr",false); case DISPHOME_ITAG: --ptr; return symbolic(at_DispHome,vecteur(0)); case EXEC_ITAG: return ti_decode_nary(ptr,at_Exec,0,contextptr); case ARCHIVE_ITAG: return ti_decode_nary(ptr,at_Archive,1,contextptr); case UNARCHIV_ITAG: return ti_decode_nary(ptr,at_Unarchiv,1,contextptr); case LU_ITAG: return ti_decode_nary(ptr,at_LU,4,contextptr); case QR_ITAG: return ti_decode_nary(ptr,at_QR,4,contextptr); case BLDDATA_ITAG: return ti_decode_not_implemented(ptr,"BldData",-1,contextptr); case DRWCTOUR_ITAG: return ti_decode_unary(ptr,at_DrwCtour,contextptr); case NEWPROB_ITAG: --ptr; return string2gen("NewProb",false); case CUSTMON_ITAG: --ptr; return string2gen("CustmOn",false); case CUSTMOFF_ITAG: --ptr; return string2gen("CustmOff",false); case SENDCHAT_ITAG: return ti_decode_not_implemented(ptr,"SendChat",1,contextptr); default: return gensizeerr(gettext("Unknown instruction tag:")+print_INT_(*ptr)); } return 0; } // convert a TI9x object to a gen // ptr points to the tag of the structure (at the end) // after the call ptr points to the address previous beginning of object gen ti_decode_tag(octet * & ptr,GIAC_CONTEXT){ // unsigned short l; gen res; switch (*ptr){ case COMPLEX_TAG: // FIXME res=cst_i*ti_decode_tag(ptr,contextptr); return ti_decode_tag(ptr,contextptr)+res; // return ti_decode_not_implemented(ptr,"ComplexTag",2,contextptr); case NONNEGATIVE_INTEGER_TAG: --ptr; return ti_decode_unsigned(ptr,contextptr); case NEGATIVE_INTEGER_TAG: --ptr; return -ti_decode_unsigned(ptr,contextptr); case POSITIVE_FRACTION_TAG: --ptr; return ti_decode_fraction(ptr,contextptr); case NEGATIVE_FRACTION_TAG: --ptr; return -ti_decode_fraction(ptr,contextptr); case FLOAT_TAG: --ptr; return ti_decode_double(ptr,contextptr); case STR_DATA_TAG: ptr-=2; return string2gen(ti_decode_string(ptr,contextptr),false); case LIST_TAG: --ptr; return ti_decode_list(ptr,END_TAG,contextptr); case MATRIX_TAG: --ptr; res=ti_decode_list(ptr,END_TAG,contextptr); res.subtype=_MATRIX__VECT; return res; case USER_DEF_TAG: --ptr; return ti_decode_function(ptr,contextptr); case DATA_VAR_TAG: return gensizeerr(gettext("Data_var_tag not implemented")); case GDB_VAR_TAG: return gensizeerr(gettext("Gdb_var_tag not implemented")); case PIC_VAR_TAG: return gensizeerr(gettext("Unable to find pic_var_tag length")); case TEXT_VAR_TAG: return gensizeerr(gettext("Unable to find text_var_tag length")); case COMMAND_TAG: // or INSTRUCTION_TAG --ptr; return ti_command_tag(ptr,contextptr); case EXT_TAG: // or SECONDARY_TAG --ptr; return ti_secondary_tag(ptr,contextptr); case END_TAG: --ptr; return at_ti_endtag; case END_OF_SEGMENT: return gensizeerr(gettext("End_tag/End_of_segment")); case ASM_PRGM_TAG: return gensizeerr(gettext("Asm programs not implemented")); case GEN_DATA_TEG: return gensizeerr(gettext("3rd party data")); case VAR_NAME_TAG: --ptr; return ti_decode_identificateur(ptr,contextptr); case VAR_A_TAG: --ptr; return a__IDNT_e; case VAR_B_TAG: --ptr; return b__IDNT_e; case VAR_C_TAG: --ptr; return c__IDNT_e; case VAR_D_TAG: --ptr; return d__IDNT_e; case VAR_E_TAG: --ptr; return symbolic(at_exp,1); case VAR_F_TAG: --ptr; return f__IDNT_e; case VAR_G_TAG: --ptr; return g__IDNT_e; case VAR_H_TAG: --ptr; return h__IDNT_e; case VAR_I_TAG: --ptr; return i__IDNT_e; case VAR_J_TAG: --ptr; return j__IDNT_e; case VAR_K_TAG: --ptr; return k__IDNT_e; case VAR_L_TAG: --ptr; return l__IDNT_e; case VAR_M_TAG: --ptr; return m__IDNT_e; case VAR_N_TAG: --ptr; return n__IDNT_e; case VAR_O_TAG: --ptr; return o__IDNT_e; case VAR_P_TAG: --ptr; return p__IDNT_e; case _VAR_Q_TAG: CERR << "_var_q_tag" << endl; case VAR_Q_TAG: --ptr; return q__IDNT_e; case VAR_R_TAG: --ptr; return r__IDNT_e; case VAR_S_TAG: --ptr; return s__IDNT_e; case VAR_T_TAG: --ptr; return t__IDNT_e; case VAR_U_TAG: --ptr; return u__IDNT_e; case VAR_V_TAG: --ptr; return v__IDNT_e; case VAR_W_TAG: --ptr; return w__IDNT_e; case VAR_X_TAG: --ptr; return x__IDNT_e; case VAR_Y_TAG: --ptr; return y__IDNT_e; case VAR_Z_TAG: --ptr; return z__IDNT_e; case EXT_SYSTEM_TAG: --ptr; return ti_decode_sysvar_tag(ptr,contextptr); case ARB_REAL_TAG: --ptr; return ti_decode_arb_real(ptr,true,contextptr); case ARB_INT_TAG: --ptr; return ti_decode_arb_real(ptr,false,contextptr); case PI_TAG: --ptr; return cst_pi; case EXP_TAG: --ptr; return symbolic(at_exp,1); case IM_TAG: --ptr; return cst_i; case NEGINFINITY_TAG: --ptr; return minus_inf; case INFINITY_TAG: --ptr; return plus_inf; case PN_INFINITY_TAG: --ptr; return unsigned_inf; case UNDEF_TAG: --ptr; return undef; case FALSE_TAG: --ptr; return zero; case TRUE_TAG: --ptr; return plus_one; case NOTHING_TAG: return ti_decode_unary(ptr,at_nop,contextptr); case ACOSH_TAG: return ti_decode_unary(ptr,at_acosh,contextptr); case ASINH_TAG: return ti_decode_unary(ptr,at_asinh,contextptr); case ATANH_TAG: return ti_decode_unary(ptr,at_atanh,contextptr); case COSH_TAG: return ti_decode_unary(ptr,at_acosh,contextptr); case SINH_TAG: return ti_decode_unary(ptr,at_asinh,contextptr); case TANH_TAG: return ti_decode_unary(ptr,at_atanh,contextptr); case ACOS_TAG: return ti_decode_unary(ptr,at_acos,contextptr); case ASIN_TAG: return ti_decode_unary(ptr,at_asin,contextptr); case ATAN_TAG: return ti_decode_unary(ptr,at_atan,contextptr); case RACOS_TAG: return ti_decode_unary(ptr,at_acos,contextptr); case RASIN_TAG: return ti_decode_unary(ptr,at_asin,contextptr); case RATAN_TAG: return ti_decode_unary(ptr,at_atan,contextptr); case COS_TAG: return ti_decode_unary(ptr,at_cos,contextptr); case SIN_TAG: return ti_decode_unary(ptr,at_sin,contextptr); case TAN_TAG: return ti_decode_unary(ptr,at_tan,contextptr); case 0x47: // FIXME!! where is 10^x? return ti_decode_unary(ptr,at_nop,contextptr); case ITAN_TAG: return ti_decode_unary(ptr,at_tan,contextptr); case ABS_TAG: return ti_decode_unary(ptr,at_abs,contextptr); case ANGLE_TAG: return ti_decode_unary(ptr,at_arg,contextptr); case CEILING_TAG: return ti_decode_unary(ptr,at_ceil,contextptr); case FLOOR_TAG: return ti_decode_unary(ptr,at_floor,contextptr); case INT_TAG: return ti_decode_unary(ptr,at_floor,contextptr); case SIGN_TAG: return ti_decode_unary(ptr,at_sign,contextptr); case SQRT_TAG: return ti_decode_unary(ptr,at_sqrt,contextptr); case EXPF_TAG: return ti_decode_unary(ptr,at_exp,contextptr); case LN_TAG: return ti_decode_unary(ptr,at_ln,contextptr); case LOG_TAG: return ti_decode_unary(ptr,at_log10,contextptr); case FPART_TAG: return ti_decode_unary(ptr,at_fPart,contextptr); case IPART_TAG: return ti_decode_unary(ptr,at_iPart,contextptr); case CONJ_TAG: return ti_decode_unary(ptr,at_conj,contextptr); case IMAG_TAG: return ti_decode_unary(ptr,at_im,contextptr); case REAL_TAG: return ti_decode_unary(ptr,at_re,contextptr); case APPROX_TAG: return ti_decode_unary(ptr,at_evalf,contextptr); case TEXPAND_TAG: return ti_decode_unary(ptr,at_texpand,contextptr); case TCOLLECT_TAG: return ti_decode_unary(ptr,at_tcollect,contextptr); case GETDENOM_TAG: return ti_decode_unary(ptr,at_getDenom,contextptr); case GETNUM_TAG: return ti_decode_unary(ptr,at_getNum,contextptr); case CUMSUM_TAG: return ti_decode_unary(ptr,at_cumSum,contextptr); case DET_TAG: return ti_decode_unary(ptr,at_det,contextptr); case COLNORM_TAG: return ti_decode_unary(ptr,at_colNorm,contextptr); case ROWNORM_TAG: return ti_decode_unary(ptr,at_rowNorm,contextptr); case NORM_TAG: return ti_decode_unary(ptr,at_l2norm,contextptr); case MEAN_TAG: return ti_decode_unary(ptr,at_mean,contextptr); case MEDIAN_TAG: return ti_decode_unary(ptr,at_median,contextptr); case PRODUCT_TAG: return ti_decode_unary(ptr,at_product,contextptr); case STDDEV_TAG: return ti_decode_unary(ptr,at_stddev,contextptr); case SUM_TAG: return ti_decode_unary(ptr,at_sum,contextptr); case VARIANCE_TAG: return ti_decode_unary(ptr,at_variance,contextptr); case UNITV_TAG: return ti_decode_unary(ptr,at_unitV,contextptr); case DIM_TAG: return ti_decode_unary(ptr,at_dim,contextptr); case MAT2LIST_TAG: return ti_decode_unary(ptr,at_mat2list,contextptr); case NEWLIST_TAG: return ti_decode_unary(ptr,at_newList,contextptr); case RREF_TAG: return ti_decode_unary(ptr,at_rref,contextptr); case REF_TAG: return ti_decode_unary(ptr,at_ref,contextptr); case IDENTITY_TAG: return ti_decode_unary(ptr,at_identity,contextptr); case DIAG_TAG: return ti_decode_unary(ptr,at_diag,contextptr); case COLDIM_TAG: return ti_decode_unary(ptr,at_colDim,contextptr); case ROWDIM_TAG: return ti_decode_unary(ptr,at_rowDim,contextptr); case TRANSPOSE_TAG: return ti_decode_unary(ptr,at_transpose,contextptr); case FACTORIAL_TAG: return ti_decode_unary(ptr,at_factorial,contextptr); case PERCENT_TAG: return ti_decode_not_implemented(ptr,"percent",1,contextptr); case RADIANS_TAG: return ti_decode_not_implemented(ptr,"radians",1,contextptr); case NOT_TAG: return ti_decode_unary(ptr,at_not,contextptr); case MINUS_TAG: return ti_decode_unary(ptr,at_neg,contextptr); case VEC_POLAR_TAG: return ti_decode_not_implemented(ptr,">Polar",1,contextptr); case VEC_CYLIND_TAG: return ti_decode_not_implemented(ptr,">Cylind",1,contextptr); case VEC_SPHERE_TAG: return ti_decode_not_implemented(ptr,">Sphere",1,contextptr); case START_TAG: // internal tag return gensizeerr(gettext("start tag")); case ISTORE_TAG: return ti_decode_binary(ptr,at_sto,false,contextptr); case STORE_TAG: return ti_decode_binary(ptr,at_sto,false,contextptr); case WITH_TAG: return ti_decode_binary(ptr,at_tilocal,true,contextptr); case XOR_TAG: return ti_decode_binary(ptr,at_xor,true,contextptr); case OR_TAG: return ti_decode_binary(ptr,at_ou,true,contextptr); case AND_TAG: return ti_decode_binary(ptr,at_and,true,contextptr); case LT_TAG: return ti_decode_binary(ptr,at_inferieur_strict,true,contextptr); case LE_TAG: return ti_decode_binary(ptr,at_inferieur_egal,true,contextptr); case EQ_TAG: return ti_decode_binary(ptr,at_equal,true,contextptr); case GE_TAG: return ti_decode_binary(ptr,at_superieur_strict,true,contextptr); case GT_TAG: return ti_decode_binary(ptr,at_superieur_egal,true,contextptr); case NE_TAG: return ti_decode_binary(ptr,at_different,true,contextptr); case ADD_TAG: return ti_decode_binary(ptr,at_plus,false,contextptr); case ADDELT_TAG: return ti_decode_binary(ptr,at_plus,false,contextptr); case SUB_TAG: res=ti_decode_binary(ptr,at_minus,false,contextptr); res=*res._SYMBptr->feuille._VECTptr; res._VECTptr->back()=-res._VECTptr->back(); return symbolic(at_plus,res); case SUBELT_TAG: return ti_decode_binary(ptr,at_minus,false,contextptr); case MUL_TAG: return ti_decode_binary(ptr,at_prod,false,contextptr); case MULELT_TAG: return ti_decode_binary(ptr,at_pointprod,false,contextptr); case DIV_TAG: return ti_decode_binary(ptr,at_division,false,contextptr); case DIVELT_TAG: return ti_decode_binary(ptr,at_pointdivision,false,contextptr); case POW_TAG: return ti_decode_binary(ptr,at_pow,true,contextptr); case POWELT_TAG: return ti_decode_binary(ptr,at_pointpow,true,contextptr); case SINCOS_TAG: return gensizeerr(gettext("Internal sincos token")); case SOLVE_TAG: return ti_decode_binary(ptr,at_solve,true,contextptr); case CSOLVE_TAG: return ti_decode_binary(ptr,at_cSolve,true,contextptr); case NSOLVE_TAG: return ti_decode_binary(ptr,at_nSolve,true,contextptr); case ZEROS_TAG: return ti_decode_binary(ptr,at_zeros,true,contextptr); case CZEROS_TAG: return ti_decode_binary(ptr,at_cZeros,true,contextptr); case FMIN_TAG: return ti_decode_binary(ptr,at_fMin,true,contextptr); case FMAX_TAG: return ti_decode_binary(ptr,at_fMax,true,contextptr); case POLYEVAL_TAG: return ti_decode_binary(ptr,at_polyEval,true,contextptr); case RANDPOLY_TAG: return ti_decode_binary(ptr,at_randPoly,true,contextptr); case CROSSP_TAG: return ti_decode_binary(ptr,at_crossP,true,contextptr); case DOTP_TAG: return ti_decode_binary(ptr,at_dotP,true,contextptr); case GCD_TAG: return ti_decode_binary(ptr,at_gcd,true,contextptr); case LCM_TAG: return ti_decode_binary(ptr,at_lcm,true,contextptr); case MOD_TAG: return ti_decode_binary(ptr,at_irem,true,contextptr); case INTDIV_TAG: return ti_decode_binary(ptr,at_intDiv,true,contextptr); case REMAIN_TAG: return ti_decode_binary(ptr,at_remain,true,contextptr); case NCR_TAG: return ti_decode_binary(ptr,at_nCr,true,contextptr); case NPR_TAG: return ti_decode_binary(ptr,at_nPr,true,contextptr); case P2RX_TAG: return ti_decode_not_implemented(ptr,"P->Rx",2,contextptr); case P2RY_TAG: return ti_decode_not_implemented(ptr,"P->Ry",2,contextptr); case P2PTHETA_TAG: return ti_decode_not_implemented(ptr,"R->Pq",2,contextptr); case P2PR_TAG: return ti_decode_not_implemented(ptr,"R->Pr",2,contextptr); case AUGMENT_TAG: return ti_decode_binary(ptr,at_augment,true,contextptr); case NEWMAT_TAG: return ti_decode_binary(ptr,at_newMat,true,contextptr); case RANDMAT_TAG: return ti_decode_binary(ptr,at_randMat,true,contextptr); case SIMULT_TAG: return ti_decode_binary(ptr,at_simult,true,contextptr); case PART_TAG: return ti_decode_nary(ptr,at_part,1,contextptr); case EXP2LIST_TAG: return ti_decode_binary(ptr,at_exp2list,true,contextptr); case RANDNORM_TAG: return ti_decode_binary(ptr,at_randNorm,true,contextptr); case MROW_TAG: return ti_decode_nary(ptr,at_mRow,3,contextptr); case ROWADD_TAG: return ti_decode_nary(ptr,at_rowAdd,4,contextptr); case ROWSWAP_TAG: return ti_decode_nary(ptr,at_rowSwap,3,contextptr); case ARCLEN_TAG: return ti_decode_nary(ptr,at_arcLen,4,contextptr); case NINT_TAG: return ti_decode_nary(ptr,at_nInt,4,contextptr); case PI_PRODUCT_TAG: return ti_decode_nary(ptr,at_product,1,contextptr); case SIGMA_SUM_TAG: return ti_decode_nary(ptr,at_sum,4,contextptr); case MROWADD_TAG: return ti_decode_nary(ptr,at_mRowAdd,4,contextptr); case ANS_TAG: return ti_decode_nary(ptr,at_ans,0,contextptr); case ENTRY_TAG: return ti_decode_nary(ptr,at_entry,0,contextptr); case EXACT_TAG: return ti_decode_nary(ptr,at_exact,1,contextptr); case LOGB_TAG: return ti_decode_binary(ptr,at_logb,true,contextptr); case COMDENOM_TAG: return ti_decode_nary(ptr,at_comDenom,1,contextptr); case EXPAND_TAG: return ti_decode_nary(ptr,at_expand,1,contextptr); case FACTOR_TAG: return ti_decode_nary(ptr,at_factor,1,contextptr); case CFACTOR_TAG: return ti_decode_nary(ptr,at_cFactor,1,contextptr); case INTEGRATE_TAG: return ti_decode_nary(ptr,at_integrate,2,contextptr); case DIFFERENTIATE_TAG: return ti_decode_nary(ptr,at_derive,2,contextptr); case AVGRC_TAG: return ti_decode_nary(ptr,at_avgRC,2,contextptr); case NDERIV_TAG: return ti_decode_nary(ptr,at_nDeriv,2,contextptr); case TAYLOR_TAG: return ti_decode_nary(ptr,at_taylor,3,contextptr); case LIMIT_TAG: return ti_decode_nary(ptr,at_limit,3,contextptr); case PROPFRAC_TAG: return ti_decode_nary(ptr,at_propFrac,1,contextptr); case WHEN_TAG: return ti_decode_nary(ptr,at_when,3,contextptr); case ROUND_TAG: return ti_decode_nary(ptr,at_round,1,contextptr); case DMS_TAG: // FIXME not clear return ti_decode_not_implemented(ptr,"DMS",1,contextptr); // return ti_decode_not_implemented(ptr,"DMS",-1,contextptr); case LEFT_TAG: return ti_decode_nary(ptr,at_left,1,contextptr); case RIGHT_TAG: return ti_decode_nary(ptr,at_right,1,contextptr); case MID_TAG: return ti_decode_nary(ptr,at_mid,2,contextptr); case SHIFT_TAG: return ti_decode_nary(ptr,at_shift,1,contextptr); case SEQ_TAG: return ti_decode_nary(ptr,at_seq,4,contextptr); case LIST2MAT_TAG: return ti_decode_nary(ptr,at_list2mat,1,contextptr); case SUBMAT_TAG: return ti_decode_nary(ptr,at_subMat,1,contextptr); case SUBSCRIPT_TAG: res=ti_decode_nary(ptr,at_at,2,contextptr); if (res.type!=_SYMB || res._SYMBptr->feuille.type!=_VECT) return gensizeerr(contextptr); res=res._SYMBptr->feuille; if (res._VECTptr->size()==2) return symbolic(at_at,makesequence(res._VECTptr->front(),(res._VECTptr->back()-plus_one))); else return symbolic(at_at,makesequence(res._VECTptr->front(),gen(vecteur(res._VECTptr->begin()+1,res._VECTptr->end()),_SEQ__VECT)-gen(vecteur(res._VECTptr->size()-1,plus_one),_SEQ__VECT))); case RAND_TAG: return ti_decode_nary(ptr,at_rand,0,contextptr); case MIN_TAG: return ti_decode_nary(ptr,at_min,1,contextptr); case MAX_TAG: return ti_decode_nary(ptr,at_max,1,contextptr); case USERFUNC_TAG: res=ti_decode_nary(ptr,at_of,0,contextptr); if (res.type!=_SYMB || res._SYMBptr->feuille.type!=_VECT) return gensizeerr(contextptr); res=res._SYMBptr->feuille; return symbolic(at_of,makesequence(res._VECTptr->front(),gen(vecteur(res._VECTptr->begin()+1,res._VECTptr->end()),_SEQ__VECT))); case FIG_TAG: return gensizeerr(gettext("fig_tag")); case MAC_TAG: return gensizeerr(gettext("mac_tag")); case COMMENT_TAG: ptr -=2; while (!*ptr) --ptr; return string2gen(ti_decode_string(ptr,contextptr),false); case NEXTEXPR_TAG: case NEWLINE_TAG: // ":" or "\n" inside a prog ti_decode_newline(ptr,contextptr); return at_nop; case PN1_TAG: return ti_decode_unary(ptr,at_neg,contextptr); case PN2_TAG: CERR << "pn2_tag" << endl; return ti_decode_binary(ptr,at_neg,true,contextptr); case ERROR_MSG_TAG: return ti_decode_not_implemented(ptr,"ErrorMsg",1,contextptr); case EIGVC_TAG: return ti_decode_unary(ptr,at_eigVc,contextptr); case EIGVL_TAG: return ti_decode_unary(ptr,at_eigVl,contextptr); case DASH_TAG: return ti_decode_unary(ptr,at_derive,contextptr); case LOCALVAR_TAG: --ptr; return ti_decode_tag(ptr,contextptr); case DESOLVE_TAG: return ti_decode_nary(ptr,at_deSolve,3,contextptr); case FDASH_TAG: return ti_decode_binary(ptr,at_derive,true,contextptr); case ISPRIME_TAG: return ti_decode_unary(ptr,at_isprime,contextptr); case ROTATE_TAG: return ti_decode_nary(ptr,at_rotate,1,contextptr); default: return gensizeerr(gettext("Unknown tag ")+print_INT_(*ptr)); } --ptr; return res; } // convert a TI9x object to a gen // ptr points to the beginning of the structure gen ti2gen(octet * ptr,GIAC_CONTEXT){ /* if (numeric_limits::Digits!=8){ return gensizeerr(gettext("Must recompile with a typedef for octet as 8-bit data")); } */ int offset= ptr[0]*256+ptr[1]; octet * tag = ptr + (offset +1); // Check here for text, non tokenized progs, 3rd party data // since length must be known if (*tag==TEXT_VAR_TAG){ char * ptrs=(char *)ptr+4; return string2gen(tiasc_translate(ptrs),false); } if (*tag==USER_DEF_TAG && (*(tag-1) & 0x08)){ ptr +=2; // point to argument list string s(":tmpfunc"); char c; tag -= 8; for (;ptr!=tag;++ptr){ c=*ptr; if (*ptr>0x7F){ if (-c==87){ // must skip until end of line for (;ptr!=tag;++ptr){ if (*ptr=='\r') break; } } else s += "Z"+print_INT_(-c); } else { switch(c){ case 0: continue; case '\r': s = (s+'\n')+':'; break; case '\026': s += "=>"; break; default: s += c; } } } s=tiasc_translate(s); CERR << s << endl; int save_maple_mode=xcas_mode(contextptr); xcas_mode(contextptr)=3; gen res(s,contextptr); xcas_mode(contextptr)=save_maple_mode; return res; } return ti_decode_tag(tag,contextptr); } static gen decode_name(octet * buf,GIAC_CONTEXT){ string lu; char c; for (int i=0;i<8 && (c=buf[i]);++i) lu += c; gen gname(lu,contextptr); if (gname.type!=_IDNT) gname=gen("_"+lu,contextptr); return gname; } // FIXME SECURITY // Format [length 2 bytes] 0xE9 prgm 0x19 or 0x13 0xE5 ... 0x0 0x0 0x0 0xDC // length is at offset 0x56 in a program file, name at 0x40 gen _unarchive_ti(const gen & g,GIAC_CONTEXT){ if ( g.type==_STRNG && g.subtype==-1) return g; if (g.type!=_STRNG) return gensizeerr(contextptr); #ifdef NSPIRE return gensizeerr(contextptr); #else if (access(g._STRNGptr->c_str(),R_OK)) return gensizeerr(gettext("Unable to open ")+g.print(contextptr)); ifstream is(g._STRNGptr->c_str()); string lu; char c; for (;!is.eof();){ is.get(c); lu += c; } unsigned int s=unsigned(lu.size()); if (s<0x60) return gensizeerr(gettext("Too short for a TI archive")); #ifdef VISUALC octet *buf=new octet[s]; // FIXME VISUALC delete #else octet buf[s]; #endif memcpy(buf,lu.c_str(),s); if (lu[6]=='P'){ // package/group file unsigned int t=buf[0x3e]*65536+buf[0x3d]*256+buf[0x3c]; if (ss) return res; unsigned int ttt=buf[tt]*256+buf[tt+1]; if (sfeuille[0],gname); else res=symb_sto(gval,gname); return res; } // Group file format // First name is folder at 0x40 offset 0x4c (dir name) // List of names 0x50, 0x60, ... offsets 0x5c 0x6c etc. // offset + 4 = begin of func/prog, ex. offset=0x1322, length at 0x1326 gen gfoldername(decode_name(&buf[0x40],contextptr)); vecteur res; if (gfoldername.print(contextptr)!="main"){ CERR << "Degrouping in folder " << gfoldername << endl; res.push_back(symbolic(at_NewFold,gfoldername)); res.push_back(symbolic(at_SetFold,gfoldername)); } // decode each prog for (unsigned int i=0;is) return res; unsigned int ttt=buf[tt]*256+buf[tt+1]; if (sfeuille[0],gname)); res.push_back(symb_sto(gval,gname)); } return res; } unsigned int t=buf[0x56]*256+buf[0x57]; if (sfeuille[0],gname); return symb_sto(gval,gname); #endif } #endif //RTOS_THREADX static const char _unarchive_ti_s[]="unarchive_ti"; static define_unary_function_eval (__unarchive_ti,&_unarchive_ti,_unarchive_ti_s); define_unary_function_ptr5( at_unarchive_ti ,alias_at_unarchive_ti,&__unarchive_ti,0,true); #ifdef GIAC_HAS_STO_38 static const char _fsi_s[]="fsi"; static define_unary_function_eval_quoted (__fsi,&_ifte,_fsi_s); define_unary_function_ptr5( at_fsi ,alias_at_fsi,&__fsi,_QUOTE_ARGUMENTS,T_BLOC_END); static const char _ffaire_s[]="ffaire"; static define_unary_function_eval_quoted (__ffaire,&_for,_ffaire_s); define_unary_function_ptr5( at_ffaire ,alias_at_ffaire,&__ffaire,_QUOTE_ARGUMENTS,T_BLOC_END); static const char _fpour_s[]="fpour"; static define_unary_function_eval_quoted (__fpour,&_for,_fpour_s); define_unary_function_ptr5( at_fpour ,alias_at_fpour,&__fpour,_QUOTE_ARGUMENTS,T_BLOC_END); static const char _ftantque_s[]="ftantque"; static define_unary_function_eval_quoted (__ftantque,&_for,_ftantque_s); define_unary_function_ptr5( at_ftantque ,alias_at_ftantque,&__ftantque,_QUOTE_ARGUMENTS,T_BLOC_END); static const char _ffonction_s[]="ffonction"; static define_unary_function_eval_quoted (__ffonction,&_for,_ffonction_s); define_unary_function_ptr5( at_ffonction ,alias_at_ffonction,&__ffonction,_QUOTE_ARGUMENTS,T_BLOC_END); #endif #ifndef NO_NAMESPACE_GIAC } // namespace giac #endif // ndef NO_NAMESPACE_GIAC