[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.4 and 1.5

version 1.4, 1999/11/04 03:05:51 version 1.5, 1999/11/04 19:33:17
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.3 1999/11/03 10:56:40 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.4 1999/11/04 03:05:51 ohara Exp $ */
   
 /* Open Mathematica サーバ */  /* Open Mathematica サーバ */
 /* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */  /* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */
Line 29  typedef cmo_zz mlo_zz;
Line 29  typedef cmo_zz mlo_zz;
 typedef struct {  typedef struct {
         int tag;          int tag;
         int length;          int length;
         cell *head;          cell head[1];
         char *function;          char *function;
 } mlo_function;  } mlo_function;
   
Line 39  mlo *receive_mlo_zz()
Line 39  mlo *receive_mlo_zz()
         char *s;          char *s;
         mlo  *m;          mlo  *m;
   
           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);
Line 50  mlo *receive_mlo_string()
Line 51  mlo *receive_mlo_string()
 {  {
         char *s;          char *s;
         mlo  *m;          mlo  *m;
           fprintf(stderr, "--debug: MLO == MLTKSTR.\n");
         MLGetString(lp, &s);          MLGetString(lp, &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()
   {
           char *s;
           cmo *m;
       cmo  *ob;
       int  i,n;
   
           fprintf(stderr, "--debug: MLO == MLTKFUNC.\n");
           MLGetFunction(lp, &s, &n);
           fprintf(stderr, "--debug: Function = \"%s\", # of args = %d\n", s, n);
           m = new_cmo_list();
           append_cmo_list(m, new_cmo_string(s));
   
           for (i=0; i<n; i++) {
                   fprintf(stderr, "--debug: arg[%d]\n", i);
                   fflush(stderr);
                   ob = receive_mlo();
                   append_cmo_list(m, ob);
           }
   
           MLDisownString(lp, s);
           return m;
   }
   
   cmo *receive_mlo_symbol()
   {
           cmo *ob;
           char *s;
   
           fprintf(stderr, "--debug: MLO == MLTKSYM.\n");
           MLGetSymbol(lp, &s);
           fprintf(stderr, "--debug: Symbol \"%s\".\n", s);
   
           ob = new_cmo_indeterminate(new_cmo_string(s));
   
           MLDisownString(lp, s);
           return ob;
   }
   
   
 /* Mathematica を起動する. */  /* Mathematica を起動する. */
 int MATH_init()  int MATH_init()
 {  {
     int argc = 2;      int argc = 2;
     char *argv[] = {"-linkname", "math -mathlink"};      char *argv[] = {"-linkname", "math -mathlink"};
   
     if(MLInitialize(NULL) != NULL) {      if(MLInitialize(NULL) == NULL
         lp = MLOpen(argc, argv);             || (lp = MLOpen(argc, argv)) == NULL) {
         if(lp != NULL) {                  fprintf(stderr, "Mathematica Kernel not found.\n");
             return 0;                  exit(1);
         }  
     }      }
     exit(1);          return 0;
 }  }
   
 int MATH_exit()  int MATH_exit()
Line 78  int MATH_exit()
Line 120  int MATH_exit()
     MLClose(lp);      MLClose(lp);
 }  }
   
 char *MATH_getObject()  
 {  
     char *s;  
   
     /* skip any packets before the first ReturnPacket */  
     while (MLNextPacket(lp) != RETURNPKT) {  
         usleep(10);  
         MLNewPacket(lp);  
     }  
     /* いまはタイプにかかわらず文字列を取得する. */  
     switch(MLGetNext(lp)) {  
     case MLTKINT:  
         fprintf(stderr, "type is INTEGER.\n");  
         MLGetString(lp, &s);  
         break;  
     case MLTKSTR:  
         fprintf(stderr, "type is STRING.\n");  
         MLGetString(lp, &s);  
         break;  
     default:  
         MLGetString(lp, &s);  
     }  
     return s;  
 }  
   
   
 cmo *MATH_getObject2()  cmo *MATH_getObject2()
 {  {
     /* skip any packets before the first ReturnPacket */      /* skip any packets before the first ReturnPacket */
Line 111  cmo *MATH_getObject2()
Line 127  cmo *MATH_getObject2()
         usleep(10);          usleep(10);
         MLNewPacket(lp);          MLNewPacket(lp);
     }      }
     /* いまはタイプにかかわらず文字列を取得する. */          return receive_mlo();
         return MATH_getObject3();  
 }  }
   
 cmo *MATH_getObject3()  cmo *receive_mlo()
 {  {
     char *s;      char *s;
     cmo  *m;  
     cmo  *ob;  
     int  i,n;  
         int type;          int type;
   
     /* いまはタイプにかかわらず文字列を取得する. */      switch(type = MLGetNext(lp)) {
         type = MLGetNext(lp);  
     switch(type) {  
     case MLTKINT:      case MLTKINT:
         fprintf(stderr, "--debug: MLO == MLTKINT.\n");                  return receive_mlo_zz();
                 m = receive_mlo_zz();  
         break;  
     case MLTKSTR:      case MLTKSTR:
         fprintf(stderr, "--debug: MLO == MLTKSTR.\n");                  return receive_mlo_string();
                 m = receive_mlo_string();  
         break;  
 #if 0  
     case MLTKREAL:      case MLTKREAL:
         fprintf(stderr, "MLTKREAL is not supported: we use MLTKSTR.\n");                  /* double はまだ... */
           fprintf(stderr, "--debug: MLO == MLTKREAL.\n");
         MLGetString(lp, &s);          MLGetString(lp, &s);
         m = (cmo *)new_cmo_string(s);          return new_cmo_string(s);
         break;  
     case MLTKERR:  
         fprintf(stderr, "--debug: MLO == MLTKERR.\n");  
         m = (cmo *)gen_error_object(MATH_ERROR);  
         break;  
 #endif  
     case MLTKSYM:      case MLTKSYM:
                 fprintf(stderr, "--debug: MLO == MLTKSYM.\n");          return receive_mlo_symbol();
                 /* この部分に問題がある. */  
         MLGetSymbol(lp, &s);  
                 fprintf(stderr, "--debug: Symbol \"%s\".\n", s);  
         m = (cmo *)new_cmo_string(s);  
         break;  
     case MLTKFUNC:      case MLTKFUNC:
         fprintf(stderr, "--debug: MLO == MLTKFUNC.\n");                  return receive_mlo_function();
         MLGetFunction(lp, &s, &n);      case MLTKERR:
         fprintf(stderr, "--debug: Function = \"%s\", # of args = %d\n", s, n);          fprintf(stderr, "--debug: MLO == MLTKERR.\n");
                 m = new_cmo_list();          return gen_error_object(MATH_ERROR);
                 append_cmo_list(m, new_cmo_string(s));  
                 fflush(stderr);  
         for (i=0; i<n; i++) {  
             fprintf(stderr, "--debug: arg[%d]\n", i);  
                         fflush(stderr);  
                         ob = MATH_getObject3();  
                         append_cmo_list(m, ob);  
         }  
         break;  
     default:      default:
         fprintf(stderr, "--debug: MLO(%d) != MLTKINT, MLTKSTR.\n", type);          fprintf(stderr, "--debug: MLO(%d) is unknown.\n", type);
         fprintf(stderr, "--debug: MLTKFUNC(%d), MLTKSYM(%d).\n", MLTKFUNC, MLTKSYM);  
   
         MLGetString(lp, &s);          MLGetString(lp, &s);
                 fprintf(stderr, "--debug: \"%s\"\n", s);                  fprintf(stderr, "--debug: \"%s\"\n", s);
         m = (cmo *)new_cmo_string(s);          return new_cmo_string(s);
     }      }
     return m;  
 }  }
   
   
   int send_mlo_int32(cmo *m)
   {
           MLPutInteger(lp, ((cmo_int32 *)m)->i);
   }
   
   int send_mlo_string(cmo *m)
   {
           char *s = ((cmo_string *)m)->s;
           MLPutString(lp, s);
           fprintf(stderr, "ox_math:: put %s.", s);
   }
   
   int send_mlo_zz(cmo *m)
   {
           char *s;
           MLPutFunction(lp, "ToExpression", 1);
           s = convert_cmo_to_string(m);
           MLPutString(lp, s);
           fprintf(stderr, "put %s.", s);
   }
   
   int send_mlo_list(cmo *c)
   {
           char *s;
           cell *cp = ((cmo_list *)c)->head;
           int len = length_cmo_list((cmo_list *)c);
   
           fprintf(stderr, "ox_math:: put List with %d args.\n", len);
           MLPutFunction(lp, "List", len);
           while(cp->next != NULL) {
                   send_mlo(cp->cmo);
                   cp = cp->next;
           }
   }
   
 int MATH_sendObject(cmo *m)  int MATH_sendObject(cmo *m)
 {  {
           send_mlo(m);
           MLEndPacket(lp);
   }
   
   int send_mlo(cmo *m)
   {
     char *s;      char *s;
     switch(m->tag) {      switch(m->tag) {
     case CMO_INT32:      case CMO_INT32:
         MLPutInteger(lp, ((cmo_int32 *)m)->i);                  send_mlo_int32(m);
         break;          break;
     case CMO_STRING:      case CMO_STRING:
         s = ((cmo_string *)m)->s;                  send_mlo_string(m);
         MLPutString(lp, s);  
         fprintf(stderr, "put %s.", s);  
         break;          break;
           case CMO_LIST:
                   send_mlo_list(m);
           break;
     default:      default:
         MLPutFunction(lp, "ToExpression", 1);          MLPutFunction(lp, "ToExpression", 1);
         s = convert_cmo_to_string(m);          s = convert_cmo_to_string(m);
Line 210  int MATH_executeFunction(char *function, int argc, cmo
Line 236  int MATH_executeFunction(char *function, int argc, cmo
     int i;      int i;
     MLPutFunction(lp, function, argc);      MLPutFunction(lp, function, argc);
     for (i=0; i<argc; i++) {      for (i=0; i<argc; i++) {
         MATH_sendObject(argv[i]);          send_mlo(argv[i]);
     }      }
     MLEndPacket(lp);      MLEndPacket(lp);
 }  }
Line 230  int initialize_stack()
Line 256  int initialize_stack()
 int push(cmo* m)  int push(cmo* m)
 {  {
 #if DEBUG  #if DEBUG
     fprintf(stderr, "server:: a cmo is pushed: tag == %d.\n", m->tag);  
     if (m->tag == CMO_STRING) {      if (m->tag == CMO_STRING) {
         fprintf(stderr, "server:: %s\n", ((cmo_string *)m)->s);          fprintf(stderr, "ox_math:: a cmo_string(%s) was pushed.\n", ((cmo_string *)m)->s);
     }      }else {
                   fprintf(stderr, "ox_math:: a cmo(%d) was pushed.\n", m->tag);
           }
 #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");
         exit(1);          exit(1); /* 手抜き */
     }      }
 }  }
   
Line 267  int sm_popCMO(int fd_write)
Line 294  int sm_popCMO(int fd_write)
 {  {
     cmo* m = pop();      cmo* m = pop();
   
     fprintf(stderr, "code: SM_popCMO.\n");      fprintf(stderr, "ox_math:: opecode = SM_popCMO. (tag = %d)\n", m->tag);
     if (m != NULL) {      if (m != NULL) {
         send_ox_cmo(fd_write, m);          send_ox_cmo(fd_write, m);
         return 0;          return 0;
Line 292  int sm_popString(int fd_write)
Line 319  int sm_popString(int fd_write)
     cmo*  m;      cmo*  m;
   
 #ifdef DEBUG  #ifdef DEBUG
     fprintf(stderr, "code: SM_popString.\n");      fprintf(stderr, "ox_math:: opecode = SM_popString.\n");
 #endif  #endif
   
     if ((m = pop()) != NULL && (s = convert_cmo_to_string(m)) != NULL) {      if ((m = pop()) != NULL && (s = convert_cmo_to_string(m)) != NULL) {
Line 307  int sm_executeStringByLocalParser(int fd_write)
Line 334  int sm_executeStringByLocalParser(int fd_write)
 {  {
     cmo* m = NULL;      cmo* m = NULL;
 #ifdef DEBUG  #ifdef DEBUG
     fprintf(stderr, "code: SM_executeStringByLocalParser.\n");      fprintf(stderr, "ox_math:: opecode = SM_executeStringByLocalParser.\n");
 #endif  #endif
     if ((m = pop()) != NULL && m->tag == CMO_STRING) {      if ((m = pop()) != NULL && m->tag == CMO_STRING) {
         /* for mathematica */          /* for mathematica */

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

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