[BACK]Return to serv2.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_math

Diff for /OpenXM/src/ox_math/Attic/serv2.c between version 1.6 and 1.7

version 1.6, 1999/11/06 21:39:37 version 1.7, 1999/11/07 12:12:56
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.5 1999/11/04 19:33:17 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.6 1999/11/06 21:39:37 ohara Exp $ */
   
 /* Open Mathematica サーバ */  /* Open Mathematica サーバ */
 /* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */  /* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */
Line 15 
Line 15 
 #include "parse.h"  #include "parse.h"
 #include "serv2.h"  #include "serv2.h"
   
 #define UNKNOWN_SM_COMMAND 50000  #define ERROR_ID_UNKNOWN_SM 10
 #define MATH_ERROR         50001  #define ERROR_ID_FAILURE_MLINK         11
   
 /* MLINK はポインタ型. */  /* MLINK はポインタ型. */
 MLINK lp = NULL;  MLINK lp = NULL;
Line 27  typedef cmo_zz mlo_zz;
Line 27  typedef cmo_zz mlo_zz;
   
 /* cmo_list の派生クラス*/  /* cmo_list の派生クラス*/
 typedef struct {  typedef struct {
         int tag;      int tag;
         int length;      int length;
         cell head[1];      cell head[1];
         char *function;      char *function;
 } mlo_function;  } mlo_function;
   
   
 mlo *receive_mlo_zz()  mlo *receive_mlo_zz()
 {  {
         char *s;      char *s;
         mlo  *m;      mlo  *m;
   
         fprintf(stderr, "--debug: MLO == MLTKINT.\n");      fprintf(stderr, "--debug: MLO == MLTKINT.\n");
         MLGetString(lp, &s);      MLGetString(lp, &s);
         fprintf(stderr, "--debug: zz = %s.\n", s);      fprintf(stderr, "--debug: zz = %s.\n", s);
         m = (mlo *)new_cmo_zz_set_string(s);      m = (mlo *)new_cmo_zz_set_string(s);
         MLDisownString(lp, s);      MLDisownString(lp, s);
         return m;      return m;
 }  }
   
 mlo *receive_mlo_string()  mlo *receive_mlo_string()
 {  {
         char *s;      char *s;
         mlo  *m;      mlo  *m;
         fprintf(stderr, "--debug: MLO == MLTKSTR.\n");      fprintf(stderr, "--debug: MLO == MLTKSTR.\n");
         MLGetString(lp, &s);      MLGetString(lp, &s);
         fprintf(stderr, "--debug: string = \"%s\".\n", s);      fprintf(stderr, "--debug: string = \"%s\".\n", s);
         m = (cmo *)new_cmo_string(s);      m = (cmo *)new_cmo_string(s);
         MLDisownString(lp, s);      MLDisownString(lp, s);
         return m;      return m;
 }  }
   
 cmo *receive_mlo_function()  cmo *receive_mlo_function()
 {  {
         char *s;      char *s;
         cmo *m;      cmo *m;
     cmo  *ob;      cmo  *ob;
     int  i,n;      int  i,n;
   
         fprintf(stderr, "--debug: MLO == MLTKFUNC.\n");      fprintf(stderr, "--debug: MLO == MLTKFUNC.\n");
         MLGetFunction(lp, &s, &n);      MLGetFunction(lp, &s, &n);
         fprintf(stderr, "--debug: Function = \"%s\", # of args = %d\n", s, n);      fprintf(stderr, "--debug: Function = \"%s\", # of args = %d\n", s, n);
         m = new_cmo_list();      m = new_cmo_list();
         append_cmo_list((cmo_list *)m, new_cmo_string(s));      append_cmo_list((cmo_list *)m, new_cmo_string(s));
   
         for (i=0; i<n; i++) {      for (i=0; i<n; i++) {
                 fprintf(stderr, "--debug: arg[%d]\n", i);          fprintf(stderr, "--debug: arg[%d]\n", i);
                 fflush(stderr);          fflush(stderr);
                 ob = receive_mlo();          ob = receive_mlo();
                 append_cmo_list((cmo_list *)m, ob);          append_cmo_list((cmo_list *)m, ob);
         }      }
   
         MLDisownString(lp, s);      MLDisownString(lp, s);
         return m;      return m;
 }  }
   
 cmo *receive_mlo_symbol()  cmo *receive_mlo_symbol()
 {  {
         cmo *ob;      cmo *ob;
         char *s;      char *s;
   
         fprintf(stderr, "--debug: MLO == MLTKSYM.\n");      fprintf(stderr, "--debug: MLO == MLTKSYM.\n");
         MLGetSymbol(lp, &s);      MLGetSymbol(lp, &s);
         fprintf(stderr, "--debug: Symbol \"%s\".\n", s);      fprintf(stderr, "--debug: Symbol \"%s\".\n", s);
   
         ob = new_cmo_indeterminate(new_cmo_string(s));      ob = new_cmo_indeterminate(new_cmo_string(s));
   
         MLDisownString(lp, s);      MLDisownString(lp, s);
         return ob;      return ob;
 }  }
   
 /* Mathematica を起動する. */  /* Mathematica を起動する. */
Line 105  int MATH_init()
Line 105  int MATH_init()
     char *argv[] = {"-linkname", "math -mathlink"};      char *argv[] = {"-linkname", "math -mathlink"};
   
     if(MLInitialize(NULL) == NULL      if(MLInitialize(NULL) == NULL
            || (lp = MLOpen(argc, argv)) == NULL) {         || (lp = MLOpen(argc, argv)) == NULL) {
                 fprintf(stderr, "Mathematica Kernel not found.\n");          fprintf(stderr, "Mathematica Kernel not found.\n");
                 exit(1);          exit(1);
     }      }
         return 0;      return 0;
 }  }
   
 int MATH_exit()  int MATH_exit()
Line 119  int MATH_exit()
Line 119  int MATH_exit()
     MLClose(lp);      MLClose(lp);
 }  }
   
 cmo *MATH_getObject2()  cmo *MATH_get_object()
 {  {
     /* skip any packets before the first ReturnPacket */      /* skip any packets before the first ReturnPacket */
     while (MLNextPacket(lp) != RETURNPKT) {      while (MLNextPacket(lp) != RETURNPKT) {
         usleep(10);          usleep(10);
         MLNewPacket(lp);          MLNewPacket(lp);
     }      }
         return receive_mlo();      return receive_mlo();
 }  }
   
 cmo *receive_mlo()  cmo *receive_mlo()
 {  {
     char *s;      char *s;
         int type;      int type;
   
     switch(type = MLGetNext(lp)) {      switch(type = MLGetNext(lp)) {
     case MLTKINT:      case MLTKINT:
                 return receive_mlo_zz();          return receive_mlo_zz();
     case MLTKSTR:      case MLTKSTR:
                 return receive_mlo_string();          return receive_mlo_string();
     case MLTKREAL:      case MLTKREAL:
                 /* double はまだ... */          /* double はまだ... */
         fprintf(stderr, "--debug: MLO == MLTKREAL.\n");          fprintf(stderr, "--debug: MLO == MLTKREAL.\n");
         MLGetString(lp, &s);          MLGetString(lp, &s);
         return (cmo *)new_cmo_string(s);          return (cmo *)new_cmo_string(s);
     case MLTKSYM:      case MLTKSYM:
         return receive_mlo_symbol();          return receive_mlo_symbol();
     case MLTKFUNC:      case MLTKFUNC:
                 return receive_mlo_function();          return receive_mlo_function();
     case MLTKERR:      case MLTKERR:
         fprintf(stderr, "--debug: MLO == MLTKERR.\n");          fprintf(stderr, "--debug: MLO == MLTKERR.\n");
         return (cmo *)gen_error_object(MATH_ERROR);          return (cmo *)make_error_object(ERROR_ID_FAILURE_MLINK, new_cmo_null());
     default:      default:
         fprintf(stderr, "--debug: MLO(%d) is unknown.\n", type);          fprintf(stderr, "--debug: MLO(%d) is unknown.\n", type);
         MLGetString(lp, &s);          MLGetString(lp, &s);
                 fprintf(stderr, "--debug: \"%s\"\n", s);          fprintf(stderr, "--debug: \"%s\"\n", s);
         return (cmo *)new_cmo_string(s);          return (cmo *)new_cmo_string(s);
     }      }
 }  }
   
 int send_mlo_int32(cmo *m)  int send_mlo_int32(cmo *m)
 {  {
         MLPutInteger(lp, ((cmo_int32 *)m)->i);      MLPutInteger(lp, ((cmo_int32 *)m)->i);
 }  }
   
 int send_mlo_string(cmo *m)  int send_mlo_string(cmo *m)
 {  {
         char *s = ((cmo_string *)m)->s;      char *s = ((cmo_string *)m)->s;
         MLPutString(lp, s);      MLPutString(lp, s);
         fprintf(stderr, "ox_math:: put %s.", s);      fprintf(stderr, "ox_math:: put %s.", s);
 }  }
   
 int send_mlo_zz(cmo *m)  int send_mlo_zz(cmo *m)
 {  {
         char *s;      char *s;
         MLPutFunction(lp, "ToExpression", 1);      MLPutFunction(lp, "ToExpression", 1);
         s = convert_cmo_to_string(m);      s = convert_cmo_to_string(m);
         MLPutString(lp, s);      MLPutString(lp, s);
         fprintf(stderr, "put %s.", s);      fprintf(stderr, "put %s.", s);
 }  }
   
 int send_mlo_list(cmo *c)  int send_mlo_list(cmo *c)
 {  {
         char *s;      char *s;
         cell *cp = ((cmo_list *)c)->head;      cell *cp = ((cmo_list *)c)->head;
         int len = length_cmo_list((cmo_list *)c);      int len = length_cmo_list((cmo_list *)c);
   
         fprintf(stderr, "ox_math:: put List with %d args.\n", len);      fprintf(stderr, "ox_math:: put List with %d args.\n", len);
         MLPutFunction(lp, "List", len);      MLPutFunction(lp, "List", len);
         while(cp->next != NULL) {      while(cp->next != NULL) {
                 send_mlo(cp->cmo);          send_mlo(cp->cmo);
                 cp = cp->next;          cp = cp->next;
         }      }
 }  }
   
 int MATH_sendObject(cmo *m)  int MATH_sendObject(cmo *m)
 {  {
         send_mlo(m);      send_mlo(m);
         MLEndPacket(lp);      MLEndPacket(lp);
 }  }
   
 int send_mlo(cmo *m)  int send_mlo(cmo *m)
Line 205  int send_mlo(cmo *m)
Line 205  int send_mlo(cmo *m)
     char *s;      char *s;
     switch(m->tag) {      switch(m->tag) {
     case CMO_INT32:      case CMO_INT32:
                 send_mlo_int32(m);          send_mlo_int32(m);
         break;          break;
     case CMO_STRING:      case CMO_STRING:
                 send_mlo_string(m);          send_mlo_string(m);
         break;          break;
         case CMO_LIST:      case CMO_LIST:
                 send_mlo_list(m);          send_mlo_list(m);
         break;          break;
     default:      default:
         MLPutFunction(lp, "ToExpression", 1);          MLPutFunction(lp, "ToExpression", 1);
Line 254  int initialize_stack()
Line 254  int initialize_stack()
 int push(cmo* m)  int push(cmo* m)
 {  {
 #if DEBUG  #if DEBUG
         symbol *symp;      symbol *symp;
   
     if (m->tag == CMO_STRING) {      if (m->tag == CMO_STRING) {
         fprintf(stderr, "ox_math:: a cmo_string(%s) was pushed.\n", ((cmo_string *)m)->s);          fprintf(stderr, "ox_math:: a CMO_STRING(%s) was pushed.\n", ((cmo_string *)m)->s);
     }else {      }else {
                 symp = lookup_by_tag(m->tag);          symp = lookup_by_tag(m->tag);
                 fprintf(stderr, "ox_math:: a %s was pushed.\n", symp->key);          fprintf(stderr, "ox_math:: a %s was pushed.\n", symp->key);
         }      }
 #endif  #endif
     Operand_Stack[Stack_Pointer] = m;      Operand_Stack[Stack_Pointer] = m;
     Stack_Pointer++;      Stack_Pointer++;
     if (Stack_Pointer >= SIZE_OPERAND_STACK) {      if (Stack_Pointer >= SIZE_OPERAND_STACK) {
         fprintf(stderr, "stack over flow.\n");          fprintf(stderr, "stack over flow.\n");
                 Stack_Pointer--;          Stack_Pointer--;
     }      }
 }  }
   
Line 295  int sm_popCMO(int fd_write)
Line 295  int sm_popCMO(int fd_write)
 {  {
     cmo* m = pop();      cmo* m = pop();
 #ifdef DEBUG  #ifdef DEBUG
         symbol *symp = lookup_by_tag(m->tag);      symbol *symp = lookup_by_tag(m->tag);
   
     fprintf(stderr, "ox_math:: opecode = SM_popCMO. (%s)\n", symp->key);      fprintf(stderr, "ox_math:: opecode = SM_popCMO. (%s)\n", symp->key);
 #endif  #endif
     if (m != NULL) {      if (m != NULL) {
Line 313  int sm_pops(int fd_write)
Line 313  int sm_pops(int fd_write)
         pops(((cmo_int32 *)m)->i);          pops(((cmo_int32 *)m)->i);
         return 0;          return 0;
     }      }
     return UNKNOWN_SM_COMMAND;      return ERROR_ID_UNKNOWN_SM;
 }  }
   
 /* MathLink 依存部分 */  /* MathLink 依存部分 */
Line 327  int sm_popString(int fd_write)
Line 327  int sm_popString(int fd_write)
     fprintf(stderr, "ox_math:: opecode = SM_popString.\n");      fprintf(stderr, "ox_math:: opecode = SM_popString.\n");
 #endif  #endif
   
         m = pop();      m = pop();
         if (m->tag == CMO_STRING) {      if (m->tag == CMO_STRING) {
         send_ox_cmo(fd_write, m);          send_ox_cmo(fd_write, m);
         }else if ((s = convert_cmo_to_string(m)) != NULL) {      }else if ((s = convert_cmo_to_string(m)) != NULL) {
         send_ox_cmo(fd_write, (cmo *)new_cmo_string(s));          send_ox_cmo(fd_write, (cmo *)new_cmo_string(s));
     }else {      }else {
                 err = new_cmo_error2(m);          err = make_error_object(SM_popString, m);
                 send_ox_cmo(fd_write, err);          send_ox_cmo(fd_write, err);
         }      }
         return 0;      return 0;
 }  }
   
 int local_execute(char *s)  int local_execute(char *s)
 {  {
         return 0;      return 0;
 }  }
   
 /* この関数はサーバに依存する. */  /* この関数はサーバに依存する. */
 int sm_executeStringByLocalParser(int fd_write)  int sm_executeStringByLocalParser(int fd_write)
 {  {
         symbol *symp;      symbol *symp;
     cmo* m = pop();      cmo* m = pop();
         char *s = NULL;      char *s = NULL;
 #ifdef DEBUG  #ifdef DEBUG
     fprintf(stderr, "ox_math:: opecode = SM_executeStringByLocalParser.\n");      fprintf(stderr, "ox_math:: opecode = SM_executeStringByLocalParser.\n");
 #endif  #endif
   
     if (m->tag == CMO_STRING      if (m->tag == CMO_STRING
                 && strlen(s = ((cmo_string *)m)->s) != 0) {          && strlen(s = ((cmo_string *)m)->s) != 0) {
                 if (s[0] == ':') {          if (s[0] == ':') {
                         local_execute(s);              local_execute(s);
                 }else {          }else {
                         /* for mathematica */              /* for mathematica */
                         /* mathematica に文字列を送って評価させる */              /* mathematica に文字列を送って評価させる */
                         MATH_evaluateStringByLocalParser(s);              MATH_evaluateStringByLocalParser(s);
                         push(MATH_getObject2());              push(MATH_get_object());
                 }          }
                 return 0;          return 0;
     }      }
 #ifdef DEBUG  #ifdef DEBUG
         if ((symp = lookup_by_tag(m->tag)) != NULL) {      if ((symp = lookup_by_tag(m->tag)) != NULL) {
                 fprintf(stderr, "ox_math:: error. the top of stack is %s.\n", symp->key);          fprintf(stderr, "ox_math:: error. the top of stack is %s.\n", symp->key);
         }else {      }else {
                 fprintf(stderr, "ox_math:: error. the top of stack is unknown cmo. (%d)\n", m->tag);          fprintf(stderr, "ox_math:: error. the top of stack is unknown cmo. (%d)\n", m->tag);
         }      }
 #endif  #endif
     return SM_executeStringByLocalParser;      return SM_executeStringByLocalParser;
 }  }
Line 393  int sm_executeFunction(int fd_write)
Line 393  int sm_executeFunction(int fd_write)
     }      }
   
     argc = ((cmo_int32 *)m)->i;      argc = ((cmo_int32 *)m)->i;
     argv = malloc(sizeof(cmo *)*argc);      argv = malloc(argc*sizeof(cmo *));
     for (i=0; i<argc; i++) {      for (i=0; i<argc; i++) {
         argv[i] = pop();          argv[i] = pop();
     }      }
     MATH_executeFunction(func, argc, argv);      MATH_executeFunction(func, argc, argv);
     push(MATH_getObject2());      push(MATH_get_object());
     return 0;      return 0;
 }  }
   
Line 408  int sm_executeFunction(int fd_write)
Line 408  int sm_executeFunction(int fd_write)
   
 int sm_mathcap(int fd_write)  int sm_mathcap(int fd_write)
 {  {
     cmo* c = make_mathcap_object(VERSION, ID_STRING);      push(make_mathcap_object(VERSION, ID_STRING));
     push(c);  
     return 0;      return 0;
 }  }
   
Line 446  int execute_sm_command(int fd_write, int code)
Line 445  int execute_sm_command(int fd_write, int code)
         break;          break;
     default:      default:
         fprintf(stderr, "unknown command: %d.\n", code);          fprintf(stderr, "unknown command: %d.\n", code);
         err = UNKNOWN_SM_COMMAND;          err = ERROR_ID_UNKNOWN_SM;
     }      }
   
     if (err != 0) {      if (err != 0) {
         push((cmo *)gen_error_object(err));          push((cmo *)make_error_object(err, new_cmo_null()));
     }      }
 }  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>