m_wtransform_layout() - ワイド文字ストリング (Bidi データ) のレイアウト変換

標準

標準/拡張機能 C/C++ 依存項目

ISO C
XPG4
C99

両方 z/OS V1R2

形式

#include <sys/layout.h>

int m_wtransform_layout(LayoutObject layout_object,
                        const wchar_t *InpBuf,
                        const size_t InpSize,
                        void *OutBuf,
                        size_t *Outsize,
                        size_t *InpToOut,
                        size_t *OutToInp,
                        unsigned char *Property,
                        size_t *InpBufIndex);

機能説明

m_wtransform_layout() 関数は、Visual (MVS™) と Implicit (z/OS® UNIX) フォーマット間のデータの双方向 (Bidi) 変換処理に対するサポートの一部を構成しています。初期サポートは、アラビア語とヘブライ語のデータ用です。

m_wtransform_layout() 関数は、レイアウト変換 (リオーダー、形状化、セル決定) を実行します。あるいは、次のような、レイアウト変換のために必要な追加情報を提供できます。
  • 変換後のレイアウトの予測サイズ
  • テキスト内のさまざまなセグメントのネスト・レベル
  • レイアウト変換前後の、対応するエレメントのロケーション間の相互参照

入力テキストと出力テキストは、どちらもワイド文字ストリングです。m_wtransform_layout() 関数は、InpBuf の入力テキストを、layout_object の現行レイアウト値に従って変換します。

値のタイプが LayoutTextDescriptor であるレイアウト値は、InpBuf および OutBuf 引数の属性を示しています。InpBufOutBuf の両方の属性が同じ場合は、その特定のレイアウト値については、NULL 変換が実行されます。

InpBuf 引数は、処理されるソース・テキストを指定します。InpBuf は、内部状態をリセットする必要がある場合を除いて、NULL にすることはできません。

InpSize 引数は、変換によって処理される InpBuf 内の文字数です。この値は、変換後も変わっていません。-1 に設定された InpSize は、InpBuf のテキストが NULL コード・エレメントによって区切られることを示します。InpSize が -1 に設定されていない場合は、入力バッファーに NULL エレメントを入れることができます。これは、例えば、NULL で分離した幾つかのストリングのワン・ショット 変換に使用できます。

この関数は、引数の設定によって、次のうちの 1 つ以上を出力します。
引数
説明
OutBuf
変換後のデータはすべて OutBuf に保管され、ShapeCharset に変換されます。
Outsize
OutBuf のワイド文字数。
InpToOut
InpBuf コード・エレメントから変換後データへの相互参照です。相互参照は、InpBufIndex が指す最初のエレメントから始まる、InpBuf 内のデータを参照します (必ずしも InpBuf の先頭から始まるわけではありません)。
OutToInp
変換後のデータから各 InpBuf コード・エレメントへの相互参照です。相互参照は、InpBufIndex が指す最初のエレメントから始まる、InpBuf 内のデータを参照します (必ずしも InpBuf の先頭から始まるわけではありません)。
Property
下記の説明のように、さまざまな意味を持つ、特殊な入力ストリング変換プロパティーを 表す重み付けされた値です。この引数は、NULL ポインターではない場合には、変換前のソース・サブストリング・テキストと同じ数のエレメントを持つ、値の配列を示します。

各バイトには、InpBufIndex が指すエレメントから始まる、InpBuf 内の対応するエレメントの、関連 Property 情報が入ります。

property バイトの右端の 4 ビットには、双方向環境の情報が入り (ActiveDirectional が True の場合)、NestingLevels を示します。0 ~ 15 の可能な値によって、InpBufIndex が指すエレメントから始まる、InpBuf 内の対応するエレメントのネスト・レベルを表します。ActiveDirectional が False の場合、NestingLevels ビットの内容は無視されます。

property バイトの左端のビットには、複合文字環境の新規セル・インディケーター が入ります。これは、新規セルの先頭に変換される InpBuf のエレメントについては値 1 に、ゼロ長 の複合文字エレメントが非複合文字と同じプレゼンテーション・セルにグループ化されるときには値 0 になります。この場合も、property の各エレメントは、InpBufIndex が指すエレメントから始まる、InpBuf 内のエレメントに対応しています (必ずしも、InpBuf の先頭ではない点を思い出してください)。

変換プロパティーが必要ない場合は、引数 Property を NULL にできます。

property の使用は、将来、他の環境の別の使用法に対応して拡張することができます。

InpBufIndex
変換されたテキストのロケーションに対するオフセット値です。m_wtransform_layout() が呼び出されたときには、InpBufIndex には、最初に変換される InpBuf 内のエレメントへのオフセットが入っています。(必ずしも、InpBuf の先頭のエレメントではない点に注意してください)。

変換が終わったときには、変換されなかった InpBuf 内の最初のエレメントへのオフセットが、InpBufIndex に入っています。サブストリング全体が正常に変換されると、InpBufIndex は、InpSize に定義された量だけ増分されます。

これらの各出力引数は、NULL にして、その特定の引数については出力が不要であることを指定できますが、意味のある作業を実行するためには、少なくとも 1 つの引数を非 NULL にする必要があります。

上記の可能な出力のほかに、layout_object は、変換関数の呼び出前後の方向状態を保持します。方向状態は、レイアウト値 TypeOfTextOrientation または ImplicitAlg のいずれかが、m_setvalues_layout() の呼び出しによって変更されるたびに、初期状態にリセットされます。

layout_object 引数は、m_create_layout() 関数から戻される LayoutObject を指定します。

OutBuf 引数は、変換後のデータを含みます。この引数を NULL ポインターとして指定し、変換データが不要であることを示すことができます。OutBuf 引数のエンコードは、layout_object に定義された ShapeCharset レイアウト値に左右されます。ActiveShapeEditing レイアウト値が設定されていない場合 (False)、OutBuf のエンコードは、layout_object に定義された LayoutObject に関連付けられたロケールのコード・セットと同じになることが保証されています。

入力時に、OutSize 引数によって出力バッファーのサイズをワイド文字の数で指定します。出力バッファーは、変換結果が十分に入る大きさにする必要があります。出力バッファーが小さいと、実行される変換は一部分だけになります。ActiveShapeEditing レイアウト値が設定されている場合 (True)、 OutBuf には、少なくとも InpSizeShapeCharsetSize を乗算した結果が入る大きさを割り振る必要があります。

OutSize
戻るときに、OutSize 引数は、OutBuf に入れられた実際のコード・エレメント数に更新されます。

OutSize 引数にゼロが指定されているときは、関数が、変換後のテキストが入る出力バッファーのサイズを計算し、その結果をこのフィールドに入れて戻します。InpBuf および OutBuf に指定されたバッファーの内容、および InpBufIndex の値は変更されません。

OutSize = NULL の場合、EINVAL エラー条件が戻されます。

InpToOut 引数は、NULL ポインターでない場合には、InpBufIndex が指す値から、バッファー内のサブストリングの最後までである、InpBuf と同じワイド文字数の値の配列を指します。

出力時には、InpToOut の n 番目の値が、InpBuf の n 番目のワイド文字に対応しています。この値は、InpBuf の n 番目のワイド文字にある、変換後の ShapeCharset エレメントを示す、OutBuf のインデックス (ワイド文字単位) です。

InpBuf から OutBuf へのインデックス配列が必要でなければ、InpToOut には NULL を指定できます。

OutToInp 引数は、NULL ポインターでない場合には、OutBuf に含まれるのと同じワイド文字数の値の配列を指します。出力時には、OutToInp の n 番目の値が、OutBuf の n 番目のワイド文字に対応しています。この値は、OutBuf の n 番目のバイトにある論理コード・エレメントを示す、InpBufIndex によって指されるワイド文字で始まる、InpBuf 内のインデックスです。

OutBuf から InpBuf へのインデックス配列が必要でなければ、OutToInp には NULL を指定できます。

コード・エレメントのリオーダーなしでテキスト・ストリングの形状化を実行するには、layout_object に、TEXT_VISUAL に設定された入出力レイアウト値 TypeOfText を設定し、Orientation のインとアウトの両方に同じ値を設定する必要があります。

戻り値

正常に実行された場合、m_wtransform_layout() は 0 を戻します。

正常に実行されなかった場合、m_wtransform_layout() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
E2BIG
OutBuf のサイズが小さすぎて、変換後テキストの全体が入りません。完了していない変換の最後の入力テキスト状態が、内部的に保管されます。
EBADF
レイアウト値の設定が意味のない組み合わせになっているか、レイアウト・オブジェクトが無効です。
EINVAL
入力バッファーの最後の不完全な複合シーケンスのために変換が停止したか、OutSize に NULL が入っています。

関連情報