=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/ctrl.c,v retrieving revision 1.51 retrieving revision 1.58 diff -u -p -r1.51 -r1.58 --- OpenXM_contrib2/asir2000/builtin/ctrl.c 2016/08/24 01:33:53 1.51 +++ OpenXM_contrib2/asir2000/builtin/ctrl.c 2018/03/28 09:07:54 1.58 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/ctrl.c,v 1.50 2016/04/01 03:04:35 ohara Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/ctrl.c,v 1.57 2018/03/28 07:58:17 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -113,58 +113,144 @@ extern int weight_check; extern char **ASIRLOADPATH; extern int ASIRLOADPATH_LEN; extern int No_ox_reset; +extern int plot_by_bigfloat; +extern int debug_plot; -static struct { +static struct keyval { char *key; int *val; + char *desc; } ctrls[] = { - {"error_in_timer",&error_in_timer}, - {"cputime",&prtime}, - {"nez",&nez}, - {"echo",&echoback}, - {"bigfloat",&bigfloat}, - {"evalef",&evalef}, - {"verbose",&Verbose}, - {"quiet_mode",&do_quiet}, - {"hideargs",&hideargs}, - {"hex",&hex_output}, - {"debug_window",&do_server_in_X11}, - {"message",&do_message}, - {"terse",&do_terse}, - {"debug_up",&debug_up}, - {"no_prompt",&do_quiet}, - {"asir_setenv",&asir_setenv}, - {"ox_batch",&ox_batch}, - {"ox_check",&ox_check}, - {"ox_exchange_mathcap",&ox_exchange_mathcap}, - {"f4_nocheck",&f4_nocheck}, - {"StrassenSize",&StrassenSize}, - {"outputstyle",&outputstyle}, - {"double_output",&double_output}, - {"real_digit",&real_digit}, - {"real_binary",&real_binary}, - {"fortran_output",&fortran_output}, - {"new_hensel",&use_new_hensel}, - {"print_quote",&print_quote}, - {"show_crossref",&show_crossref}, - {"allow_laurent",&allow_laurent}, - {"show_orderspec",&show_orderspec}, - {"no_debug_on_error",&no_debug_on_error}, - {"diag_period",&diag_period}, - {"weight_check",&weight_check}, - {"no_ox_reset",&No_ox_reset}, + {"StrassenSize",&StrassenSize,"Determines the parameter in Strassen-Winograd matrix multiplication algorithm."}, + {"allow_laurent",&allow_laurent,"If set to 1, negative exponents are allowed in monomials."}, + {"asir_setenv",&asir_setenv,"Not used."}, + {"bigfloat",&bigfloat,"If set to 1, MPFR bigfloat functions are used for floating point evaluation." }, + {"cputime",&prtime,"If set to 1, the CPU time at the toplevel is shown." }, + {"debug_up",&debug_up,"If set to 1, some debug messages are printed in special functions for univariate polynomials."}, + {"debug_window",&do_server_in_X11,"If set to 1, an input window for debugging remote server are shown."}, + {"diag_period",&diag_period,"Determines the frequency of the intermediate inter-reduction in nd_gr()."}, + {"double_output",&double_output,"If set to 1, floating point numbers are printed in the style ddd.ddd."}, + {"echo",&echoback,"If set to 1, characters read by the input function are printed." }, + {"error_in_timer",&error_in_timer,"If set to 1, the usual error handler is executed when the timer is expired."}, + {"evalef",&evalef,"If set to 1, elementary functions are evaluated immediately."}, + {"f4_nocheck",&f4_nocheck,"If set to 1, correctness check of the result of modular computation are omitted in nd_f4()."}, + {"fake_ox_reset",&No_ox_reset,"Determines the treatment of OX reset request for a server which does not implement the reset protocol."}, + {"fortran_output",&fortran_output,"If set to 1, ** is used instead of ^ for representing the power."}, + {"hex",&hex_output,"If set to 1, integers are printed by the hexadecimal notation."}, + {"hideargs",&hideargs,"If set to 1, the arguments of a function call are not printed."}, + {"message",&do_message,"If set to 1, an opening message is printed in ox_asir and ox_plot."}, + {"new_hensel",&use_new_hensel,"If set to 1, a function hensel2() is used in the univariate factorizer over Q."}, + {"nez",&nez,"If set to 1, a new version of EZGCD implementation is used." }, + {"no_debug_on_error",&no_debug_on_error,"If set to 1, the debug mode is not used."}, + {"no_ox_reset",&No_ox_reset,"Determines the treatment of OX reset request for a server which does not implement the reset protocol."}, + {"no_prompt",&do_quiet,"If set to 1, prompts are not shown."}, + {"outputstyle",&outputstyle,"If set to 1, structured data such as matrices and vectors are printed in the style mat(...), vect(...)."}, + {"ox_batch",&ox_batch,"If set to 1, the OX stream are not flushed at each sending of an OX data."}, + {"ox_check",&ox_check,"If set to 1, mathcap check is done for OpenXM date communication."}, + {"ox_exchange_mathcap",&ox_exchange_mathcap,"If set to 1, mathcaps are exchanged."}, + {"print_quote",&print_quote,"Determines the behavior of the printed form of a quote."}, + {"quiet_mode",&do_quiet,"If set to 1, the copyright notices are not printed at the beginning of the session."}, + {"real_binary",&real_binary,"If set to 1, a floating point number is printed by the binary notation."}, + {"real_digit",&real_digit,"Determines the number of digits to appear after the decimal point."}, + {"show_crossref",&show_crossref,"If set to 1, cross-references are shown when a program file is loaded."}, + {"show_orderspec",&show_orderspec,"If set to 1, the specification of a composite term order is printed upon its creation."}, + {"terse",&do_terse,"If set to 1, messages are not printed when user-defined callbacks are executed."}, + {"verbose",&Verbose,"If set to 1, a warning is printed if a function is redefined."}, + {"weight_check",&weight_check,"If set to 1, an overflow check for the given weight vector is done before starting the Groebner basis computation."}, +#if defined(DO_PLOT) + {"plot_by_bigfloat",&plot_by_bigfloat,"If set to 1, computation is done by using MPFR bigfloat functions in ox_plot."}, + {"debug_plot",&debug_plot,"If set to 1, ox_plot is executed with the message window."}, +#endif #if defined(INTERVAL) - {"zerorewrite",&zerorewrite}, - {"itvplotsize",&Itvplot}, + {"zerorewrite",&zerorewrite,""}, + {"itvplotsize",&Itvplot,""}, #endif {0,0}, }; -void Pctrl(arg,rp) -NODE arg; -Q *rp; +LIST create_control_value(char *keystr,Obj value,char *descstr,int withdesc) { - int t,i,n; + STRING key,desc; + NODE nd; + LIST list; + + MKSTR(key,keystr); + if ( withdesc ) { + MKSTR(desc,descstr); + nd = mknode(3,key,value,desc); + } else nd = mknode(2,key,value); + MKLIST(list,nd); + return list; +} + +extern Q ox_pari_stream; +extern int ox_pari_stream_initialized; +extern P ox_pari_starting_function; + +LIST create_control_values(int withdesc) +{ + int n,i; + NODE top,top1,nd,node,p; + LIST list,l; + STRING s; + char *descstr; + Q val,adj; + int nm,dv; + N num,den; + + n = sizeof(ctrls)/sizeof(struct keyval)-1; + top = 0; + for ( i = n-1; i >= 0; i-- ) { + STOQ(*(ctrls[i].val),val); + list = create_control_value(ctrls[i].key,val,ctrls[i].desc,withdesc); + MKNODE(top1,list,top); top = top1; + } +/* adj */ + Risa_GC_get_adj(&nm,&dv); UTON(nm,num); UTON(dv,den); NDTOQ(num,den,1,adj); + descstr = "Determines the parameter for Boehm's GC."; + list = create_control_value("adj",adj,descstr,withdesc); + MKNODE(top1,list,top); top = top1; + +/* prompt */ + descstr = "Determines the user-defined prompt."; + list = create_control_value("prompt",user_defined_prompt,descstr,withdesc); + MKNODE(top1,list,top); top = top1; + +/* loadpath */ + node = 0; + if( ASIRLOADPATH[0] ) { + for(i=0; ASIRLOADPATH[i]; i++); + for(i--,p=NULL; i>=0; i--,p=node) { + MKSTR(s,ASIRLOADPATH[i]); + MKNODE(node,s,p); + } + } + MKLIST(l,node); + descstr = "List of paths in ASIRLOADPATHt."; + list = create_control_value("loadpath",l,descstr,withdesc); + MKNODE(top1,list,top); top = top1; + +/* oxpari_id */ + if(!ox_pari_stream_initialized) { + STOQ(-1,val); + } else val = ox_pari_stream; + descstr = "Id of ox_pari."; + list = create_control_value("oxpari_id",val,descstr,withdesc); + MKNODE(top1,list,top); top = top1; + +/* oxpari_start */ + val = (Q)ox_pari_starting_function; + descstr = "oxpari starting function."; + list = create_control_value("oxpari_start",val,descstr,withdesc); + MKNODE(top1,list,top); top = top1; + + MKLIST(list,top); + return list; +} + +void Pctrl(NODE arg,Q *rp) +{ + int t,i,n,desc=0; int nm,dv; N num,den; Q c; @@ -172,15 +258,24 @@ Q *rp; char buf[BUFSIZ]; char *str; STRING s; - NODE node,p; + NODE node,p,opt; LIST list; P f; - extern Q ox_pari_stream; - extern int ox_pari_stream_initialized; - extern P ox_pari_starting_function; + Obj value; if ( !arg ) { - *rp = 0; + if ( current_option ) { + for ( opt = current_option; opt; opt = NEXT(opt) ) { + p = BDY((LIST)BDY(opt)); + key = BDY((STRING)BDY(p)); + value = (Obj)BDY(NEXT(p)); + if ( !strcmp(key,"desc") && value ) { + desc = value ? 1 : 0; + break; + } + } + } + *rp = create_control_values(desc); return; } key = BDY((STRING)ARG0(arg)); @@ -242,7 +337,7 @@ Q *rp; MKNODE(node,s,p); } MKLIST(list,node); - *rp = list; + *rp = (Q)list; } } else { list = (LIST)ARG1(arg); @@ -288,12 +383,12 @@ Q *rp; return; } else if ( !strcmp(key,"oxpari_start") ) { if ( argc(arg) == 1 ) { - *rp = ox_pari_starting_function; + *rp = (Q)ox_pari_starting_function; } else { - f = (Obj)ARG1(arg); + f = (P)ARG1(arg); if ( !f || OID(f) == O_P) { ox_pari_starting_function = f; - *rp = f; + *rp = (Q)f; }else { *rp = 0; }