Annotation of OpenXM/src/ox_toolkit/README, Revision 1.12
1.1 ohara 1: # Author: 小原功任 @ 金沢大学理学部計算科学教室
2: # URI: http://omega.s.kanazawa-u.ac.jp/ohara/
1.12 ! ohara 3: # $OpenXM: OpenXM/src/ox_toolkit/README,v 1.11 2000/10/10 05:23:19 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.12 ! ohara 132: 3. コネクション
1.11 ohara 133:
134: OXFILE は OpenXM での通信路を表現するクラスである。このクラスのオブジェ
135: クトを明示的には生成しないこと。必ずコンストラクタを利用しなければなら
136: ない。これはクライアントとサーバで接続時の手順が異なることに由来する。
137: バイトオーダに関連した処理はこのクラスのメソッドで実現される。このクラ
138: スのメソッドとして次のものが用意されている。
139:
1.12 ! ohara 140: 3.1 コンストラクタ
! 141:
1.11 ohara 142: OXFILE *oxf_connect_active(char *hostname, short port);
1.12 ! ohara 143:
! 144: 能動的に接続する場合のコンストラクタ。通常、サーバで利用する。
! 145:
1.11 ohara 146: OXFILE *oxf_connect_passive(int listened);
1.12 ! ohara 147:
! 148: 受動的に接続するためのコンストラクタ。
! 149: 内部で accept() を呼ぶので、listened には mysocketListen() の返した値が必要。
! 150:
1.11 ohara 151: OXFILE *oxf_open(int fd);
152:
1.12 ! ohara 153: インスタンスを生成するだけで、接続は行わない。すでにオープンされたファ
! 154: イルディスクリプタを fd に指定する。計算サーバでの利用を想定。
! 155:
! 156: 3.2 認証に関連したメソッド
! 157:
1.11 ohara 158: int oxf_confirm_client(OXFILE *oxfp, char *passwd);
1.12 ! ohara 159:
! 160: クライアント側での認証を行う。返り値が1のときに成功、0のときに失敗。
! 161:
1.11 ohara 162: int oxf_confirm_server(OXFILE *oxfp, char *passwd);
1.12 ! ohara 163:
! 164: サーバ側での認証を行う。常に成功する。
! 165:
1.11 ohara 166: void oxf_determine_byteorder_client(OXFILE *oxfp);
167: void oxf_determine_byteorder_server(OXFILE *oxfp);
1.12 ! ohara 168:
! 169: oxfp の指す通信路でのバイトオーダを決定し、oxfp のインスタンスを書き換える。
! 170:
1.11 ohara 171: void oxf_setopt(OXFILE *oxfp, int mode);
172:
1.12 ! ohara 173: oxfp の設定を行う。oxf_determine_byteorder_XXX() で用いられている。
! 174:
! 175: 3.3 その他のメソッド
! 176:
1.11 ohara 177: int oxf_read(void *buffer, size_t size, size_t num, OXFILE *oxfp);
178: int oxf_write(void *buffer, size_t size, size_t num, OXFILE *oxfp);
179: void oxf_flush(OXFILE *oxfp);
180: void oxf_close(OXFILE *oxfp);
181:
1.12 ! ohara 182: fread, fwrite, fflush, fclose に準拠。
! 183:
1.11 ohara 184: */
185: /*&ja
1.12 ! ohara 186: 4. 高水準 API(この記述は古いので使わないこと)
1.2 ohara 187:
188: 高水準 API は「OpenXM クライアント」から利用することを前提に設計されている。
189:
1.12 ! ohara 190: 4.1 通信の開始
1.2 ohara 191:
192: 通信を開始する場合には、次の関数のいずれかを利用する。
1.4 ohara 193: */
194: /*&en
1.12 ! ohara 195: 4. High-level API
1.4 ohara 196:
1.6 ohara 197: High-level API is prepared to help an implementation of OpenXM clients.
1.4 ohara 198:
1.12 ! ohara 199: 4.1 How to make connections to OpenXM servers?
1.4 ohara 200:
1.7 ohara 201: In order to open a connection to an OpenXM server, you need to call
202: ox_start() or to call ox_start_insecure_nonreverse().
1.4 ohara 203: */
204: /*&common
1.2 ohara 205:
1.11 ohara 206: OXFILE *ox_start(char* host, char* prog1, char* prog2);
207: OXFILE *ox_start_insecure_nonreverse(char* host, short portControl, short portStream);
1.2 ohara 208:
1.4 ohara 209: */
210: /*&ja
1.2 ohara 211: 第一の関数は、ローカルマシン上に OpenXM サーバを起動し、そのサーバとの
212: 間に"reverse モード"で通信路を開設する。通信に使われるポート番号は自動
213: 的に生成される。host はローカルマシンのホスト名(あるいは "localhost")、
214: prog1 はコントロールサーバの実行ファイル名、
215: prog2 は計算サーバの実行ファイル名でなければならない。
216:
217: 第二の関数は、リモートマシン上に既に起動されている OpenXM サーバとの間に
218: 通信路を開設する。通信に使われるポート番号は明示的に与えなければならない。
219: host はリモートマシンのホスト名、
220: portControl はコントロールサーバとの通信のためのポート番号、
221: portStream は計算サーバとの通信のためのポート番号である。
222:
223: それぞれの関数はサーバ(正確には二つのサーバの組)の識別子を返す。
224: この識別子は高水準 API の各関数で利用される。
225:
1.4 ohara 226: */
1.7 ohara 227: /*&en
228: The ox_start() function invoke an OpenXM server on its local machine
229: and open a connection to the server with "reverse" mode. The client
230: choose a port number of TCP/IP automatically.
231:
232: The ox_start_insecure_nonreverse() function open a connection to an
233: OpenXM server run on a remote host and you need to provide port numbers.
234:
235: */
1.4 ohara 236: /*&ja
1.12 ! ohara 237: 4.2 通信の終了
1.2 ohara 238:
239: 通信の終了のためには次の二つの関数が用意されている。
240:
1.4 ohara 241: */
242: /*&en
1.12 ! ohara 243: 4.2 How to close connections to OpenXM servers?
1.4 ohara 244:
1.7 ohara 245: In order to close a connection to an OpenXM server, you need to call
246: ox_close() or to call ox_shutdown().
1.4 ohara 247:
248: */
249: /*&common
1.11 ohara 250: void ox_close(OXFILE *sv);
251: void ox_shutdown(OXFILE *sv);
1.2 ohara 252:
1.4 ohara 253: */
254: /*&ja
1.2 ohara 255: 第一の関数はコントロールサーバに SM_control_kill を送ることによって、
256: サーバを終了させる。第二の関数は計算サーバに SM_shutdown を送ることに
257: よって、サーバを終了させる(予定)。
258:
1.7 ohara 259: */
1.4 ohara 260: /*&ja
1.12 ! ohara 261: 4.3 SM コマンドの送信
1.4 ohara 262: */
263: /*&en
1.12 ! ohara 264: 4.3 How to command to OpenXM stack machines?
1.4 ohara 265: */
266: /*&common
1.5 ohara 267:
1.11 ohara 268: void ox_push_cmd(OXFILE *sv, int sm_code);
1.2 ohara 269:
1.4 ohara 270: */
271: /*&ja
1.2 ohara 272: サーバにスタックマシンコマンドを送る。コマンドはコマンド番号で与える。
1.7 ohara 273:
1.4 ohara 274: */
275: /*&en
1.5 ohara 276: ox_push_cmd() sends an operation code to an OpenXM stack machine.
1.10 ohara 277: See OpenXM/include/ox_toolkit_tags.h for a list of operation codes.
1.7 ohara 278:
1.4 ohara 279: */
280: /*&ja
1.12 ! ohara 281: 4.4 CMO の送受信
1.7 ohara 282: */
283: /*&en
1.12 ! ohara 284: 4.4 How to receive a CMO?
1.7 ohara 285: */
286: /*&common
1.2 ohara 287:
1.11 ohara 288: void ox_push_cmo(OXFILE *sv, cmo *c);
289: cmo* ox_pop_cmo(OXFILE *sv);
290: char* ox_popString(OXFILE *sv);
1.2 ohara 291:
1.7 ohara 292: */
293: /*&ja
1.2 ohara 294: ox_push_cmo は cmo を送信、ox_pop_cmo は cmo を受信する。ox_popString
295: は cmo を文字列形式に変換して受信するが、変換の結果はサーバによって異
296: なる。
297:
1.7 ohara 298: */
299: /*&en
300: */
301: /*&ja
1.12 ! ohara 302: 4.5 スタック処理
1.7 ohara 303: */
304: /*&common
1.2 ohara 305:
1.11 ohara 306: int ox_pops(OXFILE *sv, int num);
1.2 ohara 307:
1.7 ohara 308: */
309: /*&ja
1.2 ohara 310: スタック上の num 個のオブジェクトを廃棄する。
311:
1.7 ohara 312: */
313: /*&ja
1.12 ! ohara 314: 4.6 通信路のフラッシュ
1.7 ohara 315: */
316: /*&common
1.2 ohara 317:
1.11 ohara 318: int ox_flush(OXFILE *sv);
1.2 ohara 319:
1.7 ohara 320: */
321: /*&ja
1.2 ohara 322: 通信路を flush する(実際には何もしない)。
323:
1.7 ohara 324: */
325: /*&ja
1.12 ! ohara 326: 4.7 通信の中断
1.7 ohara 327: */
328: /*&common
1.2 ohara 329:
1.11 ohara 330: void ox_reset(OXFILE *sv);
1.2 ohara 331:
1.7 ohara 332: */
333: /*&ja
1.2 ohara 334: 計算を中断する。
335:
1.7 ohara 336: */
337: /*&ja
1.12 ! ohara 338: 4.8 ローカル言語で書かれたコマンドの評価
1.7 ohara 339: */
340: /*&common
1.2 ohara 341:
1.11 ohara 342: void ox_execute_string(OXFILE *sv, char* str);
1.2 ohara 343:
1.7 ohara 344: */
345: /*&ja
1.2 ohara 346: サーバのローカル言語で書かれた命令を評価し、結果をスタックに積む。
347:
1.7 ohara 348: */
349: /*&ja
1.12 ! ohara 350: 4.9 関数呼び出し
1.7 ohara 351: */
352: /*&common
1.2 ohara 353:
1.11 ohara 354: int ox_cmo_rpc(OXFILE *sv, char *function, int argc, cmo *argv[]);
1.2 ohara 355:
1.7 ohara 356: */
357: /*&ja
1.2 ohara 358: function(argv[1], ...) を計算し、結果をスタックに積む。
359:
1.7 ohara 360: */
361: /*&ja
1.12 ! ohara 362: 4.10 Mathcap の受信
1.2 ohara 363:
1.7 ohara 364: */
365: /*&common
1.11 ohara 366: cmo_mathcap* ox_mathcap(OXFILE *sv);
1.2 ohara 367:
1.7 ohara 368: */
369: /*&ja
1.2 ohara 370: Mathcap を受け取る。現在は Mathcap の処理はユーザプログラムに任されている。
371: いずれこの関数は廃止される予定。
1.4 ohara 372: */
373: /*&ja
1.5 ohara 374:
1.12 ! ohara 375: 5. 低水準 API
1.1 ohara 376:
1.3 ohara 377: 低水準 API はファイルディスクリプタを直接利用する。
1.1 ohara 378:
1.12 ! ohara 379: 5.1 通信に使われるバイトオーダの決定
1.4 ohara 380: */
381: /*&en
1.5 ohara 382:
1.12 ! ohara 383: 5. Low-level API.
1.4 ohara 384:
1.5 ohara 385: In this section, ``fd'' is an identifier of an OpenXM connection.
386:
1.12 ! ohara 387: 5.1 How to decide a byte order of integers?
1.7 ohara 388:
1.4 ohara 389: */
390: /*&common
1.3 ohara 391: int decideByteOrderServer(int fd, int order);
392:
1.4 ohara 393: */
394: /*&ja
1.3 ohara 395: このツールキットは、サーバが開始されるときにはすでに通信路が設定されて
396: いるが、その通信路に用いるバイトオーダの決定は行われていないと仮定して
397: いる。詳しくは、高山-野呂, "OpenXM の設計と実装" を参照せよ。
398:
399: (注意) クライアント側でのバイトオーダの設定は、高水準 API で自動的に行われる。
1.5 ohara 400: */
401: /*&en
1.6 ohara 402: You need to call it when your OpenXM server is initialized.
403: This function always choose the network byte order
404: as an expression for integers.
1.4 ohara 405: */
406: /*&common
1.5 ohara 407:
1.12 ! ohara 408: 5.2
1.3 ohara 409:
1.7 ohara 410: */
411: /*&common
1.3 ohara 412: int send_int32(int fd, int integer);
1.5 ohara 413: int receive_int32(int fd);
1.3 ohara 414:
1.4 ohara 415: */
416: /*&ja
1.3 ohara 417: fd に 32bit 整数を書き込む。
1.5 ohara 418: fd から 32bit 整数を読み込む。
419: */
420: /*&en
421: send_int32() writes 32bits integer to an OpenXM connection.
422: receive_int32() reads 32bits integer from an OpenXM connection.
1.4 ohara 423: */
424: /*&common
1.3 ohara 425:
1.12 ! ohara 426: 5.3
1.3 ohara 427:
1.7 ohara 428: */
429: /*&common
1.3 ohara 430: int send_cmo(int fd, cmo* m);
1.5 ohara 431: cmo* receive_cmo(int fd);
1.3 ohara 432:
1.4 ohara 433: */
434: /*&ja
1.3 ohara 435: fd に cmo を書き込む。
1.5 ohara 436: fd から cmo を読み込む。
437: */
438: /*&en
439: send_cmo() writes an CMObject to an OpenXM connection.
440: receive_cmo() reads an CMObject from an OpenXM connection.
1.4 ohara 441: */
442: /*&common
1.3 ohara 443:
1.12 ! ohara 444: 5.4
1.3 ohara 445:
1.7 ohara 446: */
447: /*&common
1.3 ohara 448: int next_serial();
449:
1.5 ohara 450: */
451: /*&ja
1.3 ohara 452: シリアルナンバを生成する。
1.5 ohara 453: */
454: /*&en
1.6 ohara 455: next_serial() generates a serial number for ox message.
1.5 ohara 456: */
457: /*&common
1.3 ohara 458:
1.12 ! ohara 459: 5.5
1.3 ohara 460:
1.7 ohara 461: */
462: /*&common
1.3 ohara 463: int send_ox_tag(int fd, int tag);
464: int receive_ox_tag(int fd);
465:
1.5 ohara 466: */
467: /*&ja
468: fd に OX メッセージのヘッダ(tag+serial#)を書き込む。シリアル番号は
469: 自動的に生成される。
470: fd から OX メッセージのヘッダ(tag+serial#)を読み込む。
471: */
472: /*&en
1.6 ohara 473: send_ox_tag() writes a tag and an automatically generated serial number
1.5 ohara 474: of an ox message to an OpenXM conection.
1.6 ohara 475: receive_ox_tag() reads a tag and a serial number of an ox message.
1.5 ohara 476: */
477: /*&common
1.3 ohara 478:
1.12 ! ohara 479: 5.6 Sending OX messages.
1.3 ohara 480:
1.7 ohara 481: */
482: /*&common
1.3 ohara 483: int send_ox(int fd, ox* m);
484: int send_ox_cmo(int fd, cmo* m);
485: void send_ox_command(int fd, int sm_command);
486:
1.5 ohara 487: */
488: /*&ja
1.9 ohara 489: OX メッセージを送信する。
1.6 ohara 490: */
491:
492: /*&ja
493:
1.12 ! ohara 494: 6. OX expression パーサ
1.6 ohara 495:
1.7 ohara 496: */
1.9 ohara 497: /*&en
498:
1.12 ! ohara 499: 6. Parser for OX expressions
1.9 ohara 500:
501: */
1.7 ohara 502: /*&ja
1.9 ohara 503: OpenXM C library には 文字列表現された OX expression および CMO
504: expression から、ox 構造体または cmo 構造体を生成するためのパーサが付
505: 属している。ここではこのパーサについて説明する。
506: */
507: /*&en
508: We have a parser which generate an OX object or a CMO from a string
509: encoded OX/CMO expression. In this section, we explain the parser.
510: */
511: /*&en
1.6 ohara 512:
1.12 ! ohara 513: 6.1 Setting an option
1.9 ohara 514: */
515: /*&ja
1.6 ohara 516:
1.12 ! ohara 517: 6.1 オプション
1.7 ohara 518: */
519: /*&common
1.9 ohara 520:
1.6 ohara 521: int setflag_parse(int flag);
522:
1.7 ohara 523: */
524: /*&ja
1.6 ohara 525: setflag_parse(PFLAG_ADDREV) によって、CMO の短縮表現を許す。
1.9 ohara 526: */
527: /*&en
528: We set an option for the parser. If we call
529: setflag_parse(PFLAG_ADDREV), then the parser admits external
530: expressios.
531: */
532: /*&en
1.6 ohara 533:
1.12 ! ohara 534: 6.2 Initializing
1.9 ohara 535: */
536: /*&ja
537:
1.12 ! ohara 538: 6.2 初期化
1.7 ohara 539: */
540: /*&common
1.9 ohara 541:
1.6 ohara 542: int init_parser(char *str);
543:
1.7 ohara 544: */
545: /*&ja
1.6 ohara 546: パーサが処理すべき文字列をセットする。
1.9 ohara 547: */
548: /*&en
549: We give the parser an OX/CMO expression, that is, a Lisp style string.
550: */
551: /*&en
1.6 ohara 552:
1.12 ! ohara 553: 6.3 Getting an object
1.9 ohara 554: */
555: /*&ja
556:
1.12 ! ohara 557: 6.3 結果を得る
1.7 ohara 558: */
559: /*&common
1.9 ohara 560:
1.6 ohara 561: cmo *parse();
562:
1.7 ohara 563: */
564: /*&ja
1.6 ohara 565: Lisp 表現による OX expression, CMO expression の構文解析器。あらかじめ
566: 設定された文字列を解析して ox 構造体、あるいは cmo 構造体を生成する。
567: */
1.9 ohara 568: /*&en
569: The parser returns an OX/CMO object. If the given string is illegal,
570: then the parser returns NULL.
571: */
1.6 ohara 572: /*&ja
573:
574: 7. 付属プログラムについて
575:
1.7 ohara 576: */
577: /*&en
578:
579: 7. Sample programs.
580:
581: */
582: /*&common
1.6 ohara 583: testclient
584:
1.7 ohara 585: */
586: /*&ja
1.6 ohara 587: テスト用の小さな OpenXM クライアント。OX expression を入力して送信する
588: ことのみ可能。SM_popCMO, SM_popString を含むメッセージを送信した場合に
589: は、サーバから送られてくるメッセージを表示する。
590:
1.7 ohara 591: */
592: /*&en
593: This is a small OpenXM client. We send an OX message by inputting an
594: OX expression and display data messages gotten from a server.
595:
596: */
597: /*&common
1.6 ohara 598: bconv
599:
1.7 ohara 600: */
601: /*&ja
1.6 ohara 602: バイトコードエンコーダ。OX expression あるいは CMO expression を入力す
603: ると、対応するバイト列を表示する。
604:
1.7 ohara 605: */
606: /*&en
607: A byte code encoder. It shows a byte stream which corresponds to an
608: OX expression.
609:
1.9 ohara 610: */
1.7 ohara 611: /*&common
1.6 ohara 612: ox_Xsample
613:
1.7 ohara 614: */
615: /*&ja
1.6 ohara 616: GUI 表示する OpenXM サーバのサンプル。
617:
618: */
1.8 ohara 619: /*&ja
620: 8. 付録
621:
622: 8.1 ox.c における関数の命名規則
623:
624: (1) receive_cmo 関数はCMOタグとデータ本体を受信する. この関数は CMOタ
625: グの値が事前に分からないときに使用する. 返り値として、cmo へのポインタ
626: を返す.
627: (2) receive_cmo_X 関数は, CMOタグを親の関数で受信してから呼び出される
628: 関数で、データ本体のみを受信し、cmo_X へのポインタを返す. しかも、関
629: 数内部で new_cmo_X 関数を呼び出す.
630: (3) send_cmo 関数はCMOタグとデータ本体を送信する.
631: (4) send_cmo_X 関数はCMOタグを親の関数で送信してから呼び出される関数で、
632: データ本体のみを送信する.
633: (5) ただし receive_ox_tag を除いて, receive_ox_X 関数は作らない.
634: receive_cmo を利用する.
635: (6) send_ox_X 関数は OX タグを含めて送信する.
636: (7) ox_X 関数は一連の送受信を含むより抽象的な操作を表現する. ox_X 関
637: 数は、第一引数として、ox_file_t型の変数 sv をとる.
638: (8) Y_cmo 関数と Y_cmo_X 関数の関係は次の通り:
639: まず Y_cmo 関数で cmo のタグを処理し、タグを除いた残りの部分をY_cmo_X
640: 関数が処理する. cmo の内部に cmo_Z へのポインタがあるときには、その種
641: 類によらずに Y_cmo 関数を呼び出す.
642:
643: */
644:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>