| version 1.2, 1999/12/09 22:50:56 |
version 1.6, 2000/03/10 12:38:46 |
|
|
| /* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C -*- */ |
| /* $OpenXM: OpenXM/src/ox_math/mlo.c,v 1.1 1999/11/29 12:09:58 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_math/mlo.c,v 1.5 2000/01/22 06:29:18 ohara Exp $ */ |
| |
|
| /* Open Mathematica サーバ */ |
/* |
| /* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */ |
Copyright (C) Katsuyoshi OHARA, 2000. |
| |
Portions copyright 1999 Wolfram Research, Inc. |
| |
|
| /* MathLink との通信部分 */ |
You must see OpenXM/Copyright/Copyright.generic. |
| |
The MathLink Library is licensed from Wolfram Research Inc.. |
| |
See OpenXM/Copyright/Copyright.mathlink for detail. |
| |
*/ |
| |
|
| #include <stdio.h> |
#include <stdio.h> |
| #include <stdlib.h> |
#include <stdlib.h> |
| #include <unistd.h> |
#include <unistd.h> |
| #include <gmp.h> |
|
| #include <mathlink.h> |
#include <mathlink.h> |
| #include "oxtag.h" |
#include <ox_toolkit.h> |
| #include "ox.h" |
|
| #include "parse.h" |
|
| #include "mlo.h" |
#include "mlo.h" |
| #include "serv2.h" |
#include "serv2.h" |
| |
|
| |
/* If this flag sets then we identify MLTKSYM to CMO_INDETERMINATE. */ |
| int flag_mlo_symbol = FLAG_MLTKSYM_IS_INDETERMINATE; |
int flag_mlo_symbol = FLAG_MLTKSYM_IS_INDETERMINATE; |
| |
|
| /* MLINK はポインタ型. */ |
/* MLINK is a indentifier of MathLink connection. */ |
| MLINK stdlink; |
MLINK stdlink; |
| |
|
| typedef cmo mlo; |
|
| typedef cmo_string mlo_string; |
|
| typedef cmo_zz mlo_zz; |
|
| |
|
| mlo *receive_mlo_zz() |
mlo *receive_mlo_zz() |
| { |
{ |
| char *s; |
char *s; |
| Line 72 cmo *receive_mlo_function() |
|
| Line 70 cmo *receive_mlo_function() |
|
| return m; |
return m; |
| } |
} |
| |
|
| |
#if 0 |
| |
cmo *convert_mlo_to_cmo(mlo *m) |
| |
{ |
| |
if (m->tag == MLO_FUNCTION) { |
| |
if (strcmp(((mlo_function *)m)->function, "List") == 0) { |
| |
return convert_mlo_function_list_to_cmo_list(m); |
| |
} |
| |
} |
| |
return m; |
| |
} |
| |
#endif |
| |
|
| mlo_function *new_mlo_function(char *function) |
mlo_function *new_mlo_function(char *function) |
| { |
{ |
| mlo_function *c = malloc(sizeof(mlo_function)); |
mlo_function *c = malloc(sizeof(mlo_function)); |
| Line 123 cmo *receive_mlo_symbol() |
|
| Line 133 cmo *receive_mlo_symbol() |
|
| return ob; |
return ob; |
| } |
} |
| |
|
| /* Mathematica を起動する. */ |
/* starting a MathLink connection. */ |
| int ml_init() |
int ml_init() |
| { |
{ |
| int argc = 2; |
int argc = 2; |
|
|
| return 0; |
return 0; |
| } |
} |
| |
|
| |
/* closing a MathLink connection. */ |
| int ml_exit() |
int ml_exit() |
| { |
{ |
| /* quit Mathematica then close the link */ |
/* quit Mathematica then close the link */ |
|
|
| MLClose(stdlink); |
MLClose(stdlink); |
| } |
} |
| |
|
| cmo *ml_get_object() |
/* Never forget call ml_select() before calling receive_mlo(). */ |
| |
int ml_select() |
| { |
{ |
| /* skip any packets before the first ReturnPacket */ |
/* skip any packets before the first ReturnPacket */ |
| while (MLNextPacket(stdlink) != RETURNPKT) { |
while (MLNextPacket(stdlink) != RETURNPKT) { |
| usleep(10); |
usleep(10); |
| MLNewPacket(stdlink); |
MLNewPacket(stdlink); |
| } |
} |
| return receive_mlo(); |
|
| } |
} |
| |
|
| |
/* Never forget call ml_flush() after calling send_mlo(). */ |
| |
int ml_flush() |
| |
{ |
| |
MLEndPacket(stdlink); |
| |
} |
| |
|
| cmo *receive_mlo() |
cmo *receive_mlo() |
| { |
{ |
| char *s; |
char *s; |
| Line 165 cmo *receive_mlo() |
|
| Line 182 cmo *receive_mlo() |
|
| case MLTKSTR: |
case MLTKSTR: |
| return receive_mlo_string(); |
return receive_mlo_string(); |
| case MLTKREAL: |
case MLTKREAL: |
| /* double はまだ... */ |
/* Yet we have no implementation of CMO_DOUBLE... */ |
| fprintf(stderr, "--debug: MLO == MLTKREAL.\n"); |
fprintf(stderr, "--debug: MLO == MLTKREAL.\n"); |
| MLGetString(stdlink, &s); |
MLGetString(stdlink, &s); |
| return (cmo *)new_cmo_string(s); |
return (cmo *)new_cmo_string(s); |
| Line 199 int send_mlo_zz(cmo *m) |
|
| Line 216 int send_mlo_zz(cmo *m) |
|
| { |
{ |
| char *s; |
char *s; |
| MLPutFunction(stdlink, "ToExpression", 1); |
MLPutFunction(stdlink, "ToExpression", 1); |
| s = convert_cmo_to_string(m); |
s = new_string_set_cmo(m); |
| MLPutString(stdlink, s); |
MLPutString(stdlink, s); |
| } |
} |
| |
|
| Line 216 int send_mlo_list(cmo *c) |
|
| Line 233 int send_mlo_list(cmo *c) |
|
| } |
} |
| } |
} |
| |
|
| int ml_sendObject(cmo *m) |
|
| { |
|
| send_mlo(m); |
|
| MLEndPacket(stdlink); |
|
| } |
|
| |
|
| int send_mlo(cmo *m) |
int send_mlo(cmo *m) |
| { |
{ |
| char *s; |
char *s; |
| Line 247 int send_mlo(cmo *m) |
|
| Line 258 int send_mlo(cmo *m) |
|
| break; |
break; |
| default: |
default: |
| MLPutFunction(stdlink, "ToExpression", 1); |
MLPutFunction(stdlink, "ToExpression", 1); |
| s = convert_cmo_to_string(m); |
s = new_string_set_cmo(m); |
| MLPutString(stdlink, s); |
MLPutString(stdlink, s); |
| break; |
break; |
| } |
} |