表1
Oracle Tuxedo ATMI FML関数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16ビットFMLバッファと32ビットFMLバッファの間の変換
|
|
|
|
FLD_STRING型の値を変換し、バッファに追加
|
|
|
|
|
|
|
|
|
|
|
|
|
|
フィールド・オカレンスの変更 - 呼出し側は、文字列を提供
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
フォーマットされた出力からフィールド化バッファを作成
|
|
|
|
バッファにあるフィールドの最後のオカレンスの値を検索
|
|
|
|
|
|
|
|
|
|
|
|
|
|
領域の割り当て、およびフィールド・オカレンスのコピーの取得
|
|
|
|
|
|
malloc()で領域を割り当て、変換された値を取得する
|
|
|
|
|
|
バッファがフィールド化されている場合は、 trueを返す
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
エンコーディング名およびマルチバイト・データ情報を準備する
|
|
エンコーディング名およびマルチバイト・データ情報を抽出する
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
フィールド・オカレンスがバッファにある場合はtrueを返す
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C構造体からターゲットのレコード・タイプに変換、およびその逆の変換
|
|
|
|
FML32型付きバッファにあるFLD_MBSTRINGフィールドのマルチバイト文字を、ターゲットの名前付きのエンコーディングに変換する
|
|
VIEW32型付きバッファにあるMBSTRINGフィールドのマルチバイト文字を、ターゲットの名前付きのエンコーディングに変換する
|
���#include <fml.h>���
���#include <fml32.h>���
FMLは、フィールド化バッファと呼ばれる記録構造を定義、操作する一連のC言語関数で、フィールド化バッファにはフィールドと呼ばれる属性と値の対が含まれます。属性はフィールドの識別子であり、対応する値はフィールドのデータ内容を表します。
フィールド化バッファを使用すると、関連したフィールドのセットを名前でアクセスできるので、協調動作するプロセス間でパラメータ化されたデータを受け渡す場合に便利です。他のプロセスとコミュニケートする必要のあるプログラムは、FMLソフトウェアを使用し、フィールドを含む構造体を意識せずにフィールドへのアクセスが可能です。
FMLはまた、
VIEWSと呼ばれる、フィールド化バッファをC構造体にマップする(その逆も可能)機能も提供します。
VIEWSでは、フィールド化バッファではなく構造体において時間のかかるデータの処理を実行できます。データを処理するために構造体に転送すると、アプリケーションの実行速度が向上します。このように、
VIEWSを使用すると、フィールド化バッファのデータ独立性と従来のレコード構造の効率性、簡便性をともに享受することができます。
FMLには2つのサイズがあります。オリジナルのFMLインタフェースは、フィールド長に16ビットの値を使用して、フィールドを識別する情報を格納します。このマニュアル・ページでは、これらをFML16と呼びます。FML16では、一意のフィールド数は8191、個々のフィールド長は最大64Kバイト、フィールド化バッファの総容量は64Kに制限されます。このインタフェースの定義、型、および関数のプロトタイプは
fml.hに定義され、FML16インタフェースを使用するアプリケーション・プログラムは、このファイルをインクルードする必要があります。各関数は、
-lfmlにあります。FML32は、フィールド長と識別子に32ビットの値を使用します。約3千万のフィールド、約20億バイトのフィールド長およびバッファ長が使用できます。FML32の定義、型、および関数のプロトタイプは、
fml32.h内にあります。各関数は、
-lfml32にあります。FML32のすべての定義、型、および関数名には「32」という接尾辞が付きます(たとえば、
MAXFBLEN32、
FLDID32、
Fchg32)。また、環境変数にも接頭辞 “32"が付きます(
FLDTBLDIR32、
FIELDTBLS32、
VIEWFILES32、
VIEWDIR32など)。
フィールド化バッファは、フィールド識別子とフィールド値の対(
long, shortなど固定長フィールドの場合)、またはフィールド識別子、フィールド長、フィールド値の三揃い(可変長フィールドの場合)で構成されます。
フィールド識別子は、フィールド化バッファ内の個別のデータに付加されるタグです。フィールド識別子は、フィールド番号の名前およびフィールド内のデータの型で構成されます。フィールド番号はFML16では1 - 8191の範囲内、フィールド識別子の型定義は
FLDIDです。フィールド番号はFML32では1 - 33,554,431の範囲内、フィールド識別子の型定義は
FLDID32です。Oracle Tuxedo ATMIシステムは、フィールドに関する以下の規則に従っています。
|
|
|
|
|
|
|
|
1-3,999、 6,000-10,000、 30,000,001-33,554,431
|
4,000-5,999、 10,001-30,000,000
|
Oracle Tuxedo ATMIシステムでは強制的に使用不可にはなっていませんが、アプリケーションが予約番号を使用しないようにしてください。
注意:
|
FMLまたはFML32バッファ内のフィールドがルーティングに使用される場合は、フィールド番号は8191以下でなければなりません。
|
フィールドの型は、標準C言語の型のいずれでもかまいません(
short、
long、
float、
double、および
char)。他に、
string型(NULL文字で終了する文字列)、
carray型(文字配列)、
mbstring型(マルチバイト文字配列 - Oracle Tuxedoリリース8.1またはそれ以降で使用可能)、
ptr型(バッファを指すポインタ)、
FML32型(埋込み型のFML32バッファ)、および
VIEW32型(埋込み型のVIEW32バッファ)がサポートされています。(
ptr型、
fml32型、および
view32型は、FML32インタフェースでのみサポートされています。)
fml.hでは、サポートされるフィールド型は
FLD_SHORT、
FLD_LONG、
FLD_FLOAT、
FLD_DOUBLE、
FLD_CHAR、
FLD_STRING、および
FLD_CARRAYとして定義されます。
fml32.hでは、サポートされるフィールド型は
FLD_SHORT、
FLD_LONG、
FLD_FLOAT、
FLD_DOUBLE、
FLD_CHAR、
FLD_STRING、
FLD_CARRAY、
FLD_MBSTRING、
FLD_PTR、
FLD_FML32、および
FLD_VIEW32として定義されます。
FML16では、フィールド化バッファのポインタは、
FBFR *型、フィールド長は
FLDLEN型、フィールドのオカレンス数は
FLDOCC型です。FML32では、フィールド化バッファのポインタは
FBFR32 *型、フィールド長は
FLDLEN32型、フィールドのオカレンス数は
FLDOCC32型です。
フィールドは、FMLインタフェースのフィールド識別子により参照されます。ただし通常は、アプリケーション・プログラマにはフィールド名を覚える方が簡単です。フィールド名をフィールド識別子にマップするには、2つの方法があります。
実行時にFMLプログラムは、フィールド表ファイルを介してフィールド名と識別子のマッピング情報を取得できます(
「field_tables(5)」を参照)。FML16インタフェースは、環境変数
FLDTBLDIRを使用して、フィールド表が含まれるディレクトリのリストを指定し、
FIELDTBLSを使用して、使用される表ディレクトリのファイルのリストを指定します。FML32インタフェースは
FLDTBLDIR32と
FIELDTBLS32を使用します。アプリケーション・プログラム内では、FML関数
Fldid()および
Fldid32()がフィールド名からフィールド識別子への実行時変換を行い、
Fname()および
Fname32()がフィールド識別子からフィールド名への変換を行います。
コンパイル時のフィールド名と識別子のマッピングは、フィールド名のマクロ定義を含むフィールド・ヘッダー・ファイルを使用して行われます。
mkfldhdr()と
mkfldhdr32()は、フィールド表ファイルからヘッダー・ファイルを作成するための関数です(詳細は、
「mkfldhdr、mkfldhdr32(1)」を参照)。これらのヘッダー・ファイルはCプログラムの
#includeで指定されます。これらを使用して、コンパイル時にフィールド名をフィールド識別子にマップすることもできます。
フィールド化バッファ内のフィールドは、複数回出現する場合があります。FML関数の多くが、検索または変更の対象にするフィールド・オカレンスを指定する引数を取ります。フィールドが複数回出現する場合、オカレンスは、最初のオカレンスを0として、順次番号付けされます。すべてのオカレンスが集まると、論理的なシーケンスを構成しますが、オカレンス番号に対応するオーバーヘッドはありません(つまり、オカレンス番号はフィールド化バッファに格納されません)。フィールド・オカレンスを追加すると、そのオカレンスは、オカレンスの集まりの最後に追加され、一番高い番号より1つ高い番号のオカレンスとして参照されます。一番高い番号のオカレンス以外のオカレンスを削除すると、削除されたオカレンスより高い番号のオカレンスはすべて、1つだけ下位にシフトします(たとえば、オカレンス6がオカレンス5になり、オカレンス5がオカレンス4になります)。
フィールド化バッファに多数のフィールドが含まれる場合、内部インデックスを使用すると、FMLでのアクセスが促進されます。通常、ユーザーはこのインデックスの存在を意識することはありません。フィールド化バッファをディスクに格納したり、プロセス間またはコンピュータ間で転送する場合は、まず
Funindex()または
Funindex32()を使用してこのインデックスを削除すると、ディスク領域や転送時間を節約できます。後でインデックスが必要になれば、
Findex()または
Findex32()を使用して再び作成します。
適切に書かれた既存のFML16アプリケーションは、容易にFML32インタフェースを使用するように変更できます。FML関数の呼出しに使用する変数は、すべて適切なtypedef (
FLDID、
FLDLEN、および
FLDOCC)により定義されている必要があります。FML型付きバッファのための
tpalloc()呼出しには、FMLではなく
FMLTYPE定義を使用します。アプリケーションのソース・コードに、
fml.hのかわりに
fml32.hを指定し、
fml1632.hを組み込むことで32ビットの関数を使用できるようになります。
fml1632.hには、すべての16ビットの型定義を32ビット版に変換したり、16ビットの関数やマクロを32ビット版に変換するマクロが含まれています。
VIEWSは、フィールド操作言語の一部です。この機能を使用すると、フィールドとC構造体のメンバーとのマッピングの指定によって、フィールド化バッファとC言語プログラムのC構造体の間でデータを受け渡しすることができます。フィールド化バッファの情報を大量に操作する場合は、データをC構造体内に転送するとパフォーマンスが向上します。
VIEWS関数を使用して、フィールド化バッファ内の情報をバッファ内のフィールドから抽出してC構造体に置き、C構造体内でデータを操作した後、再度
VIEWS関数を使用して、更新した値をフィールド化バッファに戻すことができます。
型付きバッファは、フィールド化バッファというFMLの概念に基づいたATMI環境の機能の1つです。ATMI環境と共に納入される2種類の標準バッファは、FML型付きバッファと
VIEW型付きバッファです。このバッファがさらに異なる点は、
VIEWバッファはFMLフィールド化バッファとの関連性がまったくなくてもよいということです。また
FML32と
VIEW32のバッファ型が使用される点でも異なります。
VIEW記述は、
「viewfile(5)」で解説されるようにソースviewfileに作成、格納されます。VIEW記述は、フィールド化バッファ内のフィールドをC構造体内のメンバーにマップします。ソースVIEW記述は、
viewc()または
viewc32()でコンパイルされ、VIEWオブジェクト・ファイルが生成されます。これは、フィールド化バッファとCプログラムのC構造体の間で転送されるデータのマッピングに使用できます(詳細は、
「viewc、viewc32(1)」を参照)。また、VIEWコンパイラはアプリケーション・プログラムにインクルードするC言語のヘッダー・ファイルを作成し、VIEW記述で記述される構造体を定義します。VIEW逆アセンブラである
viewdis()または
viewdis32()は、オブジェクトVIEW記述を読取り可能な形式に変換する(つまり、ソースVIEW記述に戻す)ためのものです。逆アセンブラの出力は、VIEWコンパイラに再入力できます(詳細は、
「viewdis、viewdis32(1)」を参照)。
VIEWFILESおよび
VIEWDIR環境変数を使用して
VIEW構造体を処理するために、実行時にオブジェクト・ファイルが使用されます。
VIEWFILESに、アプリケーションのオブジェクトVIEWファイルのカンマ区切りのリストを指定する必要があります。フルパス名で指定したファイルはそのまま使用され、相対パス名で指定したファイルは
VIEWDIR変数(下記参照)で指定したディレクトリのリストから検索されます。
VIEWDIRには、相対ファイル名を指定したVIEWオブジェクト・ファイルを検索するために使用する、コロンで区切ったディレクトリのリストを指定します。
VIEW32構造体では
VIEWFILES32および
VIEWDIR32が使用されます。
大半のFML関数によってサポートされているデータ型以外に、
VIEWSはソースVIEW記述内で
int型を間接的にサポートします。VIEW記述がコンパイルされると、VIEWコンパイラは、使用中のマシンの種類によって、すべての
int型をshort型かlong型に自動的に変換します。
VIEWSは、10進数データ型もサポートしています。これは
dec_t型のフィールドとして定義され、パック10進数の値は総バイト数と小数点以下のバイト数として表されます。このようなフィールドは、FMLでは直接サポートされていませんが、このフィールドと、FMLでサポートされているほかのフィールドとの変換は自動的に行われます。パック10進数は、COBOL環境では2桁の10進数が1バイトにパックされ、下位バイトに符号が格納されます。C環境では、データ型は10進指数、符号、桁、およびパック10進数の値を含む
dec_t型定義で定義されます。
FMLバッファは
Fvftos()または
Fvftos32()を使用してビューに変換できます。ビューは
Fvstof()または
Fvstof32()を使用してフィールド化バッファに変換できます。フィールド化バッファと構造体の間でデータ転送を行うと、ソース・データは自動的に宛て先データの型に変換されます。フィールドの複数オカレンスがサポートされています。これは構造体中の配列として扱われます。NULL値は構造体の空のメンバーを表すのに使用し、viewfileの構造体の各メンバーに対して指定できます。メンバーにNULL値を指定しないと、省略時のNULL値が使用されます。またC構造体のメンバーとフィールド化バッファ内のフィールドの間にマッピングが存在していても、それらの間でのデータの転送を禁止することができます。
VIEWは、目標レコード形式からの変換、または目標レコード形式への変換もできます。デフォルトの目標形式はIBM System/370 COBOLレコードです。
Fvstot()関数によって、バイト・オーダー、浮動小数点、10進数形式、文字セット(ASCIIからEBCDIC)の変換が行われ、
Fvttos()によって元の形式に戻されます。32ビット版の関数もあります。
Fcodeset()関数を使用すると、別のASCII/EBCDIC変換表を指定できます。
ほとんどのFML関数は、1つまたは複数の戻り値を戻します。エラーの条件は、エラーの他には考えられない戻り値で示されます。通常、エラーであれば-1、不正なフィールド識別子(
BADFLDID)またはアドレスであれば0です。またエラー・タイプが、外部整数
Ferror (FML16の場合)、あるいは
Ferror32 (FML32の場合)として得られます。
Ferrorと
Ferror32は、正常呼出しではクリアされないので、エラーが示された後でのみテストします。
F_error()と
F_error32()関数は、標準エラー出力にメッセージを出力します。これらは1つのパラメータ(文字列)を取り、引数の文字列にコロンと空白を付けて出力し、改行文字の後にエラー・メッセージを出力します。表示されるエラー・メッセージは、エラー発生時に設定された
Ferrorまたは
Ferror32内の現在のエラー番号に対して定義されているメッセージです。
メッセージ・カタログからエラー・メッセージのテキストを検索するには、Fstrerror()を使用できます。
userlog(3c)への引数として使用できるポインタが返されます。
エラー・コードのうち、FML機能で生成できるものについては、マニュアルのFMLの項目で説明しています。
『FMLを使用したOracle Tuxedo ATMIアプリケーションのプログラミング』
CFadd()、
CFadd32() - フィールドの変換および追加
#include <stdio.h>
#include "fml.h"
int CFadd(FBFR *
fbfr, FLDID
fieldid, char *
value, FLDLEN
len, int
type)
#include fml32.h>
int
CFadd32(FBFR32 *
fbfr, FLDID32
fieldid, char *
value, FLDLEN32
len, int
type)
CFadd()は、
Fadd()に似た動きをしますが、CFaddは、フィールド化バッファにフィールドが追加される場合、
valueをユーザー指定の型から
fieldid型に変換します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
valueは、追加される値を指すポインタです。
lenは、追加される値の長さです。lenは、
FLD_CARRAY型の場合のみ必要です。
typeは、
value内のフィールドのデータ型です。
フィールドがバッファに追加される前に、データ項目の型が、ユーザー指定の型から
fieldidに指定された型に変換されます。ソースが
FLD_CARRAY型(任意の文字配列)である場合は、
len引数を配列の長さに設定する必要があります。これ以外の場合、長さは無視されます。変換および追加されるフィールドの値は、まず変数
valueに設定します。C言語では12345Lのような構成が許可されないためです。
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、この関数は失敗します。
CFadd()または
CFadd32()が使用されているとき、これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
CFadd32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行している場合でも、
CFadd()または
CFadd32()を呼び出すことができます。
この関数は、エラー発生時に -1を返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
CFadd()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
valueパラメータにNULLが指定された場合)。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、および
FLD_VIEW32など)。
CFchg()、
CFchg32() - フィールドの変換および変更
#include <stdio.h>
#include "fml.h"
int CFchg(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, char *
value,
FLDLEN
len, int
type)
#include "fml32.h"
int CFchg32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc,
char *
value,
FLDLEN32
len, int
type)
CFchg()は、
Fchg()に似た働きをしますが、最初に、ユーザー指定の
typeから、フィールドがフィールド化バッファで変更される
fieldidの型に
valueを変換します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocは、フィールドのオカレンス番号です。
valueは、新しい値に対するポインタです。
lenは、変更される値の長さです。lenは、型が
FLD_CARRAYの場合のみ必要です。
typeは
valueのデータ型です。
存在しないフィールド・オカレンスが指定された場合、必要とされる値が追加されるまで、存在しないオカレンスにNULL値が追加されます(たとえば、バッファに存在しないフィールドのフィールド・オカレンスを4に変更すると、3個のNULL値の後に指定されたフィールド値が追加されます)。
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、この関数は失敗します。
CFchg()または
CFchg32()が使用されている場合に、これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
CFchg32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
CFchg()または
CFchg32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
CFchg()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファが適切なバウンダリで開始していません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
valueパラメータにNULLが指定された場合)。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、および
FLD_VIEW32など)。
CFfind()、
CFfind32() - 検索、変換してポインタを返す
#include <stdio.h>
#include "fml.h"
char * CFfind(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, FLDLEN *
len,
int
type)
#include "fml32.h"
char *
CFfind32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, FLDLEN32 *
len,
int
type)
CFfind()は、バッファ内の指定されたフィールドを検索し、それを変換してからその変換した値を指すポインタを返します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
lenは変換された値の長さを指すポインタで、出力時に使用されます。
typeは、ユーザーが変換するフィールドの変換後のデータ型です。
Ffind()と同じく、この関数で返されるポインタは読取り専用とする必要があります。
CFfind()が返すポインタは、次のバッファ操作(破壊的でない場合でも)までしか有効ではありません。これは、変換後の値が1つのプライベート・バッファに保存されているためです。一方、
Ffins()の戻り値の場合は、次にバッファが変更されるまで有効です。
Ffind()とは異なり、
CFfind()は、変換済の値を呼出し側がすぐに使用できるようにします。
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、この関数は失敗します。
CFfind()または
CFfind32()が使用されている場合に、これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
CFfind32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
CFfind()または
CFfind32()を呼び出すことができます。
上記の「形式」の項では、
CFfind()の戻り値のデータ型は、charポインタ(Cの
char **)として記述されています。実際、戻されるポインタは、格納済のフィールドの型と同じ型を持つオブジェクトを指しています。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
CFfind()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、および
FLD_VIEW32など)。
CFfindocc、CFfindocc32(3fml)
CFfindocc()、
CFfindocc32() - 変換された値のオカレンスの検索
#include <stdio.h>
#include "fml.h"
FLDOCC
CFfindocc(FBFR *
fbfr, FLDID
fieldid, char *
value, FLDLEN
len, int
type)
#include "fml32.h"
FLDOCC32
CFfindocc32(FBFR32 *
fbfr, FLDID32
fieldid, char *
value, FLDLEN32
len, int
type)
CFfindocc()の処理は
Ffindocc()と似ていますが、最初に
valueをユーザー指定の型から
fieldidの型に変換します。
CFfindocc()は、ユーザー指定の値、長さおよび型と一致する、指定フィールドをバッファで検索します。
CFfindocc()は、最初に一致したフィールドのオカレンス番号を返します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
valueは、検索される値を指すポインタです。型が
FLD_CARRAYの場合、
lenは、入力値と比較する値の長さです。
typeは、
value内のフィールドのデータ型です。
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、この関数は失敗します。
CFfindocc()または
CFfindocc32()が使用されている場合に、これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
CFfindocc32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
CFfindocc()または
CFfindocc32()を呼び出すことができます。
フィールド値が見つからない場合、または他のエラーが見つかった場合、-1を返し、
CFfindocc()は
Ferrorを設定してエラー条件を示します。
次の条件の場合、
CFfindocc()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
valueパラメータにNULLが指定された場合)。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、および
FLD_VIEW32など)。
CFget()、
CFget32() - フィールドの取得および変換
#include <stdio.h>
#include "fml.h"
int
CFget(FBFR *fbfr, FLDID fieldid, FLDOCC oc, char *buf, FLDLEN *len,
int type)
#include "fml32.h"
int
CFget32(FBFR32
*fbfr, FLDID32 fieldid, FLDOCC32 oc, char *buf,
FLDLEN32 *len, int type)
CFget()は、
Fget()と同様に変換を行います。変換済の値がユーザー指定バッファにコピーされるのが大きな違いです。
fbfrはフィールド化バッファを指すポインタです。
fieldidはフィールド識別子です。
ocはフィールドのオカレンス番号です。
bufはプライベート・データ領域を指すポインタです。入力時の
lenは、プライベート・データ領域の長さを指すポインタです。戻り時の
lenは、返された値の長さを指すポインタです。入力時の
lenパラメータがNULLの場合は、フィールド値を入れるためのバッファが十分大きいために、値の長さが返されないものと想定されます。
bufパラメータがNULLの場合、フィールド値は返されません。
typeは、ユーザーが変換しようとしている戻り値の変換先のデータ型です。
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、この関数は失敗します。
CFget()または
CFget32()が使用されているとき、これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
CFget32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
CFget()または
CFget32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
CFget()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
「フィールド化バッファにスペースがありません。」
lenで指定されたデータ領域の大きさは、フィールド値を保持できるほど大きくありません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、および
FLD_VIEW32など)。
CFgetalloc、CFgetalloc32(3fml)
CFgetalloc()、
CFgetalloc32() - フィールドの取得、領域の割り当て、変換
#include <stdio.h>
#include "fml.h"
char *
CFgetalloc(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, int
type, FLDLEN
*
extralen)
#include "fml32.h"
char *
CFgetalloc32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, int
type,
FLDLEN32 *
extralen)
CFgetalloc()は、バッファから指定フィールドを取得し、領域を割り当て、ユーザーが指定した型にフィールドを変換し、その場所を指すポインタを返します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidはフィールド識別子です。
ocはフィールドのオカレンス番号です。
typeは、ユーザーが変換しようとしているフィールドの変換先のデータ型です。呼出し時の
extralenは、値を受け取るために割り当てられる追加領域の長さを指すポインタであり、戻り時には、実際に使用された領域の大きさを指すポインタになります。
extralenがNULLの場合、割り当てる追加領域はなく、実際の長さは返されません。ユーザーには、(変換された)戻り値を解放する責任があります。
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、この関数は失敗します。
CFgetalloc()または
CFgetalloc32()が使用されているとき、これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
CFgetalloc32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
CFgetalloc()または
CFgetalloc32()を呼び出すことができます。
正常終了時には、
CFgetalloc()は、変換された値を指すポインタを戻します。エラー時には、NULLを戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
CFgetalloc()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「mallocを使用して、メモリーを割り当てられませんでした。」
malloc()を使用しての領域の動的な割当てが失敗しました。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、および
FLD_VIEW32など)。
F_error()、
F_error32() - 最終エラーのエラー・メッセージを出力
#include stdio.h>
#include "fml.h"
extern int Ferror;
void
F_error(char *
msg)
#include "fml32.h"
extern int Ferror32;
void
F_error32(char *
msg)
この関数
F_error()は、UNIXシステム・エラーを出力する
perror()に似た働きをします。つまり、標準エラー出力(ファイル記述子2)にエラー・メッセージを作成し、システム・コールあるいはライブラリ関数呼出し時に発生した最後のエラーを記述します。文字列引数
msgは、最初に出力されます。次にコロン、空白が出力され、メッセージおよび改行が出力されます。
msgがNULLポインタあるいはNULL文字列を指している場合、コロンは出力されません。様々な利用形態を考慮して、この引数文字列には、エラーを起こしたプログラム名を入れます。エラー番号は外部変数
Ferrorから取得されます。これはエラーが発生すると設定されますが、エラーではない呼出しが行われてもクリアされません。MS-DOSおよびOS/2環境では
Ferrorは
FMLerrorに再定義されます。
エラー・メッセージをすぐに出力するには、別のFML関数から返されたエラーに対して
F_error()を呼び出す必要があります。エラー・メッセージが
FEUNIXのとき、
Uunix_err()が呼び出されます。
F_error32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
F_error()または
F_error32()を呼び出すことができます。
F_error()は、
void宣言なので戻り値はありません。
UNIXシステムのリファレンス・マニュアルのperror(3)、
Uunix_err(3)
F32to16()、
F16to32() - 16ビットFMLバッファと32ビットFMLバッファの間の変換
#include <stdio.h>
#include "fml.h"
#include "fml32.h"
int
F32to16(FBFR *
dest, FBFR32 *
src)
int
F16to32(FBFR32 *
dest, FBFR *
src)
F32to16()は、32ビットのFMLバッファを16ビットのFMLバッファに変換します。これは、フィールド対フィールドのバッファの変換を行い、フィールド化バッファのインデックスを作成することによって行ないます。
FLDID32から
FLDIDを生成し、フィールド値(string、carray、およびmbstringフィールドの長さ)をコピーすることによって、フィールドを変換します。
destは、変換先フィールド化バッファを指すポインタであり、
srcは、変換元のフィールド化バッファを指すポインタです。ソース・バッファは変更されません。
これらの関数は、領域の不足のために異常終了する場合があります。処理を完了するために十分な追加のメモリーを割り当てた後で、これらの関数を再び呼び出すことができます。
F16to32()は、16ビットのFMLバッファを32ビットのFMLバッファに変換します。この関数は、
fml32ライブラリまたは共有オブジェクトに格納されており、エラーが発生すると
Ferror32が設定されます。
F32to16()は、FMLライブラリまたは共有オブジェクトに格納されており、エラーが発生すると
Ferrorが設定されます。これらの関数を使用するためには、
fml.hおよび
fml32.hの両方をインクルードする必要があることに注意してください。同じファイルに、
fml1632.hをインクルードする必要はありません。
F32to16()は、
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、
FBADFLDを設定して異常終了します。これらのフィールド・タイプに対して
F16to32()を実行しても、何の影響もありません。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
F32to16()または
F16to32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
F32to16()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファのどちらかが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファまたは宛先バッファのどちらかがフィールド化バッファでないか、または
Finit()によって初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、変換先のフィールド化バッファにコピーされますが、バッファには十分な領域が残っていません。このエラーは、32ビットのFMLフィールドが長すぎて、16ビットのFMLフィールドに収まらない場合にも返されます。このエラーが返された場合は、変換先のバッファにフィールドはできません。
「無効なフィールド番号またはフィールド・タイプです。」
このエラーは、
F32to16()関数でのみ発生します。ソース・バッファは、16ビットのFMLがサポートしている8つのフィールド・タイプ以外のフィールド識別子を持っているか、フィールド番号が8191を超えています。
Fadd()、
Fadd32() - 新しいフィールド・オカレンスの追加
#include stdio.h>
#include "fml.h"
int Fadd(FBFR *
fbfr, FLDID
fieldid, char *
value, FLDLEN
len)
#include "fml32.h"
int Fadd32(FBFR32 *
fbfr, FLDID32
fieldid, char *
value, FLDLEN32
len)
Fadd()は、指定されたフィールド値を指定されたバッファに追加します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
valueは、新しい値を指すポインタです。したがって、ポインタの型は、追加される値と同じフィールド識別子の型である必要があります。
lenは、追加される値の長さであり、
FLD_CARRAY型または
FLD_MBSTRING型の場合のみ必要です。
追加する値は、
valueパラメータで指される場所にあります。すでに1つまたは複数のフィールド・オカレンスがある場合、新しいフィールド・オカレンスとして値が追加され、現在指定されているオカレンスの最大値より1つ大きいオカレンス番号が割り当てられます(指定されたオカレンスを追加するには、
Fchg()を使用する必要があります)。
上記の「形式」の項では、
Fadd()の引数valueのデータ型は、charのポインタ(Cの
char *)として記述されています。技術的には、これは、単に、
Fadd()に渡せる値のある特定の型を記述しています。実際、引数
valueの型は、追加されているフィールドのフィールド化バッファ表現と同じ型のオブジェクトへのポインタにします。たとえば、フィールドが、
FLD_LONG型でバッファに格納されている場合は、
valueの型は、long型のポインタ(Cの
long *)である必要があります。同様に、
FLD_SHORT型でバッファに格納される場合、
valueは、short型のポインタ(Cの
short *)である必要があります。大事なことは、
Fadd()は、
valueが指すオブジェクトが、追加される格納済のフィールドの型と同じ型を持っていることを想定しているということです。
FLD_PTR型の値では、
Fadd32()はポインタ値を格納します。
FLD_PTRフィールドが指すバッファは、
tpalloc()を呼び出して割り当てます。
FLD_FML32型の値の場合、
Fadd32()は、索引を除くすべての
FLD_FML32フィールドの値を格納します。
FLD_VIEW32型の値の場合、
Fadd()は
FVIEWFLD型の構造体に対するポインタを格納します。FVIEWFLD型の構造体には、
vflags (現在未使用で0に設定されているフラグ・フィールド)、
vname (VIEW名を含む文字配列)、および
data (C構造体として格納されるVIEWデータに対するポインタ)が含まれています。アプリケーションは、
Fadd32()に
vnameと
dataを提供します。
FLD_MBSTRING型の値の場合、値は
Fmbpack32()関数のパッキングされた出力引数であり、引数
lenは
Fmbpack32()の出力引数
sizeの値の長さです。
FLD_CARRAY型の値の場合、引数
lenは値の長さです。
FLD_CARRAYまたは
FLD_MBSTRING以外のすべての型では、
valueが参照するオブジェクトの長さは、その型から導かれ(たとえば、
FLD_FLOATの場合、長さは、
sizeof(float)になる)、
lenの内容は無視されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fadd()または
Fadd32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fadd()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
関数の引数が無効です
呼び出された関数の引数の1つが無効です。(たとえば、
Fadd()のvalueパラメータにNULLを指定した場合。)
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファに追加されますが、バッファには十分な領域が残っていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド番号は無効です。
Fadds()、
Fadds32() - FLD_STRING型の値を変換し、バッファに追加
#include <stdio.h>
#include "fml.h"
int
Fadds(FBFR *
fbfr, FLDID
fieldid, char *
value)
#include "fml32.h"
int
Fadds32(FBFR32 *
fbfr, FLDID32
fieldid, char *
value)
Fadds()は、ユーザー型
FLD_STRINGからフィールド型(
fieldid)への変換を処理し、それをフィールド化バッファに追加するために提供されています。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
valueは、追加される値を指すポインタです。
この関数は、
type (
FLD_STRING)を提供し、
lenが0である
CFadd()を呼び出します。
Fadds32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fadds()または
Fadds32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fadds()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファに追加されますが、バッファには十分な領域が残っていません。
「フィールド型が正しくありません。」
指定されたフィールド型は無効です。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
Fadds()の
valueパラメータにNULLを指定した場合)。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Falloc()、
Falloc32() - フィールド化バッファの割り当ておよび初期化
#include <stdio.h>
#include "fml.h"
FBFR *
Falloc(FLDOCC
F, FLDLEN
V)
#include "fml32.h"
FBFR32 *
Falloc32(FLDOCC32
F, FLDLEN32
V)
Falloc()は、フィールド化バッファ用に、
malloc()を使用して領域を動的に割り当て、
Finit()を呼び出してそれを初期化します。パラメータには、バッファに格納されているすべてのフィールドについて、フィールド数(
F)および値の領域のバイト数(
V)があります。
Falloc32()は、より多くのフィールドを持つ大きなバッファのために使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Falloc()または
Falloc32()を呼び出すことができます。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Falloc()は異常終了し、
Ferrorを次の値に設定します。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、フィールド数が0より小さい、
Vが0、または合計の大きさが65534より大きい)。
UNIXシステムのリファレンス・マニュアルのmalloc(3)
Fappend()、
Fappend32() - 新しいフィールド・オカレンスの追加
#include <stdio.h>
#include "fml.h"
int
Fappend(FBFR *
fbfr, FLDID
fieldid, char *
value, FLDLEN
len)
#include "fml32.h"
int
Fappend32(FBFR32 *
fbfr, FLDID32
fieldid, char *
value, FLDLEN32
len)
Fappend()は、指定されたフィールド値を指定されたバッファの終わりに追加します。
Fappend()は、汎用目的のFMLアクセスに必要な内部構造体および順序付けを保持しない、大規模なバッファを作成する際に役に立ちます。この最適化の影響として、
Fappend()への呼出しの後には、
Fappend()への追加の呼び出し、FML索引ルーチン
Findex()および
Funindex()への呼び出し、または
Free()、
Fused()、
Funused()、
Fsizeof()への呼び出ししか行なえません。
Findex()または
Funindex()を呼び出す前に他のFMLルーチンへの呼出しを行うと、
Ferrorが
FNOTFLDに設定されてエラーが発生します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
valueは、新しい値を指すポインタです。したがって、ポインタの型は、追加される値と同じフィールド識別子の型である必要があります。
lenは、追加される値の長さであり、
FLD_CARRAY型または
FLD_MBSTRING型の場合のみ必要です。
追加する値は、
valueパラメータで指される場所にあります。すでに1つまたは複数のフィールド・オカレンスがある場合、新しいフィールド・オカレンスとして値が追加され、現在指定されているオカレンスの最大値より1つ大きいオカレンス番号が割り当てられます(指定されたオカレンスを追加するには、
Fchg()を使用する必要があります)。
前述の「形式」の項では、
Fappend()の引数
valueのデータ型は、charのポインタ(Cの
char *)として記述されています。技術的には、これは、単に、
Fappend()に渡せる値の1つの特定の型を記述しています。実際、引数
valueの型は、追加されているフィールドのフィールド化バッファ表現と同じ型のオブジェクトへのポインタにします。たとえば、フィールドが、
FLD_LONG型でバッファに格納されている場合は、
valueの型は、long型のポインタ(Cの
long *)である必要があります。同様に、
FLD_SHORT型でバッファに格納される場合、valueは、short型のポインタ(Cの
short *)である必要があります。重要なことは、
Fappend()は、
valueが指すオブジェクトが、追加される格納済のフィールドと同じ型を持っていると想定しているということです。
FLD_MBSTRING型の値の場合、値は
Fmbpack32()関数のパッキングされた出力引数であり、引数
lenは
Fmbpack32()の出力引数
sizeの値の長さです。
FLD_CARRAY型の値の場合、引数
lenは値の長さです。
FLD_CARRAYまたは
FLD_MBSTRING以外のすべての型では、
valueが参照するオブジェクトの長さは、その型から導かれ(たとえば、
FLD_FLOATの場合、長さは、
sizeof(float)になる)、
lenの内容は無視されます。
Fappend32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fappend()または
Fappend32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fappend()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
Fappend()の
valueパラメータにNULLを指定した場合)。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファに追加されますが、バッファには十分な領域が残っていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド番号は無効です。
Fboolco、Fboolco32、Fvboolco、Fvboolco32(3fml)
Fboolco()、
Fboolco32()、
Fvboolco()、
Fvboolco32() - 式をコンパイルし評価ツリーを返す
#include <stdio.h>
#include "fml.h"
char *
Fboolco(char *
expression)
char *
Fvboolco(char *
expression, char *
viewname)
#include "fml32.h"
char *
Fboolco32(char *
expression)
char *
Fvboolco32(char *
expression, char *
viewname)
Fboolco()は、
expressionが指すブール式をコンパイルし、評価ツリーのポインタを返します。認識される表現は、Cで認識される表現に近いものです。文法の説明は、『FMLを使用したOracle Tuxedo ATMIアプリケーションのプログラミング』に記載されています。
Fboolco()が作成する評価ツリーは、下記の「関連項目」の項でリストされている他の論理関数に使用されます。したがって、式を再びコンパイルする必要はありません。
Fboolco32()は32ビットFMLで使用されます。
Fvboolco()および
Fvboolco32()は、同じVIEW機能を提供します。
viewnameパラメータは、フィールド・オフセットを取り出すVIEWを示します。
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると、この関数は失敗します。これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
Workstationプラットフォームでは、これらの関数はサポートされていません。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、ここで記述する関数、
Fboolco()、
Fboolco32()、
Fvboolco()、または
Fvboolco32()を呼び出すことができます。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fboolco()は異常終了し、
Ferrorを次の値に設定します。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
「ブール式の文法が正しくありません。」
Fboolco()は、認識できないフィールド名以外に、論理表現に文法エラーを見つけました。
「未知のフィールド名が指定されました。」
フィールド表またはビュー・ファイルにないフィールド名が指定されました。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効でした(たとえば、
expressionがNULL)。
「ビューが見つからないか、取得できません」
VIEWDIRまたは
VIEWFILESで指定したファイルに
viewnameが見つかりません。
「VIEWファイルが見つからないか、オープンできません」
viewnameの検索中に、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つをプログラムが見つけられませんでした。
「オペレーティング・システム・エラー」
viewname検索中にプログラムは
VIEWDIRまたは
VIEWFILESで指定したファイルの1つを読込み用に開けませんでした。
「VIEWファイルが正しくありません」
viewnameの検索中、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つが壊れていたか、VIEWファイルではありませんでした。
「mallocが失敗しました」
viewnameの検索中、
malloc()がビュー情報を格納するための領域の割当てに失敗しました。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、および
FLD_VIEW32など)。
#include "stdio.h"
#include "fml.h"
extern char *Fboolco(\|);
char *tree;
...
if((tree=Fboolco("FIRSTNAME %% 'J.*n' & SEX = 'M'")) == NULL)
F_error("pgm_name");
この例では、'J'で始まり'n'で終わる(たとえば、John、Jean、Jurgenなど)
FIRSTNAMEフィールドがバッファにあるか、
SEXフィールドが
'M'に等しいかを検査する論理表現をコンパイルします。
tree配列の最初の文字は、最下位バイトを形成します。次の文字は、最上位バイトを形成します。それぞれ、全体の配列の長さをバイト数で指定する符号なし型(16ビット)です。この値は、複写あるいは配列の操作に役立ちます。
Fboolev、Fboolev32、Fvboolev、Fvboolev32(3fml)
Fboolev()、
Fboolev32()、
Fvboolev()、
Fvboolev32() - 評価ツリーに対するバッファの評価
#include stdio.h>
#include "fml.h"
int
Fboolev(FBFR *
fbfr, char *
tree)
int
Fvboolev(char *
cstruct, char *
tree, char *
viewname)
#include "fml32.h"
int
Fboolev32(FBFR32 *
fbfr, char *
tree)
int
Fvboolev32(char *
cstruct, char *
tree, char *
viewname)
Fboolev()は、フィールド化バッファを指すポインタ(
fbfr)、
Fboolco()が戻す評価ツリーのポインタ(
tree)を利用して、フィールド化バッファが指定された論理条件と一致する場合は、true (1)を戻し、そうでない場合はfalse (0)を戻します。この関数は、フィールド化バッファあるいは評価ツリーのいずれも変更しません。評価ツリーは、
Fboolco()によって以前コンパイルされたものです。
Fboolev32()は32ビットFMLで使用されます。
Fvboolev()および
Fvboolev32()は、同じVIEW機能を提供します。
viewnameパラメータは、フィールド・オフセットを取り出すVIEWを示し、
Fvboolco()または
Fvboolco32()で指定されたVIEWと同じにする必要があります。
Workstationプラットフォームでは、これらの関数はサポートされていません。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、ここで記述する関数、
Fboolev()、
Fboolev32()、
Fvboolev()、または
Fvboolev32()を呼び出すことができます。
Fboolev()は、バッファ内の表現と評価ツリーが一致している場合、1を戻します。表現が評価ツリーと不一致の場合、0を戻します。この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fboolev()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません」
fbfrバッファが適切なバウンダリで開始していません。
「バッファがフィールド化されていません」
fbfrバッファがフィールド化されていないか、または
Finit()で初期化されていません。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
「関数の引数が無効です」
呼び出された関数の引数の1つが無効でした(たとえば、treeパラメータにNULLが指定されている場合)。
「ブール式の構文が正しくありません」
認識できないフィールド名以外の構文エラーがブール式に見つかりました。
「ビューが見つからないか、取得できません」
VIEWDIRまたは
VIEWFILESで指定したファイルに
viewnameが見つかりません。
「VIEWファイルが見つからないか、オープンできません」
viewnameの検索中に、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つをプログラムが見つけられませんでした。
「オペレーティング・システム・エラー」
viewname検索中にプログラムは
VIEWDIRまたは
VIEWFILESで指定したファイルの1つを読込み用に開けませんでした。
「VIEWファイルが正しくありません」
viewnameの検索中、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つが壊れていたか、VIEWファイルではありませんでした。
「mallocが失敗しました」
viewnameの検索中、
malloc()がビュー情報を格納するための領域の割当てに失敗しました。
Fboolco()の使用例でコンパイルした評価ツリーを使用します。
#include stdio.h>
#include "fml.h"
#include "fld.tbl.h"
FBFR *fbfr;
...
Fchg(fbfr,FIRSTNAME,0,"John",0);
Fchg(fbfr,SEX,0,"M",0);
if(Fboolev(fbfr,tree) > 0)
fprintf(stderr,"Buffer selected\\\\n");
else
fprintf(stderr,"Buffer not selected\\\\n");
Fboolpr、Fboolpr32、Fvboolpr、Fvboolpr32(3fml)
Fboolpr()、
Fboolpr32()、
Fvboolpr()、
Fvboolpr32() - パースされた論理式を出力
#include <stdio.h>
#include "fml.h"
void
Fboolpr(char *
tree, FILE *
iop)
int
Fvboolpr(char *
tree, FILE *
iop, char *
viewname)
#include "fml32.h"
void
Fboolpr32(char *
tree, FILE *
iop)
int
Fvboolpr32(char *
tree, FILE *
iop, char *
viewname)
Fboolpr()は、コンパイル済の表現を指定された出力ストリームに出力します。評価ツリー(
tree)は、
Fboolco()で以前作成されたものです。
iopは、出力ストリームを指す
FILE型のポインタです。出力内容のすべてがかっこ内に入れられ、評価ツリーで示されるように解析されます。この関数はデバッグに役立ちます。
Fboolpr32()は32ビットFMLで使用されます。
Fvboolpr()および
Fvboolpr32()は、同じVIEW機能を提供します。
viewnameパラメータは、フィールド・オフセットを取り出すVIEWを示し、
Fvboolco()または
Fvboolco32()で指定されたVIEWと同じにする必要があります。
Workstationプラットフォームでは、これらの関数はサポートされていません。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、ここで記述する関数、
Fboolpr()、
Fboolpr32()、
Fvboolpr()、または
Fvboolpr32()を呼び出すことができます。
Fboolpr()は、
voidを戻すものとして宣言されているので、戻り値はありません。
Fvboolpr()は、VIEW名が無効な場合は-1を戻します。
次の条件の場合、
Fvboolpr()は失敗し、
Ferrorを次の値に設定します。
「ビューが見つからないか、取得できません」
VIEWDIRまたは
VIEWFILESで指定したファイルに
viewnameが見つかりません。
「VIEWファイルが見つからないか、オープンできません」
viewnameの検索中に、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つをプログラムが見つけられませんでした。
「オペレーティング・システム・エラー」
viewname検索中にプログラムは
VIEWDIRまたは
VIEWFILESで指定したファイルの1つを読込み用に開けませんでした。
「VIEWファイルが正しくありません」
viewnameの検索中、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つが壊れていたか、VIEWファイルではありませんでした。
「mallocが失敗しました」
viewnameの検索中、
malloc()がビュー情報を格納するための領域の割当てに失敗しました。
この関数は、Windows用のOracle Tuxedo System Workstation DLLでは使用できません。
Fchg()、
Fchg32() - フィールド・オカレンス値を変更
#include <stdio.h>
#include "fml.h"
int
Fchg(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, char *
value, FLDLEN
len)
#include "fml32.h"
int
Fchg32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, char *
value,
FLDLEN32
len)
Fchg()は、バッファ内のフィールド値を変更します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
valueは、新しい値を指すポインタです。したがって、その型は、変更される値と同じ型である必要があります(下記参照)。
lenは変更される値の長さであり、
FLD_CARRAY型または
FLD_MBSTRING型の場合のみ必要です。
オカレンスが-1と指定された場合、フィールド値が新しいオカレンスとしてバッファに追加されます。指定されたフィールド・オカレンスが見つかった場合、フィールド値は、指定された値に変更されます。存在しないフィールド・オカレンスが指定された場合、必要とするオカレンスが追加されるまで、見つからないオカレンス用にはNULL値が追加されます(たとえば、バッファに存在しないフィールド用にフィールド・オカレンスを4に変更すると、3個のNULL値の後に指定されたフィールド値が追加されます)。NULL値については、文字列型と文字型の値の場合はNULL文字列(長さ1バイト)、long型とshort型のフィールドの場合は0、float型とdouble型の値の場合は0.0、文字配列の場合は0長の文字列が使用されます。新しい値または変更された値が
valueに含まれ、文字配列の場合、その長さを
lenに指定します(それ以外の場合は無視されます)。
valueがNULLの場合、フィールド・オカレンスは削除されます。削除する値が見つからない場合、エラーと見なされます。
上記の「形式」の項では、
Fchg()の引数
valueのデータ型は、charのポインタ(Cのchar *)として記述されています。技術的には、
Fchg()に渡されるある1つの特別な種類の値のみ記述しています。実際、引数
valueの型は、変更するフィールドのフィールド化バッファの表現の型と同じ型のオブジェクトを指すポインタでなければなりません。たとえば、フィールドが、
FLD_LONG型でバッファに格納されている場合は、
valueの型は、long型のポインタ(Cの
long *)である必要があります。同様に、
FLD_SHORT型でバッファに格納される場合、valueは、short型のポインタ(Cの
short *)である必要があります。大事なことは、
Fchg()は、
valueが指すオブジェクトが、変更される格納済のフィールドの型と同じ型を持っていると想定していることです。
FLD_PTR型の値では、
Fchg32()はポインタ値を格納します。
FLD_PTRフィールドが指すバッファは、
tpalloc()を呼び出して割り当てます。
FLD_FML32型の値の場合、
Fchg32()は、索引を除くすべての
FLD_FML32フィールドの値を格納します。
FLD_VIEW32型の値の場合、
Fchg()は
FVIEWFLD型の構造体に対するポインタを格納します。FVIEWFLD型の構造体には、
vflags (現在未使用で0に設定されているフラグ・フィールド)、
vname (VIEW名を含む文字配列)、および
data (C構造体として格納されるVIEWデータに対するポインタ)が含まれています。アプリケーションは、
vnameと
dataを
Fchg32()に提供します。
FLD_MBSTRING型の値の場合、値は
Fmbpack32()関数のパッキングされた出力引数であり、引数
lenは
Fmbpack32()の出力引数
sizeの値の長さです。
FLD_CARRAY型の値の場合、引数
lenは値の長さです。
FLD_CARRAYまたは
FLD_MBSTRING以外のすべての型では、
valueが参照するオブジェクトの長さは、その型から導かれ(たとえば、
FLD_FLOATの場合、長さは、
sizeof(float)になる)、
lenの内容は無視されます。
Fchg32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fchg()または
Fchg32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fchg()は失敗し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスの削除がリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fchgs()、
Fchgs32() - フィールド・オカレンスの変更 - 呼出し側は、文字列を提供
#include <stdio.h>
#include "fml.h"
int
Fchgs(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, char *
value)
#include "fml32.h"
int
Fchgs32(FBFR32 *
fbfr, FLDID32
fieldid, int
oc, char *
value)
Fchgs()は、ユーザー型
FLD_STRINGの変換を処理するために提供されています。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
valueは、追加される文字列を指すポインタです。この関数は、文字列を
fieldidのフィールド型に変換するための
FLD_STRING型および
len (値が0)を指定して、対応する非文字列関数
CFchg()を呼び出します。
Fchgs32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fchgs()または
Fchgs32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fchgs()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
Fchksum()、
Fchksum32() - フィールド化バッファのチェックサムの計算
#include <stdio.h>
#include "fml.h"
long
Fchksum(FBFR *
fbfr)
#include "fml32.h"
long
Fchksum32(FBFR32 *
fbfr)
高信頼性のI/Oでは、チェックサムは、
Fchksum()を使用して計算され、書き込まれているフィールド化バッファに格納されます。
fbfrは、フィールド化バッファを指すポインタです。格納された
チェックサムは、すべてのバッファを受信したことを確かめるために、受信プロセスによって検査されます。
FLD_PTR型の値の場合、ポインタまたはポインタによって参照されるデータのかわりに、ポインタのフィールドの名前がチェックサム計算に含まれます。
Fchksum32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fchksum()または
Fchksum32()を呼び出すことができます。
正常終了の場合、
Fchksum()は
チェックサムを戻します。この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fchksum()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Fcmp()、
Fcmp32() - 2つのフィールド化バッファの比較
#include <stdio.h>
#include "fml.h"
int
Fcmp(FBFR *
fbfr1, FBFR *
fbfr2)
#include "fml32.h"
int
Fcmp32(FBFR32 *
fbfr1, FBFR32 *
fbfr2)
Fcmp()は、フィールド識別子を比較してから、2つのFMLバッファのフィールド値を比較します。
fbfr1および
fbfr2は、比較するフィールド化バッファを指すポインタです。
FLD_PTR型の値の場合、ポインタの値(アドレス)が等しければ、2つのポインタ・フィールドは等しいとみなされます。
FLD_FML32型の値の場合、すべてのフィールド・オカレンスおよび値が等しければ、2つのフィールドは等しいとみなされます。
FLD_VIEW32型の値の場合、VIEW名が同じとき、およびすべての構造体メンバーのオカレンスおよび値が等しいとき、2つのフィールドは等しいとみなされます。
Fcmp32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fcmp()または
Fcmp32()を呼び出すことができます。
この関数は、2つのバッファが等しい場合には0を戻します。次に示す条件の場合-1を戻します。
•
|
fbfr1フィールドの fieldidが、比較する fbfr2フィールドの fieldidより小さい。
|
•
|
fbfr1のフィールド値が、比較する fbfr2フィールドのフィールド値より小さい。
|
•
|
fbfr1のフィールド数またはフィールド・オカレンス数が fbfr2より少ない。
|
条件のいずれかに該当する場合(たとえば、
fbfr1フィールドのfieldidが対応するフィールド
fbfr2のfieldidより大きい場合)、
Fcmp()は1を返します。バッファの実際のサイズ(
Falloc()に渡されるサイズ)は考慮されません。バッファのデータのみです。この関数は、エラー発生時に-2を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fcmp()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Fconcat()、
Fconcat32() - ソース・バッファと宛先バッファの連結
#include <stdio.h>
#include "fml.h"
int
Fconcat(FBFR *
dest, FBFR *
src)
#include "fml32.h"
int
Fconcat32(FBFR32 *
dest, FBFR32 *
src)
Fconcat()は、ソース・バッファのフィールドを、すでにある宛先バッファにあるフィールドに追加します。
destは宛先のフィールド化バッファを、
srcは元のフィールド化バッファをそれぞれ指すポインタです。宛先バッファにあるオカレンスは維持され、ソース・バッファの新しいオカレンスは、フィールドに対して比較的大きなオカレンス番号で追加されます。
Fconcat32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fconcat()または
Fconcat32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fconcat()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファのどちらかが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファまたは宛先バッファのどちらかがフィールド化バッファでないか、または
Finit()によって初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファに追加されますが、バッファには十分な領域が残っていません。
Fcpy()、
Fcpy32() - ソース・バッファを宛先バッファにコピー
#include <stdio.h>
#include "fml.h"
int
Fcpy(FBFR *
dest, FBFR *
src)
#include "fml32.h"
int
Fcpy32(FBFR32 *
dest, FBFR32 *
src)
Fcpy()は、フィールド化バッファの内容を別のフィールド化バッファにコピーするために使用されます。
destおよび
srcは、それぞれコピー先とコピー元のフィールド化バッファに対するポインタです。
Fcpy()は、コピー先がフィールド化バッファであると想定して、コピー元バッファのデータを収容できる十分な大きさがあるかをチェックします。
FLD_PTR型の値の場合、
Fcpy32()はバッファのポインタをコピーします。アプリケーション・プログラマは、対応するポインタがコピーされたときのバッファの再割り当ておよび解放を管理する必要があります。
Fcpy32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fcpy()または
Fcpy32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fcpy()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファのどちらかが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファまたは宛先バッファのどちらかがフィールド化バッファでないか、または
Finit()によって初期化されていません。
「フィールド化バッファにスペースがありません。」
宛先バッファは、ソース・バッファを保持できる十分な大きさではありません。
Fdel()、
Fdel32() - バッファからフィールド・オカレンスを削除
#include stdio.h>
#include "fml.h"
int
Fdel(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc)
#include "fml32.h"
int
Fdel32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc)
Fdel()は、指定されたフィールド・オカレンスをバッファから削除します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
フィールド化バッファに、1つのフィールドに対し複数のオカレンスがあり、最後のオカレンスでないフィールド・オカレンスが削除された場合、バッファにある高位のオカレンスは、1つずつ繰り下がります。すべてのオカレンスのオカレンス番号を同じままにするためには、
Fchg()を使用してフィールド・オカレンス値をNULLに設定します。
FLD_PTR型の値の場合、
Fdel32()によって
FLD_PTRフィールド・オカレンスが削除されても、参照されるバッファは変更されないか、またはポインタは解放されません。データ・バッファは、非透過的なポインタとして扱われます。
Fdel32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fdel()または
Fdel32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fdel()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fdelall()、
Fdelall32() - バッファからすべてのフィールド・オカレンスを削除
#include <stdio.h>
#include "fml.h"
int
Fdelall(FBFR *
fbfr, FLDID
fieldid)
#include "fml32.h"
int
Fdelall32(FBFR32 *
fbfr, FLDID32
fieldid)
Fdelall()は、バッファにある指定されたフィールドのすべてのオカレンスを削除します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。フィールドのオカレンスがない場合は、エラーと見なされます。
FLD_PTR型の値の場合、
Fdelall32()によって
FLD_PTRフィールド・オカレンスが削除されても、参照されるバッファは変更されないか、またはポインタは解放されません。データ・バッファは、非透過的なポインタとして扱われます。
Fdelall32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fdelall()または
Fdelall32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fdelall()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールドがリクエストされましたが、指定されたフィールドは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fdelete()、
Fdelete32() - バッファからフィールドのリストを削除
#include <stdio.h>
#include "fml.h"
int
Fdelete(FBFR *
fbfr, FLDID *
fieldid)
#include "fml32.h"
int
Fdelete32(FBFR32 *
fbfr, FLDID32 *
fieldid)
Fdelete()は、フィールド識別子の配列(
fieldid[])にリストされているすべてのフィールドのすべてのオカレンスを削除します。配列の最後のエントリは
BADFLDIDであることが必要です。
fbfrはフィールド化バッファを指すポインタです。
fieldidはフィールド識別子の配列を指すポインタです。これは、
Fdelall()の呼出しを繰り返すよりも、バッファから複数のフィールドを削除する効率のよい方法です。更新はその場で実行されます。フィールド識別子の配列は、
Fdelete()によって再配列されます(ソートされていない場合はソートされ、番号順になります)。
FLD_PTR型の値の場合、
Fdelete32()によって
FLD_PTRフィールド・オカレンスが削除されても、参照されるバッファは変更されないか、またはポインタは解放されません。データ・バッファは、非透過的なポインタとして扱われます。
Fdelete()は、削除するフィールドがフィールド化バッファにない場合も正常終了で返ります。
Fdelete32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fdelete()または
Fdelete32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fdelete()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fextread、Fextread32(3fml)
Fextread()、
Fextread32() - フォーマットされた出力からフィールド化バッファを作成
#include <stdio.h>
#include "fml.h"
int
Fextread(FBFR *
fbfr, FILE *
iop)
#include "fml32.h"
int
Fextread32(FBFR32 *
fbfr, FILE *
iop)
Fextread()は、フォーマットされた出力(つまり、
Fprint()の出力)からフィールド化バッファを作成するために使用されます。パラメータは、フィールド化バッファを指すポインタ
fbfrとファイル・ストリームを指すポインタ
iopです。入力ファイル形式は基本的に
Fprint()の出力形式と同じで、次のようになります。
[flag] fldname or fldid tab> fldval (or fldname, if flag is ``='')
フィールド化バッファにあるフィールドのオカレンス0は、指定された値に変更されます。
指定されたフィールドのオカレンス0は、フィールド化バッファから削除されます。タブ文字が必要です。すべてのフィールド値は、無視されます。
この場合、入力行の最後のフィールドは、フィールド化バッファ内のフィールド名です。そのフィールドのオカレンス0の値は、入力行の最初のフィールドで指定されたオカレンス0に割り当てられます。
フラグが指定されない場合、値(
fldval)を持った
fldnameで指定されているフィールドの新しいオカレンスが、フィールド化バッファに追加されます。後続の改行(
-)は、完了済の各入力バッファの後に置く必要があります。
FLD_FML32および
FLD_VIEW32型の値の場合、
Fextread32()はそれぞれ、ネストされたFML32バッファとVIEW32フィールドを生成します。この関数は、
FLD_PTRフィールド・タイプを無視します。関数にタイプ
FLD_PTRの値が与えられても、エラーは戻されません。
Fextread32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fextread()または
Fextread32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fextread()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド番号は無効です。
UNIXシステム・コールでエラーが発生しました
UNIXシステム・コールでエラーが発生しました。外部の整数型変数
errnoは、システム・コールによるエラーを示すために設定され、外部の整数型変数
Uunixerr (
Uunix.hで定義されている値)は、エラーを返したシステム・コールに設定されます。
「未知のフィールド名が指定されました。」
フィールド表にないフィールド名が指定されました。
形式の文法が正しくありません。
外部バッファの形式に文法エラーがありました。考えられるエラーは、不正なend-of-fileインジケータ、次の形式にない入力行(
fieldidまたは
name tab > value)、2つの制御文字、1000文字より大きいフィールド値、または無効な16進のエスケープ・シーケンスなどです。
「該当するフィールドがありません。」
削除するフィールドが、フィールド化バッファにありません。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
この関数は、Windows用のOracle Tuxedo System Workstation DLLでは使用できません。
Ffind()、
Ffind32() - バッファにあるフィールド・オカレンスの検索
#include <stdio.h>
#include "fml.h"
char *
Ffind(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, FLDLEN *
len)
#include "fml32.h"
char *
Ffind32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, FLDLEN32 *
len)
Ffind()は、バッファ内の指定されたフィールド・オカレンスの値を検索します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。フィールドがある場合、その長さは、*
lenに設定され、その位置は、関数の値として返されます。
lenの値がNULLの場合は、フィールドの長さは返されません。
Ffind()は、フィールドの読取り専用アクセス権を取得する場合に使用できます。
Ffind()によって返された値を使用してバッファを変更することはできません。
一般に、
FLD_LONG、
FLD_FLOAT、
FLD_DOUBLE、
FLD_PTR、
FLD_FML32、および
FLD_VIEW32型の場合、それぞれの値がバッファ内で適切に配置されているとは限らないため、格納されているままの型を直接使用するのには向いていません。これらの値は、最初に、適宜に配列されたメモリー位置に複写される必要があります。変換関数
CFfind()を使用してこのようなフィールドにアクセスする場合、検索される変換済の値は正しく配列されることが保証されます。バッファの変更は、関数
Fadd()または
Fchg()によってのみ行われる必要があります。
Ffind()および
Ffindlast()が戻す値は、バッファが変更されないかぎり有効です。
Ffind32()は、
FLD_FML32および
FLD_VIEW32フィールド・タイプで提供される、埋め込み型のバッファ内の指定フィールドのオカレンスをチェックしません。
FLD_MBSTRING型の指定されたフィールド識別子の場合、
Ffind32()の戻り値は
Fmbunpack(32)関数を使用して解析できます。
Ffind32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Ffind()または
Ffind32()を呼び出すことができます。
前述の「形式」の項では、
Ffind()の戻り値のデータ型は、charのポインタ(Cの
char *)として記述されています。実際、戻されるポインタは、格納済のフィールドの型と同じ型を持つオブジェクトを指しています。
この関数は、エラー時にはNULLのポインタを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ffind()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません。」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Ffindlast、Ffindlast32(3fml)
Ffindlast()、
Ffindlast32() - バッファにあるフィールドの最後のオカレンスの値を検索
#include <stdio.h>
#include "fml.h"
char *
Ffindlast(FBFR *
fbfr, FLDID
fieldid, FLDOCC *
oc, FLDLEN *
len) #include "fml32.h"
char *
Ffindlast32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32 *
oc, FLDLEN32 *
len)
Ffindlast()は、バッファ内でフィールドの最後のオカレンスを検索します。
fbfrはフィールド化バッファを指すポインタです。
fieldidはフィールド識別子です。
ocはフィールドのオカレンス番号を受け取るために使用される整数型を指すポインタです。
lenは値の長さです。バッファにフィールドのオカレンスがない場合は、NULLが返されます。通常、
Ffindlast()の処理は
Ffind()に似ています。
Ffindlastではユーザーがフィールド・オカレンスを指定しないのが大きな違いです。その代わり、フィールドの最後のオカレンスの値およびオカレンス番号の両方が返されます。最後のフィールドのオカレンス番号を返すため、
Ffindlast()のオカレンス引数
ocは、整数型のポインタであり、
Ffind()の場合のように整数ではありません。
ocがNULLで指定されている場合、最後のオカレンスのオカレンス番号は返されません。
lenの値がNULLの場合は、フィールドの長さは返されません。
一般に、
FLD_LONG、
FLD_FLOAT、
FLD_DOUBLE、
FLD_PTR、
FLD_FML32、および
FLD_VIEW32型の場合、それぞれの値がバッファ内で適切に配置されているとは限らないため、格納されているままの型を直接使用するのには向いていません。これらの値は、最初に、適宜に配列されたメモリー位置に複写される必要があります。変換関数
CFfind()を使用してこのようなフィールドにアクセスする場合、検索される変換済の値は正しく配列されることが保証されます。バッファの変更は、関数
Fadd()または
Fchg()によってのみ行われる必要があります。
Ffind()および
Ffindlast()が戻す値は、バッファが変更されないかぎり有効です。
Ffindlast32()は、
FLD_FML32および
FLD_VIEW32フィールド・タイプで提供される、埋め込み型のバッファ内の指定フィールドのオカレンスをチェックしません。
FLD_MBSTRING型の指定されたフィールド識別子の場合、
Ffindlast32()の戻り値は
Fmbunpack(32)関数を使用して解析できます。
Ffindlast32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Ffindlast()または
Ffindlast32()を呼び出すことができます。
上記の「形式」の項では、
Ffindlast()の戻り値のデータ型は、charのポインタ(Cの
char *)として記述されています。実際、戻されるポインタは、格納済のフィールドの型と同じ型を持つオブジェクトを指しています。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ffindlast()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールドがリクエストされましたが、指定されたフィールドは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Ffindocc、Ffindocc32(3fml)
Ffindocc()、
Ffindocc32() - フィールド値のオカレンスの検索
#include <stdio.h>
#include "fml.h"
FLDOCC
Ffindocc(FBFR *
fbfr, FLDID
fieldid, char *
value, FLDLEN
len) #include "fml32.h"
FLDOCC32
Ffindocc32(FBFR32 *
fbfr, FLDID32
fieldid, char *
value, FLDLEN32
len)
Ffindocc()は、バッファ内の指定したフィールドのオカレンスを調べ、ユーザー指定のフィールド値と一致する最初のフィールド・オカレンスのオカレンス番号を返します。
fbfrはフィールド化バッファを指すポインタです。
fieldidはフィールド識別子です。検索される値は、
valueパラメータが指す場所に含まれています。
lenは値の長さです(
FLD_CARRAY型または
FLD_MBSTRING型の場合)。
fieldidのフィールド型が
FLD_STRINGで、
lenが0でない場合、パターン照合は文字列に対して実行されます。サポートされるパターン照合は、
regcmp(3)で説明されるパターンと同じです(UNIXのリファレンス・マニュアルを参照)。さらに、正規表現のalternationがサポートされます(たとえば、''
A|B''は''
A''または''
B''と一致します)。パターンはフィールド値全体と一致する必要があります(つまり、パターン''
value''は暗黙に''
^value$''として扱われます)。MS-DOSおよびOS/2環境で使用するために提供される
Ffindocc()では、
FLD_STRINGフィールドの
regcmp()パターン照合はサポートされません。
strcmp()が使用されます(UNIXのリファレンス・マニュアルを参照)。
前述の「形式」の項では、
Ffindocc()の引数valueのデータ型は、charのポインタ(Cの
char *)として記述されています。技術的には、これは、
Ffindocc()に渡すことのできるある特定の値のみを記述しています。実際、value引数の型は、検索されるフィールドのフィールド化バッファ表現の型と同じ型のオブジェクトのポインタである必要があります。たとえば、フィールドが、
FLD_LONG型でバッファに格納されている場合は、valueの型は、long型のポインタ(Cの
long *)である必要があります。同様に、
FLD_SHORT型でバッファに格納される場合、valueは、short型のポインタ(Cの
short *)である必要があります。大事な点は、
Ffindocc()は、valueで指されるオブジェクトが、格納済の検索されるフィールドの型と同じ型を持っていることを想定していることです。
FLD_PTR型の値の場合、
Ffindocc32()は指定されたポインタ値と一致するフィールドのオカレンスを検索します。
FLD_FML32型の値の場合、すべてのフィールド・オカレンスおよび値が等しければ、2つのフィールドは等しいとみなされます。
FLD_VIEW32型の値の場合、VIEW名が同じとき、およびすべての構造体メンバーのオカレンスおよび値が等しいとき、2つのフィールドは等しいとみなされます。
FLD_MBSTRING型の値の場合、値は
Fmbpack32()関数のパッキングされた出力引数であり、引数
lenは
Fmbpack32()の出力引数
sizeの値の長さです。
Ffindocc32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Ffindocc()または
Ffindocc32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ffindocc()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド値がリクエストされましたが、指定されたフィールドおよび値は、フィールド化バッファにありませんでした。
「関数の引数が無効です。」
呼び出された関数の引数の1つが、無効でした(たとえば、NULLのvalueパラメータを
Ffindocc()に渡した、あるいは無効な文字列パターンを指定した)。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Ffinds()、
Ffinds32() - 文字列表現を指すポインタを返す
#include <stdio.h>
#include "fml.h"
char *
Ffinds(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc)
#include "fml32.h"
char *
Ffinds32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc)
Ffinds()は、ユーザー型
FLD_STRINGに変換する処理のために提供されます。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。指定されたフィールド・オカレンスは、検索されると、バッファにあるその型からNULL終了の文字列に変換されます。基本的に、このマクロは対応する変換関数
CFfind()を呼び出します。CFfind()は、
utype (
FLD_STRING)および
ulen (値が0)を提供します。
Ffinds()が返すポインタが妥当である期間は、
CFfind()で記述されているものと同じです。
Ffinds32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Ffinds()または
Ffinds32()を呼び出すことができます。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ffinds()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド型は無効です。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
Ffloatev、Ffloatev32、Fvfloatev、Fvfloatev32(3fml)
Ffloatev()、
Ffloatev32()、
Fvfloatev()、
Fvfloatev32() - 式の値をdouble型で返す
#include <stdio.h>
#include "fml.h"
double
Ffloatev(FBFR *
fbfr, char *
tree)
double
Fvfloatev(char *
cstruct, char *
tree, char *
viewname)
#include "fml32.h"
double
Ffloatev32(FBFR32 *
fbfr, char *
tree)
double
Fvfloatev32(char *
cstruct, char *
tree, char *
viewname)
Ffloatev()は、フィールド化バッファのポインタ(
fbfr)および
Fboolco()が返す評価ツリーのポインタ(
tree)を利用して、算術式の値(ツリーによって表される)をdouble型で返します。この関数は、フィールド化バッファあるいは評価ツリーのいずれも変更しません。
Ffloatev32()は32ビットFMLで使用されます。
Fvfloatev()および
Fvfloatev32()は、同じVIEW機能を提供します。
viewnameパラメータは、フィールド・オフセットを取り出すVIEWを示し、
Fvboolco()または
Fvboolco32()で指定されたVIEWと同じにする必要があります。
Workstationプラットフォームでは、これらの関数はサポートされていません。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、ここで記述する関数、
Ffloatev()、
Ffloatev32()、
Fvfloatev()、または
Fvfloatev32()を呼び出すことができます。
正常終了時には、
Ffloatev()は、表現の値をdoubleで返します。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ffloatev()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
「ブール式の文法が正しくありません。」
論理表現のtreeに文法エラーがありました。
「ビューが見つからないか、取得できません」
VIEWDIRまたは
VIEWFILESで指定したファイルに
viewnameが見つかりません。
「VIEWファイルが見つからないか、オープンできません」
viewnameの検索中に、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つをプログラムが見つけられませんでした。
「オペレーティング・システム・エラー」
viewname検索中にプログラムは
VIEWDIRまたは
VIEWFILESで指定したファイルの1つを読込み用に開けませんでした。
「VIEWファイルが正しくありません」
viewnameの検索中、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つが壊れていたか、VIEWファイルではありませんでした。
「mallocが失敗しました」
viewnameの検索中、
malloc()がビュー情報を格納するための領域の割当てに失敗しました。
Ffprint()、
Ffprint32() - フィールド化バッファを指定されたストリームに出力
#include <stdio.h>
#include "fml.h"
int
Ffprint(FBFR *
fbfr, FILE *
iop)
#include "fml32.h"
int
Ffprint32(FBFR32 *
fbfr, FILE *
iop)
Ffprint()は、テキストが指定された出力ストリームに出力されることを除いて、
Fprint()と同様の機能を持ちます。
fbfrは、フィールド化バッファを指すポインタです。
iopは、出力ストリームを指す
FILE型のポインタです。
バッファの各フィールドについて、フィールド名とフィールド値がタブで区切って出力されます。
Fname()はフィールド名を決定するために使用されます。フィールド名が決定できない場合、フィールド識別子が出力されます。文字列または文字配列のフィールド値内の表示不能な文字は、バックスラッシュとその後に続く2文字の16進値で表現されます。バッファの出力が完了すると改行が出力されます。
FLD_PTR型の値の場合、
Ffprint32()はフィールド名またはフィールド識別子、およびポインタ値を16進数で出力します。この関数はポインタ情報を出力しますが、
Fextread32()関数は
FLD_PTRフィールド・タイプを無視します。
FLD_FML32型の値の場合、
Ffprint32()は各ネスト・レベルに先行タブを追加することにより、再帰的にFML32バッファを出力します。
FLD_VIEW32型の値の場合、
Ffprint32()はVIEW32フィールド名、および構造体メンバーの名前と値のペアを出力します。
Ffprint32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Ffprint()または
Ffprint32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ffprint()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
この関数は、Windows用のOracle Tuxedo System Workstation DLLでは使用できません。
Ffree()、
Ffree32() - フィールド化バッファ用に割り当てられた領域の解放
#include <stdio.h>
#include "fml.h"
int
Ffree(FBFR *
fbfr)
#include "fml32.h"
int
Ffree32(FBFR32 *
fbfr)
Ffree()は、その引数であるフィールド化バッファ用に割り当てられた領域を取り戻します。
fbfrは、フィールド化バッファを指すポインタです。フィールド化バッファは無効化されます。つまり、フィールド化を解除して解放します。
Ffree32()は、
FLD_PTRフィールドのポインタによって参照されるメモリー領域を解放しません。
free()よりFfree()の使用をお薦めします(UNIXシステムのリファレンス・マニュアルを参照)。
free()ではフィールド化バッファを無効にできませんが、
Ffree()を使用するとフィールド化バッファを無効にできます。フィールド化バッファの無効化は重要です。
malloc() (UNIXシステムのリファレンス・マニュアルを参照)は、解放されたメモリーをクリアせずに再利用するためです。
free()を使用すると、
malloc()が、有効なフィルード化バッファのように見えるがそうではないメモリーを返す可能性があります。
Ffree32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Ffree()または
Ffree32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ffree()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
UNIXシステムのリファレンス・マニュアルのfree(3)、
malloc(3)
Fget()、
Fget32() - フィールド・オカレンスのコピーおよび長さの取得
#include <stdio.h>
#include "fml.h"
int
Fget(FBFR *fbfr, FLDID
fieldid, FLDOCC oc, char *
loc, FLDLEN
*
maxlen)
#include "fml32.h"
int
Fget32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, char *
loc,
FLDLEN32 *
maxlen)
Fget()は、値が変更されたときに、フィールド化バッファのフィールドを検索するために使用されます。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。呼出し側は、プライベート・データ領域を指すポインタ(
loc)、データ領域の長さ(*
maxlen)を
Fget()に渡します。フィールドの長さは、*
maxlenに返されます。関数が呼び出された時に、
maxlenがNULLの場合は、そのフィールドの値(
loc)のデータ領域が十分大きく、フィールド値の入力に支障がないため、値が返されないと想定されます。
locがNULLの場合は、値は検索されません。このように、この関数を呼び出すことにより、フィールドが存在するかどうかを確かめることができます。
上記の「形式」の項では、
Fget()の引数valueのデータ型は、charのポインタ(Cの
char *)として記述されています。技術的には、これは、
Fget()に渡すことのできる値のある特定の値のみを記述しています。実際、value引数の型は、検索されるフィールドのフィールド化バッファ表現の型と同じ型のオブジェクトのポインタである必要があります。たとえば、フィールドが、
FLD_LONG型でバッファに格納されている場合は、valueの型は、long型のポインタ(Cの
long *)である必要があります。同様に、
FLD_SHORT型でバッファに格納される場合、valueは、short型のポインタ(Cの
short *)である必要があります。大事なことは、
Fget()はvalueで指されるオブジェクトが、検索される格納済のフィールドの型と同じ型を持っていることを想定していることです。
FLD_MBSTRING型の指定された
fieldidの場合、
Fget32()の戻り値は
Fmbunpack(32)関数を使用して解析できます。
Fget32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fget()または
Fget32()を呼び出すことができます。
Fget32()が
FLD_VIEW32フィールド・タイプで使用されると、
FVIEWFLD構造体を指すポインタが戻されます。この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fget()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「空き領域なし」
maxlenに指定されているデータ領域の大きさは、フィールド値を保持するのに十分な大きさではありません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fgetalloc、Fgetalloc32(3fml)
Fgetalloc()、
Fgetalloc32() - 領域の割り当て、およびフィールド・オカレンスのコピーの取得
#include <stdio.h>
#include "fml.h"
char *
Fgetalloc(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, FLDLEN *
extralen)
#include "fml32.h"
char *
Fgetalloc32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, FLDLEN32
*
extralen)
Fget()同様、
Fgetalloc()は、バッファ・フィールドのコピーの検索および作成を行いますが、(UNIXシステムのプログラマ・リファレンス・マニュアルにある)
malloc()を介してフィールド用の領域を取得します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
Fgetalloc()の最後の引数
extralenは、フィールド値の大きさに加えて取得される予備の領域の大きさを提供します。それは、取得される値が、フィールド化バッファに再挿入される前に拡張される場合に使用されます。
extralenがNULLの場合、割り当てる追加領域はなく、実際の長さは返されません。
Fgetalloc()で取得した領域を
free()で解放する処理は、呼出し側プログラムの役割です。バッファは、あらゆるフィールドの型に対して正しく並べられます。
FLD_MBSTRING型の指定されたフィールド識別子の場合、
Fgetalloc32()の戻り値は
Fmbunpack(32)関数を使用して解析できます。
Fgetalloc32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fgetalloc()または
Fgetalloc32()を呼び出すことができます。
前述の「形式」の項では、
Fgetalloc()の戻り値のデータ型は、charのポインタ(Cの
char *)として記述されています。実際、戻されるポインタは、格納済のフィールドの型と同じ型を持つオブジェクトを指しています。
Fgetalloc32()が
FLD_VIEW32フィールド・タイプで使用されると、
FVIEWFLD構造体を指すポインタが戻されます。この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fgetalloc()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「malloc()を使用して、メモリーを割り当てられませんでした。」
malloc()を使用しての領域の動的な割当てが失敗しました。
UNIXシステムのリファレンス・マニュアルのfree(3)、
malloc(3)
Fgetlast、Fgetlast32(3fml)
Fgetlast()、
Fgetlast32() - 最後のオカレンスのコピーの取得
#include <stdio.h>
#include "fml.h"
int
Fgetlast(FBFR *
fbfr, FLDID
fieldid, FLDOCC *
oc, char *
value, FLDLEN
*
maxlen)
#include "fml32.h"
int
Fgetlast32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32 *
oc, char
*
value, FLDLEN32 *
maxlen)
Fgetlast()は、フィールド識別子(
fieldid)で識別される最後のオカレンスの値とオカレンス番号の両方を検索するために使用されます。
fbfrは、フィールド化バッファを指すポインタです。最後のフィールドのオカレンス番号を返すため、オカレンスの引数(
oc)は、整数型を指すポインタであり、整数ではありません。
呼出し側は、プライベート・バッファを指すポインタ(
loc)、バッファの長さ(
*maxlen)を
Fgetlast()に提供します。フィールドの長さは、
*maxlenに返されます。関数が呼び出された時に、
maxlenがNULLの場合は、そのフィールド値のバッファが十分に大きく、フィールド値を入れるのに支障がないために、値が返されないと想定されます。
locがNULLの場合、値は返されません。
ocがNULLの場合は、オカレンスは、返されません。
上記の「形式」の項では、
Fget()の引数valueのデータ型は、charのポインタ(Cの
char *)として記述されています。技術的には、これは、
Fget()に渡すことのできる値のある特定の値のみを記述しています。実際、value引数の型は、検索されるフィールドのフィールド化バッファ表現の型と同じ型のオブジェクトのポインタである必要があります。たとえば、フィールドが、
FLD_LONG型でバッファに格納されている場合は、valueの型は、long型のポインタ(Cの
long *)である必要があります。同様に、
FLD_SHORT型でバッファに格納される場合、valueは、short型のポインタ(Cの
short *)である必要があります。大事なことは、
Fget()はvalueで指されるオブジェクトが、検索される格納済のフィールドの型と同じ型を持っていることを想定していることです。
FLD_MBSTRING型の指定されたフィールド識別子の場合、
Fgetlast32()の戻り値は
Fmbunpack(32)関数を使用して解析できます。
Fgetlast32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fgetlast()または
Fgetlast32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fgetlast()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「空き領域なし」
maxlenに指定されているデータ領域の大きさは、フィールド値を保持するのに十分な大きさではありません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fgets()、
Fgets32() - 値を文字列に変換
#include <stdio.h>
#include "fml.h"
int
Fgets(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, char *
buf)
#include "fml32.h"
int
Fgets32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, char *
buf)
Fgets()は、フィールド化バッファからフィールド・オカレンスを検索し、値をユーザー型
FLD_STRINGに変換します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
Fgets()の呼出し側は、プライベート・バッファを指すポインタ(
buf)を提供します。プライベート・バッファは、検索されるフィールド値のために使用されます。
bufが十分に大きく、値を保持できると想定されています。基本的に、
Fgets()は、想定されている
utype (
FLD_STRING)および
ulen (値が0)を利用して
CFget()を呼び出します。
Fgets32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fgets()または
Fgets32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fgets()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
Fgetsa()、
Fgetsa32() -
malloc()で領域を割り当て、変換された値を取得する
#include <stdio.h>
#include "fml.h"
char *
Fgetsa(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc, FLDLEN *
extra)
#include "fml32.h"
char *
Fgetsa32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc, FLDLEN32
*
extra)
Fgetsa()は
CFgetalloc()を呼び出すマクロです。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。この関数は
malloc() (UNIXシステムのプログラマ・リファレンス・マニュアル)を使用して、文字列に変換して取得したフィールド値のための領域を割り当てます。
extraがNULLでない場合、extraには、フィールド値の大きさに加えて割り当てる余分な領域を指定します。全体の大きさは、
extraに返されます。
malloc()で割り当てた領域を(UNIXシステムのリファレンス・マニュアルの)
free()を使用して解放するのは、ユーザーの責任です。
Fgetsa32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fgetsa()または
Fgetsa32()を呼び出すことができます。
正常終了の場合、割り当てられたバッファを指すポインタを返します。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fgetsa()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
UNIXシステムのリファレンス・マニュアルのfree(3)、
malloc(3)
Fidnm_unload、Fidnm_unload32(3fml)
Fidnm_unload()、
Fidnm_unload32() -
id->nmマッピング表から領域を取り戻す
#include <stdio.h>
#include "fml.h"
void
Fidnm_unload(void);
#include "fml32.h"
void
Fidnm_unload32(void);
Fidnm_unload()は、
Fname()によってフィールド識別子用に割り当てられた領域を、フィールド名のマッピング表用に取り戻します。
Fidnm_unload32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fidnm_unload()または
Fidnm_unload32()を呼び出すことができます。
Fidxused、Fidxused32(3fml)
Fidxused()、
Fidxused32() - 使用されている領域の大きさを返す
#include <stdio.h>
#include "fml.h"
long
Fidxused(FBFR *
fbfr)
#include "fml32.h"
long
Fidxused32(FBFR32 *
fbfr)
Fidxused()は、バッファの索引で使用している現在の領域の大きさを示します。
fbfrは、フィールド化バッファを指すポインタです。
Fidxused32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fidxused()または
Fidxused32()を呼び出すことができます。
正常終了の場合、索引で使用しているバッファ内の領域の大きさを戻します。この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fidxused()は、異常終了して
Ferrorを次のように設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Fielded()、
Fielded32() - バッファがフィールド化されている場合は、
trueを返す
#include stdio.h>
#include "fml.h"
int
Fielded(FBFR *
fbfr)
#include "fml32.h"
int
Fielded32(FBFR32 *
fbfr)
Fielded()は、指定されたバッファがフィールド化されているかを調べるのに使用されます。
fbfrは、フィールド化バッファを指すポインタです。
Fielded32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fielded()または
Fielded32()を呼び出すことができます。
Fielded()は、バッファがフィールド化されている場合には
trueを戻します。また、バッファがフィールド化されていない場合は、
falseを戻しますが、この場合は
Ferrorを設定しません。
Findex()、
Findex32() - フィールド化バッファの索引を行う
#include <stdio.h>
#include "fml.h"
int
Findex(FBFR *
fbfr, FLDOCC
intvl)
#include "fml32.h"
int
Findex32(FBFR32 *
fbfr, FLDOCC32
intvl)
Findex()は、フィールド化バッファのインデックスを行うために明示的に呼び出されます。
fbfrは、フィールド化バッファを指すポインタです。2番目のパラメータ
intvlには、インデックスの間隔を指定します。つまり、インデックスするフィールドを理想的に分離します。この引数の値が0の場合、バッファの現在のインデックス値が使用されます。現在の値そのものが0の場合、値
FSTDXINTVL (デフォルトは16)が使用されます。インデックス値に1を使用すると、必ず、バッファにあるすべてのフィールドがインデックスされます。インデックス間隔の大きさとバッファのインデックスに割り当てられる領域の大きさは、反比例します。したがって、間隔が小さいとより多くのフィールドがインデックスされ、より多くの領域が使用されます。
Findex32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Findex()または
Findex32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Findex()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「フィールド化バッファにスペースがありません。」
エントリは、索引に追加されますが、バッファには十分な領域が残っていません。
Finit()、
Finit32() - フィールド化バッファを初期化
#include <stdio.h>
#include "fml.h"
int
Finit(FBFR *
fbfr, FLDLEN
buflen)
#include "fml32.h"
int
Finit32(FBFR32 *
fbfr, FLDLEN32
buflen)
Finit()は、フィールド化バッファを静的に初期化するために呼び出されます。
fbfrは、フィールド化バッファを指すポインタです。
buflenは、バッファの長さです。この関数はバッファ・ポインタとバッファの長さを取り、フィールドのないバッファのために内部構造体を設定します。前に使用されたバッファを再初期化するには
Finit()も使用できます。
Finit32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Finit()または
Finit32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Finit()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません。」
バッファのポインタがNULLです。
「フィールド化バッファにスペースがありません。」
フィールド化バッファ用に指定されたバッファの大きさが小さすぎます。
フィールドを持たないようバッファを再初期化する正しい方法は、
Finit(fbfr, (FLDLEN)Fsizeof(fbfr));です。
Fjoin()、
Fjoin32() - ソース・バッファを宛先バッファに組み込む
#include stdio.h>
#include "fml.h"
int
Fjoin(FBFR *
dest, FBFR *
src)
#include "fml32.h"
int
Fjoin32(FBFR32 *
dest, FBFR32 *
src)
Fjoin()は、2つのフィールド化バッファをフィールド識別子/オカレンスの一致に基づいて結合するために使用されます。
destは宛先のフィールド化バッファを、
srcは元のフィールド化バッファをそれぞれ指すポインタです。フィールドID/オカレンスと一致するフィールドの場合は、フィールド値はソース・バッファの値を使って宛先バッファで更新されます。ソース・バッファ内に、対応するfieldidとオカレンスの組合せがない場合、宛先バッファのフィールドは削除されます。バッファを組み込むことにより
FLD_PTRフィールドが削除されても、ポインタによって参照されるメモリー領域は変更または解放されません。
新しい値が古い値より大きい場合は、この関数は領域の不足のために失敗することがあります。その場合、宛先バッファは変更されます。ただし、その場合は、
Frealloc()を使用し、
Fjoin()関数を繰返し呼び出して、宛先バッファを再割り当てできます。宛先バッファが部分的に更新された場合でさえ、
Fjoin()関数を繰り返すことで正しい結果が取得されます。
Fjoin32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fjoin()または
Fjoin32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fjoin()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファのどちらかが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファまたは宛先バッファのどちらかがフィールド化バッファでないか、または
Finit()によって初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
FBFR *src, *dest; ... if(Fjoin(dest,src) 0) F_error("pgm_name");
destがフィールドA、BおよびCオカレンスを2個持っており、
srcが、フィールドA、CおよびDを持っている場合、結果的に、
destは、元のフィールド値Aおよび元のフィールド値Cを持つことになります。
Fldid()、
Fldid32() - フィールド名をフィールド識別子にマップする
#include <stdio.h>
#include "fml.h"
FLDID
Fldid(char *
name)
#include "fml32.h"
FLDID32
Fldid32(char *
name)
Fldid()は、フィールド名からフィールド識別子を導くランタイム変換機能を提供し、そのフィールドの
nameパラメータに対応した
FLDIDを戻します。最初の呼出しでは、フィールド表用の領域が動的に割り当てられ、表がロードされます。
Fldid()でロードしたフィールド表が占有しているデータ領域を回復するには、
Fnmid_unload()関数を呼び出してファイルをアンロードする必要があります。
Fldid32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fldid()または
Fldid32()を呼び出すことができます。
この関数は、エラー時には
BADFLDIDを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fldid()は異常終了し、
Ferrorを次の値に設定します。
「未知のフィールド名が指定されました。」
フィールド表にないフィールド名が指定されました。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
UNIXシステムのリファレンス・マニュアルのmalloc(3)
Fldno()、
Fldno32() - フィールド識別子をフィールド番号にマップする
#include <stdio.h>
#include "fml.h"
int
Fldno(FLDID fieldid)
#include "fml32.h"
long
Fldno32(FLDID32 fieldid)
Fldno()は、パラメータとしてフィールド識別子(
fieldid)を受け取り、識別子にあるフィールド番号を返します。
Fldno32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fldno()または
Fldno32()を呼び出すことができます。
この関数は、フィールド番号を返します。エラーは返しません。
Fldtype()、
Fldtype32() - フィールド識別子をフィールド・タイプにマップする
#include <stdio.h>
#include "fml.h"
int
Fldtype(FLDID
fieldid)
#include "fml32.h"
int
Fldtype32(FLDID32
fieldid)
Fldtype()は、フィールド識別子(
fieldid)を受け取り、
fml.hで定義されているように、識別子(整数)にあるフィールド・タイプを返します。
Fldtype32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fldtype()または
Fldtype32()を呼び出すことができます。
Flen()、
Flen32() - バッファ中のフィールド・オカレンスの
lenを返します。
#include <stdio.h>
#include "fml.h"
int
Flen(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc)
#include "fml32.h"
long
Flen32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc)
Flen()は、バッファ中の指定したフィールド・オカレンスの値を見つけ出し、そのフィールド長を返します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
FLD_PTR型の値の場合、
Flen32()は
sizeof(char*)に基づくポインタ・フィールドの固定長を戻します。
FLD_FML32型の値の場合、
Flen32()はネストされたバッファの長さに対する
Fused32()の値を戻します。
FLD_VIEW32型の値の場合、
Flen32()はVIEWデータの長さとVIEW名の長さを戻します。
FLD_MBSTRING型の値の場合、
Flen32()は
Fmbpack32()で作成され、パッキングされた出力の長さを返します。
Flen32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Flen()または
Flen32()を呼び出すことができます。
Flen()は、正しく終了するとフィールド長を返します。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件が発生すると、
Flen()は異常終了し、
Ferrorを次のように設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「該当するフィールドがありません。」
フィールド・オカレンスがリクエストされましたが、指定されたフィールドとオカレンスの両方、あるいはどちらかは、フィールド化バッファにありませんでした。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fmbpack32() - エンコーディング名およびマルチバイト・データ情報を準備する
int
Fmbpack32 (char *
enc,void *
ind,FLDLEN32
indlen,void
*
packed,FLDLEN32 *
size,long
flags)
Fmbpack32()は、FML32型付きバッファに入力された
FLD_MBSTRINGフィールドのエンコーディング名およびマルチバイト・データ情報を準備します。
Fmbpack32()は、
FLD_MBSTRINGフィールドがFML32 APIでFML32バッファに追加される前に使用します。
encは、NULLでない場合、コード・セットのマルチバイト・データ(
ind)に対するコード・セットのエンコーディング名を保持するASCII文字列(NULLで終了)です。
encがNULL、引数
flagsが0の場合、出力
packedに含められるエンコーディング名は、プロセス
TPMBENC環境変数から取得されます。引数
flagsが
FBUFENCの場合、
encは無視されます。
indは、コード・セットのマルチバイト・データです。
packedは、
Fmbpack32()の出力を指すポインタです。これは、FML32バッファに
FLD_MBSTRINGフィールドを含めるFML32 APIの入力値として使用されます。パック領域は、FLDLEN32(TM32U)バウンダリに配置する必要があります。
入力でのsizeは、
packedが指すメモリー・サイズです。サイズが
Fmbpack32()の結果の処理には不十分な場合、
FNOSPACEが戻され、
sizeは
packedのバイト数にリセットされます。
Fmbpack32()が正常に実行された後、
sizeは実際に使用されたバイト数にリセットされます。
flagsは、0または
FBUFENCです。
flagsを
FBUFENCに設定すると、
Fmbpack32()は引数
encを無視し、
FBUFENCを
packedの入力データと共に含めます。エンコーディング名を指定しない場合、出力
packedは、FML32 APIによって強制的に
FLD_MBSTRINGフィールドでエンコーディング名をFML32バッファから取得するよう処理します。したがって、
FBUFENCを使用する場合、FML32バッファのエンコーディング名を設定するために、アプリケーション開発者は
tpsetmbenc()も使用する必要があります。
Fmbpack32()は、正しく終了すると正の値を戻します。
Fmbpack32()は、エラー発生時に-1を戻し、
Ferror32を設定してエラー条件を示します。
次の条件の場合、
Fmbpack32()は異常終了し、
Ferror32を次の値に設定します。
ind、
packed、または
sizeがNULLです。
encまたは
indlenが無効です。
packedのサイズが、
Fmbpack32()の結果を処理するには不十分です。
Fmbunpack32() - エンコーディング名およびマルチバイト・データ情報を抽出する
int
Fmbunpack32 (void *
packed,FLDLEN32
ilen,char *
enc,void
*
outd,FLDLEN32 *
olen,long
flags)
Fmbunpack32()は、FML32型付きバッファ内の
FLD_MBSTRINGフィールドからエンコーディング名およびマルチバイト・データ情報を抽出します。
Fmbunpack32()は、
FLD_MBSTRINGフィールドがFML32 API (
Ffind32()、
Fget32()、など)でFML32バッファから抽出された後に使用します。
packedは、FML32 APIで出力された
FLD_MBSTRINGフィールドのデータを指すポインタです。
encは、
FLD_MBSTRINGフィールドのコード・セットのエンコーディング名が、パッキングされた情報(
packed)の一部である場合に、エンコーディング名を保持する
packed内のASCII文字列(NULLで終了)です。
FBUFENCフラグを設定して
Fmbpack32()で
FLD_MBSTRINGフィールドを作成した場合、
encはNULLに設定します。後者の場合、アプリケーション開発者は、FML32バッファで
tpgetmbenc()を使用して、
FLD_MBSTRINGフィールドのエンコーディング名を取得する必要があります。
outdには、
Fmbunpack32()の正常終了時に
packedから抽出されるマルチバイト・データが入ります。
入力でのolenは、
outdが指すメモリー・サイズです。サイズが
Fmbunpack32()の結果の処理には不十分な場合、
FNOSPACEが戻され、
olenは
outdのバイト数にリセットされます。
Fmbunpack32()が正常に実行された後、
olenは実際に使用されたバイト数にリセットされます。
flagsは現在使用されていないので、0に設定します。
Fmbunpack32()は、正しく終了すると正の値を戻します。
Fmbunpack32()は、エラー発生時に-1を戻し、
Ferror32を設定してエラー条件を示します。
次の条件の場合、
Fmbunpack32()は異常終了し、
Ferror32を次の値に設定します。
outd、
olen、または
packedがNULLです。
packedまたは
ilenが無効です。
outdのサイズが、
Fmbunpack32()の結果を処理するには不十分です。
Fmkfldid、Fmkfldid32(3fml)
Fmkfldid()、
Fmkfldid32() - フィールド識別子を作成
#include <stdio.h>
#include "fml.h"
FLDID
Fmkfldid(int
type, FLDID
num)
#include "fml.h"
FLDID32
Fmkfldid32(int
type, FLDID32
num)
Fmkfldid()によって、有効な型(
fml.hで定義されている)から有効なフィールド識別子を作成できます。フィールド番号を順次選択するアプリケーション・ジェネレータをコーディングする場合、あるいはフィールド識別子を再作成する場合に役立ちます。
Fmkfldid32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fmkfldid()または
Fmkfldid32()を呼び出すことができます。
この関数は、エラー時には
BADFLDIDを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fmkfldid()は異常終了し、
Ferrorを次の値に設定します。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド番号は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは、無効です(
fml.hで定義されている)。
Fmove()、
Fmove32() - フィールド化バッファを宛先バッファに移動
#include <stdio.h>
#include "fml.h"
int
Fmove(char *
dest, FBFR *
src)
#include "fml32.h"
int
Fmove32(char *
dest, FBFR32 *
src)
Fmove()は、フィールド化バッファから任意の型のバッファにコピーするときに使用されます。
destは宛先のフィード化バッファを、
srcは元のフィールド化バッファをそれぞれ指すポインタです。
Fmove()と
Fcpy()の違いは、
Fcpy()は宛先がフィールド化バッファであることを想定し、ソース・バッファのデータを収容できる十分なサイズがあることを確認できることです。
Fmove()ではそのようなチェックは行われません。
Fsizeof()のバイト数のデータを、ソースのフィールド化バッファからターゲットのバッファに移動するだけです。宛先バッファは、shortバウンダリで並んでいる必要があります。
FLD_PTR型の値の場合、
Fmove32()はバッファ・ポインタを渡します。アプリケーション・プログラマは、対応するポインタの移動に応じてバッファの再割り当て、および解放を管理する必要があります。
Fmove32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fmove()または
Fmove32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fmove()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファがフィールド化バッファでないか、または
Finit()で初期化されていません。
Fname()、
Fname32() - フィールド識別子をフィールド名にマップする
#include <stdio.h>
#include "fml.h"
char *
Fname(FLDID
fieldid)
#include "fml32.h"
char *
Fname32(FLDID32
fieldid)
Fname()は、フィールド識別子(
fieldid)からフィールド名を導くランタイム変換機能を提供し、引数に対応した名前を持つ文字列を指すポインタを戻します。最初の呼出しでは、フィールド表用の領域が動的に割り当てられ、表がロードされます。
Fname()で作成したマッピング表によって使用されている表領域は、
Fidnm_unload()関数を呼び出して回復することができます。
Fname32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fname()または
Fname32()を呼び出すことができます。
戻されたポインタは内部FML表で保持されます。マルチスレッド・アプリケーションが、戻されたポインタへの参照を解除する場合は、アプリケーション・コード自体でスレッド・セーフにする必要があります。
Fnmid_unload/Fidnm_unloadが発行された場合は、
Fnameによって戻されたポインタへの参照を解除しないでください。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fname()は異常終了し、
Ferrorを次の値に設定します。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
フィールド名が不明または無効な場合、フィールド番号が指定されます。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
Fneeded()、
Fneeded32() - バッファに必要な大きさの計算
#include <stdio.h>
#include "fml.h"
long
Fneeded(FLDOCC
F, FLDLEN
V)
#include "fml32.h"
long
Fneeded32(FLDOCC32
F, FLDLEN32
V)
Fneeded()は、フィールド化バッファに割り当てなければならない領域を決める場合に使用されます。引数
Fはフィールドの数、引数
Vはすべてのフィールド値に必要な領域のバイト数です。
Fneeded32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fneeded()または
Fneeded32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fneeded()は異常終了し、
Ferrorを次の値に設定します。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、フィールド数が0より小さい、
Vが0、または合計の大きさが65534より大きい)。
Fnext()、
Fnext32() - 次のフィールド・オカレンスの取得
#include <stdio.h>
#include "fml.h"
int
Fnext(FBFR *
fbfr, FLDID *
fieldid, FLDOCC *
oc, char *
value, FLDLEN *
len)
#include "fml32.h"
int
Fnext32(FBFR32 *
fbfr, FLDID32 *
fieldid, FLDOCC32 *
oc, char *
value, FLDLEN32 *
len)
Fnext()は、指定されたフィールド・オカレンスの後、バッファ内の次のフィールドを検索します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子を指すポインタです。
ocは、フィールドのオカレンス番号を指すポインタです。
valueは、次のフィールドの値を指すポインタです。
lenは、次の値の長さです。
フィールド識別子
FIRSTFLDIDを指定して、バッファの最初のフィールドを取得する必要があります(たとえば、
Fnext()を最初に呼び出すとき)。
valueがNULLでない場合、次のフィールド値が
valueにコピーされます。
*lenを使用して、値を格納するために十分な領域がバッファに割り当てられているかどうかを判別します。値の長さが
*lenに返されます。関数が呼び出されたときに
lenがNULLの場合は、十分な領域があるために、新しい値の長さが返されないと想定されます。
valueがNULLの場合、値は取得されず、
fieldidと
ocのみが更新されます。
*fieldidおよび
*ocパラメータはぞれぞれ、次に検出されたフィールドとオカレンスに設定されます。フィールドがそれ以上見つからない場合は、0が返されます(バッファの終わり)。
*fieldid、
*ocおよび
*valueは変更されません。フィールドは、フィールド識別子の順に返されます。
値の型は、
char *ですが、返される値は、検索される次のフィールドと同じ型になります。
検索されるフィールドのタイプが
FLD_VIEW32である場合、
valueパラメータは
FVIEWFLD構造体を指します。
Fnext()関数を使用して、構造体の
vnameフィールドと
dataフィールドを設定します。
Fnext32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fnext()または
Fnext32()を呼び出すことができます。
Fnext()は、次のオカレンスを正常に検索できた場合、1を返します。バッファの終わりに達した場合は、0を返します。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fnext()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「空き領域なし」
lenで指定されている値の大きさが十分でないため、フィールド値を保持できません。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
fieldidまたは
ocにNULLを指定している)。
Fnmid_unload、Fnmid_unload32(3fml)
Fnmid_unload()、
Fnmid_unload32() -
nm->idマッピング表から領域を取り戻す
#include <stdio.h>
#include "fml.h"
void Fnmid_unload(void)
#include "fml32.h"
void Fnmid_unload32(void)
Fldid()でロードしたフィールド表が占有しているデータ領域を回復するには、
Fnmid_unload()関数を呼び出してファイルをアンロードする必要があります。
Fnmid_unload32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fnmid_unload()または
Fnmid_unload32()を呼び出すことができます。
Fnum()、
Fnum32() - バッファにあるすべてのオカレンスの数を返す
#include <stdio.h>
#include "fml.h"
FLDOCC
Fnum(FBFR *
fbfr)
#include "fml32.h"
FLDOCC32
Fnum32(FBFR32 *
fbfr)
Fnum()は、指定されたバッファに含まれているフィールド数を返します。
fbfrはフィールド化バッファを指すポインタです。
FLD_FML32および
FLD_VIEW32フィールドは、格納するフィールド数に関係なく、単一フィールドとしてカウントされます。
Fnum32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fnum()または
Fnum32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fnum()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Foccur()、
Foccur32() - バッファにあるフィールド・オカレンスの数を返す
#include <stdio.h>
#include "fml.h"
FLDOCC
Foccur(FBFR *
fbfr, FLDID
fieldid)
#include "fml32.h"
FLDOCC32 Foccur32(FBFR32 *
fbfr, FLDID32
fieldid)
Foccur()は、
fbfrで参照されるバッファの
fieldidで指定されるフィールド・オカレンスの数を決めるために使用されます。
FLD_FML32フィールド・タイプであるため、埋め込み型のFML32バッファ内のフィールドのオカレンスはカウントされません。
Foccur32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Foccur()または
Foccur32()を呼び出すことができます。
正常終了の場合、
Foccur()は、オカレンスの数を返します。オカレンスがない場合は、0を返します。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Foccur()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
Fojoin()、
Fojoin32() - ソース・バッファを宛先バッファに組み込む
#include <stdio.h>
#include "fml.h"
int
Fojoin(FBFR *
dest, FBFR *
src)
#include "fml32.h"
int
Fojoin32(FBFR32 *
dest, FBFR32 *
src)
Fojoin()は、
Fjoin()に似ていますが、宛先バッファ
destのフィールドに、ソース・バッファ
srcに対応するフィールド識別子/オカレンスがない場合でも、そのフィールドは削除されません。対応するフィールド識別子/オカレンスを宛先バッファに持たないソース・バッファにあるフィールドは、宛先バッファに追加されません。バッファを組み込むことにより
FLD_PTRフィールドが削除されても、ポインタによって参照されるメモリー領域は変更または解放されません。
Fjoin()と同様、この関数は領域不足により異常終了し、さらに領域を割り当てた後、操作を完了するために再起動されます。
Fojoin32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fojoin()または
Fojoin32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fojoin()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファのどちらかが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファまたは宛先バッファのどちらかがフィールド化バッファでないか、または
Finit()によって初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
if(Fojoin(dest,src) 0)
F_error("pgm_name");
destが、フィールドA、BおよびCのオカレンスを2個持っており、
srcが、フィールドA、CおよびDを持っている場合、結果的に、
destは、ソース・フィールド値A、宛先フィールド値B、ソース・フィールド値C、および2番目の宛先フィールド値Cを含んでいます。
Fpres()、
Fpres32() - フィールド・オカレンスがバッファにある場合は
trueを返す
#include <stdio.h>
#include "fml.h"
int
Fpres(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc)
#include "fml32.h"
int
Fpres32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc)
Fpres()は、指定されたフィールド(
fieldid)の指定されたオカレンス(
oc)が、
fbfrで参照されるバッファに存在するかどうかを調べるために使用されます。
Fpres32()は、
FLD_FML32フィールド・タイプの埋込み型バッファ内では、指定されたフィールドのオカレンスがあるかどうかをチェックしません。
Fpres32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fpres()または
Fpres32()を呼び出すことができます。
Fpres()は、指定されたオカレンスがある場合は
trueを、そうでない場合は、
falseを返します。
Fprint()、
Fprint32() - 標準出力にバッファを出力する
#include <stdio.h>
#include "fml.h"
int
Fprint(FBFR *
fbfr)
#include "fml32.h"
int
Fprint32(FBFR32 *
fbfr)
Fprint()は、標準出力に指定されたバッファを出力します。
fbfrは、フィールド化バッファを指すポインタです。バッファの各フィールドについて、フィールド名とフィールド値がタブで区切って出力されます。
Fname()はフィールド名を決定するために使用されます。フィールド名が決定できない場合、フィールド識別子が出力されます。文字列または文字配列のフィールド値内の表示不能な文字は、バックスラッシュとその後に続く2文字の16進値で表現されます。バッファの出力が完了すると改行が出力されます。
FLD_PTR型の値の場合、
Fprint32()はフィールド名またはフィールド識別子、およびポインタ値を16進数で出力します。この関数はポインタ情報を出力しますが、
Fextread32()関数は
FLD_PTRフィールド・タイプを無視します。
FLD_FML32型の値の場合、
Fprint32()は各ネスト・レベルに先行タブを追加して、再帰的にFML32バッファを出力します。
FLD_VIEW32型の値の場合、
Fprint32()はVIEW32フィールド名、および構造体メンバーの名前と値のペアを出力します。
Fprint32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fprint()または
Fprint32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fprint()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「mallocが失敗しました」
malloc()による領域の動的な割当てが失敗しました。
Fproj()、
Fproj32() - バッファのプロジェクション
#include <stdio.h>
#include "fml.h"
int
Fproj(FBFR *
fbfr, FLDID *
fieldid)
#include "fml32.h"
int
Fproj32(FBFR32 *
fbfr, FLDID32 *
fieldid)
Fproj()は、必要なフィールドのみを維持する目的でバッファを更新するために使用されます。
fbfrは、フィールド化バッファを指すポインタです。必要なフィールドは、
fieldidが指すフィールド識別子の配列に指定されます。配列の最後のエントリは
BADFLDIDであることが必要です。更新は、その場所で行われます。したがって、投影の結果にないフィールドは、フィールド化バッファから削除されます。フィールド識別子の配列は、再配列される場合があります。(まだ番号順でない場合は、ソートされます。)バッファを更新することにより
FLD_PTRフィールドが削除されても、ポインタによって参照されるメモリー領域は変更または解放されません。
Fproj32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fproj()または
Fproj32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fproj()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
#include "fld.tbl.h"
FBFR *fbfr;
FLDID fieldid[20];
...
fieldid[0] = A; /* field ID for field A */
fieldid[1] = D; /* field ID for field D */
fieldid[2] = BADFLDID; /* sentinel value */
...
if(Fproj(fbfr, fieldid) 0)
F_error("pgm_name");
バッファが、フィールドA、B、CおよびDを持っている場合、使用例の結果、バッファは、フィールドAおよびDのオカレンスのみ持つようになります。フィールド識別子の配列のエントリは、特定の順番になっている必要はありませんが、フィールド識別子の配列の最後の値は、フィールド識別子0 (
BADFLDID)である必要があります。
Fprojcpy、Fprojcpy32(3fml)
Fprojcpy()、
Fprojcpy32() - バッファのプロジェクションおよびコピー
#include <stdio.h>
#include "fml.h"
int
Fprojcpy(FBFR *
dest, FBFR *
src, FLDID *
fieldid)
#include "fml32.h"
int
Fprojcpy32(FBFR32 *
dest, FBFR32 *
src, FLDID32 *
fieldid)
Fprojcpy()は、
Fproj()と類似していますが、プロジェクションはその場所で行われず、宛先バッファで行われます。
destは宛先フィールド化バッファを指すポインタ、
srcは元のフィールド化バッファを指すポインタです。
fieldidは、フィールド識別子の配列を指すポインタです。宛先バッファのすべてのフィールドは、最初に削除され、ソース・バッファに投影した結果は宛先バッファに組み込まれます。ソース・バッファは変更されません。フィールド識別子の配列は、再配列される場合があります。(まだ番号順でない場合は、ソートされます。)バッファを更新することにより
FLD_PTRフィールドが削除されても、ポインタによって参照されるメモリー領域は変更または解放されません。
この関数は、領域が不足した場合に異常終了します。この関数は、操作を完了するために付加領域を十分に割り当てた後、再起動されます。
Fprojcpy32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fprojcpy()または
Fprojcpy32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fprojcpy()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファのどちらかが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファまたは宛先バッファのどちらかがフィールド化バッファでないか、または
Finit()によって初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、変換先のフィールド化バッファにコピーされますが、バッファには十分な領域が残っていません。
Fread()、
Fread32() - フィールド化バッファの読取り
#include <stdio.h>
#include "fml.h"
int
Fread(FBFR *
fbfr, FILE *
iop)
#include "fml32.h"
int
Fread32(FBFR32 *
fbfr, FILE32 *
iop)
フィールド化バッファは、
Fread()を使用して、ファイル・ストリームから読み取られます。
fbfrは、フィールド化バッファを指すポインタです。
iopは、
FILE型の入力ストリームを指すポインタです(ストリームの詳細は、UNIXシステムのリファレンス・マニュアルで
stdio(3S)を参照してください)。
Fread()は、ストリームからフィールド化バッファを
fbfrに読み込み、バッファに格納されていたデータを消去し、バッファのインデックスを再作成します。
Fread32()は、
FLD_PTR型のフィールドを無視します。関数にタイプ
FLD_PTRの値が与えられても、エラーは戻されません。
Fread32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fread()または
Fread32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fread()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。また、このエラーは、読み取られたデータがフィールド化バッファでない場合に返されます。
「フィールド化バッファにスペースがありません。」
ストリームから読み取られるフィールド化バッファを保持するための十分な領域が、バッファにありません。
UNIXシステム・コールでエラーが発生しました
read()システム・コールが異常終了しました。外部の整数型変数
errnoは、システム・コールによるエラーを示すように設定しておく必要があります。
この関数は、Windows用のOracle Tuxedo System Workstation DLLでは使用できません。
UNIXシステムのリファレンス・マニュアルのstdio(3S)
Frealloc、Frealloc32(3fml)
Frealloc()、
Frealloc32() - フィールド化バッファの再割当て
#include <stdio.h>
#include "fml.h"
FBFR *
Frealloc(FBFR *
fbfr, FLDOCC
nf, FLDLEN
nv)
#include "fml32.h"
FBFR32 *
Frealloc32(FBFR32 *
fbfr, FLDOCC32
nf, FLDLEN32
nv)
Frealloc()は、フィールド化バッファを拡大するための領域の再割当てに使用されます。
fbfrは、フィールド化バッファを指すポインタです。2番目のパラメータ
nfは、新しいフィールドの数です。3番目のパラメータ
nvは、新しい値の領域のバイト数です。これらは、増分ではありません。
Frealloc32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Frealloc()または
Frealloc32()を呼び出すことができます。
正常終了の場合、
Frealloc()は、再割り当てされたFBFRを指すポインタを返します。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Frealloc()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、フィールド数が0より小さい、
Vが0、または合計の大きさが65534より大きい)。
「malloc()を使用して、メモリーを割り当てられませんでした。」
新しい大きさが、現在バッファにあるものより小さいか、または
realloc()を使用しての領域の動的な割当てが失敗しました。
Frstrindex、Frstrindex32(3fml)
Frstrindex()、
Frstrindex32() - バッファにある索引をリストアする
#include <stdio.h>
#include "fml.h"
int
Frstrindex(FBFR *
fbfr, FLDOCC
numidx)
#include "fml32.h"
int
Frstrindex32(FBFR32 *
fbfr, FLDOCC32
numidx)
インデックス解除されたフィールド化バッファは、
Findex()または
Frstrindx()を呼び出して再インデックスされます。
fbfrは、フィールド化バッファを指すポインタです。前者は、バッファの合計インデックス計算を実行するため、非常にコストがかかります(バッファの完全スキャンが必要)。インデックス化されていなバッファが変更されたとき、またはバッファの前の状態が不明な場合に、使用する必要があります(たとえば、あるプロセスからインデックスなしの別のプロセスに送信された場合)。
Frstrindex()は時間がかかりませんが、使用できるのは、前のインデックス解除操作の後でバッファが変更されていない場合のみです。
Frstrindx()の2番目の引数
numidxは、
Funindex()関数の戻り値です。
Frstrindex32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Frstrindex()または
Frstrindex32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Frstrindex()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
バッファを索引なしで送信するためには、次のような文が実行されます。
save = Funindex(fbfr);
num_to_send = Fused(fbfr);
transmit(fbfr,num_to_send); /* A hypothetical function */ Frstrindx(fbfr,save);
1. - /* unindex, saving for Frstrindx */
2. - /* determine number of bytes to send */
3. - /* send fbfr, without index */
4. - /* restore index */
この場合、
transmit()には、メモリー・ポインタおよび長さが渡されます。送信されるデータは、メモリー・ポインタで始まり、
num_to_sendバイトです。いったんバッファが送信されると、その索引は、
Frstrindex()を使用してリストアされます(どのような場合でも、
transmit()が、索引を変更しないことが前提となっている)。送信の終わりを受信すると、フィールド化バッファを受け取ったプロセスは、
Findex()を使用してそのバッファを次に示す方法で索引します。
receive(fbfr); /* get fbfr from wherever .. into fbfr */
Findex(fbfr); /* index it */
受信プロセスは、次の理由により
Frstrindx()を呼び出すことができません。
1.
|
受信プロセスは、 Funindex()を呼び出していません。したがって、 Frstrindex()の引数 numidxの値がわかりません。
|
解決策としては、
Findex()を明示的に呼び出すことです。もちろんユーザーは、フィールド化バッファの索引のバージョンを自由に送信する(つまり、
Fsizeof(*fbfr)バイトを送信する)ことができ、受信側の
Findex()のコストを回避します。
Fsizeof()、
Fsizeof32() - フィールド化バッファのサイズを返す
#include <stdio.h>
#include "fml.h"
long
Fsizeof(FBFR *
fbfr)
#include "fml32.h"
long
Fsizeof32(FBFR32 *
fbfr)
Fsizeof()は、フィールド化バッファのサイズをバイト数で返します。
fbfrは、フィールド化バッファを指すポインタです。
Fsizeof32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fsizeof()または
Fsizeof32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fsizeof()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Fstrerror、Fstrerror32(3fml)
Fstrerror()、
Fstrerror32() - FMLエラーのエラー・メッセージ文字列の取得
#include <fml.h>
char *
Fstrerror(int
err)
#include <fml32.h>
char *
Fstrerror32(int
err)
Fstrerror()は、
LIBFML_CATからエラー・メッセージのテキストを検索するために使用します。
errは、FML関数呼出しが -1またはその他のエラー値を返したときに
F_errorに設定されるエラー・コードです。
Fstrerror()が返したポインタを、
userlog()または
F_errorへの引数として使用できます。
Fstrerror32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fstrerror()または
Fstrerror32()を呼び出すことができます。
errが無効なエラー・コードの場合、
Fstrerror()は、NULLを返します。正常終了した場合は、この関数は、エラー・メッセージのテキストを持つ文字列を指すポインタを返します。
Fstrerror()は、エラーが発生するとNULLを返します。この場合は、
F_errorの設定をしません。
Ftypcvt()、
Ftypcvt32() - フィールド・タイプを別のフィールド・タイプに変換
#include <stdio.h>
#include "fml.h"
char *
Ftypcvt(FLDLEN *
tolen, int
totype, char *
fromval, int
fromtype,
FLDLEN
fromlen)
#include "fml32.h"
char *
Ftypcvt32(FLDLEN32 *
tolen, int
totype, char *
fromval, int
fromtype,
FLDLEN32
fromlen)
Ftypcvt()は、
fromlenで指定された長さの
fromtype型の
*fromvalの値(
fromtypeが
FLD_CARRAYの場合。それ以外の場合、
fromlenは
fromtypeから算出)を、
totype型の値に変換します。
Ftypcvt()が成功すると、変換後の値に対するポインタが返され、
*tolenに変換後の長さが設定されます。失敗すると、
Ftypcvt()からNULLが返されます。
Ftypcvt32()は、
FLD_PTR、
FLD_MBSTRING、
FLD_FML32、または
FLD_VIEW32のフィールド・タイプが使用されると失敗します。これらのフィールド・タイプの1つが指定されると、
Ferrorに
FEBADOPが設定されます。
Ftypcvt32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Ftypcvt()または
Ftypcvt32()を呼び出すことができます。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ftypcvt()は異常終了し、
Ferrorを次の値に設定します。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)から文字列に変換するときに、
malloc()を使用しての領域の動的な割当てが失敗しました。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
tolenまたは
fromvalパラメータにNULLが指定された場合)。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
指定されたフィールド・タイプは無効です(
FLD_PTR、
FLD_FML32、または
FLD_VIEW32など)。
Ftype()、
Ftype32() - フィールド・タイプを指すポインタを返す
#include <stdio.h>
#include "fml.h"
char *
Ftype(FLDID
fieldid)
#include "fml32.h"
char *
Ftype32(FLDID32
fieldid)
Ftype()は、フィールド識別子
fieldidを受け取り、フィールドの型名を持つ文字列を指すポインタを戻します。たとえば、
Ftype()に
short型の
FLDIDが与えられた場合は、文字列"short"を指すポインタが戻されます。このデータ領域は読取り専用です。
Ftype32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Ftype()または
Ftype32()を呼び出すことができます。
Ftype()は、正常終了時にフィールド・タイプを識別する文字列を指すポインタを返します。
この関数は、エラー発生時にNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Ftype()は異常終了し、
Ferrorを次の値に設定します。
「フィールド型が正しくありません。」
指定されたフィールド識別子は無効です。
Funindex、Funindex32(3fml)
Funindex()、
Funindex32() - フィールド化バッファの索引の破棄
#include <stdio.h>
#include "fml.h"
FLDOCC
Funindex(FBFR *
fbfr)
#include "fml32.h"
FLDOCC32
Funindex32(FBFR32 *
fbfr)
Funindex()は、フィールド化バッファのインデックスを破棄します。
fbfrはフィールド化バッファを指すポインタです。この関数が正常終了して戻る場合は、バッファはインデックスなしになります。結果として、インデックスにバッファ領域は割り当てられず、ユーザー・フィールドとして利用可能な領域が増加します。ただし、アクセス時間が遅くなる可能性があります。ディスクに格納する場合、または別の場所に転送する場合は、バッファをインデックスなしにすることが有効です。ディスク格納の場合、ディスク領域が節約され、転送を行う場合、転送コストを減少させることができます。
バッファが索引なしになった後、バッファ開始からの上位バイトの数は関数呼出し
Fused(fbfr)によって決定されます。
Funindex32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Funindex()または
Funindex32()を呼び出すことができます。
Funindex()は、索引が取り除かれる前にバッファが持つ索引の要素数を返します。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Funindex()は、異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Funused()、
Funused32() - フィールド化バッファの未使用分のバイト数を返す
#include <stdio.h>
#include "fml.h"
long
Funused(FBFR *
fbfr)
#include "fml32.h"
long
Funused32(FBFR32 *
fbfr)
Funused()は、現在使用していないバッファ領域の量を返します。ユーザー・データまたはヘッダーや索引といった、オーバーヘッド・データを含まない領域は使用されていません。
fbfrは、フィールド化バッファを指すポインタです。
Funused32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Funused()または
Funused32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Funused()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Fupdate()、
Fupdate32() - ソース・バッファで宛先バッファを更新する
#include <stdio.h>
#include "fml.h"
int
Fupdate(FBFR *
dest, FBFR *
src)
#include "fml32.h"
int
Fupdate32(FBFR32 *
dest, FBFR32 *
src)
Fupdate()は、ソース・バッファのフィールド値で宛先バッファを更新します。
destおよび
srcは、フィールド化バッファを指すポインタです。フィールドID/オカレンスと一致するフィールドの場合は、フィールド値はソース・バッファの値を使って宛先バッファで更新されます。ソース・バッファに、一致するフィールドを持たない宛先バッファのフィールドはそのままです。宛先バッファに、一致するフィールドを持たないソース・バッファのフィールドが、宛先バッファに追加されます。
FLD_PTR型の値では、
Fupdate32()はポインタ値を格納します。
FLD_PTRフィールドが指すバッファは、
tpalloc()を呼び出して割り当てます。
FLD_FML32型の値の場合、
Fupdate32()は、索引を除くすべての
FLD_FML32フィールドの値を格納します。
FLD_VIEW32型の値の場合、
Fupdate32()は
FVIEWFLD型の構造体に対するポインタを格納します。FVIEWFLD型の構造体には、
vflags (現在未使用で0に設定されているフラグ・フィールド)、
vname (VIEW名を含む文字配列)、および
data (C構造体として格納されるVIEWデータに対するポインタ)が含まれています。アプリケーションは、
Fupdate32()に
vnameおよび
dataを提供します。
Fupdate32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fupdate()または
Fupdate32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fupdate()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
ソース・バッファまたは宛先バッファのどちらかが適切なバウンダリで開始していません。
「バッファがフィールド化されていません。」
ソース・バッファまたは宛先バッファがフィールド化バッファでないか、または
Finit()で初期化されていません。
「フィールド化バッファにスペースがありません。」
フィールド値は、宛先バッファで追加または変更されますが、バッファ領域の残りが十分ではありません。
Fused()、
Fused32() - フィールド化バッファで使用しているバイト数を返す
#include <stdio.h>
#include "fml.h"
long
Fused(FBFR *
fbfr)
#include "fml32.h"
long
Fused32(FBFR32 *
fbfr)
Fused()は、ユーザー・データとヘッダーの両方を含む(索引は、いつでもドロップできるため含まない)、フィールド化バッファで使用している領域のサイズをバイト数で返します。
fbfrは、フィールド化バッファを指すポインタです。
Fused32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fused()または
Fused32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fused()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
Fvall()、
Fvall32() - フィールド・オカレンスをlong型で返す
#include <stdio.h>
#include "fml.h"
long
Fvall(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc)
#include "fml32.h"
long
Fvall32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc)
Fvall()は、long型およびshort型の値の場合に
Ffind()と同様に動作しますが、値を指すポインタではなく、フィールドの実際の値を返します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidはフィールド識別子です。
ocはフィールドのオカレンス番号です。
指定したフィールド・オカレンスが発見されない場合は、0が戻されます。この関数は、戻り値をチェックせずにフィールドの値を別の関数に渡すのに役立ちます。この関数は、型
FLD_LONGまたは
FLD_SHORTのフィールドに対してのみ有効です。
Fvall32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvall()または
Fvall32()を呼び出すことができます。
Fvall()は、
FLD_LONGおよび
FLD_SHORT以外のフィールド・タイプに対して0を返し、
Ferrorを
FTYPERRに設定します。
この関数は、他のエラーが発生すると0を返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvall()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
fieldidが誤っている、またはフィールド・タイプが
FLD_SHORTでも
FLD_LONGでもありません。
Fvals()、
Fvals32() - フィールド・オカレンスの文字列の値を返す
#include <stdio.h>
#include "fml.h"
char *
Fvals(FBFR *
fbfr, FLDID
fieldid, FLDOCC
oc)
#include "fml32.h"
char *
Fvals32(FBFR32 *
fbfr, FLDID32
fieldid, FLDOCC32
oc)
Fvals()は、文字列の値の場合に
Ffind()と同様に動作しますが、値が返されることを保証します。
fbfrは、フィールド化バッファを指すポインタです。
fieldidは、フィールド識別子です。
ocはフィールドのオカレンス番号です。
指定したフィールド・オカレンスが見つからない場合は、NULLが返されます。この関数は、戻り値をチェックせずにフィールドの値を別の関数に渡すのに役立ちます。ただし、この関数は、
FLD_STRING型のフィールドの場合のみ有効であり、他のフィールド型の場合は、自動的にNULL文字列を返します(つまり、変換は行われません)。
Fvals32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvals()または
Fvals32()を呼び出すことができます。
この関数は、エラーが発生するとNULLを返し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvals()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「未知のフィールド番号か、未知のフィールド型が指定されました。」
指定されたフィールド識別子は無効です。
「フィールド型が正しくありません。」
fieldidが誤っている、またはフィールド・タイプが
FLD_STRINGではありません。
Fvftos()、
Fvftos32() - フィールド化バッファからC構造体にコピー
#include <stdio.h>
#include "fml.h"
int
Fvftos(FBFR *
fbfr, char *
cstruct, char *
view)
#include "fml32.h"
int
Fvftos32(FBFR32 *
fbfr, char *
cstruct, char *
view)
Fvftos()関数は、フィールド化バッファからC構造体へデータを転送します。
fbfrは、フィールド化バッファを指すポインタです。
cstructは、C構造体を指すポインタです。
viewは、コンパイルしたVIEW記述子の名前を指すポインタです。
フィールドは、フィールド化バッファから
viewのメンバー記述子に基づく構造体にコピーされます。フィールド化バッファのフィールドが、一致するバッファをC構造体に持たない場合は、無視されます。C構造体で指定されたメンバーがフィールド化バッファに一致するフィールドを持たない場合は、メンバーにNULL値が複写されます。使用したNULL値がVIEW記述子の各メンバーに対して定義可能です。
C構造体で複数のオカレンスを格納するには、構造体のメンバーは配列である必要があります(たとえば、
int zip[4]は
zipの4つのオカレンスを格納できます)。バッファに存在するオカレンスの数が、配列にある要素数よりも少ない場合は、余分の要素スロットにはNULL値が割り当てられます。一方、バッファの配列にある要素数よりもオカレンスの数の方が多い場合は、余分なオカレンスは無視されます。
フィールド識別子およびメンバーに対してマッピング・エントリが存在する場合でも、マッピングを禁止するVIEW記述子のオプションがあります。これらのオプションは、初めはVIEWファイルで指定されていますが、実行時に
Fvopt()を使用して変更できます。
Fvftos32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvftos()または
Fvftos32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvftos()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「関数の引数が無効です」
呼び出された関数への引数の1つが無効です(たとえば、
Fvftosの
cstructパラメータにNULLを指定)。
「ACMに負の値が含まれています」
構造体からフィールド化バッファにデータを移動するときには、連想カウント・メンバー(ACM)は負の値であってはなりません。
「VIEW記述が見つからないか、取得できません」
指定したVIEW記述子がNULLであるか、あるいは
VIEWDIRまたは
VIEWFILESで指定されたファイルにこの記述子がありませんでした。
Fvneeded、Fvneeded32(3fml)
Fvneeded()、
Fvneeded32() -
VIEWバッファに必要な大きさの計算
#include <stdio.h>
#include "fml.h"
long
Fvneeded(char *
subtype)
#include "fml32.h"
long
Fvneeded32(char *
subtype)
Fvneeded()は、
VIEW C構造体のサイズを返します。
subtypeは
VIEWの名前です。
Fvneeded()を呼び出して、割り当てる
VIEWバッファのサイズを判別できます。
Fvneeded32()は32ビットの
VIEWで使用します。
Fvneeded()は、
VIEWのサイズをバイト数で戻します。この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvnull()は異常終了し、
Ferrorを次の値に設定します。
「関数の引数が無効です。」
VIEWDIR環境変数および
VIEWFILES環境変数で指定されたVIEWファイルで、リクエストされた
VIEWが見つかりませんでした。
Fvnull()、
Fvnull32() - 構造体の要素がNULLかどうかのチェック
#include <stdio.h>
#include "fml.h"
int
Fvnull(char *
cstruct, char *
cname, FLDOCC
oc, char *
view)
#include "fml32.h"
int
Fvnull32(char *
cstruct, char *
cname, FLDOCC32
oc, char *
view)
Fvnull()は、構造体要素のオカレンスがNULLであるかどうかを判断するのに使用します。
cstructは、C構造体を指すポインタです。
cnameは、
cstruct内の要素名を指すポインタです。
ocは要素のオカレンス番号です。
viewは、コンパイルしたVIEW記述子の名前を指すポインタです。
Fvopt()のオプションは、この関数に影響しません。
Fvnull32()は、
viewc32で定義されたビューや、フィールド数の多い大規模ビューのための
VIEW32型付きバッファに対して使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのコンテキスト状態で実行している場合でも、
Fvnull()または
Fvnull32()を呼び出すことができます。
Fvnull()は、C構造体で指定した
cnameがNULLの場合は1を戻し、NULLでない場合は0を戻します。この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvnull()は異常終了し、
Ferrorを次の値に設定します。
「VIEW記述が見つからないか、取得できません。」
指定したVIEW記述子が
VIEWDIRまたは
VIEWFILESで指定されたファイル内にありませんでした。
「cnameが見つかりません。」
C構造体フィールド名が、VIEW記述子で見つかりません。
Fvopt()、
Fvopt32() - マッピング・エントリのフラグ・オプションの変更
#include <stdio.h>
#include "fml.h"
int
Fvopt(char *
cname, int
option, char *
view)
#include "fml32.h"
int
Fvopt32(char *
cname, int
option, char *
view)
Fvopt()は、実行時にバッファと構造体のマッピング・オプションの指定を可能にします。
cnameはVIEW記述子、
viewでの要素名を指すポインタです。
optionは、マッピング・オプションのために必要な設定を指定します。有効なオプションとその意味は次に説明します。
フィールド化バッファから構造体への一方向のマッピング、VIEW記述子内のフラグ
S
構造体からフィールド化バッファへの一方向のマッピング、VIEW記述子内のフラグ
F
フィールド化バッファと構造体の間でのマッピングを行わない、VIEW記述子内のフラグ
N
フィールド化バッファと構造体の間の双方向のマッピング、VIEW記述子内のフラグ
Sおよび
F
Fvopt32()は、
viewc32で定義されたビューや、フィールド数の多い大規模ビューのための
VIEW32型付きバッファに対して使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvopt()または
Fvopt32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvopt()は異常終了し、
Ferrorを次の値に設定します。
「関数の引数が無効です。」
呼び出された関数への引数の1つが無効でした(たとえば、
cnameパラメータまたは
viewパラメータにNULLを指定、あるいは無効な
optionを指定)。
「VIEW記述が見つからないか、取得できません。」
VIEWDIRまたは
VIEWFILESで指定したファイルにVIEWが見つかりませんでした。
「cnameが見つかりません。」
C構造体フィールド名が、VIEW記述子で見つかりません。
Fvrefresh、Fvrefresh32(3fml)
Fvrefresh()、
Fvrefresh32() - C構造体からフィールド化バッファにコピー
#include <stdio.h>
#include "fml.h"
void
Fvrefresh()
#include "fml32.h"
void
Fvrefresh32()
Fvrefresh()は、ビュー構造マッピングの内部キャッシュ・メモリーをクリアし、初期化し直します。この操作が必要になるのは、頻繁に使用するビューが動的に更新される場合に限られます。
Fvrefresh32()は、
viewc32で定義されたビューや、フィールド数の多い大規模ビューのための
VIEW32型付きバッファに対して使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvrefresh()または
Fvrefresh32()を呼び出すことができます。
このルーチンはvoid関数であり、値を返しません。
このルーチンはvoid関数であり、エラー・コードはセットされません。
Fvselinit、Fvselinit32(3fml)
Fvselinit()、
Fvselinit32() - 構造体の要素をNULL値で初期化する
#include <stdio.h>
#include "fml.h"
int
Fvselinit(char *
cstruct, char *
cname, char *
view)
#include "fml32.h"
int
Fvselinit32(char *
cstruct, char *
cname, char *
view)
Fvselinit()は、C構造体の個々の要素を、適切なNULL値で初期化します。
cstructは、C構造体を指すポインタです。
cnameは、
cstructの要素名を指すポインタです。
viewは、コンパイルしたVIEW記述子の名前を指すポインタです。
Fvselinit()は、VIEWがコンパイルされたときに
Cフラグが使用された場合は要素の関連するカウント・メンバーを0に設定します。また、
LフラグがVIEWファイルで使用された場合は、関連する長さのメンバーを関連するNULL値の長さに設定します。
Fvselinit32()は、
viewc32で定義されたビューや、フィールド数の多い大規模ビューのための
VIEW32型付きバッファに対して使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvselinit()または
Fvselinit32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvselinit()は異常終了し、
Ferrorを次の値に設定します。
「関数の引数が無効です。」
呼び出された関数への引数の1つが無効です(たとえば、
Fvselinitの
cstructパラメータに無効なNULLを指定した場合)。
「VIEW記述が見つからないか、取得できません」
指定したVIEW記述子がNULLであるか、あるいは
VIEWDIRまたは
VIEWFILESで指定されたファイルにこの記述子がありませんでした。
「cnameが見つかりません。」
C構造体フィールド名が、VIEW記述子で見つかりません。
Fvsinit()、
Fvsinit32() - C構造体をNULL値で初期化
#include <stdio.h>
#include "fml.h"
int
Fvsinit(char *
cstruct, char *
view)
#include "fml32.h"
int
Fvsinit32(char *
cstruct, char *
view)
Fvsinit()は、C構造体のすべてのメンバーを、VIEW記述子
viewで指定されたNULL値に初期化します。
cstructは、C構造体を指すポインタです。
viewは、コンパイルされたVIEW記述子を指すポインタです。
Fvsinit()は、VIEWがコンパイルされたときに
Cフラグが使用された場合は要素の関連するカウント・メンバーを0に設定します。また、
LフラグがVIEWファイルで使用された場合は、関連する長さのメンバーを関連するNULL値の長さに設定します。
Fvsinit32()は、
viewc32で定義されたビューや、フィールド数の多い大規模ビューのための
VIEW32型付きバッファに対して使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvsinit()または
Fvsinit32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvsinit()は異常終了し、
Ferrorを次の値に設定します。
「関数の引数が無効です。」
呼び出された関数への引数の1つが無効です(たとえば、
Fvsinit()の
cstructに無効なNULLパラメータを指定した場合)。
「VIEW記述が見つからないか、取得できません」
指定したVIEW記述子がNULLであるか、あるいは
VIEWDIRまたは
VIEWFILESで指定されたファイルにこの記述子がありませんでした。
Fvstof()、
Fvstof32() - C構造体からフィールド化バッファにコピー
#include <stdio.h>
#include "fml.h"
int
Fvstof(FBFR *
fbfr, char *
cstruct, int
mode, char *
view)
#include "fml32.h"
int
Fvstof32(FBFR32 *
fbfr, char *
cstruct, int
mode, char *
view)
Fvstof()は、C構造体からフィールド化バッファへデータを転送します。
fbfrは、フィールド化バッファを指すポインタです。
cstructは、C構造体を指すポインタです。
modeは、転送が行われる方法を指定します。
viewは、コンパイルされたVIEW記述子を指すポインタです。
modeは、次の4つのいずれかの値です。
これらのモードの処理は、
Fupdate()、
Fojoin()、
Fjoin()および
Fconcat()の説明と同じです。これらの関数ではソース・バッファを指定するのに対して、
Fvstof()ではC構造体を指定することを除けば、
Fvstof()はこれらの関数と同じものと考えることもできます。
FUPDATEはNULLの値を持つ構造体の要素を移動しないことを憶えていてください。
Fvstof32()は、
viewc32で定義されたビューや、フィールド数の多い大規模ビューのための
VIEW32型付きバッファに対して使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvstof()または
Fvstof32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fvstof()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効でした(たとえば、
cstructパラメータにNULL、または無効な
modeを
Fvstof()に指定した場合)
「フィールド化バッファにスペースがありません。」
フィールド値は、フィールド化バッファで追加あるいは変更されますが、バッファには、十分な領域が残っていません。
「ACMに負の値が含まれています」
構造体からフィールド化バッファにデータを移動するときには、連想カウント・メンバー(ACM)は負の値であってはなりません。
「malloc()を使用して、メモリーを割り当てられませんでした。」
CARRAY (またはMBSTRING)あるいは文字列の値から変換するときに、
malloc()を使用した領域の動的な割当てが失敗しました。
Fvstot()、
Fvttos() - C構造体からターゲットのレコード・タイプに変換、およびその逆の変換
#include <stdio.h>
#include "fml.h"
long
Fvstot(char *
cstruct, char *
trecord, long
treclen, char *
viewname)
long
Fvttos(char *
cstruct, char *
trecord, char *
viewname)
#include "fml32.h"
int
Fvstot32(char *cstruct, char *trecord, long treclen, char *viewname)
int
Fvttos32(char *cstruct, char *trecord, char *viewname)
int Fcodeset(char *translation_table)
Fvstot()は、Cの構造体からターゲットのレコード・タイプにデータを転送します。
Fvttos()関数は、データをターゲット・レコードからC構造体に転送します。
trecordはターゲット・レコードへのポインタです。
cstructはC構造体へのポインタです。
viewnameは、コンパイルされたVIEW記述の名前へのポインタです。
VIEWDIRおよび
VIEWFILES環境変数を使用してコンパイルされたVIEW記述があるディレクトリとファイルが検索されます。
Fvttos32()と
Fvstot32()は、32ビットのVIEWに対して使用されます。
FMLバッファからターゲット・レコードに変換するには、まず
Fvftos()を呼び出してFMLバッファからC構造体に変換し、次に
Fvstot()を呼び出してターゲット・レコードに変換します。ターゲット・レコードからFMLバッファに変換するには、まず
Fvttos()を呼び出してC構造体に変換し、次に
Fvstof()を呼び出してそのデータ構造体をFMLバッファに変換します。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fvstot()または
Fvttos()を呼び出すことができます。
下に示したデフォルト・ターゲットは、IBM/370のCOBOLレコードです。デフォルトのデータ変換は、下の表に基づいて行われます。
IBM/370のレコードでは、フィールド間のフィルタ・バイトはありません。ビューに対応するデータ構造の一部をなすデータ・アイテムに対しては、COBOL SYNC項は指定することはできません。
整数フィールドは、変換を実行するマシン上の整数のサイズに応じて4バイトまたは2バイトの整数に変換されます。
IBM/370フォーマットへの変換、あるいはIBM/370フォーマットからの変換を行う場合は、ビューの文字列フィールドはNULLで終了している必要があります。
carrayフィールドまたはmbstringフィールドのデータは変更されずに渡されます。データの変換は行われません。
パック10進数は、IBM/370環境では1バイトにパッキングされた2桁の10進数として存在し、下位の1/2バイトは符号を格納するために使用されます。パッキングされた10進数の長さは1 - 16バイトで、1 - 31桁の数字と1つの符号の格納領域があります。
パッキングされた10進数は、Cの構造体では
dec_tというフィールド・タイプを利用することによってサポートされます。
dec_tフィールドは、カンマで区切られた2つの数字で構成されたサイズに定義されています。カンマの左側の数字は、10進数が占有するバイトのトータル長を示します。右側の数値は、小数点以下の桁数です。変換の公式を以下に示します。
dec_t(
m, n) => S9(2*
m-(
n+1))V9(
n)COMP-3
10進数の値は、
decimal()で説明した関数を利用することにより、他のデータ型に変換したり、他のデータ型から変換することができます(int、long、string、double、floatなど)。
下の表は、ASCII (左側)とEBCDIC (右側)の間でのデフォルトの文字変換における対応関係を示したものです。
| 00 00 |01 01 |02 02 |03 03 |04 37 |05 2d |06 2e |07 2f |
| 08 16 |09 05 |0a 25 |0b 0b |0c 0c |0d 0d |0e 0e |0f 0f |
| 10 10 |11 11 |12 12 |13 13 |14 3c |15 3d |16 32 |17 26 |
| 18 18 |19 19 |1a 3f |1b 27 |1c 1c |1d 1d |1e 1e |1f 1f |
| 20 40 |21 5a |22 7f |23 7b |24 5b |25 6c |26 50 |27 7d |
| 28 4d |29 5d |2a 5c |2b 4e |2c 6b |2d 60 |2e 4b |2f 61 |
| 30 f0 |31 f1 |32 f2 |33 f3 |34 f4 |35 f5 |36 f6 |37 f7 |
| 38 f8 |39 f9 |3a 7a |3b 5e |3c 4c |3d 7e |3e 6e |3f 6f |
| 40 7c |41 c1 |42 c2 |43 c3 |44 c4 |45 c5 |46 c6 |47 c7 |
| 48 c8 |49 c9 |4a d1 |4b d2 |4c d3 |4d d4 |4e d5 |4f d6 |
| 50 d7 |51 d8 |52 d9 |53 e2 |54 e3 |55 e4 |56 e5 |57 e6 |
| 58 e7 |59 e8 |5a e9 |5b ad |5c e0 |5d bd |5e 5f |5f 6d |
| 60 79 |61 81 |62 82 |63 83 |64 84 |65 85 |66 86 |67 87 |
| 68 88 |69 89 |6a 91 |6b 92 |6c 93 |6d 94 |6e 95 |6f 96 |
| 70 97 |71 98 |72 99 |73 a2 |74 a3 |75 a4 |76 a5 |77 a6 |
| 78 a7 |79 a8 |7a a9 |7b c0 |7c 6a |7d d0 |7e a1 |7f 07 |
| 80 20 |81 21 |82 22 |83 23 |84 24 |85 15 |86 06 |87 17 |
| 88 28 |89 29 |8a 2a |8b 2b |8c 2c |8d 09 |8e 0a |8f 1b |
| 90 30 |91 31 |92 1a |93 33 |94 34 |95 35 |96 36 |97 08 |
| 98 38 |99 39 |9a 3a |9b 3b |9c 04 |9d 14 |9e 3e |9f e1 |
| a0 41 |a1 42 |a2 43 |a3 44 |a4 45 |a5 46 |a6 47 |a7 48 |
| a8 49 |a9 51 |aa 52 |ab 53 |ac 54 |ad 55 |ae 56 |af 57 |
| b0 58 |b1 59 |b2 62 |b3 63 |b4 64 |b5 65 |b6 66 |b7 67 |
| b8 68 |b9 69 |ba 70 |bb 71 |bc 72 |bd 73 |be 74 |bf 75 |
| c0 76 |c1 77 |c2 78 |c3 80 |c4 8a |c5 8b |c6 8c |c7 8d |
| c8 8e |c9 8f |ca 90 |cb 9a |cc 9b |cd 9c |ce 9d |cf 9e |
| d0 9f |d1 a0 |d2 aa |d3 ab |d4 ac |d5 4a |d6 ae |d7 af |
| d8 b0 |d9 b1 |da b2 |db b3 |dc b4 |dd b5 |de b6 |df b7 |
| e0 b8 |e1 b9 |e2 ba |e3 bb |e4 bc |e5 4f |e6 be |e7 bf |
| e8 ca |e9 cb |ea cc |eb cd |ec ce |ed cf |ee da |ef db |
| f0 dc |f1 dd |f2 de |f3 df |f4 ea |f5 eb |f6 ec |f7 ed |
| f8 ee |f9 ef |fa fa |fb fb |fc fc |fd fd |fe fe |ff ff |
実行時には、
Fcodeset()を呼び出すことにより、別の文字変換表を使用することができます。
translation_tableは、512バイトのバイナリ・データを指している必要があります。最初の256バイトのデータは、ASCIIからEBCDICへの変換表として解釈されます。残りの256バイトのデータはEBCDICからASCIIへの変換表として解釈されます。512バイトより後ろのデータは無視されます。ポインタがNULLのときは、デフォルトの変換表が使用されます。
正常に終了すると、
Fvstot()はターゲット・レコードのデータ長を返し、
Fvttos()はC構造体のデータ長を返します。
これら2つの関数は、エラーが発生した場合は -1という値を返し、
Ferrorをエラー条件を示す値にセットします。
次の条件が発生すると、
Fvttos()は異常終了し、
Ferrorを次のように設定します。
「関数の引数が無効です。」
呼び出された関数の引数の1つが無効です(たとえば、
Fvttos()の
trecordパラメータまたは
cstructパラメータにNULLを指定した場合)。また、このエラーは、変換元または変換先のターゲット・レコードの値が範囲を超えている場合にも返されます。
「ACMに負の値が含まれています。」
連想カウント・メンバー(Associated Count Member)は負の値にセットできません。
「ビューが見つからないか、取得できません」
VIEWDIRまたは
VIEWFILESで指定したファイルに
viewnameが見つかりません。
「バッファにスペースがありません。」
変換したデータ構造のサイズがターゲット・レコードのサイズを上回っています。
「VIEWファイルが見つからないか、オープンできません」
viewnameの検索中に、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つをプログラムが見つけられませんでした。
「オペレーティング・システム・エラー」
viewname検索中にプログラムは
VIEWDIRまたは
VIEWFILESで指定したファイルの1つを読込み用に開けませんでした。
「VIEWファイルが正しくありません」
viewnameの検索中、
VIEWDIRまたは
VIEWFILESで指定したファイルの1つが壊れていたか、VIEWファイルではありませんでした。
「mallocが失敗しました」
viewnameの検索中、
malloc()がビュー情報を格納するための領域の割当てに失敗しました。
VIEW test.v
VIEW test
#type cname fbname count flag size null
float float1 FLOAT1 1 - - 0.0
double double1 DOUBLE1 1 - - 0.0
long long1 LONG1 1 - - 0
short short1 SHORT1 1 - - 0
int int1 INT1 1 - - 0
dec_t dec1 DEC1 1 - 4,2 0
char char1 CHAR1 1 - - ''
string string1 STRING1 1 - 20 ''
carray carray1 CARRAY1 1 - 20 ''
END
Equivalent COBOL Record
02 OUTPUT-REC.
05 FLOAT1 USAGE IS COMP-1.
05 DOUBLE1 USAGE IS COMP-2.
05 LONG1 PIC S9(9) USAGE IS COMP.
05 SHORT1 PIC S9(4) USAGE IS COMP.
05 INT1 PIC S9(9) USAGE IS COMP.
05 DEC1 PIC S9(5)V9(2) COMP-3.
05 CHAR1 PIC X(01).
05 STRING1 PIC X(20).
05 CARRAY1 PIC X(20).
C Program
#include "test.h"
#include "decimal.h"
main()
{
struct test s1;
char data[100];
s1.float1 = 1.0;
s1.double1 = 2.0;
s1.long1 = 3;
s1.short1 = 4;
s1.int1 = 5;
deccvdbl(6.0,s1.dec1);
s1.char1 = '7';
(void) strcpy(s1.string1, "eight");
(void) strcpy(s1.carray1, "nine");
if (Fvstot((char *)&s1, data, reclen, "test") == -1) {
printf("Fvstot failed: %sn", Fstrerror(Ferror));
exit(0);
}
/* transfer to target machine and get response */
...
/* translate back */
if (Fvttos(data, (char *)&s1, "test") == -1) {
printf("Fvttos failed: %sn", Fstrerror(Ferror));
exit(0);
}
/* use the structure */
.....
exit(0);
}
UNIXシステムのリファレンス・マニュアルのdecimal(3)
Fwrite()、
Fwrite32() - フィールド化バッファを書き込む
#include <stdio.h>
#include "fml.h"
int
Fwrite(FBFR *
fbfr, FILE *
iop)
#include "fml32.h"
int
Fwrite32(FBFR32 *
fbfr, FILE *
iop)
Fwrite()は、フィールド化バッファをストリームに書き込みます。(ストリームの詳細は、UNIXシステムのリファレンス・マニュアルで
stdio(3S)を参照してください)。
Fwrite()はバッファのインデックスを破棄します。
fbfrは、フィールド化バッファを指すポインタです。
iopは、出力ストリームを指す
FILE型のポインタです。
FLD_PTRフィールド・タイプの場合、ポインタによって指示されているデータではなく、ポインタだけが出力ストリームに書き込まれます。
FLD_VIEW32フィールド・タイプの場合、VIEW32バッファ内のデータではなく、
FVIEWFLD構造体だけが出力ストリームに書き込まれます。
Fwrite32()は32ビットFMLで使用されます。
マルチスレッドのアプリケーション内のスレッドは、
TPINVALIDCONTEXTを含め、どのようなコンテキスト状態で実行していても、
Fwrite()または
Fwrite32()を呼び出すことができます。
この関数は、エラー発生時に-1を戻し、
Ferrorを設定してエラー条件を示します。
次の条件の場合、
Fwrite()は異常終了し、
Ferrorを次の値に設定します。
「フィールド化バッファが境界付けされていません。」
バッファの先頭が正しい境界線上にありません。
「バッファがフィールド化されていません」
バッファがフィールド化されていないか、または
Finit()で初期化されていません。
UNIXシステム・コールでエラーが発生しました
writeシステム・コールが異常終了しました。外部の整数型変数
errnoは、システム・コールによるエラーを示すために設定され、外部の整数型変数
Uunixerr (
Uunix.hで定義されている値)は、エラーを返したシステム・コールに設定されます。
この関数は、Windows用のOracle Tuxedo System Workstation DLLでは使用できません。
UNIXシステムのリファレンス・マニュアルのstdio(3S)
tpconvfmb32() - ソースのエンコーディングからターゲットのエンコーディングにマルチバイト文字を変換する
#include <atmi.h>
#include "fml32.h"
int
tpconvfmb32 (FBFR32 **
bufp, FLDID32 *
ids, char *
target_encoding,
long
flags)
tpconvfmb32()は、FML32型付きバッファにある
FLD_MBSTRINGフィールドのマルチバイト文字を、ターゲットの名前付きのエンコーディングに変換します。具体的には、
tpconvfmb32()は、
FLD_MBSTRINGフィールドで指定されたソースのエンコーディング名と
target_encodingで定義されたターゲットのエンコーディング名を比較し、エンコーディング名が異なる場合に
tpconvfmb32()は、
FLD_MBSTRINGフィールドのデータをターゲットのエンコーディングに変換します。
システムによるエンコーディング変換にかわる方法として、tpconvfmb32()があります。プロセス
TPMBACONV環境変数をNULL以外の値に設定した場合、システムによる
FLD_MBSTRINGフィールド・データのエンコーディング変換が自動的に行われます。
bufpはFML32型付きバッファを指すポインタです。ポインタに関連付けられたサイズがFML32バッファの変換済の出力データの処理に不十分な場合、このポインタは内部的に再割り当てされます。
bufpは、
Falloc()関数ではなく
tpalloc()関数を使用して定義する必要があります。
bufpに
FLD_FML32フィールドが含まれる場合、
FLD_MBSTRINGフィールドについて再帰的にチェックされます。
bufpに
FLD_PTRフィールドが含まれる場合はスキップされます。
idsには、変換するフィールド識別子の配列を指すポインタが入ります。
idsがNULLの場合、
bufpにあるすべての
FLD_MBSTRINGは、必要に応じてターゲットのエンコーディングに変換されます。配列を使用する場合は、0 (
BADFLDID)で終了する必要があります。
target_encodingは、
bufpメッセージ内にある
FLD_MBSTRINGフィールドの変換に使用する、ターゲットのコード・セットのエンコーディング名です。
target_encodingがNULLの場合、
tpconvfmb32()は、プロセス
TPMBENC環境変数で定義されたエンコーディング名を使用します。
flagsは、
tpconvfmb32()では使用されません。これは、ユーザー定義の変換関数用のバッファ・タイプ・スイッチ関数に渡されます。
正常終了の場合、
tpconvfmb32()は0を返します。エラーが発生した場合、
tpconvfmb32()は -1を返し、
tperrnoを設定してエラー条件を示します。
次の条件の場合、
tpconvfmb32()は異常終了し、
tperrnoを次の値に設定します。
bufpは、バッファ・タイプ・スイッチ変換関数がないTuxedoバッファに変換します。
Tuxedoシステムのエラーが発生しました(
bufpが有効なTuxedoバッファに対応していない場合など)。
target_encodingまたは
bufpがNULLです。
オペレーティング・システムのエラーが発生しました。外部整数
Uunixerr (
Uunix.hで定義されている値)が、そのエラーを戻したシステム・コールに設定されます。
tpconvvmb32() - VIEW32型付きバッファにあるMBSTRINGフィールドのマルチバイト文字を、ターゲットの名前付きのエンコーディングに変換する
#include <atmi.h>
#include "fml32.h"
extern int tperrno;
int
tpconvvmb32 (char **bufp, FLDID32 *ids, char *target_encoding,
long flags)
具体的には、
tpconvvmb32()は、MBSTRINGフィールドで指定されたソースのエンコーディング名と
target_encodingで定義されたターゲットのエンコーディング名を比較し、エンコーディング名が異なる場合に
tpconvvmb32()は、MBSTRINGフィールドのデータをターゲットのエンコーディングに変換します。
システムによるエンコーディング変換にかわる方法として、tpconvvmb32()があります。プロセス
TPMBACONV環境変数を
NULL以外の値に設定した場合、システムによるMBSTRINGフィールド・データのエンコーディング変換が自動的に行われます。
tpconvvmb32()では、以下の引数を使用できます。
VIEW32型付きバッファを指すポインタです。ポインタに関連付けられたサイズがVIEW32バッファの変換済の出力データの処理に不十分な場合、このポインタは内部的に再割り当てされます。
注意:
|
bufpは、 Falloc()ではなく tpalloc()関数で定義しなければなりません。
|
変換するフィールド識別子
の配列を指すポインタが入ります。
idsが
NULLの場合、
bufpにあるすべてのMBSTRINGフィールドは、必要に応じてターゲットのエンコーディングに変換されます。配列を使用する場合は、0 (
BADFLDID)で終了する必要があります。
bufpメッセージ内にあるMBSTRINGフィールドの変換に使用する、ターゲットのコード・セットのエンコーディング名です。
target_encodingが
NULLの場合、
tpconvvmb32()は、プロセス
TPMBENC環境変数で定義されたエンコーディング名を使用します。
tpconvvmb32()では使用されません。これは、ユーザー定義の変換関数用のバッファ・タイプ・スイッチ関数に渡されます。
成功した場合、
tpconvvmb32()は
0を戻します。エラーの場合、
tpconvvmb32()は
-1を戻し、
tperrnoを設定してエラー条件を示します。
次の条件の場合、
tpconvvmb32()は異常終了し、
tperrnoを次の値に設定します。
bufpは、バッファ・タイプ・スイッチ変換関数がないTuxedoバッファに変換します。
Tuxedoシステムのエラーが発生しました(
bufpが有効なTuxedoバッファに対応していない場合など)。
target_encodingまたは
bufpがNULLです。
オペレーティング・システムのエラーが発生しました。外部整数Uunixerr (Uunix.hで定義されている値)が、そのエラーを返したシステム・コールに設定されます。