ONC+ 開発ガイド

配列変換サンプルプログラム 3

main に対するよく知られた引数 argcargv を持つ構造体を作成し、その構造体の配列にコマンドヒストリを保存することができます。構造体の宣言と、その XDR ルーチンは 例 A-9 のようになります。


例 A-9 配列変換のサンプルプログラム 3

struct cmd {
 	u_int c_argc;
 	char **c_argv;
};
#define ALEN 1000           /* argc は 1000 以下 */
 #define NARGC 100          /* 各コマンドの args は 100 以下 */
 
struct history {
 	u_int h_len;
 	struct cmd *h_cmds;
};
#define NCMDS 75            /* ヒストリは 75 コマンドまで */
bool_t
xdr_wrapstring(xdrs, sp)
 
 	XDR *xdrs;
 	char **sp;
{
 	return(xdr_string(xdrs, sp, ALEN));
 }
 
bool_t
xdr_cmd(xdrs, cp)
 
 	XDR *xdrs;
 	struct cmd *cp;
{
 	return(xdr_array(xdrs, &cp->c_argv, &cp->c_argc, NARGC,
 	        sizeof (char *), xdr_wrapstring));
}
bool_t
xdr_history(xdrs, hp)
 
 	XDR *xdrs;
 	struct history *hp;
{
 	return(xdr_array(xdrs, &hp->h_cmds, &hp->h_len, NCMDS,
 	        sizeof (struct cmd), xdr_cmd));
}

このプログラムで最もむずかしいのは、xdr_string() を呼び出すためのルーチン xdr_wrapstring() が必要な点です。xdr_array() が配列要素記述ルーチンを呼び出すときは引数が 2 つしか渡されないため、xdr_string() の第 3 引数を提供するルーチン xdr_wrapstring() が必要になります。

これまでの説明で XDR ライブラリの再帰的性質が明らかになりました。その他の合成データ型の変換も見てみましょう。