| version 1.12, 2000/01/05 06:09:11 |
version 1.15, 2000/03/10 12:45:48 |
|
|
| /* -*- 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.14 2000/03/10 12:38:47 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 INIT_S_SIZE 2048 |
| #define EXT_S_SIZE 2048 |
#define EXT_S_SIZE 2048 |
| |
|
| Line 43 static int extend_stack() |
|
| Line 53 static int extend_stack() |
|
| 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; |
stack[stack_pointer] = m; |
|
|
| } |
} |
| } |
} |
| |
|
| /* スタックが空のときは, (CMO_NULL) をかえす. */ |
/* if the stack is empty, then pop() returns (CMO_NULL). */ |
| cmo* pop() |
cmo* pop() |
| { |
{ |
| if (stack_pointer > 0) { |
if (stack_pointer > 0) { |
|
|
| } |
} |
| } |
} |
| |
|
| /* sm_XXX 関数群は、エラーのときは 0 以外の値を返し、呼び出し元で |
/* |
| エラーオブジェクトをセットする */ |
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(int fd_write) |
int sm_popCMO(int fd_write) |
| { |
{ |
| 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) { |
| Line 104 int sm_pops(int fd_write) |
|
| Line 116 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(int fd_write) |
| { |
{ |
| char *s; |
char *s; |
| Line 143 int local_execute(char *s) |
|
| Line 155 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(int fd_write) |
| { |
{ |
| 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 171 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()); |
| Line 168 int sm_executeStringByLocalParser(int fd_write) |
|
| Line 180 int sm_executeStringByLocalParser(int fd_write) |
|
| } |
} |
| #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; |
| } |
} |
| Line 218 int execute_sm_command(int fd_write, int code) |
|
| Line 230 int execute_sm_command(int fd_write, 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) { |
| Line 246 int execute_sm_command(int fd_write, int code) |
|
| Line 258 int execute_sm_command(int fd_write, int code) |
|
| 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); |