=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/mlo.c,v retrieving revision 1.1 retrieving revision 1.4 diff -u -p -r1.1 -r1.4 --- OpenXM/src/ox_math/mlo.c 1999/11/29 12:09:58 1.1 +++ OpenXM/src/ox_math/mlo.c 2000/01/05 06:09:11 1.4 @@ -1,29 +1,22 @@ -/* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM$ */ +/* -*- mode: C -*- */ +/* $OpenXM: OpenXM/src/ox_math/mlo.c,v 1.3 1999/12/14 09:31:55 ohara Exp $ */ -/* Open Mathematica サーバ */ -/* ファイルディスクリプタ 3, 4 は open されていると仮定して動作する. */ - -/* MathLink との通信部分 */ - #include #include #include #include #include +#include "oxtag.h" #include "ox.h" -#include "parse.h" +#include "mlo.h" #include "serv2.h" +/* If this flag sets then we identify MLTKSYM to CMO_INDETERMINATE. */ int flag_mlo_symbol = FLAG_MLTKSYM_IS_INDETERMINATE; -/* MLINK はポインタ型. */ +/* MLINK is a indentifier of MathLink connection. */ MLINK stdlink; -typedef cmo mlo; -typedef cmo_string mlo_string; -typedef cmo_zz mlo_zz; - mlo *receive_mlo_zz() { char *s; @@ -70,6 +63,18 @@ cmo *receive_mlo_function() 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 *c = malloc(sizeof(mlo_function)); @@ -121,7 +126,7 @@ cmo *receive_mlo_symbol() return ob; } -/* Mathematica を起動する. */ +/* starting a MathLink connection. */ int ml_init() { int argc = 2; @@ -135,6 +140,7 @@ int ml_init() return 0; } +/* closing a MathLink connection. */ int ml_exit() { /* quit Mathematica then close the link */ @@ -142,16 +148,22 @@ int ml_exit() 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 */ while (MLNextPacket(stdlink) != RETURNPKT) { usleep(10); MLNewPacket(stdlink); } - return receive_mlo(); } +/* Never forget call ml_flush() after calling send_mlo(). */ +int ml_flush() +{ + MLEndPacket(stdlink); +} + cmo *receive_mlo() { char *s; @@ -163,7 +175,7 @@ cmo *receive_mlo() case MLTKSTR: return receive_mlo_string(); case MLTKREAL: - /* double はまだ... */ + /* Yet we have no implementation of CMO_DOUBLE... */ fprintf(stderr, "--debug: MLO == MLTKREAL.\n"); MLGetString(stdlink, &s); return (cmo *)new_cmo_string(s); @@ -197,7 +209,7 @@ int send_mlo_zz(cmo *m) { char *s; MLPutFunction(stdlink, "ToExpression", 1); - s = convert_cmo_to_string(m); + s = new_string_set_cmo(m); MLPutString(stdlink, s); } @@ -214,12 +226,6 @@ int send_mlo_list(cmo *c) } } -int ml_sendObject(cmo *m) -{ - send_mlo(m); - MLEndPacket(stdlink); -} - int send_mlo(cmo *m) { char *s; @@ -245,7 +251,7 @@ int send_mlo(cmo *m) break; default: MLPutFunction(stdlink, "ToExpression", 1); - s = convert_cmo_to_string(m); + s = new_string_set_cmo(m); MLPutString(stdlink, s); break; }