Annotation of OpenXM/doc/OpenXM-specs/stackmachine.tex, Revision 1.1.1.1
1.1 noro 1: %% $OpenXM$
2: //&jp \section{ OX スタックマシン }
3: //&eg \section{ OX stackmachine } (This section has not yet been translated.)
4:
5: /*&jp
6: この節では, OX スタックマシン operator の説明
7: (TCP/IP ソケット上での標準 encoding 法 を用いる),
8: および, サンプルサーバとリンクする場合または
9: open XM ライブラリとしてリンクして使用する場合の
10: ための C の関数の仕様を説明する.
11:
12: 説明の前に, OX サーバスタックマシンの動作の原則を
13: 説明しておく.
14: サーバスタックマシンは,
15: {\tt SM\_pop*} 系のスタックマシンコマンドがこないかぎり,
16: 自発的にメッセージを送信することはない.
17: この原則に基づいて分散計算のプログラミングをおこなう.
18: イベントドリブンなプログラム法とはちがうことに
19: 注意しよう.
20:
21:
22: \subsection{サーバスタックマシン }
23:
24: サンプルサーバである {\tt oxserver00.c}
25: は以下の仕様の C の関数を用意して,
26: {\tt nullstackmachine.c } を置き換えれば一応動作するはずである.
27:
28:
29: \noindent
30: \subsubsection{サーバスタックマシンのグループ SMobject/Basic0
31: に属するオペレータ}
32:
33:
34: \noindent
35: サーバスタックマシンは最低で1本のスタック
36: \begin{verbatim}
37: Object xxx_OperandStack[SIZE];
38: \end{verbatim}
39: をもつ.
40: ここで, {\tt Object} はそのシステム固有の Object 型で構わない.
41: CMObject は各サーバ固有のローカルオブジェクトに変換して
42: スタックへプッシュしてよい.
43: ただし変換, 逆変換を合成したものは恒等写像であることがのぞましい.
44: CMObject をどのように (local) Object に変換するか,
45: Object が受け付けるメッセージの定義は,
46: 各システムが独自にきめて文書化しておくものとする.
47: つまりすべてのメッセージは, private である.
48: たとえば, {\tt add } のような基本的な メッセージにたいしても,
49: OX スタックマシンはなにもきめていない.
50: 将来的には open math \cite{openmath} のように
51: CMObject に対する最大公約数的なメッセージの仕様を
52: content dictionary (CD) の形で定義したい.
53:
54:
55: 以下, \verb+ xxx_ + は誤解の恐れがないときは省略する.
56: \verb+ xxx_ + は local サーバシステムに固有の識別子である.
57: {\tt Asir} の場合は \verb+ Asir_ + を用いる.
58: {\tt kan/sm1} の場合は \verb+ Sm1_ + を用いる.
59: 関数名, タグ名は長いので省略形を用いてもよい.
60:
61: 以下では次のようにパケットを記述する.
62: 各フィールドは,
63: \fbox{データ型 \quad データ} なる形式で書く.
64: たとえば,
65: {\tt int32 OX\_DATA}
66: は 32 bit network byte order の数字 {\tt OX\_DATA}
67: という意味である.
68: ``イタリックで書かれているフィールドは,
69: 定義が別のところでなされているか解釈に誤解のないような自然言語
70: で説明されている object を表す.''
71: たとえば,
72: {\it String commandName}
73: は, String データ型の local object {\it commandName}
74: を意味する.
75: (サーバスタックマシン上の object は, CMO 形式の object
76: とは限らないことに注意.
77: CMO 形式で書いてあっても, それはサーバスタックマシンの
78: local 形式でスタック上にあると解釈して下さい.)
79:
80: すべてのサーバスタックマシンは
81: 以下の関数を実装していないといけない.
82: \begin{enumerate}
83:
84: \item
85: CMObject/Basic0 の CMO データのうち必須のもの,
86: {\tt CMO\_ERROR2}, {\tt CMO\_NULL}, {\tt CMO\_INT32},
87: {\tt CMO\_STRING}, {\tt CMO\_LIST}
88: がおくられて来た場合
89: それをスタックに push する.
90: たとえば, {\tt CMO\_NULL} の場合次のようになる.
91: \\ Request:
92: \begin{tabular}{|c|c|} \hline
93: {\tt int32 OX\_DATA} & {\tt int32 CMO\_NULL} \\
94: \hline
95: \end{tabular}
96: \\ Stack after the request:
97: \begin{tabular}{|c|} \hline
98: {\it NULL} \\
99: \hline
100: \end{tabular}
101: \\ Result: なし.
102:
103: たとえば, {\tt CMO\_String} の場合次のようになる.
104: \\ Request:
105: \begin{tabular}{|c|c|c|c|c|c|} \hline
106: {\tt int32 OX\_DATA} & {\tt int32 CMO\_String} &{\tt int32} {\rm size}
107: &{\tt byte} {\rm s1} & $\cdots$ &{\tt byte} {\rm ssize}\\
108: \hline
109: \end{tabular}
110: \\ Stack after the request:
111: \begin{tabular}{|c|} \hline
112: {\it String s} \\
113: \hline
114: \end{tabular}
115: \\ Result: なし.
116:
117: CMO データの受け取りに失敗した時のみ \\
118: \begin{tabular}{|c|c|c|} \hline
119: {\tt int32 OX\_DATA} & {\tt int32 CMO\_ERROR2} & {\it CMObject} ob\\
120: \hline
121: \end{tabular}
122: \\
123: をスタックへ push する.
124: 現在のところ, ob には, \\
125: \centerline{
126: [{\sl Integer32} OX パケット番号, {\sl Integer32} エラー番号,
127: {\sl CMObject} optional 情報]
128: }
129: なるリストを入れる (CMO 形式でかいてあるが, これはサーバ独自の形式でよい.
130: CMO として送出されるときこのような形式でないといけないという意味である.)
131:
132:
133:
134: \item
135: \begin{verbatim}
136: void *xxx_mathCap()
137: \end{verbatim}
138: このサーバの mathcap をもどす (termcap のまね).
139: サーバのタイプ, サーバスタックマシンの能力を知ることができる.
140: C 言語で実装する場合は, mathCap の構造体をシステム毎にきめるものとし,
141: この関数はその構造体へのポインタを戻す.
142: (open sm1 では {\tt struct mathCap} を用いている.
143: @plugin/mathcap.h)
144: \\ Request:
145: \begin{tabular}{|c|c|} \hline
146: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_mathcap} \\
147: \hline
148: \end{tabular}
149: \\ Result:
150: \begin{tabular}{|c|c|} \hline
151: {\tt int32 OX\_DATA} & {\sl Mathcap} mathCapOb \\
152: \hline
153: \end{tabular}
154:
155: \item
156: \begin{verbatim}
157: xxx_setMathCap(void *m)
158: \end{verbatim}
159: 受け取った Mathcap {\tt m} を
160: 自分のシステムに設定して, 相手側が理解不能な CMO をおくらないように
161: する.
162: C 言語で実装する場合は, mathCap の構造体をシステム毎にきめるものとし,
163: この関数はその構造体へのポインタを引数とする.
164: (open sm1 では {\tt struct mathCap} を用いている.
165: @plugin/mathcap.h)
166: \\ Request:
167: \begin{tabular}{|c|c|} \hline
168: {\tt int32 OX\_DATA} & {\sl Mathcap} m \\ \hline
169: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setMathCap} \\
170: \hline
171: \end{tabular}
172: \\ Result: なし. \\
173: 注意: mathcap は一般にクライアント主体で設定する.
174: クライアントがサーバに {\tt SM\_mathcap} をおくり,
175: サーバ側の mathcap を得る.
176: それを, クライアントはそのサーバに付随した mathcap として
177: 設定する.
178: 次に, クライアントはサーバに自分の mathcap を
179: {\tt SM\_setMathCap} でおくり, 自分の mathcap を設定させる.
180:
181:
182: \item
183: \begin{verbatim}
184: int xxx_executeStringByLocalParser(char *s)
185: \end{verbatim}
186: 文字列 $s$ をシステム xxx の文法(サーバスタックマシンの組み込みローカル
187: 言語)にしたがったコマンドとして実行する.
188: ただし, コマンドの実行の結果の最後に戻り値があるときは,
189: {\tt OperandStack} に戻り値を push する.
190: 正常終了なら 0 を, 異常終了なら -1 をもどす.
191: debug モードにはいった場合, -2 を戻す.
192: エラーの時 Error2 Object
193: を stack へ push する.\\
194: {\tt kan/sm1} の場合, サーバスタックマシンの組み込みローカル言語は
195: {\tt sm1} ポストスクリプト言語である.
196: サーバスタックマシンと, {\tt sm1} ポストスクリプト言語はスタックを
197: 共有するように実装されている.
198: 実際の計算は
199: {\tt executeStringByLocalParser} により実行される.
200: open XM では, 現在のところ関数名の標準化はおこなっていない.
201: したがって, 実際の計算コマンドの送出は mathcap をみてクライアントが
202: 正しいコマンドを選択する必要がある.
203: (しかしながら, 共通関数名がないために, 共通仕様のサーバスタックマシンの
204: 実装はきわめて簡単である. 関数名の共通化は将来の課題.) \\
205: 割込みに関しては, -1 を戻すように ハンドラを書く.
206: executeStringByLocalParser() を再帰的に呼んだときも 割り込みのハンドラが
207: 正しく動作するようにこの関数は書かれるべきである.
208: この関数を呼び出したのち, signal, setjmp の再設定を呼び出し側でやらないと
209: いけない. \\
210: この関数および {\tt popString} の機能を実現すれば, 最低限の
211: open XM のサーバになれる. 実装では, まずこの二つの関数の機能を
212: 実現すべきである.
213: \\ Stack before the request:
214: \\
215: \begin{tabular}{|c|} \hline
216: {\it String commandString} \\
217: \hline
218: \end{tabular}
219: \\Request:
220: \begin{tabular}{|c|c|} \hline
221: {\tt int32 OX\_COMMAND}& {\tt int32 SM\_executeStringByLocalParser} \\
222: \hline
223: \end{tabular}
224: \\ Result: なし.
225: \\ 参考: \ 実行前のスタックのデータは,
226: {\it String commandString} なる local stackmachine の object として
227: スタック上にあるが, TCP/IP の通信路では, 次のようなデータがまずながれて
228: {\it commandName} がスタックに push される:
229: \\
230: \begin{tabular}{|c|c|c|} \hline
231: {\tt int32 OX\_DATA} & {\tt int32 CMO\_string} & {\it size and the string commandString} \\
232: \hline
233: \end{tabular}
234:
235: \item
236: \begin{verbatim}
237: int xxx_executeStringByLocalParserInBatchMode(char *s)
238: \end{verbatim}
239: スタックに副作用がない(スタックにたいしてなんの操作もしない)
240: ことを除き上とまったく同じ関数である.
241: エラーの時のみ, Error2 Object をスタックへプッシュする.
242:
243: \item
244: \begin{verbatim}
245: char *xxx_popString(void)
246: void xxx_popString(ox_stream out)
247: \end{verbatim}
248: 最初の関数はライブラリとしてリンクして使用する場合の関数である.
249: {\tt OperandStack} より Object を pop し, それを xxx の出力
250: 規則にしたがい文字列型に変換して戻す.
251: スタックが空のときは, {\tt (char *)NULL} を戻す.
252: 呼出側の関数は, 戻り値のメモリー領域を操作してはいけない.
253: また, 再度 サーバスタックマシンが呼ばれたときは, 戻り値のメモリ領域
254: は変更されているかもしれない.
255:
256: 2 番目の関数は, TCP/IP を用いて通信する場合の関数である.
257: 変換されてでてきた文字列を値として返すのではなく,
258: {\tt ox\_stream out}
259: へ CMO のデータとして送信する.
260: エラーの場合は {\tt CMO\_ERROR2} を戻すべきである.
261: \\ Stack before the request:
262: \begin{tabular}{|c|} \hline
263: {\it Object} \\
264: \hline
265: \end{tabular}
266: \\ Request:
267: \begin{tabular}{|c|c|} \hline
268: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_popString} \\
269: \hline
270: \end{tabular}
271: \\ Result:
272: \begin{tabular}{|c|c|c|} \hline
273: {\tt int32 OX\_DATA} & {\tt int32 CMO\_STRING} & {\it size and the string s} \\
274: \hline
275: \end{tabular}
276:
277: \item
278: \begin{verbatim}
279: int xxx_getsp(void)
280: \end{verbatim}
281: 現在のスタックポインタの位置をもどす.
282: スタート時点での位置は 0 であり, object が push されたばあい,
283: 1 づつ増えるものとする.
284: \\ Stack before the request:
285: \begin{tabular}{|c|} \hline
286: {\it Object} \\
287: \hline
288: \end{tabular}
289: \\ Request:
290: \begin{tabular}{|c|c|} \hline
291: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_getsp} \\
292: \hline
293: \end{tabular}
294: \\ Result:
295: \begin{tabular}{|c|c|c|} \hline
296: {\tt int32 OX\_DATA} & {\tt int32 CMO\_INT32} & {\it stack pointer value} \\
297: \hline
298: \end{tabular}
299:
300: \item
301: \begin{verbatim}
302: object xxx_dupErrors(void)
303: \end{verbatim}
304: スタック上のエラーオブジェクトをリストにして戻す.
305: スタック自体は変化させない.
306: \\ Stack before the request:
307: \begin{tabular}{|c|} \hline
308: {\it Object} \\
309: \hline
310: \end{tabular}
311: \\ Request:
312: \begin{tabular}{|c|c|} \hline
313: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_dupErrors} \\
314: \hline
315: \end{tabular}
316: \\ Result:
317: \begin{tabular}{|c|c|c|} \hline
318: {\tt int32 OX\_DATA} & {\sl CMObject} \ a list of errors\\
319: \hline
320: \end{tabular}
321:
322: \item
323: \begin{verbatim}
324: int xxx_start()
325: \end{verbatim}
326: xxx の初期化をおこなう.
327:
328: \end{enumerate}
329:
330: \noindent
331: {\bf 例}: \
332: 次は, 標準入力よりの入力を asir に送り評価した結果を表示するプログラム
333: である.
334: \begin{verbatim}
335: #include <stdio.h>
336:
337: main() {
338: char tmp[1024];
339: Asir_start();
340: while (gets(tmp) != NULL) {
341: if (Asir_executeStringByLocalParser(tmp) != 0) {
342: printf("%s\n",Asir_popString());
343: }
344: }
345: }
346:
347: \end{verbatim}
348:
349: \medbreak
350: \noindent
351: {\bf 例}: \
352: mathcap の問い合わせに対して, {\tt ox\_sm1} は次のように答える.
353: %%Prog: [(cmoMathCap)] extension ::
354: \begin{verbatim}
355: Class.mathcap
356: [ [199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.990911$ ,
357: $HOSTTYPE=i386$ ] ,
358: [262 , 263 , 264 , 265 , 266 , 268 , 269 , 272 , 273 , 275 , 276 ] ,
359: [[514] , [2130706434 , 1 , 2 , 4 , 5 , 17 , 19 , 20 , 22 , 23 , 24 ,
360: 25 , 26 , 30 , 31 , 60 , 61 , 27 , 33 , 40 , 34 ]]]
361: \end{verbatim}
362:
363: mathcap は 3つの要素をもつリストである.
364: まづ, 最初の要素を見よう.
365: Ox\_system は open xxx システム名である.
366: 読み込むライブラリがちがっていて, 関数名(または シンボル)の意味がちがうときは
367: この名前もかえる.
368: たとえば, open math の basic content dictionary 対応の関数定義マクロを
369: 読みこんだ sm1 は,
370: ox\_sm1\_basicCD なる名前にする.
371: HOSTTYPE値は, CPU の種類をあらわし
372: unix では環境変数\verb+$HOSTTYPE+ の値である.
373: 2 番目の要素は 利用可能な SM コマンドをあつめたリストである.
374: 3 番目のリストは, 処理可能な数学データの形式, およびCMOの場合なら
375: 処理可能なCMOのタグのリストが続く.
376: 上の例では, 514 は {\tt OX\_DATA} をあらわし, 数学データのフォマットは
377: (サイズ情報なしの) CMO であることを示す.
378:
379:
380: \medbreak
381: \noindent
382: {\bf 例}: \
383: %%Prog: (ox.sm1) run sm1connectr [(oxWatch) ox.ccc] extension
384: %%Prog: ox.ccc (122345; ) oxsubmit ;
385: {\tt message\_body} の実例をあげる. シリアル番号部は除いてある.
386: \begin{enumerate}
387: \item {\tt executeStringByLocalParser("12345 ;");}
388: は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす.
389: {\tt xx(yy)} のなかの {\tt (yy)} は対応するアスキーコードをあわらす.
390: \begin{verbatim}
391: 0 0 2 2 0 0 0 4 0 0 0 7
392: 31(1) 32(2) 33(3) 34(4) 35(5) 20 3b(;)
393: 0 0 2 1 0 0 1 c
394: \end{verbatim}
395: ここで,
396: \verb+ 0 0 2 2 0 0 0 4 + は, network byte order で,
397: 順番に {\tt OX\_DATA} それから,
398: CMO のタグの, {\tt CMO\_STRING} を表す.
399: \verb+ 0 0 0 7 + は文字数,
400: 最後に 文字列 {\tt 12345 ;} が来る.
401: ここで, \verb+ 0 0 1 c + は, network byte order で,
402: {\tt OX\_executeString} を表す.
403:
404: まとめると次のようになる.
405: \begin{verbatim}
406: 0 0 2 2 (OX_DATA) 0 0 0 4 (CMO_STRING)
407: 0 0 0 7 (size)
408: 31(1) 32(2) 33(3) 34(4) 35(5) 20 3b(;) (data)
409: 0 0 2 1 (OX_COMMAND)
410: 0 0 1 c (SM_executeStringByLocalParser)
411: \end{verbatim}
412: これを OXexpression で表記すると次のようになる.
413: \begin{center}
414: (OX\_DATA, (CMO\_STRING, 7, "12345 ;"))
415: \end{center}
416: \begin{center}
417: (OX\_COMMAND, (SM\_executeStringByLocalParser))
418: \end{center}
419:
420: \item {\tt popString()} を要請するメッセージ:
421: \begin{verbatim}
422: 0 0 2 1 (OX_COMMAND)
423: 0 0 1 7 (SM_popString)
424: \end{verbatim}
425: OXexpression では
426: (OX\_COMMAND, (SM\_popString)).
427:
428: \noindent
429: これにたいして次の返答メッセージがくる.
430: \begin{verbatim}
431: 0 0 2 2 (OX_DATA)
432: 0 0 0 4 (CMO_STRING) 0 0 0 5 (size)
433: 31(1) 32(2) 33(3) 34(4) 35(5)
434: \end{verbatim}
435: OXexpression でかくと,
436: (OX\_DATA, (CMO\_STRING, 7, "12345 ;")).
437:
438:
439:
440: \end{enumerate}
441:
442: \subsubsection{グループ SMobject/Basic1 に属するオペレータ}
443:
444:
445: \begin{enumerate}
446:
447: \item
448: \begin{verbatim}
449: void xxx_pops(int n)
450: \end{verbatim}
451: operand stack より, {\it n} 個の元
452: ({\it obj1, obj2, $\ldots$, objn}) を pop して捨てる.
453: \\ Stack before the request: (右が stack のトップである.) \\
454: \begin{tabular}{|c|c|c|c|c|} \hline
455: {\it obj1} & {\it obj2} & $\cdots$ & {\it objn} &{\it INT32 n} \\
456: \hline
457: \end{tabular}
458: \\ Request:
459: \begin{tabular}{|c|c|} \hline
460: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_pops } \\
461: \hline
462: \end{tabular}
463: \\ Result: なし.
464:
465:
466: \item
467: \begin{verbatim}
468: int xxx_setName(char *name)
469: \end{verbatim}
470: (これは本当に必要な関数??)
471: {\tt OperandStack} より {\it name} を pop し, つぎに
472: {\tt OperandStack} より {\it obj} を pop し, それを
473: 現在の名前空間で変数 {\it name} に bind する.
474: 正常終了なら 0 を, 異常終了なら -1 をもどす.
475: TCP/IP による通信では, 異常終了の時のみ, {\tt CMO\_ERROR2} を
476: stack へ push する.
477: \\ Stack before the request: (右が stack の top.)
478: \begin{tabular}{|c|c|} \hline
479: {\it obj} & {\it String name} \\
480: \hline
481: \end{tabular}
482: \\ Request:
483: \begin{tabular}{|c|c|} \hline
484: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setName} \\
485: \hline
486: \end{tabular}
487: \\ Result: なし.
488:
489: \item
490: \begin{verbatim}
491: int xxx_evalName(char *name)
492: \end{verbatim}
493: (これは本当に必要な関数??)
494: 現在の名前空間で変数 {\it name} を評価する.
495: 評価の結果 {\it resultObj} をスタックへ戻す.
496: 関数自体は正常終了なら 0 を, 異常終了なら -1 をもどす.
497: TCP/IP の場合, 異常終了の場合のみ {\tt CMO\_ERROR2} を stack へ push する.
498: \\ Stack before the request: (右が stack の top.)
499: \begin{tabular}{|c|} \hline
500: {\it String name} \\
501: \hline
502: \end{tabular}
503: \\ Request:
504: \begin{tabular}{|c|c|} \hline
505: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_evalName} \\
506: \hline
507: \end{tabular}
508: \\ Stack after the request: (右が stack の top.)
509: \begin{tabular}{|c|} \hline
510: {\it resultObj} \\
511: \hline
512: \end{tabular}
513: \\ Result: なし.
514:
515: \item
516: \begin{verbatim}
517: int xxx_executeFunction(char *s, int n)
518: \end{verbatim}
519: スタックより {\it n} 個のデータを pop して, サーバのローカル関数
520: {\it s} を実行する.
521: エラーのときのみ {\tt CMO\_ERROR2} を stack へ push する.
522: \\ Stack before the request: (右が stack の top.) \\
523: \begin{tabular}{|c|c|c|c|c|} \hline
524: {\it objn} & $\cdots$ & {\it obj1} & {\it INT32 n} & {\it String s} \\
525: \hline
526: \end{tabular}
527: \\ Request:
528: \begin{tabular}{|c|c|} \hline
529: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_executeFunction} \\
530: \hline
531: \end{tabular}
532: \\ Stack after the request:
533: 関数実行の結果.
534: \\ Result: なし.
535:
536:
537:
538:
539:
540: \item
541: \begin{verbatim}
542: bytes *xxx_popSerializedLocalObject(void)
543: void popSerializedLocalObject(ox_stream out)
544: \end{verbatim}
545: 最初の関数はライブラリとしてリンクして使用するための関数である.
546: スタックより pop した object を local 形式の serialization して
547: byte 列で戻す.
548: 2 番目の関数は Socket で通信するための同機能の関数であり,
549: serialization された byte 列を
550: {\tt ox\_stream out} へ出力する.
551: この場合,
552: header
553: {\tt int32 OX\_DATA}, {\tt int32 CMO\_LOCAL\_OBJECT}
554: をつけてから, byte 列を送る.
555: この関数はおもに, homogeneous な分散システムで用いる.
556: 次に, サーバスタックマシンの関数が実行されるまでは,
557: 戻り object の内容は保証されないといけない.
558:
559: \item
560: local serialized object, および サポートする CMO object を
561: {\tt OX\_DATA} として受信した場合, {\tt OperandStack} へ
562: push する.
563: 受信エラーを起こしたときのみ, {\tt CMO\_ERROR2} を stack へ push する.
564:
565:
566: \item
567: \begin{verbatim}
568: bytes *xxx_popCMO(void)
569: void xxx_popCMO(ox_stream out)
570: \end{verbatim}
571:
572: 最初の関数はライブラリとしてリンクして使用するための関数である.
573: {\tt OperandStack} より object を pop し CMO 形式の
574: serialized object を byte 列として戻す.
575: 2 番目の関数は Socket で通信するための同機能の関数であり,
576: {\tt ox\_stream out } へ, そのデータを header
577: {\tt OX\_DATA} をつけてながす.
578: この関数はおもに, heterotic な分散システムで用いる.
579: 次に, サーバスタックマシンの関数が実行されるまでは,
580: 戻り object の内容は保証されないといけない.
581: \\ Request:
582: \begin{tabular}{|c|c|} \hline
583: {\tt int32 OX\_COMMAND} & {\tt int32 OX\_popCMO} \\
584: \hline
585: \end{tabular}
586: \\ Result:
587: \begin{tabular}{|c|c|} \hline
588: {\tt int32 OX\_DATA} & {\it Serialized CMO} \\
589: \hline
590: \end{tabular}
591:
592: 以下で, {\tt ox\_stream} はサンプルサーバの場合,
593: \begin{verbatim}
594: typedef FILE2 * ox_stream;
595: \end{verbatim}
596: である (cf. {\tt file2.h}). これは処理系によりちがってよい.
597: {\tt ox\_asir} では, {\tt FILE *} を用いている.
598:
599: \end{enumerate}
600:
601: */
602:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>