以下の例は、次の z/OS 上の C 言語構造体のレイアウトを定義しています。
typedef struct { char char_val; unsigned short ushort_val; short short_val; unsigned long ulong_val; long long_val; char string_val[32]; } _test;
レイアウト XML ファイルの作成
以下に示すように、XML ファイル・フォーマットは、layout.dtd 文書タイプ定義 (DTD) ファイルの中に定義されます。
<?xml version="1.0" encoding="ISO-8859-1"?> <!ELEMENT LAYOUT (FIELD)+> <!ATTLIST LAYOUT Header CDATA #REQUIRED length CDATA #REQUIRED> <!ELEMENT FIELD (FIELD)*> <!ATTLIST FIELD Header CDATA #REQUIRED Type (16_BIT_INT|16_BIT_UINT|16_BIT_HINT|32_BIT_INT|32_BIT_UINT|32_BIT_HINT|32_BIT_FLOAT|64_BIT_INT|64_BIT_FLOAT|CHARACTER|HEX|ASCII|EBCDIC|STRUCTURE|PADDING|BIT|BITMASK|MAP) #REQUIRED length CDATA #REQUIRED layout CDATA #IMPLIED>
これは、XML レイアウト・ファイルが最初にヘッダー (タイトル) およびレイアウトの全長を指定し、それに続いて、ヘッダー (名前)、長さ、ならびにそのサブエレメントのデフォルト表記を決めるのに使用する基本的なタイプによって記述された、サブエレメント (FIELD) のリストを指定することを意味します。
以下のような特殊なサブエレメント・タイプもあります。
_test 構造体のツリー・ビューを記述していて、このフォーマットに準拠している XML ファイルは次のとおりです。
<?xml version="1.0"?> <!DOCTYPE LAYOUT SYSTEM "Layout.dtd" > <LAYOUT Header = "A Layout" length="17"> <FIELD Header = "char_val" Type = "CHARACTER" length = "1" > </FIELD> <FIELD Header = "ushort_val" Type = "16_BIT_UINT" length = "2" > </FIELD> <FIELD Header = "short_val" Type = "16_BIT_INT" length = "2" > </FIELD> <FIELD Header = "ulong_val" Type = "32_BIT_UINT" length = "4" > </FIELD> <FIELD Header = "long_val" Type = "32_BIT_INT" length = "4" > </FIELD> <FIELD Header = "string_val" Type = "ASCII" length = "32"> </FIELD> </LAYOUT>
パディング・フィールドの定義
long_val フィールドは無視するが、レイアウトの中に string_val タイプは表示したいと決めた場合、XML ファイルは次のようになります。
<FIELD Header = "short_val" Type = "16_BIT_INT" length = "2" > </FIELD> <FIELD Header = "ulong_val" Type = "32_BIT_UINT" length = "4" > </FIELD> <FIELD Header = "" Type = "PADDING" length = "4" > </FIELD> <FIELD Header = "string_val" Type = "ASCII" length = "32"> </FIELD>
PADDING サブエレメントを定義する所期の目的は、バイト位置合わせ構造体を処理するためです。 しかしそれはまた、レイアウトの中で詳細化する必要のないデータ域をスキップするためにも使用できます。
構造体の定義
以下の XML の一例は、ネストされた構造体をマップするための STRUCTURE フィールドの使用法を示しています。 構造体トップ・エレメントは、関連付けられた値をもちません。 それは、そのサブエレメントを示すために展開できます。 STRUCTURE フィールドの長さは XML レイアウトの合計サイズに加えられますが、インクルードされたフィールド・サイズについては、表示のためだけを意図しています。 例えば、以下の構造体は合計レイアウト・サイズの中の 344 バイトのみを意味します。
<FIELD Header = "MACHINE CHECK LOG OUT AREA" Type = "STRUCTURE" length = "344" > <FIELD Header="reserved" Type="HEX" length="16"></FIELD> <FIELD Header="FLCSID" Type="HEX" length="4"></FIELD> <FIELD Header="FLCIOFP" Type="HEX" length="4"></FIELD> <FIELD Header="reserved" Type="HEX" length="20"></FIELD> <FIELD Header="FLCESAR" Type="HEX" length="4"></FIELD> <FIELD Header="FLCCTSA" Type="HEX" length="8"></FIELD> <FIELD Header="FLCCCSA" Type="HEX" length="8"></FIELD> <FIELD Header="FLCMCIC" Type="HEX" length="8"></FIELD> <FIELD Header="reserved" Type="HEX" length="8"></FIELD> <FIELD Header="FLCFSA" Type="HEX" length="4"></FIELD> <FIELD Header="reserved" Type="HEX" length="4"></FIELD> <FIELD Header="FLCFLA" Type="HEX" length="16"></FIELD> <FIELD Header="FLCRV110" Type="HEX" length="16"></FIELD> <FIELD Header="FLCARSAV" Type="STRUCTURE"length="64"> <FIELD Header="AR0" Type="HEX" length="4"></FIELD> <FIELD Header="AR1" Type="HEX" length="4"></FIELD> <FIELD Header="AR2" Type="HEX" length="4"></FIELD> <FIELD Header="AR3" Type="HEX" length="4"></FIELD> <FIELD Header="AR4" Type="HEX" length="4"></FIELD> <FIELD Header="AR5" Type="HEX" length="4"></FIELD> <FIELD Header="AR6" Type="HEX" length="4"></FIELD> <FIELD Header="AR7" Type="HEX" length="4"></FIELD> <FIELD Header="AR8" Type="HEX" length="4"></FIELD> <FIELD Header="AR9" Type="HEX" length="4"></FIELD> <FIELD Header="AR10" Type="HEX" length="4"></FIELD> <FIELD Header="AR11" Type="HEX" length="4"></FIELD> <FIELD Header="AR12" Type="HEX" length="4"></FIELD> <FIELD Header="AR13" Type="HEX" length="4"></FIELD> <FIELD Header="AR14" Type="HEX" length="4"></FIELD> <FIELD Header="AR15" Type="HEX" length="4"></FIELD> </FIELD> <FIELD Header="FLCFPSAV" Type="HEX" length="32"></FIELD> <FIELD Header="" Type="PADDING" length="64"></FIELD> <FIELD Header="" Type="PADDING" length="64"></FIELD> </FIELD>
ビット・マスク・フィールドの定義
以下の XML の一例は、BITMASK フィールドを記述しているサンプルです。 BITMASK の長さはバイト数で指定されます。 それには、長さがビット数で指定される BIT フィールドのセットが含まれます。 BIT フィールドに対して表示されるオフセットは、BITMASK フィールド内のビット・オフセットです。 ビット・マスク・フィールドの長さは XML レイアウトの合計サイズに加えられるが、個別の BIT フィールド・サイズについては、表示のためだけを意図しています。
<FIELD Header="byte_field" Type="BITMASK"length="2"> <FIELD Header="hi_byte" Type="BIT" length="8"></FIELD> <FIELD Header="lo_byte" Type="BIT" length="8"></FIELD> </FIELD>
ネストされたレイアウトの定義
MAP フィールド・タイプおよびオプション・レイアウト・フィールドを一緒に使用すれば、以下の z/OS DSA レイアウトの例のように、ネストされたレイアウトを記述できます。
<?xml version="1.0"?> <!DOCTYPE LAYOUT SYSTEM "Layout.dtd" > <LAYOUT Header = "DSA" length="72"> <FIELD Header = "FLAGS" Type = "HEX" length = "2"></FIELD> <FIELD Header = "junk" Type = "HEX" length = "2"></FIELD> <FIELD Header = "Back Chain" Type = "MAP" length = "4"layout="dsa.xml" ></FIELD> <FIELD Header = "Forward Chain" Type = "MAP" length ="4" layout="dsa.xml" ></FIELD> <FIELD Header = "R14" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R15" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R0" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R1" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R2" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R3" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R4" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R5" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R6" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R7" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R8" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R9" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R10" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R11" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R12" Type = "HEX" length = "4"></FIELD> </LAYOUT>
この適格な XML レイアウトは、DSA.XML と呼ばれるファイルに保管されます。 お気付きのように、フィールド 3 および 4 には異なる DSA 構造体を指すポインターが入っているので、2 つのネストされたレイアウト定義を追加することになります。