| version 1.15, 2000/03/10 12:45:48 |
version 1.18, 2000/12/03 15:19:23 |
|
|
| /* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
| /* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.14 2000/03/10 12:38:47 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_math/serv2.c,v 1.17 2000/11/28 20:16:03 ohara Exp $ */ |
| |
|
| /* |
/* |
| Copyright (C) Katsuyoshi OHARA, 2000. |
Copyright (C) Katsuyoshi OHARA, 2000. |
|
|
| extern int flag_mlo_symbol; |
extern int flag_mlo_symbol; |
| |
|
| /* MathLink independent */ |
/* 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) |
|
|
| fprintf(stderr, "ox_math:: a %s was pushed.\n", symbol_get_key(symp)); |
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++; |
| } |
} |
| |
|
| /* if the stack is empty, then pop() returns (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; |
| } |
} |
| } |
} |
| |
|
| |
void push_error(int errcode, cmo* pushback) |
| |
{ |
| |
return push((cmo *)make_error_object(errcode, pushback)); |
| |
} |
| |
|
| /* |
/* |
| if error occurs, then a sm_*() function returns non-zero and |
if error occurs, then a sm_*() function returns non-zero and |
| an error obect is set by a function which calls sm_*(). |
an error obect is set by a function which calls sm_*(). |
| */ |
*/ |
| int sm_popCMO(int fd_write) |
int sm_popCMO(OXFILE* oxfp) |
| { |
{ |
| cmo* m = pop(); |
cmo* m = pop(); |
| #ifdef DEBUG |
#ifdef DEBUG |
| Line 100 int sm_popCMO(int fd_write) |
|
| Line 99 int sm_popCMO(int fd_write) |
|
| #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 117 int sm_pops(int fd_write) |
|
| Line 116 int sm_pops(int fd_write) |
|
| } |
} |
| |
|
| /* MathLink dependent */ |
/* MathLink dependent */ |
| int sm_popString(int fd_write) |
int sm_popString(OXFILE* oxfp) |
| { |
{ |
| char *s; |
char *s; |
| cmo *err; |
cmo *err; |
| Line 129 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 156 int local_execute(char *s) |
|
| Line 155 int local_execute(char *s) |
|
| } |
} |
| |
|
| /* The following function is depend on an implementation of a server. */ |
/* The following function is depend on an implementation of a server. */ |
| int sm_executeStringByLocalParser(int fd_write) |
int sm_executeStringByLocalParser(OXFILE* oxfp) |
| { |
{ |
| symbol_t symp; |
symbol_t symp; |
| cmo* m = pop(); |
cmo* m = pop(); |
| Line 173 int sm_executeStringByLocalParser(int fd_write) |
|
| Line 172 int sm_executeStringByLocalParser(int fd_write) |
|
| /* for mathematica */ |
/* for mathematica */ |
| /* Sending the string `s' to mathematica for its evaluation. */ |
/* 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; |
| Line 185 int sm_executeStringByLocalParser(int fd_write) |
|
| Line 184 int sm_executeStringByLocalParser(int fd_write) |
|
| 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 207 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_t sp = lookup_by_tag(code); |
symbol_t sp = lookup_by_tag(code); |
| Line 236 int execute_sm_command(int fd_write, int code) |
|
| Line 243 int execute_sm_command(int fd_write, int code) |
|
| |
|
| 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(); |