version 1.10, 1999/11/29 12:09:58 |
version 1.11, 1999/12/14 09:31:56 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.9 1999/11/19 20:51:36 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.10 1999/11/29 12:09:58 ohara Exp $ */ |
|
|
/* Open Mathematica サーバ */ |
/* Open Mathematica サーバ */ |
/* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */ |
/* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */ |
|
|
extern int flag_mlo_symbol; |
extern int flag_mlo_symbol; |
|
|
/* MathLink 非依存部分 */ |
/* MathLink 非依存部分 */ |
|
#define INIT_S_SIZE 2048 |
|
#define EXT_S_SIZE 2048 |
|
|
#define SIZE_OPERAND_STACK 2048 |
static int stack_size = 0; |
|
static int stack_pointer = 0; |
|
static cmo **stack = NULL; |
|
|
static cmo* Operand_Stack[SIZE_OPERAND_STACK]; |
|
static int Stack_Pointer = 0; |
|
|
|
int initialize_stack() |
int initialize_stack() |
{ |
{ |
Stack_Pointer = 0; |
stack_pointer = 0; |
|
stack_size = INIT_S_SIZE; |
|
stack = malloc(stack_size*sizeof(cmo*)); |
} |
} |
|
|
|
static int extend_stack() |
|
{ |
|
int size2 = stack_size + EXT_S_SIZE; |
|
cmo **stack2 = malloc(size2*sizeof(cmo*)); |
|
memcpy(stack2, stack, stack_size*sizeof(cmo *)); |
|
free(stack); |
|
stack = stack2; |
|
stack_size = size2; |
|
} |
|
|
int push(cmo* m) |
int push(cmo* m) |
{ |
{ |
#if DEBUG |
#if DEBUG |
|
|
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; |
stack[stack_pointer] = m; |
Stack_Pointer++; |
stack_pointer++; |
if (Stack_Pointer >= SIZE_OPERAND_STACK) { |
if (stack_pointer >= stack_size) { |
fprintf(stderr, "stack over flow.\n"); |
extend_stack(); |
Stack_Pointer--; |
|
} |
} |
} |
} |
|
|
/* スタックが空のときは, (CMO_NULL) をかえす. */ |
/* スタックが空のときは, (CMO_NULL) をかえす. */ |
cmo* pop() |
cmo* pop() |
{ |
{ |
if (Stack_Pointer > 0) { |
if (stack_pointer > 0) { |
Stack_Pointer--; |
stack_pointer--; |
return Operand_Stack[Stack_Pointer]; |
return stack[stack_pointer]; |
} |
} |
return new_cmo_null(); |
return new_cmo_null(); |
} |
} |
|
|
void pops(int n) |
void pops(int n) |
{ |
{ |
Stack_Pointer -= n; |
stack_pointer -= n; |
if (Stack_Pointer < 0) { |
if (stack_pointer < 0) { |
Stack_Pointer = 0; |
stack_pointer = 0; |
} |
} |
} |
} |
|
|
Line 106 int sm_popString(int fd_write) |
|
Line 118 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(fd_write, m); |
}else if ((s = convert_cmo_to_string(m)) != NULL) { |
}else if ((s = new_string_set_cmo(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 = make_error_object(SM_popString, m); |
err = make_error_object(SM_popString, m); |
Line 149 int sm_executeStringByLocalParser(int fd_write) |
|
Line 161 int sm_executeStringByLocalParser(int fd_write) |
|
/* for mathematica */ |
/* for mathematica */ |
/* mathematica に文字列を送って評価させる */ |
/* mathematica に文字列を送って評価させる */ |
ml_evaluateStringByLocalParser(s); |
ml_evaluateStringByLocalParser(s); |
push(ml_get_object()); |
ml_select(); |
|
push(receive_mlo()); |
} |
} |
return 0; |
return 0; |
} |
} |
Line 182 int sm_executeFunction(int fd_write) |
|
Line 195 int sm_executeFunction(int fd_write) |
|
argv[i] = pop(); |
argv[i] = pop(); |
} |
} |
ml_executeFunction(func, argc, argv); |
ml_executeFunction(func, argc, argv); |
push(ml_get_object()); |
ml_select(); |
|
push(receive_mlo()); |
return 0; |
return 0; |
} |
} |
|
|
/* 平成11年10月13日 */ |
/* 平成12年12月14日 */ |
#define VERSION 0x11102700 |
#define VERSION 0x11121400 |
#define ID_STRING "ox_math server 1999/10/28 17:29:25" |
#define ID_STRING "ox_math server 1999/12/14 15:25:00" |
|
|
int sm_mathcap(int fd_write) |
int sm_mathcap(int fd_write) |
{ |
{ |