[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.12 and 1.18

version 1.12, 2000/01/05 06:09:11 version 1.18, 2000/12/03 15:19:23
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.11 1999/12/14 09:31:56 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.17 2000/11/28 20:16:03 ohara Exp $ */
   
 /* Open Mathematica サーバ */  /*
 /* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */     Copyright (C) Katsuyoshi OHARA, 2000.
      Portions copyright 1999 Wolfram Research, Inc.
   
      You must see OpenXM/Copyright/Copyright.generic.
      The MathLink Library is licensed from Wolfram Research Inc..
      See OpenXM/Copyright/Copyright.mathlink for detail.
   */
   
   /*
      Remarks:
      file descripter 3 and 4 are already opened by the parent process.
   */
   
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <unistd.h>  #include <unistd.h>
 #include <gmp.h>  #include <gmp.h>
 #include <mathlink.h>  #include <mathlink.h>
 #include "ox.h"  #include <ox_toolkit.h>
 #include "parse.h"  
 #include "serv2.h"  #include "serv2.h"
   
 extern int flag_mlo_symbol;  extern int flag_mlo_symbol;
   
 /* MathLink 非依存部分 */  /* MathLink independent */
 #define INIT_S_SIZE 2048  
 #define EXT_S_SIZE  2048  
   
 static int stack_size = 0;  
 static int stack_pointer = 0;  
 static cmo **stack = NULL;  static cmo **stack = NULL;
   static int stack_size = 0;
   static int stack_ptr = 0;
   OXFILE *stack_oxfp = NULL;
   
 int initialize_stack()  #define DIFFERENCE_OF_STACK  1024
 {  
     stack_pointer = 0;  
         stack_size = INIT_S_SIZE;  
         stack = malloc(stack_size*sizeof(cmo*));  
 }  
   
 static int extend_stack()  static void stack_extend()
 {  {
         int size2 = stack_size + EXT_S_SIZE;      int newsize = stack_size + DIFFERENCE_OF_STACK;
         cmo **stack2 = malloc(size2*sizeof(cmo*));      cmo **newstack = (cmo **)malloc(sizeof(cmo *)*newsize);
         memcpy(stack2, stack, stack_size*sizeof(cmo *));      if (stack != NULL) {
         free(stack);          memcpy(newstack, stack, sizeof(cmo *)*stack_size);
         stack = stack2;          free(stack);
         stack_size = size2;      }
       stack_size = newsize;
       stack = newstack;
 }  }
   
 int push(cmo* m)  int push(cmo* m)
 {  {
 #if DEBUG  #if DEBUG
     symbol *symp;      symbol_t 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", symbol_get_key(symp));
     }      }
 #endif  #endif
     stack[stack_pointer] = m;      if (stack_ptr >= stack_size) {
     stack_pointer++;          stack_extend();
     if (stack_pointer >= stack_size) {  
                 extend_stack();  
     }      }
       stack[stack_ptr] = m;
       stack_ptr++;
 }  }
   
 /* スタックが空のときは, (CMO_NULL) をかえす. */  /* if the stack is empty, then pop() returns (CMO_NULL). */
 cmo* pop()  cmo* pop()
 {  {
     if (stack_pointer > 0) {      if (stack_ptr > 0) {
         stack_pointer--;          return stack[--stack_ptr];
         return stack[stack_pointer];  
     }      }
     return new_cmo_null();      return new_cmo_null();
 }  }
   
 void pops(int n)  void pops(int n)
 {  {
     stack_pointer -= n;      stack_ptr -= n;
     if (stack_pointer < 0) {      if (stack_ptr < 0) {
         stack_pointer = 0;          stack_ptr = 0;
     }      }
 }  }
   
 /* sm_XXX 関数群は、エラーのときは 0 以外の値を返し、呼び出し元で  void push_error(int errcode, cmo* pushback)
    エラーオブジェクトをセットする */  
 int sm_popCMO(int fd_write)  
 {  {
       return push((cmo *)make_error_object(errcode, pushback));
   }
   
   /*
      if error occurs, then a sm_*() function returns non-zero and
      an error obect is set by a function which calls sm_*().
   */
   int sm_popCMO(OXFILE* oxfp)
   {
     cmo* m = pop();      cmo* m = pop();
 #ifdef DEBUG  #ifdef DEBUG
     symbol *symp = lookup_by_tag(m->tag);      symbol_t 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", symbol_get_key(symp));
 #endif  #endif
   
     if (m != NULL) {      if (m != NULL) {
         send_ox_cmo(fd_write, m);          send_ox_cmo(oxfp, m);
         return 0;          return 0;
     }      }
     return SM_popCMO;      return SM_popCMO;
 }  }
   
 int sm_pops(int fd_write)  int sm_pops(OXFILE* oxfp)
 {  {
     cmo* m = pop();      cmo* m = pop();
     if (m != NULL && m->tag == CMO_INT32) {      if (m != NULL && m->tag == CMO_INT32) {
Line 104  int sm_pops(int fd_write)
Line 115  int sm_pops(int fd_write)
     return ERROR_ID_UNKNOWN_SM;      return ERROR_ID_UNKNOWN_SM;
 }  }
   
 /* MathLink 依存部分 */  /* MathLink dependent */
 int sm_popString(int fd_write)  int sm_popString(OXFILE* oxfp)
 {  {
     char *s;      char *s;
     cmo *err;      cmo *err;
Line 117  int sm_popString(int fd_write)
Line 128  int sm_popString(int fd_write)
   
     m = pop();      m = pop();
     if (m->tag == CMO_STRING) {      if (m->tag == CMO_STRING) {
         send_ox_cmo(fd_write, m);          send_ox_cmo(oxfp, m);
     }else if ((s = new_string_set_cmo(m)) != NULL) {      }else if ((s = new_string_set_cmo(m)) != NULL) {
         send_ox_cmo(fd_write, (cmo *)new_cmo_string(s));          send_ox_cmo(oxfp, (cmo *)new_cmo_string(s));
     }else {      }else {
         err = make_error_object(SM_popString, m);          err = make_error_object(SM_popString, m);
         send_ox_cmo(fd_write, err);          send_ox_cmo(oxfp, err);
     }      }
     return 0;      return 0;
 }  }
Line 143  int local_execute(char *s)
Line 154  int local_execute(char *s)
     return 0;      return 0;
 }  }
   
 /* この関数はサーバに依存する. */  /* The following function is depend on an implementation of a server. */
 int sm_executeStringByLocalParser(int fd_write)  int sm_executeStringByLocalParser(OXFILE* oxfp)
 {  {
     symbol *symp;      symbol_t symp;
     cmo* m = pop();      cmo* m = pop();
     char *s = NULL;      char *s = NULL;
 #ifdef DEBUG  #ifdef DEBUG
Line 159  int sm_executeStringByLocalParser(int fd_write)
Line 170  int sm_executeStringByLocalParser(int fd_write)
             local_execute(++s);              local_execute(++s);
         }else {          }else {
             /* for mathematica */              /* for mathematica */
             /* mathematica に文字列を送って評価させる */              /* Sending the string `s' to mathematica for its evaluation. */
             ml_evaluateStringByLocalParser(s);              ml_evaluateStringByLocalParser(s);
                         ml_select();              ml_select();
             push(receive_mlo());              push(receive_mlo());
         }          }
         return 0;          return 0;
     }      }
 #ifdef DEBUG  #ifdef DEBUG
     symp = lookup_by_tag(m->tag);      symp = lookup_by_tag(m->tag);
     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", symbol_get_key(symp));
 #endif  #endif
     return SM_executeStringByLocalParser;      return SM_executeStringByLocalParser;
 }  }
   
 int sm_executeFunction(int fd_write)  int sm_executeFunction(OXFILE* oxfp)
 {  {
     int i, argc;      int i, argc;
     cmo **argv;      cmo **argv;
Line 195  int sm_executeFunction(int fd_write)
Line 206  int sm_executeFunction(int fd_write)
         argv[i] = pop();          argv[i] = pop();
     }      }
     ml_executeFunction(func, argc, argv);      ml_executeFunction(func, argc, argv);
         ml_select();      ml_select();
     push(receive_mlo());      push(receive_mlo());
     return 0;      return 0;
 }  }
   
 #define VERSION 0x11121400  int sm_mathcap(OXFILE* oxfp)
 #define ID_STRING  "ox_math server 1999/12/14 15:25:00"  
   
 int sm_mathcap(int fd_write)  
 {  {
     push(make_mathcap_object(VERSION, ID_STRING));      push((cmo *)oxf_cmo_mathcap(oxfp));
     return 0;      return 0;
 }  }
   
 int receive_sm_command(int fd_read)  void sm_set_mathcap(OXFILE *oxfp)
 {  {
     return receive_int32(fd_read);      cmo_mathcap *m = (cmo_mathcap *)pop();
       if (m->tag == CMO_MATHCAP) {
           oxf_mathcap_update(oxfp, m);
       }else {
           push_error(-1, m);
           /* an error object must be pushed */
       }
 }  }
   
 int execute_sm_command(int fd_write, int code)  int receive_sm_command(OXFILE* oxfp)
 {  {
       return receive_int32(oxfp);
   }
   
   int execute_sm_command(OXFILE* oxfp, int code)
   {
     int err = 0;      int err = 0;
 #ifdef DEBUG  #ifdef DEBUG
     symbol *sp = lookup_by_tag(code);      symbol_t sp = lookup_by_tag(code);
     fprintf(stderr, "ox_math:: %s received.\n", sp->key);      fprintf(stderr, "ox_math:: %s received.\n", symbol_get_key(sp));
 #endif  #endif
   
     switch(code) {      switch(code) {
     case SM_popCMO:      case SM_popCMO:
         err = sm_popCMO(fd_write);          err = sm_popCMO(oxfp);
         break;          break;
     case SM_popString:      case SM_popString:
         err = sm_popString(fd_write);          err = sm_popString(oxfp);
         break;          break;
     case SM_mathcap:      case SM_mathcap:
         err = sm_mathcap(fd_write);          err = sm_mathcap(oxfp);
         break;          break;
     case SM_pops:      case SM_pops:
         err = sm_pops(fd_write);          err = sm_pops(oxfp);
         break;          break;
     case SM_executeStringByLocalParser:      case SM_executeStringByLocalParser:
     case SM_executeStringByLocalParserInBatchMode:      case SM_executeStringByLocalParserInBatchMode:
         err = sm_executeStringByLocalParser(fd_write);          err = sm_executeStringByLocalParser(oxfp);
         break;          break;
     case SM_executeFunction:      case SM_executeFunction:
         err = sm_executeFunction(fd_write);          err = sm_executeFunction(oxfp);
         break;          break;
     case SM_shutdown:      case SM_shutdown:
         shutdown();          shutdown();
         break;          break;
     case SM_setMathCap:      case SM_setMathCap:
         pop();  /* 無視する */          pop();  /* ignore */
         break;          break;
     default:      default:
         fprintf(stderr, "unknown command: %d.\n", code);          fprintf(stderr, "unknown command: %d.\n", code);

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.18

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