![]() |
![]() |
|
|
論理式を処理する関数
ここでは、引数として論理式をとる各種の関数について説明します。
Fboolco および Fvboolco
Fboolco、論理式をコンパイルし、評価ツリーに対するポインタを返します。
char*
Fboolco(char *expression)
*expression はコンパイル対象の式に対するポインタです。次のいずれかのフィールド・タイプが使用されると、この関数は異常終了します。FLD_PTR、FLD_FML32、または FLD_VIEW32。これらのフィールド・タイプの 1 つが指定されると、Ferror に FEBADOP が設定されます。
Fvboolco は、VIEW の論理式をコンパイルし、評価ツリーに対するポインタを返します。
char*
Fvboolco(char *expression, char *viewname)
*expression はコンパイル対象の式に対するポインタで、*viewname はフィールドを評価する VIEW 名に対するポインタです。
評価ツリーを保持するには、malloc(3) を使用して領域を割り当てます。たとえば、次の例は、「J」で始まり「n」で終了する FIRSTNAME フィールド (たとえば、「John」、「Joan」など) がバッファ内に存在し、かつ、SEX (性別) フィールドが「M」に設定されているかどうかをチェックする論理式をコンパイルします。
#include "<stdio.h>"
#include "fml.h"
extern char *Fboolco;
char *tree;
. . .
if((tree=Fboolco("FIRSTNAME %% 'J.*n' && SEX == 'M'")) == NULL)
F_error("pgm_name");
ツリー配列の最初と 2 つ目の文字は、それぞれ、配列全体の長さをビット単位で提供する unsigned 型の 16 ビット量の最下位バイトと最上位バイトを形成します。この値は、配列のコピーなどの操作を行う場合に有用です。
Fboolco が生成する評価ツリーは、次の節で説明する論理式関数で使用されます。したがって、絶えず式の再コンパイルをする必要はありません。
論理式を使用する必要がなくなった時に評価ツリーに割り当てられた領域を解放するには、free(3) を使用してください。必要がなくなった評価ツリーを解放せずに多くの論理式をコンパイルすると、プログラムのデータ領域がなくなってしまう恐れがあります。
詳細については、『BEA Tuxedo FML リファレンス』の「Fboolco、Fboolco32、Fvboolco、Fvboolco32(3fml)」を参照してください。
Fboolpr および Fvboolpr
Fboolpr は、指定されたファイルにコンパイルされた式を出力します。コンパイルされた式は、構文解析された (評価ツリーで示された) ようにコンパイルされ、全体にかっこが付きます。
void
Fboolpr(char *tree, FILE *iop)
以下はパラメータの説明です。
Fvboolpr は、指定されたファイルにコンパイルされた式を出力します。
void
Fvboolpr(char *tree, FILE *iop, char *viewname)
以下はパラメータの説明です。
この関数は、デバッグを行う場合に有用です。
Fboolcoの例でコンパイルされた式を Fboolprにかけると、以下の結果が出力されます。
(((FIRSTNAME[0]) %% ('J.*n')) && ((SEX[0]) == ('M')))
詳細については、『BEA Tuxedo FML リファレンス』の「Fboolpr、Fboolpr32、Fvboolpr、Fvboolpr32(3fml)」を参照してください。
Fboolev と Ffloatev、および Fvboolev と Fvfloatev
これらの関数は、両方とも、フィールド化バッファと照合して論理式を評価します。
int Fboolev(FBFR *fbfr,char *tree)
double Ffloatev(FBFR *fbfr,char *tree)
以下はパラメータの説明です。
同等の VIEW の関数を以下に示します。
int
Fvboolev(FBFR *fbfr,char *tree,char *viewname)
double
Fvfloatev(FBFR *fbfr,char *tree,char *viewname)
Fboolev は、フィールド化バッファが評価ツリーで指定された論理式の条件と一致する場合は true (1) を返します。この関数は、フィールド化バッファあるいは評価ツリーのいずれも変更しません。上記の例のコンパイルされた評価ツリーを使用すると、「Buffer selected」と出力されます。
#include <stdio.h>
#include "fml.h"
#include "fldtbl.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");
Ffloatev および Ffloatev32 は、Fboolevと同様に動作しますが、式の値を double 型として返します。たとえば、次のコードでは、「6.6」と出力されます。
#include <stdio.h>
#include "fml.h"
FBFR *fbfr;
. . .
main() {
char *Fboolco;
char *tree;
double Ffloatev;
if (tree=Fboolco("3.3+3.3")) {
printf("%lf",Ffloatev(fbfr,tree));
}
}
Fboolev を上記の例の Floatevの位置で使用した場合、1 が出力されます。
詳細については、『BEA Tuxedo FML リファレンス』の「Fboolev、Fboolev32、Fvboolev、Fvboolev32(3fml)」および「Ffloatev、Ffloatev32、Fvfloatev、Fvfloatev32(3fml)」を参照してください。
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|