| version 1.91, 2015/08/19 05:29:23 | version 1.98, 2018/03/27 06:29:19 | 
|  |  | 
| * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, | * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, | 
| * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. | * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. | 
| * | * | 
| * $OpenXM: OpenXM_contrib2/asir2000/parse/glob.c,v 1.90 2015/08/14 13:51:56 fujimoto Exp $ | * $OpenXM: OpenXM_contrib2/asir2000/parse/glob.c,v 1.97 2017/08/30 09:40:30 ohara Exp $ | 
| */ | */ | 
| #include "ca.h" | #include "ca.h" | 
| #include "al.h" | #include "al.h" | 
| #include "parse.h" | #include "parse.h" | 
| #include "ox.h" | #include "ox.h" | 
|  | #include <signal.h> | 
| #if !defined(VISUAL) && !defined(__MINGW32__) && !defined(_PA_RISC1_1) && !defined(linux) && !defined(SYSV) && !defined(__CYGWIN__) && !defined(__INTERIX) && !defined(__FreeBSD__) | #if !defined(VISUAL) && !defined(__MINGW32__) && !defined(_PA_RISC1_1) && !defined(linux) && !defined(SYSV) && !defined(__CYGWIN__) && !defined(__INTERIX) && !defined(__FreeBSD__) | 
| #include <sgtty.h> | #include <sgtty.h> | 
| #endif | #endif | 
| 
| Line 122  struct oVL oVLIST[52]; |  | 
| Line 123  struct oVL oVLIST[52]; |  | 
|  |  | 
| VL CO = oVLIST; | VL CO = oVLIST; | 
| VL ALG; | VL ALG; | 
|  | VL LASTCO; | 
|  |  | 
| struct oVS oGPVS,oAPVS,oEPVS,oPPVS; | struct oVS oGPVS,oAPVS,oEPVS,oPPVS; | 
| VS GPVS = &oGPVS; | VS GPVS = &oGPVS; | 
| 
| Line 161  void glob_init() { |  | 
| Line 163  void glob_init() { |  | 
| VR(&oVLIST[i]) = &oVAR[i]; NEXT(&oVLIST[i]) = &oVLIST[i+1]; | VR(&oVLIST[i]) = &oVAR[i]; NEXT(&oVLIST[i]) = &oVLIST[i+1]; | 
| } | } | 
| VR(&oVLIST[i]) = &oVAR[i]; NEXT(&oVLIST[i]) = 0; | VR(&oVLIST[i]) = &oVAR[i]; NEXT(&oVLIST[i]) = 0; | 
| reallocarray((char **)&GPVS->va,(int *)&GPVS->asize,(int *)&GPVS->n,(int)sizeof(struct oPV)); | LASTCO = &oVLIST[i]; | 
| reallocarray((char **)&APVS->va,(int *)&APVS->asize,(int *)&APVS->n,(int)sizeof(struct oPV)); | asir_reallocarray((char **)&GPVS->va,(int *)&GPVS->asize,(int *)&GPVS->n,(int)sizeof(struct oPV)); | 
| reallocarray((char **)&PPVS->va,(int *)&PPVS->asize,(int *)&PPVS->n,(int)sizeof(struct oPV)); | asir_reallocarray((char **)&APVS->va,(int *)&APVS->asize,(int *)&APVS->n,(int)sizeof(struct oPV)); | 
|  | asir_reallocarray((char **)&PPVS->va,(int *)&PPVS->asize,(int *)&PPVS->n,(int)sizeof(struct oPV)); | 
| CPVS = GPVS; | CPVS = GPVS; | 
| MKNODE(ONENODE,mkfnode(1,I_FORMULA,ONE),NULLP); | MKNODE(ONENODE,mkfnode(1,I_FORMULA,ONE),NULLP); | 
| OID(F_TRUE)=O_F; FOP(F_TRUE)=AL_TRUE; F_TRUE->arg.dummy = 0; | OID(F_TRUE)=O_F; FOP(F_TRUE)=AL_TRUE; F_TRUE->arg.dummy = 0; | 
| 
| Line 189  void notdef(VL vl,Obj a,Obj b,Obj *c) |  | 
| Line 192  void notdef(VL vl,Obj a,Obj b,Obj *c) |  | 
| error("undefined arithmetic operation."); | error("undefined arithmetic operation."); | 
| } | } | 
|  |  | 
|  | int disable_debugger; | 
| int do_asirrc; | int do_asirrc; | 
| int do_file; | int do_file; | 
| char *do_filename; | char *do_filename; | 
| 
| Line 247  void asir_terminate(int status) |  | 
| Line 251  void asir_terminate(int status) |  | 
| mpi_finalize(); | mpi_finalize(); | 
| #else | #else | 
| #if defined(SIGPIPE) | #if defined(SIGPIPE) | 
| signal(SIGPIPE,SIG_IGN); | set_signal(SIGPIPE,SIG_IGN); | 
| #endif | #endif | 
| close_allconnections(); | close_allconnections(); | 
| #endif | #endif | 
| 
| Line 353  void process_args(int ac,char **av) |  | 
| Line 357  void process_args(int ac,char **av) |  | 
| #if !defined(MPI) | #if !defined(MPI) | 
| do_message = 1; | do_message = 1; | 
| #endif | #endif | 
|  | #if defined(VISUAL) && defined(VISUAL_CONSOLE) | 
|  | disable_debugger=1; | 
|  | #endif | 
| do_quiet = 0; | do_quiet = 0; | 
| while ( ac > 0 ) { | while ( ac > 0 ) { | 
| if ( !strcmp(*av,"-heap") && (ac >= 2) ) { | if ( !strcmp(*av,"-heap") && (ac >= 2) ) { | 
| 
| Line 373  void process_args(int ac,char **av) |  | 
| Line 380  void process_args(int ac,char **av) |  | 
| av += 2; ac -= 2; | av += 2; ac -= 2; | 
| } else if ( !strcmp(*av,"-cpp") && (ac >= 2) ) { | } else if ( !strcmp(*av,"-cpp") && (ac >= 2) ) { | 
| strcpy(cppname,*(av+1)); av += 2; ac -= 2; | strcpy(cppname,*(av+1)); av += 2; ac -= 2; | 
|  | } else if ( !strcmp(*av,"-d") && (ac >= 2) ) { | 
|  | #if defined(VISUAL) && defined(VISUAL_CONSOLE) | 
|  | disable_debugger=0; | 
|  | #endif | 
|  | av += 2; ac -= 2; | 
| } else if ( !strcmp(*av,"-f") && (ac >= 2) ) { | } else if ( !strcmp(*av,"-f") && (ac >= 2) ) { | 
| do_quiet = 1; | do_quiet = 1; | 
| in_fp = fopen(*(av+1),"r"); | in_fp = fopen(*(av+1),"r"); | 
| 
| Line 429  void process_args(int ac,char **av) |  | 
| Line 441  void process_args(int ac,char **av) |  | 
| #endif | #endif | 
| } | } | 
|  |  | 
| #include <signal.h> | #if defined(HAVE_SIGACTION) | 
|  | void (*set_signal(int sig, void (*handler)(int)))(int) | 
|  | { | 
|  | struct sigaction act; | 
|  | struct sigaction oldact; | 
|  | if (handler == SIG_IGN || handler == SIG_DFL) { | 
|  | return signal(sig,handler); | 
|  | } | 
|  | act.sa_handler=handler; | 
|  | act.sa_flags=0; | 
|  | act.sa_flags |= SA_RESTART; | 
|  | sigemptyset(&act.sa_mask); | 
|  | sigaction(sig,&act,&oldact); | 
|  | return oldact.sa_handler; | 
|  | } | 
|  | #endif | 
|  |  | 
| void sig_init() { | void sig_init() { | 
| #if !defined(VISUAL) && !defined(__MINGW32__) | #if !defined(VISUAL) && !defined(__MINGW32__) | 
| signal(SIGINT,int_handler); | set_signal(SIGINT,int_handler); | 
| #else | #else | 
| void register_ctrlc_handler(); | void register_ctrlc_handler(); | 
|  |  | 
| register_ctrlc_handler(); | register_ctrlc_handler(); | 
| #endif | #endif | 
| signal(SIGSEGV,segv_handler); | set_signal(SIGSEGV,segv_handler); | 
|  |  | 
| #if defined(SIGFPE) | #if defined(SIGFPE) | 
| signal(SIGFPE,fpe_handler); | set_signal(SIGFPE,fpe_handler); | 
| #endif | #endif | 
|  |  | 
| #if defined(SIGPIPE) | #if defined(SIGPIPE) | 
| signal(SIGPIPE,pipe_handler); | set_signal(SIGPIPE,pipe_handler); | 
| #endif | #endif | 
|  |  | 
| #if defined(SIGILL) | #if defined(SIGILL) | 
| signal(SIGILL,ill_handler); | set_signal(SIGILL,ill_handler); | 
| #endif | #endif | 
|  |  | 
| #if !defined(VISUAL) && !defined(__MINGW32__) | #if !defined(VISUAL) && !defined(__MINGW32__) | 
| signal(SIGBUS,bus_handler); | set_signal(SIGBUS,bus_handler); | 
| #endif | #endif | 
| } | } | 
|  |  | 
| static void (*old_int)(int); | static void (*old_int)(int); | 
|  |  | 
| void asir_save_handler() { | void asir_save_handler() { | 
| old_int = signal(SIGINT,SIG_IGN); | old_int = set_signal(SIGINT,SIG_IGN); | 
| signal(SIGINT,old_int); | set_signal(SIGINT,old_int); | 
| } | } | 
|  |  | 
| void asir_set_handler() { | void asir_set_handler() { | 
| signal(SIGINT,int_handler); | set_signal(SIGINT,int_handler); | 
| } | } | 
|  |  | 
| void asir_reset_handler() { | void asir_reset_handler() { | 
| signal(SIGINT,old_int); | set_signal(SIGINT,old_int); | 
| } | } | 
|  |  | 
| extern int I_am_server; | extern int I_am_server; | 
| 
| Line 517  void int_handler(int sig) |  | 
| Line 544  void int_handler(int sig) |  | 
| extern NODE PVSS; | extern NODE PVSS; | 
| NODE t; | NODE t; | 
|  |  | 
|  | if ( do_file || disable_debugger ) { | 
| if ( do_file ) { | LEAVE_SIGNAL_CS_ALL; | 
| ExitAsir(); | ExitAsir(); | 
| } | } | 
| if ( !ox_get_pari_result && critical_when_signal ) { | if ( !ox_get_pari_result && critical_when_signal ) { | 
| 
| Line 532  void int_handler(int sig) |  | 
| Line 559  void int_handler(int sig) |  | 
| #if defined(VISUAL) || defined(__MINGW32__) | #if defined(VISUAL) || defined(__MINGW32__) | 
| suspend_timer(); | suspend_timer(); | 
| #endif | #endif | 
| signal(SIGINT,SIG_IGN); | set_signal(SIGINT,SIG_IGN); | 
| #if !defined(VISUAL) && !defined(__MINGW32__) | #if !defined(VISUAL) && !defined(__MINGW32__) | 
| if ( do_server_in_X11 ) { | if ( do_server_in_X11 ) { | 
| debug(PVSS?((VS)BDY(PVSS))->usrf->f.usrf->body:0); | debug(PVSS?((VS)BDY(PVSS))->usrf->f.usrf->body:0); | 
| 
| Line 613  void int_handler(int sig) |  | 
| Line 640  void int_handler(int sig) |  | 
| } | } | 
| } | } | 
| } | } | 
|  | LEAVE_SIGNAL_CS_ALL; | 
| resetenv("return to toplevel"); | resetenv("return to toplevel"); | 
| break; | break; | 
| case 'd': | case 'd': | 
| 
| Line 645  void restore_handler() { |  | 
| Line 673  void restore_handler() { |  | 
| resume_timer(); | resume_timer(); | 
| #endif | #endif | 
| #if defined(SIGINT) | #if defined(SIGINT) | 
| signal(SIGINT,int_handler); | set_signal(SIGINT,int_handler); | 
| #endif | #endif | 
| } | } | 
|  |  | 
| void segv_handler(int sig) | void segv_handler(int sig) | 
| { | { | 
| #if defined(SIGSEGV) | #if defined(SIGSEGV) | 
| signal(SIGSEGV,segv_handler); | set_signal_for_restart(SIGSEGV,segv_handler); | 
| error("internal error (SEGV)"); | error("internal error (SEGV)"); | 
| #endif | #endif | 
| } | } | 
| 
| Line 660  void segv_handler(int sig) |  | 
| Line 688  void segv_handler(int sig) |  | 
| void ill_handler(int sig) | void ill_handler(int sig) | 
| { | { | 
| #if defined(SIGILL) | #if defined(SIGILL) | 
| signal(SIGILL,ill_handler); | set_signal_for_restart(SIGILL,ill_handler); | 
| error("illegal instruction (ILL)"); | error("illegal instruction (ILL)"); | 
| #endif | #endif | 
| } | } | 
| 
| Line 685  void alrm_handler(int sig) |  | 
| Line 713  void alrm_handler(int sig) |  | 
| void bus_handler(int sig) | void bus_handler(int sig) | 
| { | { | 
| #if defined(SIGBUS) | #if defined(SIGBUS) | 
| signal(SIGBUS,bus_handler); | set_signal_for_restart(SIGBUS,bus_handler); | 
| error("internal error (BUS ERROR)"); | error("internal error (BUS ERROR)"); | 
| #endif | #endif | 
| } | } | 
| 
| Line 693  void bus_handler(int sig) |  | 
| Line 721  void bus_handler(int sig) |  | 
| void fpe_handler(int sig) | void fpe_handler(int sig) | 
| { | { | 
| #if defined(SIGFPE) | #if defined(SIGFPE) | 
| signal(SIGFPE,fpe_handler); | set_signal_for_restart(SIGFPE,fpe_handler); | 
| error("internal error (FPE)"); | error("internal error (FPE)"); | 
| #endif | #endif | 
| } | } | 
| 
| Line 701  void fpe_handler(int sig) |  | 
| Line 729  void fpe_handler(int sig) |  | 
| void pipe_handler(int sig) | void pipe_handler(int sig) | 
| { | { | 
| #if defined(SIGPIPE) | #if defined(SIGPIPE) | 
| signal(SIGPIPE,pipe_handler); | set_signal_for_restart(SIGPIPE,pipe_handler); | 
| end_critical(); | end_critical(); | 
| error("internal error (BROKEN PIPE)"); | error("internal error (BROKEN PIPE)"); | 
| #endif | #endif | 
| 
| Line 802  void set_timer(int interval) |  | 
| Line 830  void set_timer(int interval) |  | 
| it.it_value.tv_sec = interval; | it.it_value.tv_sec = interval; | 
| it.it_value.tv_usec = 0; | it.it_value.tv_usec = 0; | 
| setitimer(ITIMER_TYPE,&it,0); | setitimer(ITIMER_TYPE,&it,0); | 
| signal(SIGNAL_FOR_TIMER,alrm_handler); | set_signal(SIGNAL_FOR_TIMER,alrm_handler); | 
| timer_is_set = 1; | timer_is_set = 1; | 
| } | } | 
|  |  | 
| 
| Line 815  void reset_timer() |  | 
| Line 843  void reset_timer() |  | 
| it.it_value.tv_sec = 0; | it.it_value.tv_sec = 0; | 
| it.it_value.tv_usec = 0; | it.it_value.tv_usec = 0; | 
| setitimer(ITIMER_TYPE,&it,0); | setitimer(ITIMER_TYPE,&it,0); | 
| signal(SIGNAL_FOR_TIMER,SIG_IGN); | set_signal(SIGNAL_FOR_TIMER,SIG_IGN); | 
| timer_is_set = 0; | timer_is_set = 0; | 
| } | } | 
| #endif | #endif | 
| 
| Line 868  char *scopyright() |  | 
| Line 896  char *scopyright() |  | 
| } | } | 
|  |  | 
| #if defined(VISUAL) || defined(__MINGW32__) | #if defined(VISUAL) || defined(__MINGW32__) | 
|  | int recv_intr; | 
|  |  | 
|  | static CRITICAL_SECTION signal_cs; | 
|  | static int initialized_signal_cs; | 
|  | static int signal_cs_count; | 
|  |  | 
|  | static void init_signal_cs() | 
|  | { | 
|  | if (!initialized_signal_cs) { | 
|  | InitializeCriticalSection(&signal_cs); | 
|  | initialized_signal_cs=1; | 
|  | signal_cs_count=0; | 
|  | } | 
|  | } | 
|  |  | 
|  | void try_enter_signal_cs() | 
|  | { | 
|  | init_signal_cs(); | 
|  | if(TryEnterCriticalSection(&signal_cs)) { | 
|  | signal_cs_count++; | 
|  | } | 
|  | } | 
|  |  | 
|  | void enter_signal_cs() | 
|  | { | 
|  | init_signal_cs(); | 
|  | EnterCriticalSection(&signal_cs); | 
|  | signal_cs_count++; | 
|  | } | 
|  |  | 
|  | void leave_signal_cs() | 
|  | { | 
|  | init_signal_cs(); | 
|  | if(signal_cs_count>0) { | 
|  | LeaveCriticalSection(&signal_cs); | 
|  | signal_cs_count--; | 
|  | } | 
|  | } | 
|  |  | 
|  | void leave_signal_cs_all() | 
|  | { | 
|  | if (!initialized_signal_cs) { | 
|  | init_signal_cs(); | 
|  | } | 
|  | while(signal_cs_count>0) { | 
|  | LeaveCriticalSection(&signal_cs); | 
|  | signal_cs_count--; | 
|  | } | 
|  | } | 
|  |  | 
| void check_intr() | void check_intr() | 
| { | { | 
| extern int recv_intr; | extern int recv_intr; | 
|  | enter_signal_cs(); | 
| if ( recv_intr ) { | if ( recv_intr ) { | 
| if ( recv_intr == 1 ) { | if ( recv_intr == 1 ) { | 
| recv_intr = 0; | recv_intr = 0; | 
| int_handler(0); | int_handler(SIGINT); | 
| } else { | } else { | 
| recv_intr = 0; | recv_intr = 0; | 
| ox_usr1_handler(0); | ox_usr1_handler(0); | 
| } | } | 
| } | } | 
|  | leave_signal_cs_all(); | 
| } | } | 
| #endif | #endif |