version 1.12, 2015/08/21 01:20:30 |
version 1.19, 2019/12/19 08:34:41 |
|
|
/* $OpenXM: OpenXM/src/ox_pari/ox_pari.c,v 1.11 2015/08/21 00:53:53 noro Exp $ */ |
/* $OpenXM: OpenXM/src/ox_pari/ox_pari.c,v 1.18 2019/07/25 05:59:15 noro Exp $ */ |
|
|
|
#include <signal.h> |
#include "ox_pari.h" |
#include "ox_pari.h" |
|
|
OXFILE *fd_rw; |
OXFILE *fd_rw; |
|
|
|
|
int sm_mathcap() |
int sm_mathcap() |
{ |
{ |
mathcap_init(OX_PARI_VERSION, ID_STRING, "ox_pari", NULL, NULL); |
#if 0 |
|
char *opts[] = {"no_ox_reset", NULL}; |
|
mathcap_init2(OX_PARI_VERSION, ID_STRING, "ox_pari", NULL, NULL, opts); |
|
#else |
|
mathcap_init2(OX_PARI_VERSION, ID_STRING, "ox_pari", NULL, NULL, NULL); |
|
#endif |
push((cmo*)oxf_cmo_mathcap(fd_rw)); |
push((cmo*)oxf_cmo_mathcap(fd_rw)); |
return 0; |
return 0; |
} |
} |
Line 151 int sm_executeFunction() |
|
Line 157 int sm_executeFunction() |
|
struct parif *parif; |
struct parif *parif; |
unsigned long prec; |
unsigned long prec; |
char buf[BUFSIZ]; |
char buf[BUFSIZ]; |
|
int status; |
|
char *err; |
|
|
if ( setjmp(GP_DATA->env) ) { |
if ( (status = setjmp(GP_DATA->env)) != 0 ) { |
sprintf(buf,"sm_executeFunction : an error occured in PARI."); |
err = errmessage[status]; |
|
if ( status == errpile ) { |
|
sprintf(buf,"%s\nIncrease PARI stack by pari(allocatemem,size).",err); |
|
init_pari(); |
|
} else if ( strlen(err) != 0 ) |
|
sprintf(buf,"An error occured in PARI :%s",err); |
|
else |
|
sprintf(buf,"An error occured in PARI."); |
push((cmo*)make_error2(buf)); |
push((cmo*)make_error2(buf)); |
return -1; |
return -1; |
} |
} |
Line 210 int sm_executeFunction() |
|
Line 225 int sm_executeFunction() |
|
avma = av0; |
avma = av0; |
push(ret); |
push(ret); |
return 0; |
return 0; |
|
} else if ( parif->type == 2 ) { |
|
/* one number/poly/matrix argument with flag=0 */ |
|
av0 = avma; |
|
z = cmo_to_GEN(av[0]); |
|
if ( ismatrix(z) ) { |
|
int i,len; |
|
len = lg(z); |
|
for ( i = 1; i < len; i++ ) |
|
settyp(z[i],t_COL); |
|
settyp(z,t_MAT); |
|
z = shallowtrans(z); |
|
} |
|
printf("input : "); output(z); |
|
m = (*parif->f)(z,0); |
|
ret = GEN_to_cmo(m); |
|
avma = av0; |
|
push(ret); |
|
return 0; |
} else { |
} else { |
sprintf(buf,"%s : not implemented",func->s); |
sprintf(buf,"%s : not implemented",func->s); |
push((cmo*)make_error2(buf)); |
push((cmo*)make_error2(buf)); |
|
|
return 0; |
return 0; |
} |
} |
|
|
|
#if defined(ANDROID) |
|
jmp_buf ox_env; |
|
#else |
|
sigjmp_buf ox_env; |
|
#endif |
|
|
|
void usr1_handler(int sig) |
|
{ |
|
#if defined(ANDROID) |
|
_longjmp(ox_env,1); |
|
#else |
|
siglongjmp(ox_env,1); |
|
#endif |
|
} |
|
|
int main() |
int main() |
{ |
{ |
init_gc(); |
#if defined(ANDROID) |
ox_stderr_init(stderr); |
if ( _setjmp(ox_env) ) { |
initialize_stack(); |
#else |
init_pari(); |
if ( sigsetjmp(ox_env,~0) ) { |
|
#endif |
|
fprintf(stderr,"resetting libpari and sending OX_SYNC_BALL..."); |
|
initialize_stack(); |
|
init_pari(); |
|
send_ox_tag(fd_rw,OX_SYNC_BALL); |
|
fprintf(stderr,"done\n"); |
|
} else { |
|
init_gc(); |
|
ox_stderr_init(stderr); |
|
initialize_stack(); |
|
init_pari(); |
|
|
|
fprintf(stderr,"ox_pari\n"); |
|
|
fprintf(stderr,"ox_pari\n"); |
fd_rw = oxf_open(3); |
|
oxf_determine_byteorder_server(fd_rw); |
|
} |
|
|
fd_rw = oxf_open(3); |
#if defined(__CYGWIN__) |
oxf_determine_byteorder_server(fd_rw); |
void *mysignal(int sig,void (*handler)(int m)); |
|
mysignal(SIGUSR1,usr1_handler); |
|
#else |
|
signal(SIGUSR1,usr1_handler); |
|
#endif |
|
|
while(1){ |
while(1){ |
receive(); |
receive(); |