![]() |
![]() |
|
|
Fvstot、Fvttos(3fml)
名前
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 は、コンパイルされたビューの記述名を指すポインタです。コンパイルされたビュー記述のあるディレクトリとファイルを探すために、VIEWDIR と VIEWFILES が使用されます。
Fvttos32() と Fvstot32() は、32 ビットの VIEW に対して使用されます。
FML バッファからターゲット・レコードに変換するには、まず Fvftos() を呼び出して FML バッファから C 構造体に変換し、次に Fvstot() を呼び出してターゲット・レコードに変換します。ターゲット・レコードから FML バッファに変換する場合は、まず最初に Fvttos() を呼び出して C 構造体に変換し、次にFvstof() を呼び出してそのデータ構造体を FML バッファに変換します。
マルチスレッドのアプリケーション内のスレッドは、TPINVALIDCONTEXT を含め、どのようなコンテキスト状態で実行している場合でも、Fvstot() または Fvttos() を呼び出すことができます。
デフォルト変換 - IBM/370
下に示したデフォルト・ターゲットは、IBM/370 の COBOL レコードです。デフォルトのデータ変換は、下の表に基づいて行われます。
データ構造 |
レコード |
---|---|
float |
COMP-1 |
double |
COMP-2 |
long |
S9(9) COMP |
short |
S9(4) COMP |
int |
S9(9) COMP or S9(4) COMP |
dec_t(m, n) |
S9(2*m-(n+1))V9(n)COMP-3 |
ASCII 文字 |
EBCDIC 文字 |
ASCII 文字列 |
EBCDIC 文字列 |
carray |
文字配列 |
IBM/370 のレコードでは、フィールド間のフィルタ・バイトはありません。ビューに対応するデータ構造の一部をなすデータ・アイテムに対しては、COBOL SYNC節は指定することはできません。 整数フィールドは、変換を実行するマシン上の整数のサイズに応じて 4 バイトまたは 2 バイトの整数に変換されます。 IBM/370 フォーマットへの変換、あるいは IBM/370 フォーマットからの変換を行う場合は、ビューの文字列フィールドは NULL で終了している必要があります。 carray フィールドのデータは変更されずに渡されます。データの変換は行われません。 パック 10 進数は、IBM/370 環境では1バイトにパッキングされた 2 桁の 10 進数として存在し、下位の 1/2 バイトは符号を格納するために使用されます。パッキングされた 10 進数の長さは 1 〜 16 バイトで、1 〜 31 桁の数字と 1 つの符号の格納領域があります。 パック 10 進数は、C の構造体では dec_t というフィールド・タイプを利用することによってサポートされます。dec_t フィールドは、コンマで区切られた 2 つの数字で構成されたサイズに定義されています。コンマの左側の数字は、10 進数が占有するバイトのトータル長を示します。右側の数値は、小数点以下の桁数です。変換の公式を以下に示します。 10 進数の値は、decimal() で説明した関数を利用することにより、他のデータ型に変換したり、他のデータ型から変換することができます (int、long、string、double、float など)。 下の表は、ASCII (左側) と EBCDIC (右側) の間でのデフォルトの文字変換における対応関係を示したものです。 実行時には、Fcodeset() を呼び出すことにより、別の文字変換表を使用することができます。translation_table は、512 バイトのバイナリ・データを指している必要があります。最初の 256 バイトのデータは、ASCII から EBCDIC への変換テーブルとして解釈されます。残りの 256 バイトのデータは EBCDIC から ASCII への変換テーブルとみなされます。512 バイトより後ろのデータは無視されます。ポインタが NULL のときは、デフォルトの変換テーブルが使用されます。 戻り値 正常終了すると、Fvstot() はターゲット・レコードのデータ長を返し、Fvttos() は C 構造体のデータ長を返します。 これら 2 つの関数は、エラーが発生した場合は -1 という値を返し、Ferror をエラー条件を示す値にセットします。 エラー 次の条件が発生すると、Fvttos() は異常終了し、Ferror を次のように設定します。 dec_t(m, n) => S9(2*m-(n+1))V9(n)COMP-3
| 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 |
呼び出された関数の引数の 1 つが無効です (たとえば、Fvttos() に対して NULL の trecord または cstruct パラメータを指定した場合)。またこのエラーは、変換元もしくは変換先のターゲット・レコードの値が範囲を超えている場合にも返されます。
関連カウント・メンバ (Associated Count Member) は負の値にセットすることはできません。
VIEWDIR または VIEWFILES で指定したファイルに viewname が見つかりません。
変換したデータ構造のサイズがターゲット・レコードのサイズを上回っています。
viewname 検索中にプログラムで VIEWDIR または VIEWFILES で指定したファイルの 1 つが見つかりませんでした。
viewname 検索中にプログラムは VIEWDIR または VIEWFILES で指定したファイルの 1 つを読み込み用に開けませんでした。
viewname 検索中に VIEWDIR または VIEWFILES で指定したファイルの 1 つが破壊されていたか、VIEW ファイルではありませんでした。
viewname 検索中に malloc() が VIEW 情報を格納するための領域の割り当てに失敗しました。
使用例
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
同等の COBOL レコード
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 プログラム
#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);
}
/* ターゲット・マシンに送信して応答を得る */
...
/* 逆方向に変換する */
if (Fvttos(data, (char *)&s1, "test") == -1) {
printf("Fvttos failed:%sn", Fstrerror(Ferror));
exit(0);
}
/* 構造体を使用する */
.....
exit(0);
}
関連項目
「FML 関数の紹介」、Fvftos、Fvftos32(3fml)、Fvstof、Fvstof32(3fml)、viewfile(5)
UNIX システムのリファレンス・ページの decimal(3)
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|