version 1.1, 1999/11/29 12:09:58 |
version 1.5, 2000/01/22 06:29:18 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C -*- */ |
/* $OpenXM$ */ |
/* $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 <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <unistd.h> |
#include <unistd.h> |
#include <gmp.h> |
#include <gmp.h> |
#include <mathlink.h> |
#include <mathlink.h> |
|
#include "oxtag.h" |
#include "ox.h" |
#include "ox.h" |
#include "parse.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 70 cmo *receive_mlo_function() |
|
Line 72 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 121 cmo *receive_mlo_symbol() |
|
Line 135 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 163 cmo *receive_mlo() |
|
Line 184 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 197 int send_mlo_zz(cmo *m) |
|
Line 218 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 214 int send_mlo_list(cmo *c) |
|
Line 235 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 245 int send_mlo(cmo *m) |
|
Line 260 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; |
} |
} |