Annotation of OpenXM/src/ox_toolkit/README, Revision 1.10
1.1 ohara 1: # Author: 小原功任 @ 金沢大学理学部計算科学教室
2: # URI: http://omega.s.kanazawa-u.ac.jp/ohara/
1.10 ! ohara 3: # $OpenXM: OpenXM/src/ox_toolkit/README,v 1.9 2000/01/20 17:18:55 ohara Exp $
1.1 ohara 4:
1.4 ohara 5: /*&ja ox_toolkit ユーザガイド
1.1 ohara 6:
1.4 ohara 7: */
1.6 ohara 8: /*&en A user's guide for OpenXM C library.
1.4 ohara 9:
10: */
1.7 ohara 11: /* &ja いきさつ
12: このライブラリは ox_math および math2ox を開発するために設計された。
13: ライブラリ自身には、 Mathematica に依存した部分はない。
14: */
15: /* &en Introduction
16:
17: */
1.4 ohara 18: /*&ja
1.1 ohara 19: libox.a を利用するには次のヘッダファイルをインクルードする必要があります。
1.4 ohara 20: */
21: /*&en
22: How to use OpenXM C library?
23:
1.6 ohara 24: In order to use libox.a, you need to include the following header files:
1.4 ohara 25: */
26: /*&common
1.1 ohara 27:
1.10 ! ohara 28: #include <ox_toolkit.h>
1.1 ohara 29:
1.4 ohara 30: */
31: /*&ja
1.2 ohara 32: 1. データ型
1.1 ohara 33:
1.2 ohara 34: このツールキットで定義されている各構造体の生成については次節を参照せよ。
35:
36: 1.1 CMO (Common Math Object)
1.1 ohara 37: 次のデータ型(構造体)が用意されている。
1.4 ohara 38: */
39: /*&en
40: 1. Types
41:
42: 1.1 CMO (Common Math Object)
1.10 ! ohara 43: The following structures are defined in ox_toolkit.h:
1.4 ohara 44: */
45: /*&common
1.1 ohara 46:
47: cmo
48: cmo_null
49: cmo_int32
50: cmo_datum
51: cmo_string
52: cmo_mathcap
53: cmo_list
54: cmo_monomial32
55: cmo_zz
56: cmo_qq
57: cmo_zero
58: cmo_dms_generic
59: cmo_ring_by_name
60: cmo_distributed_polynomial
61: cmo_indeterminate
62: cmo_error2
63:
1.4 ohara 64: */
65: /*&ja
1.1 ohara 66: このうち cmo 型はいわば抽象基底クラスに相当するものであり、この型のオ
1.2 ohara 67: ブジェクトを明示的には生成されない。このクラスはポインタ型のキャストの
68: ために用意されている。また cmo_distributed_polynomial は cmo_list の派
69: 生クラスであると思ってもよい。
70:
1.4 ohara 71: */
72: /*&en
1.7 ohara 73: The cmo above is abstract base class; you never make an object of cmo
74: class.
1.4 ohara 75:
76: */
77: /*&ja
1.2 ohara 78: 1.2 OX オブジェクト
79: 次のデータ型(構造体)が用意されている。
1.4 ohara 80: */
81: /*&en
82: 1.2 OX objects
1.10 ! ohara 83: The following structures are defined in ox_toolkit.h:
1.4 ohara 84: */
85: /*&common
1.2 ohara 86:
87: ox
88: ox_command
89: ox_data
90:
1.4 ohara 91: */
92: /*&ja
1.2 ohara 93: このうち、ox 型は抽象基底クラスなので、オブジェクトをつくってはいけない。
94:
1.4 ohara 95: */
96: /*&en
97: The ox above is abstract base class.
98:
99: */
100: /*&ja
1.2 ohara 101: 2. オブジェクトの生成
102:
103: オブジェクトを生成するために、new 関数群が用意されている。それぞれの関
104: 数はオブジェクトを生成して、そのオブジェクトへのポインタを返す。
1.4 ohara 105: */
106: /*&en
107: 2. How to make CMObjects?
108:
1.7 ohara 109: Use the following functions to generate an object. It returns a
110: pointer to the object. */ /*&common
1.1 ohara 111:
112: new_cmo_null();
113: new_cmo_int32(int i);
114: new_cmo_string(char* s);
115: new_cmo_mathcap(cmo* ob);
116: new_cmo_list();
117: new_cmo_monomial32();
118: new_cmo_monomial32_size(int size);
119: new_cmo_zz();
120: new_cmo_zz_size(int size);
121: new_cmo_zz_set_si(int integer);
122: new_cmo_zz_noinit();
123: new_cmo_zero();
124: new_cmo_distributed_polynomial();
125: new_cmo_dms_generic();
126: new_cmo_ring_by_name(cmo* ob);
127: new_cmo_indeterminate(cmo* ob);
128: new_cmo_error2(cmo* ob);
129:
1.4 ohara 130: */
131: /*&ja
1.2 ohara 132: 3. 高水準 API
133:
134: 高水準 API は「OpenXM クライアント」から利用することを前提に設計されている。
135:
136: 3.1 通信の開始
137:
138: 通信を開始する場合には、次の関数のいずれかを利用する。
1.4 ohara 139: */
140: /*&en
141: 3. High-level API
142:
1.6 ohara 143: High-level API is prepared to help an implementation of OpenXM clients.
1.4 ohara 144:
1.6 ohara 145: 3.1 How to make connections to OpenXM servers?
1.4 ohara 146:
1.7 ohara 147: In order to open a connection to an OpenXM server, you need to call
148: ox_start() or to call ox_start_insecure_nonreverse().
1.4 ohara 149: */
150: /*&common
1.2 ohara 151:
152: ox_file_t ox_start(char* host, char* prog1, char* prog2);
153: ox_file_t ox_start_insecure_nonreverse(char* host, short portControl, short portStream);
154:
1.4 ohara 155: */
156: /*&ja
1.2 ohara 157: 第一の関数は、ローカルマシン上に OpenXM サーバを起動し、そのサーバとの
158: 間に"reverse モード"で通信路を開設する。通信に使われるポート番号は自動
159: 的に生成される。host はローカルマシンのホスト名(あるいは "localhost")、
160: prog1 はコントロールサーバの実行ファイル名、
161: prog2 は計算サーバの実行ファイル名でなければならない。
162:
163: 第二の関数は、リモートマシン上に既に起動されている OpenXM サーバとの間に
164: 通信路を開設する。通信に使われるポート番号は明示的に与えなければならない。
165: host はリモートマシンのホスト名、
166: portControl はコントロールサーバとの通信のためのポート番号、
167: portStream は計算サーバとの通信のためのポート番号である。
168:
169: それぞれの関数はサーバ(正確には二つのサーバの組)の識別子を返す。
170: この識別子は高水準 API の各関数で利用される。
171:
1.4 ohara 172: */
1.7 ohara 173: /*&en
174: The ox_start() function invoke an OpenXM server on its local machine
175: and open a connection to the server with "reverse" mode. The client
176: choose a port number of TCP/IP automatically.
177:
178: The ox_start_insecure_nonreverse() function open a connection to an
179: OpenXM server run on a remote host and you need to provide port numbers.
180:
181: */
1.4 ohara 182: /*&ja
1.2 ohara 183: 3.2 通信の終了
184:
185: 通信の終了のためには次の二つの関数が用意されている。
186:
1.4 ohara 187: */
188: /*&en
1.6 ohara 189: 3.2 How to close connections to OpenXM servers?
1.4 ohara 190:
1.7 ohara 191: In order to close a connection to an OpenXM server, you need to call
192: ox_close() or to call ox_shutdown().
1.4 ohara 193:
194: */
195: /*&common
1.2 ohara 196: void ox_close(ox_file_t sv);
197: void ox_shutdown(ox_file_t sv);
198:
1.4 ohara 199: */
200: /*&ja
1.2 ohara 201: 第一の関数はコントロールサーバに SM_control_kill を送ることによって、
202: サーバを終了させる。第二の関数は計算サーバに SM_shutdown を送ることに
203: よって、サーバを終了させる(予定)。
204:
1.7 ohara 205: */
1.4 ohara 206: /*&ja
1.2 ohara 207: 3.3 SM コマンドの送信
1.4 ohara 208: */
209: /*&en
1.6 ohara 210: 3.3 How to command to OpenXM stack machines?
1.4 ohara 211: */
212: /*&common
1.5 ohara 213:
1.2 ohara 214: void ox_push_cmd(ox_file_t sv, int sm_code);
215:
1.4 ohara 216: */
217: /*&ja
1.2 ohara 218: サーバにスタックマシンコマンドを送る。コマンドはコマンド番号で与える。
1.7 ohara 219:
1.4 ohara 220: */
221: /*&en
1.5 ohara 222: ox_push_cmd() sends an operation code to an OpenXM stack machine.
1.10 ! ohara 223: See OpenXM/include/ox_toolkit_tags.h for a list of operation codes.
1.7 ohara 224:
1.4 ohara 225: */
226: /*&ja
1.2 ohara 227: 3.4 CMO の送受信
1.7 ohara 228: */
229: /*&en
230: 3.4 How to receive a CMO?
231: */
232: /*&common
1.2 ohara 233:
234: void ox_push_cmo(ox_file_t sv, cmo *c);
235: cmo* ox_pop_cmo(ox_file_t sv);
236: char* ox_popString(ox_file_t sv);
237:
1.7 ohara 238: */
239: /*&ja
1.2 ohara 240: ox_push_cmo は cmo を送信、ox_pop_cmo は cmo を受信する。ox_popString
241: は cmo を文字列形式に変換して受信するが、変換の結果はサーバによって異
242: なる。
243:
1.7 ohara 244: */
245: /*&en
246: */
247: /*&ja
1.2 ohara 248: 3.5 スタック処理
1.7 ohara 249: */
250: /*&common
1.2 ohara 251:
252: int ox_pops(ox_file_t sv, int num);
253:
1.7 ohara 254: */
255: /*&ja
1.2 ohara 256: スタック上の num 個のオブジェクトを廃棄する。
257:
1.7 ohara 258: */
259: /*&ja
260: 3.6 通信路のフラッシュ
261: */
262: /*&common
1.2 ohara 263:
264: int ox_flush(ox_file_t sv);
265:
1.7 ohara 266: */
267: /*&ja
1.2 ohara 268: 通信路を flush する(実際には何もしない)。
269:
1.7 ohara 270: */
271: /*&ja
272: 3.7 通信の中断
273: */
274: /*&common
1.2 ohara 275:
276: void ox_reset(ox_file_t sv);
277:
1.7 ohara 278: */
279: /*&ja
1.2 ohara 280: 計算を中断する。
281:
1.7 ohara 282: */
283: /*&ja
284: 3.8 ローカル言語で書かれたコマンドの評価
285: */
286: /*&common
1.2 ohara 287:
288: void ox_execute_string(ox_file_t sv, char* str);
289:
1.7 ohara 290: */
291: /*&ja
1.2 ohara 292: サーバのローカル言語で書かれた命令を評価し、結果をスタックに積む。
293:
1.7 ohara 294: */
295: /*&ja
296: 3.9 関数呼び出し
297: */
298: /*&common
1.2 ohara 299:
1.6 ohara 300: int ox_cmo_rpc(ox_file_t sv, char *function, int argc, cmo *argv[]);
1.2 ohara 301:
1.7 ohara 302: */
303: /*&ja
1.2 ohara 304: function(argv[1], ...) を計算し、結果をスタックに積む。
305:
1.7 ohara 306: */
307: /*&ja
308: 3.10 Mathcap の受信
1.2 ohara 309:
1.7 ohara 310: */
311: /*&common
1.2 ohara 312: cmo_mathcap* ox_mathcap(ox_file_t sv);
313:
1.7 ohara 314: */
315: /*&ja
1.2 ohara 316: Mathcap を受け取る。現在は Mathcap の処理はユーザプログラムに任されている。
317: いずれこの関数は廃止される予定。
1.4 ohara 318: */
319: /*&ja
1.5 ohara 320:
1.2 ohara 321: 4. 低水準 API
1.1 ohara 322:
1.3 ohara 323: 低水準 API はファイルディスクリプタを直接利用する。
1.1 ohara 324:
1.3 ohara 325: 4.1 通信に使われるバイトオーダの決定
1.4 ohara 326: */
327: /*&en
1.5 ohara 328:
1.4 ohara 329: 4. Low-level API.
330:
1.5 ohara 331: In this section, ``fd'' is an identifier of an OpenXM connection.
332:
1.4 ohara 333: 4.1 How to decide a byte order of integers?
1.7 ohara 334:
1.4 ohara 335: */
336: /*&common
1.3 ohara 337: int decideByteOrderServer(int fd, int order);
338:
1.4 ohara 339: */
340: /*&ja
1.3 ohara 341: このツールキットは、サーバが開始されるときにはすでに通信路が設定されて
342: いるが、その通信路に用いるバイトオーダの決定は行われていないと仮定して
343: いる。詳しくは、高山-野呂, "OpenXM の設計と実装" を参照せよ。
344:
345: (注意) クライアント側でのバイトオーダの設定は、高水準 API で自動的に行われる。
1.5 ohara 346: */
347: /*&en
1.6 ohara 348: You need to call it when your OpenXM server is initialized.
349: This function always choose the network byte order
350: as an expression for integers.
1.4 ohara 351: */
352: /*&common
1.5 ohara 353:
1.3 ohara 354: 4.2
355:
1.7 ohara 356: */
357: /*&common
1.3 ohara 358: int send_int32(int fd, int integer);
1.5 ohara 359: int receive_int32(int fd);
1.3 ohara 360:
1.4 ohara 361: */
362: /*&ja
1.3 ohara 363: fd に 32bit 整数を書き込む。
1.5 ohara 364: fd から 32bit 整数を読み込む。
365: */
366: /*&en
367: send_int32() writes 32bits integer to an OpenXM connection.
368: receive_int32() reads 32bits integer from an OpenXM connection.
1.4 ohara 369: */
370: /*&common
1.3 ohara 371:
372: 4.3
373:
1.7 ohara 374: */
375: /*&common
1.3 ohara 376: int send_cmo(int fd, cmo* m);
1.5 ohara 377: cmo* receive_cmo(int fd);
1.3 ohara 378:
1.4 ohara 379: */
380: /*&ja
1.3 ohara 381: fd に cmo を書き込む。
1.5 ohara 382: fd から cmo を読み込む。
383: */
384: /*&en
385: send_cmo() writes an CMObject to an OpenXM connection.
386: receive_cmo() reads an CMObject from an OpenXM connection.
1.4 ohara 387: */
388: /*&common
1.3 ohara 389:
390: 4.4
391:
1.7 ohara 392: */
393: /*&common
1.3 ohara 394: int next_serial();
395:
1.5 ohara 396: */
397: /*&ja
1.3 ohara 398: シリアルナンバを生成する。
1.5 ohara 399: */
400: /*&en
1.6 ohara 401: next_serial() generates a serial number for ox message.
1.5 ohara 402: */
403: /*&common
1.3 ohara 404:
405: 4.5
406:
1.7 ohara 407: */
408: /*&common
1.3 ohara 409: int send_ox_tag(int fd, int tag);
410: int receive_ox_tag(int fd);
411:
1.5 ohara 412: */
413: /*&ja
414: fd に OX メッセージのヘッダ(tag+serial#)を書き込む。シリアル番号は
415: 自動的に生成される。
416: fd から OX メッセージのヘッダ(tag+serial#)を読み込む。
417: */
418: /*&en
1.6 ohara 419: send_ox_tag() writes a tag and an automatically generated serial number
1.5 ohara 420: of an ox message to an OpenXM conection.
1.6 ohara 421: receive_ox_tag() reads a tag and a serial number of an ox message.
1.5 ohara 422: */
423: /*&common
1.3 ohara 424:
1.9 ohara 425: 4.6 Sending OX messages.
1.3 ohara 426:
1.7 ohara 427: */
428: /*&common
1.3 ohara 429: int send_ox(int fd, ox* m);
430: int send_ox_cmo(int fd, cmo* m);
431: void send_ox_command(int fd, int sm_command);
432:
1.5 ohara 433: */
434: /*&ja
1.9 ohara 435: OX メッセージを送信する。
1.6 ohara 436: */
437:
438: /*&ja
439:
440: 5. OX expression パーサ
441:
1.7 ohara 442: */
1.9 ohara 443: /*&en
444:
445: 5. Parser for OX expressions
446:
447: */
1.7 ohara 448: /*&ja
1.9 ohara 449: OpenXM C library には 文字列表現された OX expression および CMO
450: expression から、ox 構造体または cmo 構造体を生成するためのパーサが付
451: 属している。ここではこのパーサについて説明する。
452: */
453: /*&en
454: We have a parser which generate an OX object or a CMO from a string
455: encoded OX/CMO expression. In this section, we explain the parser.
456: */
457: /*&en
1.6 ohara 458:
1.9 ohara 459: 5.1 Setting an option
460: */
461: /*&ja
1.6 ohara 462:
1.9 ohara 463: 5.1 オプション
1.7 ohara 464: */
465: /*&common
1.9 ohara 466:
1.6 ohara 467: int setflag_parse(int flag);
468:
1.7 ohara 469: */
470: /*&ja
1.6 ohara 471: setflag_parse(PFLAG_ADDREV) によって、CMO の短縮表現を許す。
1.9 ohara 472: */
473: /*&en
474: We set an option for the parser. If we call
475: setflag_parse(PFLAG_ADDREV), then the parser admits external
476: expressios.
477: */
478: /*&en
1.6 ohara 479:
1.9 ohara 480: 5.2 Initializing
481: */
482: /*&ja
483:
484: 5.2 初期化
1.7 ohara 485: */
486: /*&common
1.9 ohara 487:
1.6 ohara 488: int init_parser(char *str);
489:
1.7 ohara 490: */
491: /*&ja
1.6 ohara 492: パーサが処理すべき文字列をセットする。
1.9 ohara 493: */
494: /*&en
495: We give the parser an OX/CMO expression, that is, a Lisp style string.
496: */
497: /*&en
1.6 ohara 498:
1.9 ohara 499: 5.3 Getting an object
500: */
501: /*&ja
502:
503: 5.3 結果を得る
1.7 ohara 504: */
505: /*&common
1.9 ohara 506:
1.6 ohara 507: cmo *parse();
508:
1.7 ohara 509: */
510: /*&ja
1.6 ohara 511: Lisp 表現による OX expression, CMO expression の構文解析器。あらかじめ
512: 設定された文字列を解析して ox 構造体、あるいは cmo 構造体を生成する。
513: */
1.9 ohara 514: /*&en
515: The parser returns an OX/CMO object. If the given string is illegal,
516: then the parser returns NULL.
517: */
1.6 ohara 518: /*&ja
519:
520: 7. 付属プログラムについて
521:
1.7 ohara 522: */
523: /*&en
524:
525: 7. Sample programs.
526:
527: */
528: /*&common
1.6 ohara 529: testclient
530:
1.7 ohara 531: */
532: /*&ja
1.6 ohara 533: テスト用の小さな OpenXM クライアント。OX expression を入力して送信する
534: ことのみ可能。SM_popCMO, SM_popString を含むメッセージを送信した場合に
535: は、サーバから送られてくるメッセージを表示する。
536:
1.7 ohara 537: */
538: /*&en
539: This is a small OpenXM client. We send an OX message by inputting an
540: OX expression and display data messages gotten from a server.
541:
542: */
543: /*&common
1.6 ohara 544: bconv
545:
1.7 ohara 546: */
547: /*&ja
1.6 ohara 548: バイトコードエンコーダ。OX expression あるいは CMO expression を入力す
549: ると、対応するバイト列を表示する。
550:
1.7 ohara 551: */
552: /*&en
553: A byte code encoder. It shows a byte stream which corresponds to an
554: OX expression.
555:
1.9 ohara 556: */
1.7 ohara 557: /*&common
1.6 ohara 558: ox_Xsample
559:
1.7 ohara 560: */
561: /*&ja
1.6 ohara 562: GUI 表示する OpenXM サーバのサンプル。
563:
564: */
1.8 ohara 565: /*&ja
566: 8. 付録
567:
568: 8.1 ox.c における関数の命名規則
569:
570: (1) receive_cmo 関数はCMOタグとデータ本体を受信する. この関数は CMOタ
571: グの値が事前に分からないときに使用する. 返り値として、cmo へのポインタ
572: を返す.
573: (2) receive_cmo_X 関数は, CMOタグを親の関数で受信してから呼び出される
574: 関数で、データ本体のみを受信し、cmo_X へのポインタを返す. しかも、関
575: 数内部で new_cmo_X 関数を呼び出す.
576: (3) send_cmo 関数はCMOタグとデータ本体を送信する.
577: (4) send_cmo_X 関数はCMOタグを親の関数で送信してから呼び出される関数で、
578: データ本体のみを送信する.
579: (5) ただし receive_ox_tag を除いて, receive_ox_X 関数は作らない.
580: receive_cmo を利用する.
581: (6) send_ox_X 関数は OX タグを含めて送信する.
582: (7) ox_X 関数は一連の送受信を含むより抽象的な操作を表現する. ox_X 関
583: 数は、第一引数として、ox_file_t型の変数 sv をとる.
584: (8) Y_cmo 関数と Y_cmo_X 関数の関係は次の通り:
585: まず Y_cmo 関数で cmo のタグを処理し、タグを除いた残りの部分をY_cmo_X
586: 関数が処理する. cmo の内部に cmo_Z へのポインタがあるときには、その種
587: 類によらずに Y_cmo 関数を呼び出す.
588:
589: */
590:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>