| version 1.5, 2000/08/21 08:31:50 | 
version 1.22, 2011/08/10 04:51:58 | 
 | 
 | 
|   * shall be made on your publication or presentation in any form of the | 
  * shall be made on your publication or presentation in any form of the | 
|   * results obtained by use of the SOFTWARE. | 
  * results obtained by use of the SOFTWARE. | 
|   * (4) In the event that you modify the SOFTWARE, you shall notify FLL by | 
  * (4) In the event that you modify the SOFTWARE, you shall notify FLL by | 
|   * e-mail at risa-admin@flab.fujitsu.co.jp of the detailed specification | 
  * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification | 
|   * for such modification or the source code of the modified part of the | 
  * for such modification or the source code of the modified part of the | 
|   * SOFTWARE. | 
  * SOFTWARE. | 
|   * | 
  * | 
 | 
 | 
|   * 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/plot/ox_plot.c,v 1.4 2000/06/07 08:46:41 noro Exp $ | 
  * $OpenXM: OpenXM_contrib2/asir2000/plot/ox_plot.c,v 1.21 2006/02/08 02:11:20 noro Exp $ | 
|  */ | 
 */ | 
|  #include "ca.h" | 
 #include "ca.h" | 
|  #include "parse.h" | 
 #include "parse.h" | 
 | 
 | 
|  #include "ifplot.h" | 
 #include "ifplot.h" | 
|  #include "version.h" | 
 #include "version.h" | 
|  #include <signal.h> | 
 #include <signal.h> | 
|  #if PARI | 
 #if defined(PARI) | 
|  #include "genpari.h" | 
 #include "genpari.h" | 
|  #endif | 
 #endif | 
|   | 
  | 
|  void ox_usr1_handler(); | 
 void ox_usr1_handler(); | 
|   | 
  | 
|   | 
 extern int asir_OperandStackSize; | 
|   | 
 extern Obj *asir_OperandStack; | 
|   | 
 extern int asir_OperandStackPtr; | 
|   | 
  | 
|   | 
 /* environement is defined in libpari.a */ | 
|   | 
 #if !(PARI_VERSION_CODE > 131588) | 
|  extern jmp_buf environnement; | 
 extern jmp_buf environnement; | 
|   | 
 #endif | 
|   | 
  | 
|  extern int do_message; | 
 extern int do_message; | 
|  extern int ox_flushing; | 
 extern int ox_flushing; | 
|  extern jmp_buf ox_env; | 
 extern JMP_BUF ox_env; | 
|  extern MATHCAP my_mathcap; | 
 extern MATHCAP my_mathcap; | 
|   | 
 extern char LastError[]; | 
|   | 
  | 
|  static int plot_OperandStackSize; | 
 void create_error(ERR *,unsigned int ,char *,LIST ); | 
|  static Obj *plot_OperandStack; | 
  | 
|  static int plot_OperandStackPtr = -1; | 
  | 
|   | 
  | 
|  static void create_error(ERR *,unsigned int ,char *); | 
 void ox_io_init(); | 
|   | 
 void ox_asir_init(int,char **,char *); | 
|   | 
 Obj asir_pop_one(); | 
|   | 
 void asir_push_one(Obj); | 
|   | 
 void asir_end_flush(); | 
|   | 
 int asir_executeString(); | 
|   | 
 void asir_evalName(unsigned int); | 
|   | 
 void asir_setName(unsigned int); | 
|   | 
 void asir_pops(); | 
|   | 
 void asir_popString(); | 
|   | 
 void asir_popCMO(unsigned int); | 
|   | 
 void asir_popSerializedLocalObject(); | 
|   | 
 char *name_of_cmd(unsigned int); | 
|   | 
 char *name_of_id(int); | 
|   | 
 LIST asir_GetErrorList(); | 
|   | 
  | 
|   | 
 static void asir_do_cmd(unsigned int,unsigned int); | 
|  static void process_ox(); | 
 static void process_ox(); | 
|  static void ox_io_init(); | 
  | 
|  static void ox_asir_init(int,char **); | 
  | 
|  static Obj asir_pop_one(); | 
  | 
|  static void asir_push_one(Obj); | 
  | 
|  static void asir_end_flush(); | 
  | 
|  static void asir_executeFunction(); | 
 static void asir_executeFunction(); | 
|  static int asir_executeString(); | 
  | 
|  static void asir_evalName(unsigned int); | 
  | 
|  static void asir_setName(unsigned int); | 
  | 
|  static void asir_pops(); | 
  | 
|  static void asir_popString(); | 
  | 
|  static void asir_popCMO(unsigned int); | 
  | 
|  static void asir_popSerializedLocalObject(); | 
  | 
|  static char *name_of_cmd(unsigned int); | 
  | 
|  static char *name_of_id(int); | 
  | 
|  static void asir_do_cmd(unsigned int,unsigned int); | 
  | 
|  static LIST asir_GetErrorList(); | 
  | 
|   | 
  | 
|  static void create_error(ERR *err,unsigned int serial,char *msg) | 
 #if defined(VISUAL) | 
|   | 
 void ox_plot_main() | 
|   | 
 #else | 
|   | 
 void ox_plot_main(int argc,char **argv) | 
|   | 
 #endif | 
|  { | 
 { | 
|          USINT ui; | 
  | 
|          NODE n,n1; | 
  | 
|          LIST list; | 
  | 
|          STRING errmsg; | 
  | 
|   | 
  | 
|          MKUSINT(ui,serial); | 
  | 
|          MKSTR(errmsg,msg); | 
  | 
|          MKNODE(n1,errmsg,0); MKNODE(n,ui,n1); MKLIST(list,n); | 
  | 
|          MKERR(*err,list); | 
  | 
|  } | 
  | 
|   | 
  | 
|  void ox_plot_main(int argc,char **argv) { | 
  | 
|          int ds; | 
         int ds; | 
|          fd_set r; | 
         fd_set r; | 
|          int n; | 
         int n; | 
|   | 
         int use_x; | 
|   | 
  | 
|          ox_asir_init(argc,argv); | 
 #if !defined(VISUAL) | 
|          init_plot_display(argc,argv); | 
         ox_asir_init(argc,argv,"ox_plot"); | 
|          ds = ConnectionNumber(display); | 
         use_x = init_plot_display(argc,argv); | 
|   | 
         if ( use_x ) | 
|   | 
                 ds = ConnectionNumber(display); | 
|   | 
         else | 
|   | 
                 fprintf(stderr,"Entering no X mode\n"); | 
|   | 
 #endif | 
|          if ( do_message ) | 
         if ( do_message ) | 
|                  fprintf(stderr,"I'm an ox_plot, Version %d.\n",ASIR_VERSION); | 
                 fprintf(stderr,"I'm an ox_plot, Version %d.\n",ASIR_VERSION); | 
|   | 
  | 
|          if ( setjmp(ox_env) ) { | 
         if ( SETJMP(ox_env) ) { | 
|                  while ( NEXT(asir_infile) ) | 
                 while ( NEXT(asir_infile) ) | 
|                          closecurrentinput(); | 
                         closecurrentinput(); | 
|                  reset_current_computation(); | 
                 reset_current_computation(); | 
|                  ox_send_sync(0); | 
                 ox_send_sync(0); | 
|          } | 
         } | 
|          while ( 1 ) { | 
         while ( 1 ) { | 
|   | 
 #if defined(VISUAL) | 
|   | 
                 process_ox(); | 
|   | 
 #else | 
|                  if ( ox_data_is_available(0) ) | 
                 if ( ox_data_is_available(0) ) | 
|                          process_ox(); | 
                         process_ox(); | 
|                  else { | 
                 else if ( use_x ) { | 
|                          FD_ZERO(&r); | 
                         FD_ZERO(&r); | 
|                          FD_SET(3,&r); FD_SET(ds,&r); | 
                         FD_SET(3,&r); FD_SET(ds,&r); | 
|                          select(FD_SETSIZE,&r,NULL,NULL,NULL); | 
                         select(FD_SETSIZE,&r,NULL,NULL,NULL); | 
| Line 133  void ox_plot_main(int argc,char **argv) { | 
 
  | 
| Line 140  void ox_plot_main(int argc,char **argv) { | 
 
 
 | 
|                                  process_xevent(); | 
                                 process_xevent(); | 
|                  } | 
                 } | 
|          } | 
         } | 
|   | 
 #endif | 
|  } | 
 } | 
|   | 
  | 
|  static void process_ox() | 
 static void process_ox() | 
| Line 143  static void process_ox() | 
 
  | 
| Line 151  static void process_ox() | 
 
 
 | 
|          ERR err; | 
         ERR err; | 
|          unsigned int serial; | 
         unsigned int serial; | 
|          int ret; | 
         int ret; | 
|          extern char LastError[]; | 
  | 
|   | 
  | 
|          serial = ox_recv(0,&id,&obj); | 
         serial = ox_recv(0,&id,&obj); | 
|          if ( do_message ) | 
         if ( do_message ) | 
| Line 155  static void process_ox() | 
 
  | 
| Line 162  static void process_ox() | 
 
 
 | 
|                                  break; | 
                                 break; | 
|                          if ( do_message ) | 
                         if ( do_message ) | 
|                                  fprintf(stderr," %s\n",name_of_cmd(cmd)); | 
                                 fprintf(stderr," %s\n",name_of_cmd(cmd)); | 
|                          if ( ret = setjmp(env) ) { | 
                         if ( ret = SETJMP(main_env) ) { | 
|                                  if ( ret == 1 ) { | 
                                 if ( ret == 1 ) { | 
|                                          create_error(&err,serial,LastError); | 
                                         create_error(&err,serial,LastError,0); | 
|                                          asir_push_one((Obj)err); | 
                                         asir_push_one((Obj)err); | 
|                                  } | 
                                 } | 
|                                  break; | 
                                 break; | 
| Line 195  static void asir_do_cmd(unsigned int cmd,unsigned int  | 
 
  | 
| Line 202  static void asir_do_cmd(unsigned int cmd,unsigned int  | 
 
 
 | 
|                          asir_push_one((Obj)list); | 
                         asir_push_one((Obj)list); | 
|                          break; | 
                         break; | 
|                  case SM_getsp: | 
                 case SM_getsp: | 
|                          i = plot_OperandStackPtr+1; | 
                         i = asir_OperandStackPtr+1; | 
|                          STOQ(i,q); | 
                         STOQ(i,q); | 
|                          asir_push_one((Obj)q); | 
                         asir_push_one((Obj)q); | 
|                          break; | 
                         break; | 
| Line 218  static void asir_do_cmd(unsigned int cmd,unsigned int  | 
 
  | 
| Line 225  static void asir_do_cmd(unsigned int cmd,unsigned int  | 
 
 
 | 
|                          asir_executeString(); | 
                         asir_executeString(); | 
|                          break; | 
                         break; | 
|                  case SM_executeFunction: | 
                 case SM_executeFunction: | 
|                          asir_executeFunction(); | 
                         asir_executeFunction(serial); | 
|                          break; | 
                         break; | 
|                  case SM_shutdown: | 
                 case SM_shutdown: | 
|                          asir_terminate(2); | 
                         asir_terminate(2); | 
| Line 233  static void asir_do_cmd(unsigned int cmd,unsigned int  | 
 
  | 
| Line 240  static void asir_do_cmd(unsigned int cmd,unsigned int  | 
 
 
 | 
|                          client_mathcap = (MATHCAP)asir_pop_one(); | 
                         client_mathcap = (MATHCAP)asir_pop_one(); | 
|                          store_remote_mathcap(0,client_mathcap); | 
                         store_remote_mathcap(0,client_mathcap); | 
|                          break; | 
                         break; | 
|   | 
                 case SM_nop: | 
|                  default: | 
                 default: | 
|                          break; | 
                         break; | 
|          } | 
         } | 
|  } | 
 } | 
|   | 
  | 
|  static char *name_of_id(int id) | 
 static void asir_executeFunction(int serial) | 
|  { | 
  | 
|          switch ( id ) { | 
  | 
|                  case OX_COMMAND: | 
  | 
|                          return "OX_COMMAND"; | 
  | 
|                          break; | 
  | 
|                  case OX_DATA: | 
  | 
|                          return "OX_DATA"; | 
  | 
|                          break; | 
  | 
|                  case OX_LOCAL_OBJECT_ASIR: | 
  | 
|                          return "OX_LOCAL_OBJECT_ASIR"; | 
  | 
|                          break; | 
  | 
|                  case OX_SYNC_BALL: | 
  | 
|                          return "OX_SYNC_BALL"; | 
  | 
|                          break; | 
  | 
|                  default: | 
  | 
|                          return "Unknown id"; | 
  | 
|                          break; | 
  | 
|          } | 
  | 
|  } | 
  | 
|   | 
  | 
|  static char *name_of_cmd(unsigned cmd) | 
  | 
|  { | 
  | 
|          switch ( cmd ) { | 
  | 
|                  case SM_popSerializedLocalObject: | 
  | 
|                          return "SM_popSerializedLocalObject"; | 
  | 
|                          break; | 
  | 
|                  case SM_popCMO: | 
  | 
|                          return "SM_popCMO"; | 
  | 
|                          break; | 
  | 
|                  case SM_popString: | 
  | 
|                          return "SM_popString"; | 
  | 
|                          break; | 
  | 
|                  case SM_pops: | 
  | 
|                          return "SM_pops"; | 
  | 
|                          break; | 
  | 
|                  case SM_setName: | 
  | 
|                          return "SM_setName"; | 
  | 
|                          break; | 
  | 
|                  case SM_evalName: | 
  | 
|                          return "SM_evalName"; | 
  | 
|                          break; | 
  | 
|                  case SM_executeStringByLocalParser: | 
  | 
|                          return "SM_executeString"; | 
  | 
|                          break; | 
  | 
|                  case SM_executeFunction: | 
  | 
|                          return "SM_executeFunction"; | 
  | 
|                          break; | 
  | 
|                  case SM_shutdown: | 
  | 
|                          return "SM_shutdown"; | 
  | 
|                          break; | 
  | 
|                  case SM_beginBlock: | 
  | 
|                          return "SM_beginBlock"; | 
  | 
|                          break; | 
  | 
|                  case SM_endBlock: | 
  | 
|                          return "SM_endBlock"; | 
  | 
|                          break; | 
  | 
|                  case SM_mathcap: | 
  | 
|                          return "SM_mathcap"; | 
  | 
|                          break; | 
  | 
|                  case SM_setMathcap: | 
  | 
|                          return "SM_setMathcap"; | 
  | 
|                          break; | 
  | 
|                  default: | 
  | 
|                          return "Unknown cmd"; | 
  | 
|                          break; | 
  | 
|          } | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void asir_popSerializedLocalObject() | 
  | 
|  { | 
  | 
|          Obj obj; | 
  | 
|          VL t,vl; | 
  | 
|   | 
  | 
|          obj = asir_pop_one(); | 
  | 
|          get_vars(obj,&vl); | 
  | 
|          for ( t = vl; t; t = NEXT(t) ) | 
  | 
|                  if ( t->v->attr == (pointer)V_UC || t->v->attr == (pointer)V_PF ) | 
  | 
|                          error("bsave : not implemented"); | 
  | 
|          ox_send_cmd(0,SM_beginBlock); | 
  | 
|          ox_send_local_ring(0,vl); | 
  | 
|          ox_send_local_data(0,obj); | 
  | 
|          ox_send_cmd(0,SM_endBlock); | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void asir_popCMO(unsigned int serial) | 
  | 
|  { | 
  | 
|          Obj obj; | 
  | 
|          ERR err; | 
  | 
|   | 
  | 
|          obj = asir_pop_one(); | 
  | 
|          if ( valid_as_cmo(obj) ) | 
  | 
|                  ox_send_data(0,obj); | 
  | 
|          else { | 
  | 
|                  create_error(&err,serial,"cannot convert to CMO object"); | 
  | 
|                  ox_send_data(0,err); | 
  | 
|                  asir_push_one(obj); | 
  | 
|          } | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void asir_popString() | 
  | 
|  { | 
  | 
|          Obj val; | 
  | 
|          char *buf,*obuf; | 
  | 
|          int l; | 
  | 
|          STRING str; | 
  | 
|   | 
  | 
|          val = asir_pop_one(); | 
  | 
|          if ( !val ) | 
  | 
|                  obuf = 0; | 
  | 
|          else { | 
  | 
|                  l = estimate_length(CO,val); | 
  | 
|                  buf = (char *)ALLOCA(l+1); | 
  | 
|                  soutput_init(buf); | 
  | 
|                  sprintexpr(CO,val); | 
  | 
|                  l = strlen(buf); | 
  | 
|                  obuf = (char *)MALLOC(l+1); | 
  | 
|                  strcpy(obuf,buf); | 
  | 
|          } | 
  | 
|          MKSTR(str,obuf); | 
  | 
|          ox_send_data(0,str); | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void asir_pops() | 
  | 
|  { | 
  | 
|          int n; | 
  | 
|   | 
  | 
|          n = (int)(((USINT)asir_pop_one())->body); | 
  | 
|          plot_OperandStackPtr = MAX(plot_OperandStackPtr-n,-1); | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void asir_setName(unsigned int serial) | 
  | 
|  { | 
  | 
|          char *name; | 
  | 
|          int l,n; | 
  | 
|          char *dummy = "=0;"; | 
  | 
|          SNODE snode; | 
  | 
|          ERR err; | 
  | 
|   | 
  | 
|          name = ((STRING)asir_pop_one())->body; | 
  | 
|          l = strlen(name); | 
  | 
|          n = l+strlen(dummy)+1; | 
  | 
|          parse_strp = (char *)ALLOCA(n); | 
  | 
|          sprintf(parse_strp,"%s%s",name,dummy); | 
  | 
|          if ( mainparse(&snode) ) { | 
  | 
|                  create_error(&err,serial,"cannot set to variable"); | 
  | 
|                  asir_push_one((Obj)err); | 
  | 
|          } else { | 
  | 
|                  FA1((FNODE)FA0(snode)) = (pointer)mkfnode(1,I_FORMULA,asir_pop_one()); | 
  | 
|                  evalstat(snode); | 
  | 
|          } | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void asir_evalName(unsigned int serial) | 
  | 
|  { | 
  | 
|          char *name; | 
  | 
|          int l,n; | 
  | 
|          SNODE snode; | 
  | 
|          ERR err; | 
  | 
|          pointer val; | 
  | 
|   | 
  | 
|          name = ((STRING)asir_pop_one())->body; | 
  | 
|          l = strlen(name); | 
  | 
|          n = l+2; | 
  | 
|          parse_strp = (char *)ALLOCA(n); | 
  | 
|          sprintf(parse_strp,"%s;",name); | 
  | 
|          if ( mainparse(&snode) ) { | 
  | 
|                  create_error(&err,serial,"no such variable"); | 
  | 
|                  val = (pointer)err; | 
  | 
|          } else | 
  | 
|                  val = evalstat(snode); | 
  | 
|          asir_push_one(val); | 
  | 
|  } | 
  | 
|   | 
  | 
|  static int asir_executeString() | 
  | 
|  { | 
  | 
|          SNODE snode; | 
  | 
|          pointer val; | 
  | 
|          char *cmd; | 
  | 
|  #if PARI | 
  | 
|          recover(0); | 
  | 
|          if ( setjmp(environnement) ) { | 
  | 
|                  avma = top; recover(1); | 
  | 
|                  resetenv(""); | 
  | 
|          } | 
  | 
|  #endif | 
  | 
|          cmd = ((STRING)asir_pop_one())->body; | 
  | 
|          parse_strp = cmd; | 
  | 
|          if ( mainparse(&snode) ) { | 
  | 
|                  return -1; | 
  | 
|          } | 
  | 
|          val = evalstat(snode); | 
  | 
|          if ( NEXT(asir_infile) ) { | 
  | 
|                  while ( NEXT(asir_infile) ) { | 
  | 
|                          if ( mainparse(&snode) ) { | 
  | 
|                                  asir_push_one(val); | 
  | 
|                                  return -1; | 
  | 
|                          } | 
  | 
|                          nextbp = 0; | 
  | 
|                          val = evalstat(snode); | 
  | 
|                  } | 
  | 
|          } | 
  | 
|          asir_push_one(val); | 
  | 
|          return 0; | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void asir_executeFunction() | 
  | 
|  { | 
 { | 
|          char *func; | 
         char *func; | 
|          int argc; | 
         int argc; | 
| Line 452  static void asir_executeFunction() | 
 
  | 
| Line 254  static void asir_executeFunction() | 
 
 
 | 
|          FUNC f; | 
         FUNC f; | 
|          Q ret; | 
         Q ret; | 
|          VL vl; | 
         VL vl; | 
|   | 
         ERR err; | 
|          NODE n,n1; | 
         NODE n,n1; | 
|   | 
         LIST bytes; | 
|   | 
  | 
|          func = ((STRING)asir_pop_one())->body; | 
         func = ((STRING)asir_pop_one())->body; | 
|          argc = (int)(((USINT)asir_pop_one())->body); | 
         argc = (int)(((USINT)asir_pop_one())->body); | 
| Line 464  static void asir_executeFunction() | 
 
  | 
| Line 268  static void asir_executeFunction() | 
 
 
 | 
|          if ( n ) | 
         if ( n ) | 
|                  NEXT(n1) = 0; | 
                 NEXT(n1) = 0; | 
|          id = -1; | 
         id = -1; | 
|          if ( !strcmp(func,"plot") ) | 
         if ( !strcmp(func,"plot") ) { | 
|                  id = plot(n); | 
                 id = plot(n); | 
|          else if ( !strcmp(func,"arrayplot") ) | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|                  id = arrayplot(n); | 
         } else if ( !strcmp(func,"memory_plot") ) { | 
|          else if ( !strcmp(func,"plotover") ) | 
                 memory_plot(n,&bytes); asir_push_one((Obj)bytes); | 
|                  id = plotover(n); | 
 #if defined(INTERVAL) | 
|          else if ( !strcmp(func,"drawcircle") ) | 
         } else if ( !strcmp(func,"itvifplot") ) { | 
|                  id = drawcircle(n); | 
                 id = itvifplot(n); | 
|          STOQ(id,ret); | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|  #if 0 | 
         } else if ( !strcmp(func,"itvplot1") ) { | 
|          asir_push_one((Obj)ret); | 
                 id = itvplot1(n); | 
|   | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|   | 
         } else if ( !strcmp(func,"itvplot2") ) { | 
|   | 
                 id = itvplot2(n); | 
|   | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|   | 
         } else if ( !strcmp(func,"itvplot3") ) { | 
|   | 
                 id = itvplot3(n); | 
|   | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|   | 
         } else if ( !strcmp(func,"itvplot4") ) { | 
|   | 
                 id = itvplot4(n); | 
|   | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|   | 
         } else if ( !strcmp(func,"ineqnover") ) { | 
|   | 
                 id = ineqnover(n); | 
|   | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|   | 
         } else if ( !strcmp(func,"ineqn") ) { | 
|   | 
                 id = ineqn(n); | 
|   | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|   | 
         } else if ( !strcmp(func,"objcp") ) { | 
|   | 
                 id = objcp(n); | 
|   | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|  #endif | 
 #endif | 
|  } | 
         } else if ( !strcmp(func,"arrayplot") ) { | 
|   | 
                 id = arrayplot(n); | 
|  static void asir_end_flush() | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|  { | 
         } else if ( !strcmp(func,"open_canvas") ) { | 
|          ox_flushing = 0; | 
                 id = open_canvas(n); | 
|  } | 
                 STOQ(id,ret); asir_push_one((Obj)ret); | 
|   | 
         } else if ( !strcmp(func,"plotover") ) { | 
|  static void asir_push_one(Obj obj) | 
                 plotover(n); | 
|  { | 
         } else if ( !strcmp(func,"drawcircle") ) { | 
|          if ( !obj || OID(obj) != O_VOID ) { | 
                 drawcircle(n); | 
|                  plot_OperandStackPtr++; | 
         } else if ( !strcmp(func,"draw_obj") ) { | 
|                  if ( plot_OperandStackPtr >= plot_OperandStackSize ) { | 
                 if ( draw_obj(n) < 0 ) { | 
|                          plot_OperandStackSize += BUFSIZ; | 
                         create_error(&err,serial,LastError,0); | 
|                          plot_OperandStack | 
                         asir_push_one((Obj)err); | 
|                                  = (Obj *)REALLOC(plot_OperandStack, | 
                 } | 
|                                          plot_OperandStackSize*sizeof(Obj)); | 
         } else if ( !strcmp(func,"draw_string") ) { | 
|   | 
                 if ( draw_string(n) < 0 ) { | 
|   | 
                         create_error(&err,serial,LastError,0); | 
|   | 
                         asir_push_one((Obj)err); | 
|                  } | 
                 } | 
|                  plot_OperandStack[plot_OperandStackPtr] = obj; | 
         } else if ( !strcmp(func,"clear_canvas") ) { | 
|   | 
                 clear_canvas(n); | 
|          } | 
         } | 
|  } | 
  | 
|   | 
  | 
|  static LIST asir_GetErrorList() | 
  | 
|  { | 
  | 
|          int i; | 
  | 
|          NODE n,n0; | 
  | 
|          LIST err; | 
  | 
|          Obj obj; | 
  | 
|   | 
  | 
|          for ( i = 0, n0 = 0; i <= plot_OperandStackPtr; i++ ) | 
  | 
|                  if ( (obj = plot_OperandStack[i]) && (OID(obj) == O_ERR) ) { | 
  | 
|                          NEXTNODE(n0,n); BDY(n) = (pointer)obj; | 
  | 
|                  } | 
  | 
|          if ( n0 ) | 
  | 
|                  NEXT(n) = 0; | 
  | 
|          MKLIST(err,n0); | 
  | 
|          return err; | 
  | 
|  } | 
  | 
|   | 
  | 
|  static Obj asir_pop_one() { | 
  | 
|          if ( plot_OperandStackPtr < 0 ) { | 
  | 
|                  if ( do_message ) | 
  | 
|                          fprintf(stderr,"OperandStack underflow"); | 
  | 
|                  return 0; | 
  | 
|          } else { | 
  | 
|                  if ( do_message ) | 
  | 
|                          fprintf(stderr,"pop at %d\n",plot_OperandStackPtr); | 
  | 
|                  return plot_OperandStack[plot_OperandStackPtr--]; | 
  | 
|          } | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void ox_asir_init(int argc,char **argv) | 
  | 
|  { | 
  | 
|          int tmp; | 
  | 
|          char ifname[BUFSIZ]; | 
  | 
|          extern int GC_dont_gc; | 
  | 
|          extern int read_exec_file; | 
  | 
|          extern int do_asirrc; | 
  | 
|          extern int do_server_in_X11; | 
  | 
|          char *getenv(); | 
  | 
|          static ox_asir_initialized = 0; | 
  | 
|          FILE *ifp; | 
  | 
|   | 
  | 
|          do_server_in_X11 = 1; /* XXX */ | 
  | 
|          asir_save_handler(); | 
  | 
|  #if PARI | 
  | 
|          risa_pari_init(); | 
  | 
|  #endif | 
  | 
|          srandom((int)get_current_time()); | 
  | 
|   | 
  | 
|  #if defined(THINK_C) | 
  | 
|          param_init(); | 
  | 
|  #endif | 
  | 
|          StackBottom = &tmp + 1; /* XXX */ | 
  | 
|          rtime_init(); | 
  | 
|          env_init(); | 
  | 
|          endian_init(); | 
  | 
|  #if !defined(VISUAL) && !defined(THINK_C) | 
  | 
|  /*      check_key(); */ | 
  | 
|  #endif | 
  | 
|          GC_init(); | 
  | 
|          process_args(--argc,++argv); | 
  | 
|  #if 0 | 
  | 
|          copyright(); | 
  | 
|  #endif | 
  | 
|          output_init(); | 
  | 
|          arf_init(); | 
  | 
|          nglob_init(); | 
  | 
|          glob_init(); | 
  | 
|          sig_init(); | 
  | 
|          tty_init(); | 
  | 
|          debug_init(); | 
  | 
|          pf_init(); | 
  | 
|          sysf_init(); | 
  | 
|          parif_init(); | 
  | 
|  #if defined(VISUAL) | 
  | 
|          init_socket(); | 
  | 
|  #endif | 
  | 
|  #if defined(UINIT) | 
  | 
|          reg_sysf(); | 
  | 
|  #endif | 
  | 
|  #if defined(THINK_C) | 
  | 
|          sprintf(ifname,"asirrc"); | 
  | 
|  #else | 
  | 
|          sprintf(ifname,"%s/.asirrc",getenv("HOME")); | 
  | 
|  #endif | 
  | 
|          if ( do_asirrc && (ifp = fopen(ifname,"r")) ) { | 
  | 
|                  input_init(ifp,ifname); | 
  | 
|                  if ( !setjmp(env) ) { | 
  | 
|                          read_exec_file = 1; | 
  | 
|                          read_eval_loop(); | 
  | 
|                          read_exec_file = 0; | 
  | 
|                  } | 
  | 
|                  fclose(ifp); | 
  | 
|          } | 
  | 
|          input_init(0,"string"); | 
  | 
|          ox_io_init(); | 
  | 
|          create_my_mathcap("ox_plot"); | 
  | 
|  } | 
  | 
|   | 
  | 
|  static void ox_io_init() { | 
  | 
|          unsigned char c,rc; | 
  | 
|          extern int little_endian; | 
  | 
|   | 
  | 
|          endian_init(); | 
  | 
|          iofp[0].in = fdopen(3,"r"); | 
  | 
|          iofp[0].out = fdopen(4,"w"); | 
  | 
|          setbuffer(iofp[0].in,(char *)malloc(LBUFSIZ),LBUFSIZ); | 
  | 
|          setbuffer(iofp[0].out,(char *)malloc(LBUFSIZ),LBUFSIZ); | 
  | 
|          plot_OperandStackSize = BUFSIZ; | 
  | 
|          plot_OperandStack = (Obj *)CALLOC(plot_OperandStackSize,sizeof(Obj)); | 
  | 
|          plot_OperandStackPtr = -1; | 
  | 
|          signal(SIGUSR1,ox_usr1_handler); | 
  | 
|          if ( little_endian ) | 
  | 
|                  c = 1; | 
  | 
|          else | 
  | 
|                  c = 0xff; | 
  | 
|          write_char(iofp[0].out,&c); ox_flush_stream(0); | 
  | 
|          read_char(iofp[0].in,&rc); | 
  | 
|          iofp[0].conv = c == rc ? 0 : 1; | 
  | 
|  } | 
 } |