=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/mlo.c,v retrieving revision 1.1 retrieving revision 1.5 diff -u -p -r1.1 -r1.5 --- OpenXM/src/ox_math/mlo.c 1999/11/29 12:09:58 1.1 +++ OpenXM/src/ox_math/mlo.c 2000/01/22 06:29:18 1.5 @@ -1,29 +1,31 @@ -/* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM$ */ +/* -*- mode: C -*- */ +/* $OpenXM: OpenXM/src/ox_math/mlo.c,v 1.4 2000/01/05 06:09:11 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 #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 +72,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 +135,7 @@ cmo *receive_mlo_symbol() return ob; } -/* Mathematica を起動する. */ +/* starting a MathLink connection. */ int ml_init() { int argc = 2; @@ -135,6 +149,7 @@ int ml_init() return 0; } +/* closing a MathLink connection. */ int ml_exit() { /* quit Mathematica then close the link */ @@ -142,16 +157,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 +184,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 +218,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 +235,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 +260,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; }