前ページへファイル処理ライブラリルーチン バイトストリームファイル処理次ページへ

第 11 章 その他のトピック

この章では、ファイル処理の多くのトピックについて説明します。次のトピックがあります。

11.1 コンパイラ指令

プログラムでデータファイルを処理する場合に、注意が必要なコンパイラ指令がいくつかあります。これらのコンパイル指令を適切に使用すると、コードを簡略化したり、デフォルトの言語動作を設定したり、ANSI'85 などの重要な言語拡張機能にアクセスすることができます。

該当するコンパイラ指令は次のとおりです。

ANS85
ASSIGN
CALLFH
DATACOMPRESS
IDXFORMAT
FILETYPE
KEYCOMPRESS
OPTIONAL-FILE
RECMODE
RM
SEQUENTIAL

11.1.1 ANS85

ANS85 コンパイラ指令により、ANSI'85 COBOL 言語拡張機能を有効化し、ANSI'85 ファイル状態コードを取得することができます。

NOANS85 指令を指定する場合は、ANSI'85 ファイル状態コードを取得できません。また、ANSI'85 予約語も使用できません。

ANS85"SYNTAX" を指定する場合は、ANSI'85 構文を使用できますが、プログラムは ANSI'74 ファイル状態コードを戻します。

例えば、NOANS85 を使用してプログラムをコンパイルする場合は、File not found ファイル状態コードが、このプログラムの Micro Focus ランタイムシステムエラーコードである 9/013 (最初の状態バイトは ASCII 9、2番目の状態バイトは 10進数の 13) になります。NOANS85 指令を省略すると、File not found は、このプログラムの ANSI'85 ファイル状態コードである 3/5 (最初の状態バイトは ASCII 3、2 番目の状態バイトは ASCII 5) になります。

11.1.2 ASSIGN

ASSIGN コンパイラ指令は、次のように、EXTERNAL または DYNAMIC のどちらかに設定できます。

ASSIGN"DYNAMIC" (デフォルト)
ASSIGN"EXTERNAL"

The ASSIGN コンパイラ指令は、デフォルトのファイル割り当てを動的また外部的のどちらで実行するかを指定します。

ASSIGN"EXTERNAL" を指令として指定し、SELECT 文を次のようにコード化するとします。

     select fd-name
         assign to var1

この場合、COBOL は SELECT が次のようにコード化されているとみなします。

     select fd-name
         assign to external var1

11.1.3 CALLFH

呼び出し可能ファイルハンドラインターフェイスにより、CALLFH 指令を使用して、すべてのファイル入出力操作の直接呼び出しを生成できます。この場合は、Micro Focus ファイルハンドラ、Fileshare、またはユーザが作成したファイルハンドラを使用することができます。Fileshare を使用するには、CALLFH(FHREDIR) を指定します。

11.1.4 COBFSTATCONV

COBFSTATCONV コンパイラ指令を使用して、ファイルに返された状態値を、COBOL プログラムに戻す前に状態変換ルーチンを使用して変換するよう指定します。

状態変換ルーチンの名前は、CONVERTSTATUS 構成オプション、または COBFSTATCONV 環境変数によって実行時に指定します。

11.1.5 DATACOMPRESS および KEYCOMPRESS

未使用および今後の使用のために予約されている大容量領域をもつファイルがある場合は、そのファイルを圧縮してディスク領域を節約できます。

COBOL では、データファイルを圧縮する場合は、2 つの指令、DATACOMPRESS および KEYCOMPRESS を使用することができます。これらの指令は、ファイルの作成時に指定する必要があります。

索引ファイルおよびレコード順ファイルの場合は、DATACOMPRESS 指令を使用して、反復文字を抑制できます。


注: 圧縮されたファイルは、可変長レコード形式になります。相対ファイルでデータ圧縮を指定しても、最大レコード長が常に書き出されるため、領域の節約にはなりません。


索引ファイルの場合は、KEYCOMPRESS 指令を使用して、反復文字を抑制できます。

これらの指令は、$SET 文を使用して指定し、選択したファイルの圧縮を有効化することができます。

DATACOMPRESS および KEYCOMPRESS の詳細は、『データ圧縮とキー圧縮』を参照してください。

11.1.6 IDXFORMAT

IDXFORMAT コンパイラ指令を使用すると、作成する索引ファイルの種類を指定できます。 例えば、IDXFORMAT"1" を使用して C-ISAM ファイルを作成し、IDXFORMAT "5" または IDXFORMAT "6" を使用して BTRIEVE ファイルを作成できます。

多くの副キーをもつファイルの処理では、IDXFORMAT"4" または IDXFORMAT"8" を使用します。これにより、削除操作と再書き込み操作のパフォーマンスが向上し、多くの重複キーが有効化されます。

1 ギガバイト (非共有ファイルの場合は 2 ギガバイト) より大きいファイルを作成するには、IDXFORMAT"8"を使用します。

11.1.7 OPTIONAL-FILE

OPTIONAL-FILE コンパイラ指令は、次のどちらかで指定します。

OPTIONAL-FILE (デフォルト)
NOOPTIONAL-FILE

OPTIONAL-FILE 指令では、開いている I/O または EXTEND の SELECT 文は、OPTIONAL が SELECT 句でコード化されているものとして処理されます。つまり、存在しないファイルが開いている I/O または EXTEND ファイルである場合は、次のようになります。

11.1.8 RECMODE

RECMODE コンパイラ指令は、ファイルのデフォルトの RECORDING MODE が固定または可変形式のどちらであるかを次のように指定します。

RECMODE"F" (デフォルト)
RECMODE"V"

RECMODE"V" を指定すると、SELECT 文の RECORDING MODE IS VARIABLE 句を省略できます。ただし、この句が必要な場合は、RECORDING MODE IS FIXED を指定する必要があります。

11.1.9 RM

RM コンパイラ指令は、いくつかの領域で Ryan-McFarland COBOL 互換性を提供します。例えば、この指令によって、Ryan-McFarland ファイル状態コードを生成することができます。詳細については、『Compatibility Guide』および『言語リファレンス - 追加トピック』の『Ryan-McFarland COBOL V2.0 Syntax Support』を参照してください。

11.1.10 SEQUENTIAL

SEQUENTIAL コンパイラ指令は、デフォルトで、SELECT 文の明示的または暗示的 ORGANIZATION IS SEQUENTIAL 句をもつファイルが、レコード順または行順のどちらであるかを判断します。

この指令は、次のように RECORD、LINE、ANSI または ADVANCING に設定することができます。

SEQUENTIAL"RECORD" (デフォルト)
SEQUENTIAL"LINE"
SEQUENTIAL"ANSI"
SEQUENTIAL"ADVANCING"

この指令は、ORGANIZATION SEQUENTIAL がこの COBOL システムの ORGANIZATION LINE SEQUENTIAL と等価である他の COBOL ダイアレクトから変換する場合に役に立ちます。

SEQUENTIAL"LINE" でコンパイルし、SELECT 文を次のようにコード化するとします。

     select fd-name
         assign to ...
         organization is sequential

この場合は、ファイルが、デフォルトのレコード順ファイルではなく、行順ファイルになります。

11.2 オペレーティングシステムの注意事項

ファイル処理に影響を与える、オペレーティングシステム固有の注意事項は、数多くあります。この項では、いくつかの共通の注意事項について説明します。この中にはファイル処理に関連するメモリの問題を回避および解決するためのヒントも含まれています。

11.2.1 電源障害

アプリケーションの実行中に電源障害またはシステムリブートが発生した場合は、障害の発生時にアプリケーションによって処理されていたファイルの一貫性は保証されません。

11.2.2 ファイルハンドル

ファイルハンドルは、システムによるファイルの使用方法を制御するオペレーティングシステムのメカニズムです。アプリケーションで開いたすべてのファイルには、少なくとも 1 つのファイルハンドルが必要です。UNIX では、ファイルハンドルはファイル記述子と呼ばれます。

一度に開くことができるファイルの最大数は、標準入力、出力およびエラーファイルを除き、UNIX システムの構成によって異なります。システム構成の詳細については、『Release Notes』を参照してください。ファイルのオープンモードは、一度に開くことができるファイルの最大数に影響を与える場合があります。INPUT 用に開かれるファイルの数は、UNIX システム用に設定されているプロセスごとのファイルの最大数に制限されます。EXCLUSIVE アクセス権に (OUTPUT 用に開かれるファイル) が設定されているファイルではファイルロックを取得するため、UNIX システム用に設定されているプロセスごとのファイルロックの最大数に制限されます。これらの 2 つの制限は必ずしも同じではありません。

調整可能な max_file_handles を使用して開くファイルの最大数を指定できます。詳細は、『Server Express ユーザガイド』を参照してください。

必要なファイルハンドル数を決定するためのいくつかの要因を次に示します。

11.2.2.1 索引ファイルのファイルハンドラ

2 つのファイル、データファイルおよび索引ファイルから成る索引ファイルの場合は、開いている索引ファイルごとに 2 つのファイルハンドルが必要です。IDXFORMAT"8" ファイルには 1 つのファイルしかないため、必要なハンドルは 1 つのみです。

11.2.2.2 ソート中のファイルハンドル

COBOL SORT を実行すると、いくつかの作業ファイルが作成され、そのファイルごとに 1 つのファイルハンドラが必要です。

11.2.2.3 アニメーション中のファイルハンドル

アニメーション中は、特定の数の Animator 制御ファイルが開かれます。これらのファイルごとに 1 つのファイルハンドルが必要です。つまり、アニメーション中にアプリケーションでファイルハンドルが足りなくなる場合がありますが、スタンドアロンで実行中には足りなくなることはありません。

11.2.3 ネットワークファイル処理の制限

ネットワークには、オペレーティングシステムで設定されている制限よりも限定的な制限が組み込まれている場合があります。ネットワークで実行する場合は、ネットワークに関するマニュアルを参照して、一度に開くことができるファイルの最大数を確認してください。

11.2.4 ファイルサイズ

作成可能なファイルの最大サイズは、環境変数 ulimit によって制限されます。デフォルトの制限値が小さい場合でも、スーパーユーザであれば、この値を大きくすることができます。

11.2.5 ファイルのオープン

COBOL OPEN OUTPUT 文では、オペレーティングシステムに対して 2 つの呼び出しを実行する必要があります。最初はファイルを開くための呼び出しで、2 番目は排他ロックを取得するための呼び出しです。この 2 つの呼び出しの間には、少し時間的間隔があるため、2 番目のユーザは、ファイルが作成される時間と排他的にロックされる時間の間にファイルにアクセスすることができます。アクセスが行われた場合に、2 番目のユーザがファイルが空になっていることに気づいてファイルを読み込もうとすると、at end エラーが発生します。OPEN OUTPUT を実行するユーザは、排他ロックの呼び出しが失敗したため、file locked エラーを受け取ります。

11.3 複数リールファイル

順ファイルを複数リール (複数ユニット) ファイルとして指定できます。つまり、1 つの順ファイルを次の複数の領域に格納することができます。

ファイルを複数リールファイルとして、環境部の SELECT 句で指定する必要があります。

可変長レコードがある場合は、ファイルヘッダーレコード(次を参照)で格納できるのは 1 つのレコード長に限られるため、順ファイルを複数リールファイルとして指定できません。

順ファイルを複数リールファイルとして指定するたびに、ファイルの適切なリールを書き出すようにプロンプトが表示されます。これは、ファイルの最初のリールがすでに書き出されている場合でも適用されます。プロンプトは次のようになります。

ボリューム nnnn (access  ファイル filename )をロードしてください
準備ができたら新しいデバイス (必要な場合) と <CR> を入力してください

この場合のパラメータは次のようになります。

nnnn 書き出されるリールの 4 桁のリール番号 (0001〜9999)
access ソースプログラムで指定される INPUT、OUTPUT または I/O
filename ソースプログラムの SELECT 句で指定されるファイル名

関連ディスクまたはリールが書き出されていることを確認し (出力用のメディアはフォーマット済みでなければなりません)、ファイル名を入力します。

入力または入出力用に開いているファイルの誤ったボリュームが書き出されたり、ヘッダー情報が何らかの原因で破損した場合は、エラーが返されます。

次の場合は常にプロンプトが表示されます。

11.3.1 複数リールファイルヘッダーレコード

複数リールファイルには、長さが 256 バイトのヘッダー情報のブロックがあります。このヘッダーは、各リールの最初の 256 バイトを占有し、リールを記述する情報を含みます。また、予約されている 44 バイトも含まれます。この予約領域は変更できません。

複数リールファイルヘッダーの構造は、次のとおりです。

バイト
内容
0〜49 複数リールヘッダー開始識別子。
50〜69 ファイル名。これは SELECT 句で指定したファイルの名前です。
70〜75 yymmdd フォーム (ASCII 桁の年、月、日付) のファイル作成時間。システムにより日付が戻されない場合は、ヘッダーのこの部分に ASCII ゼロが格納されます。
76〜83 hhmmsscc フォーム (ASCII 桁の時間、分、秒、ミリ秒) のファイル作成時間。システムにより時間が戻されない場合は、ヘッダーのこの部分に ASCII ゼロが格納されます。
84〜127 ユーザが独自に使用するための予約領域 (前述の説明を参照) 。
128〜131 リール番号。これは、0001〜9999のリール番号を示す 4 桁の ASCII 値です。
132 継続フラグ。リールが終了する方法を示す 1 バイトの値。この値は、次のようにASCII の Y、A または N になります。
Y このリールの後には、継続リールが続きます。リールを変更するには、A CLOSE REEL 文を使用します。
A このリールの後には、継続リールが続きます。このリールは一杯になると自動的に変更されます。
N このリールには継続がありません。ファイルの最後のリールです。
133 予約済み領域。現在 ASCII 値、N が格納されています。
134〜145 リールの長さ。このリールに格納されている情報のバイト数を示す 12 桁の ASCII 値。システムでリールサイズを判断できない場合はヘッダーのこの部分にゼロが格納されます。
146〜151 レコードサイズ。このファイルのレコードのレコード長を示す 6 桁の ASCII 値です。
152〜157 ブロックサイズ。ヘッダーのレコードサイズ領域と同じ値をもつ 6 桁の ASCII 値です。
158〜239 ASCII 空白文字を含む予約済み領域
240〜255 複数リールヘッダーの終了識別子

11.4 索引ファイルキー

以降の項では、スパースキーと、多くの重複キーをもつファイルの処理方法について説明します。

11.4.1 スパースキー

スパースキーは、特定のキー値に対して索引エントリを格納しないことを示すキーです。例えば、すべての空白文字を格納するときにキーをスパースとして定義すると、レコードのキー部分に空白文字のみを格納する場合は、そのキーに対する索引エントリは挿入されません。

通常、呼び出し可能ファイルハンドラに索引レコードが格納されると、キー値は、定義したキーごとに索引ファイルに格納されます。副キーをスパースキーとして定義し、レコード内のキー値が指定したスパース値である場合は、キーが格納されません。ただし、通常の主キーパスを使用してレコードを読み取るには十分な情報が格納されます。

この機能を使用すると、索引ファイルの容量を小さくすることができます。キーが大きくなるほど、また副キーに特定の値をもつレコードの数が増えるほど、ディスク領域を節約することができます。

スパースを指定できるのは、重複が許可されている副キーのみです。

11.4.1.1 スパースキーの使用

スパースキーは、SELECT...ALTERNATE KEYS 文で SUPPRESS 句を使用して定義されます (詳細は、『Language Reference』を参照してください)。

スパースキーは、C-ISAM ファイルではサポートされません。

 input-output section.
 file-control.
     select out-file
         assign to "outfile"
         organization is indexed
         access mode is dynamic
         record key is out-key
         alternate record key is alt-key
             with duplicates
             suppress when all "A"
*
* ここで副キー値が "A" の
* レコードを書き込んでも、実キー値は
* 索引ファイルには格納されません。
*
     file status is file-status.

 data division.
 file section.
 fd out-file.
 01 out-rec.
     03 out-key               pic 9(10).
     03 alt-key               pic x(20).
 working-storage section.
 01 file-status               pic xx.
 procedure division.
     open output out-file
     if file-status not = "00"
*         < 中断コード >
     end-if
     perform varying out-key from 1 by 1
         until out-key > 10
         move all "A" to alt-key
         write out-rec
          invalid key
*             < 中断コード >
     end-write
     end-perform
     close out-file
     stop run.

11.4.2 重複キー

索引ファイルでキーを定義して重複値を使用することができます。ただし、主キーでは重複値を使用しないことをお奨めします。これは、重複を許可すると、ファイルのレコードを一意に識別できなくなるためです。『Language Reference』の READ、REWRITE および DELETE 文を参照してください。

重複キーを有効化するには、SELECT 文の ALTERNATE RECORD 節で句 WITH DUPLICATES を指定します。

重複キーを使用する場合は、標準ファイルのすべてのキーについて、重複キーの最大数、 65535 が許可されていることに注意してください。重複キーを指定するたびに、そのオカレンス番号に 1 が追加されます。ただし、オカレンス番号は、重複キーレコードが作成順に読み取られているかどうかを確認するために使用され、レコードが削除されているオカレンス番号は再使用できないため、重複キーの最大値に到達する可能性があります。

この問題を回避するには、異なる種類のファイル、 IDXFORMAT"4" を利用します。このファイルは、個々のファイルまたはプログラム内のすべてのファイルに対して SELECT 文の前に IDXFORMAT"4" コンパイラ指令を指定するときに呼び出します。IDXFORMAT"4" 形式のファイルでは、最大 4,294,967,297 の重複キーを使用できます。データファイルの各レコードの後ろには、そのレコードの重複キーの数を格納するシステムレコードが続きます。これにより、多くの重複値をもつレコードでの REWRITE または DELETE 操作が大幅に高速化されます。このため、そのようなファイルのデータレコードは、デフォルトファイルのデータレコードよりも容量が大きくなります。

11.5 データ圧縮とキー圧縮

呼び出し可能ファイルハンドラを使用して作成したファイルのレコードとキーを圧縮し、物理ディスク領域を節約することができます。データ圧縮を有効化するには、呼び出し可能ハンドラを使用してプログラムから圧縮ルーチンを呼び出します。

11.5.1 データ圧縮

データ圧縮を使用すると、順ファイルまたは索引ファイルでデータを圧縮することができます。この COBOL システムでは、2 つの圧縮メカニズム、ランレングス符号化 (タイプ 1) と拡張ランレングス符号化(タイプ 3)を提供しています。

ファイルをランレングス符号化を使用して定義すると、反復文字の文字列は反復カウントをもつ単一の文字として格納されます。

DATACOMPRESS コンパイラ指令を使用してデータ圧縮を有効化できます。

固定構造の順ファイルのデータ圧縮を指定すると、ファイルは可変構造の順ファイルに変換されます。詳細は、『ファイル構造体』の章を参照してください。

ファイルで使用する圧縮は、ファイルの SELECT 文が処理されるときに最後に処理された DATACOMPRESS 指令により決定されます。そのため、個々のファイルに対して圧縮の種類を設定するには、次のフォームの文を SELECT 文の直前に挿入します。

$SET DATACOMPRESS

他のファイルを処理する前に、$SET NODATACOMPRESS を使用して、この文を必ず無効にしてください。


注: 圧縮した順ファイルでは、REWRITE 文を使用しないことをお奨めします。REWRITE 操作は、圧縮したレコードの長さが圧縮した古いレコードの長さと同じ場合にのみ成功します。


11.5.2 キー圧縮

キー圧縮は、索引ファイルのキーに使用できる圧縮方法です。キー圧縮では次の 3 つの種類の圧縮を使用できます。

どのキーに対してもこれらの圧縮を組み合わせて使用することができますが、重複の圧縮は、重複を有効にした副キーのみに使用できます。

キー圧縮は、KEYCOMPRESS コンパイラ指令を使用して指定します。

ファイルで使用する圧縮は、ファイルの SELECT 文を処理するときに最後に処理された KEYCOMPRESS 指令によって判断されます。そのため、個々のファイルに対して圧縮の種類を設定するには、次のフォームの行を SELECT 文の直前に挿入します。

$SET KEYCOMPRESS

他のファイルを処理する前に、$SET NODATACOMPRESS を使用して、この文を必ず無効にしてください。

KEYCOMPRESS コンパイラ指令の詳細は、『Server Express ユーザガイドを参照してください。

11.5.2.1 後続ヌルの圧縮

後続ヌルの圧縮を使用してキーを定義すると、キー値の後続ヌルはファイルに格納されません。

例えば、長さが 30 字の主キーまたは副キーがあり、キーの最初の 10 字のみを使用し、残りはヌルのレコードを書き込むとします。圧縮を指定しない場合は、キーの 30 字すべてが格納され、30 バイトが必要になります。後続ヌルの圧縮を指定すると、必要なバイト数は 11 バイトのみです (10 バイトはキーの 10 字に使用され、1 バイトは、後続ヌルのカウントを保持するために使用されます)。

11.5.2.2 後続空白文字の圧縮

キーを後続空白文字の圧縮を使用して定義すると、キー値の後続空白文字はファイルに格納されません。ただし、キーを正しく検索できる情報は確認されます。

例えば、長さが 30 字の主キーまたは副キーがあり、キーの最初の 10 字のみを使用し残りは空白のレコードを書き込むとします。圧縮を指定しない場合、キーの 30 字すべてが格納さます。後続空白文字の圧縮を指定すると、索引ファイルの 11 バイトのみが使用されます (10 バイトはキーの 10 字に使用され、1 バイトは後続空白のカウントを保持するために使用されます)。

11.5.2.3 先行文字の圧縮

先行文字の圧縮を使用してキーを定義すると、先行するキーの先行文字と一致する先行文字の一部のみが、索引文字に格納されません。ただし、キーを正常に再作成するための情報は格納されます。

例えば、先行文字の圧縮を使用して定義したキーで、次のキー値を使用してレコードを書き込むとします。

AXYZBBB BBCDEFG BBCXYZA BBCXYEF BEFGHIJ CABCDEF

実際にこの索引ファイルに格納されるキーは、次のとおりです。

AXYZBBB BBCDEFG XYZA    EF      EFGHIJ  CABCDEF

11.5.2.4 重複キーの圧縮

副キーを重複の圧縮を使用して定義すると、最初の重複キーのみがファイルに格納されます。残りのキーは格納されませんが、キーを正常に再作成するための情報は格納されます。

例えば、ABC という副キー値をもつレコードを書き込むとします。重複キーの圧縮を有効にして、同じキー値をもつ別のレコードを書き込む場合は、ファイルハンドラは索引ファイルに重複キー値を物理的に格納しません。ただし、レコードは副キーパスに従って使用することができます。

11.5.3 データ圧縮とキー圧縮の使用例

次のプログラムでは、transfile にはデータ圧縮を指定していますが、 masterfile には指定していません。キー圧縮については、前のキーと同じ後続空白文字と先行文字の抑制を、キー t-rec-keym-rec-key に指定しています。重複キーの反復の抑制は、m-alt-key-1 および m-alt-key-2 でも有効になっています。

$set callfh"extfh"
$set datacompress"1" 
$set keycompress"6" 
     select transfile 
         assign to ... 
         key is t-rec-key. 
$set nokeycompress
$set nodatacompress
     select masterfile 
         assign to ... 
         organization is indexed 
$set keycompress"6"
         record key is m-rec-key 
$set keycompress"7"
         alternate key is m-alt-key-1 with duplicates
         alternate key is m-alt-key-2. 
$set nokeycompress

11.5.4 圧縮ルーチン

呼び出し可能ファイルハンドラでデータを圧縮するために使用するルーチンは、スタンドアロンのモジュールです。つまり、このルーチンはユーザ独自のアプリケーションで使用するか、コール可能ファイルハンドラで独自のデータ圧縮ルーチンを使用することができます。

最大 127 の Micro Focus 圧縮ルーチンと最大 127 のユーザ定義の圧縮ルーチンを指定することができます。

11.5.4.1 Micro Focus 圧縮ルーチン

Micro Focus ルーチンは、CBLDCnnn と呼ばれるモジュールに格納されています。この nnn には 001〜127 を指定できます。Micro Focus 圧縮ルーチンを使用するには、FCD のオフセット 78 のバイトを 001〜127 の値に設定します。

11.5.4.1.1 Micro Focus 圧縮ルーチン CBLDC001

圧縮ルーチン CBLDC001 では、ランレングス符号化のフォームを使用します。この方法では、同じ文字の文字列 (ラン) を検出して、それらを文字の識別子、カウントおよび 1 つのオカレンスに縮小する圧縮方法です。


注: このルーチンは、ダブルバイトの空白文字を含む、 2 バイト文字の有効なオカレンスを格納するファイルでは使用できません。これらのファイルは圧縮されません。


CBLDC001 は、空白文字、バイナリゼロおよび文字ゼロ (単一の文字に縮小可能) および印刷可能文字 (カウントとその後の反復文字で構成される 2 つの文字に縮小される) のランを特に強調しています。

圧縮されたファイルでは、バイトは次の意味になります (表示されている 16 進数値)。

20〜7F (最も印刷可能な文字) 標準の ASCII の意味
80〜9F それぞれ 1〜32 の空白文字なります。
A0〜BF それぞれ 1〜32 のバイナリゼロになります。
C0〜DF それぞれ 1〜32 の文字ゼロになります。
E0〜FF 1〜32 の連続文字のオカレンスになります。
00〜1F 1〜32 の連続文字のオカレンスで、圧縮コードではなく文字どおり解釈されます。

これは、範囲、 00〜1F、80〜9F、A0〜BF、C0〜DF または E0-FF の文字が元のデータにある場合に使用されます。 (そのため、このような 1 文字は 2 バイトに拡張されます。拡張されない場合でも、圧縮によってペナルティが発生することはありません。)

11.5.4.1.2 Micro Focus 圧縮ルーチン CBLDC003

CBLDC001 と同様、このルーチンではランレングス符号化を使用しますが、 1 バイトまたは 2 バイトの文字の文字列 (ラン) を検出します。そのため、このルーチンは、DBCS 文字に適していますが、CBLDC001 のかわりに使用することもできます。

圧縮の形式は、2 ヘッダーバイトの後に 1 字以上の文字が続きます。ヘッダーバイトのビットは、次の意味になります。

ビット 15 未設定 - 単一文字
ビット 14 設定 - 圧縮された順序 未設定 - 圧縮されない順序
ビット 0〜13 圧縮された文字または圧縮されない文字のカウント

文字の文字列の長さは、次のようにヘッダービットによって異なります。

ビット 14 と 15 が設定されている場合 2 文字の反復文字
ビット 14 のみが設定されている場合 1 文字の反復文字
上記の以外の場合 1〜63 文字の圧縮されない文字

11.5.4.2 Micro Focus 圧縮ルーチンの呼び出し

データファイルの圧縮では、呼び出し可能ファイルハンドラは、DATACOMPRESS コンパイラ指令で指定する圧縮ルーチンを呼び出します。

Micro Focus データ圧縮ルーチンを呼び出すには、次の構文を使用します。

COBOL

call "CBLDCnnn" using input-buffer,
                        input-buffer-size,
                        output-buffer,
                        output-buffer-size,
                        compression-type

C

cbldcnnn(input_buffer, &input_buffer_size,  
         output_buffer, &output_buffer_size,
         &compression-type);

この場合のパラメータは次のようになります。

nnn データ圧縮ルーチン (001〜127)
input_buffer A PIC X(size) データ項目。圧縮または圧縮を解除するデータです。最大サイズは 65535 です。
input_buffer_size 2 バイトの (C では int、COBOL では PIC XX COMP-5) データ項目。入力バッファのデータの長さを出力します。
output_buffer A PIC X(size) データ項目。結果のデータを格納するバッファです。
output_buffer_size 2 バイト (C では int、COBOL では PIC XX COMP-5) のデータ項目。ルーチンへの入力時に、このデータ項目には使用可能な出力バッファのサイズを含める必要があります。終了時には、バッファ内のデータの長さを含めます。
compression-type 1 バイト (C では char、COBOL では PIC X COMP-X) のデータ項目。入力データの圧縮または圧縮解除のどちらを実行するか指定します。

0 - 圧縮
1 - 圧縮の解除

RETURN-CODE 特殊レジスタは、操作の成功または失敗を示します。圧縮または圧縮解除は、出力バッファが小さすぎて結果を受け入れることができない場合にのみ失敗します。

0 成功を示します。
1 失敗を示します。

11.5.4.3 ユーザ指定の圧縮ルーチン

ユーザ指定の圧縮ルーチンは、 USRDCnnn と呼ばれるモジュールに格納する必要があります。この場合の nnn は 128〜255 になります。

ユーザ指定のルーチンを呼び出すには、Micro Focus ルーチンを呼び出す場合と同じ構文を使用しますが、ファイル名に、 CBLDCnnn ではなく USRDCnnn を使用します。この nnn は 128〜255 の値にする必要があります。

システムで圧縮ルーチンを使用できるようにするには、 必要に応じて呼び出すことができる、呼び出し可能な共通オブジェクトを作成する必要があります。

cob オプションを使用すると、プログラム内のデータ圧縮ルーチンの呼び出しを、前の UNIX COBOL システムから新しい呼び出しへマップすることができます。

-m CBL_DATA_COMPRESS_nnn=CBLDCnnn

注:


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前ページへファイル処理ライブラリルーチン バイトストリームファイル処理次ページへ