| 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; | 
| } | } |