オペレーティング・システムにも PL/I 言語にも、 出力データのフォーマット設定を簡単に行えるようにするための機能がいくつかあります。 オペレーティング・システムで、ユーザーが各レコードの最初のバイトを印刷制御文字として 使用することができるようにしています。 制御文字は、印刷されずにプリンターに改行や改ページを行わせます。(印刷制御文字の詳細については、図 29 お よび 表 17 を参照してください。)
PL/I プログラムでは、PRINT ファイルの使用は、ストリーム指向データ伝送からの 印刷出力のレイアウトを制御するのに便利な方法です。 コンパイラーは、PAGE、 SKIP、LINE オプション、およびフォーマット項目に対応 して印刷制御文字を自動的に挿入します。
関連付けられたデータ・セットを直接印刷するつもりでない 場合でも、PRINT 属性を任意の STREAM OUTPUT ファイルに適用することができます。 PRINT ファイルが直接アクセス・データ・セットに関連付けられていると、 印刷制御文字はこのデータ・セットのレイアウトには効力がありませんが、 レコード内のデータの一部として現れます。
FB または VB でオープンされた PRINT ファイルは、UNDEFINEDFILE 条件が生じる原因になります。PRINT ファイルは、"A" オプションすなわち FBA または VBA でオープンします。
コンパイラーは、PRINT ファイルで伝送される各レコードの最初の バイトが米国標準規格 (ANS) の印刷制御文字用に予約し、自動的に適切な文字を 挿入します。
PRINT ファイルは、次の 5 つの印刷制御文字だけを使用します。
コンパイラーは、現行レコードの残りにブランクを埋め込み、次の レコードに適切な制御文字を挿入することによって、PAGE、SKIP、LINE の 各オプションやフォーマット項目を処理します。SKIP または LINE に 3 行を超えるスペースが指定されている場合は、 コンパイラーは、適切な制御文字を使って必要な数のブランク・レコードを挿入し、 必要なスペーシングを行います。 印刷制御オプションやフォーマット項目がない場合は、レコードがフルになる と、コンパイラーは、次のレコードの最初のバイトにブランク文字 (1 行の スペース) を挿入します。
PRINT ファイルの伝送先が端末の場合は、出力フォーマットを指定しない限り、PAGE、SKIP、LINE の各オプションに 3 行を超えるスキップをさせることはありません。
ユーザーの PL/I プログラムあるいは DD ステートメントにレコード長を 指定する (ENVIRONMENT 属性) か、あるいは OPEN ステートメントに行サイズを指定する (LINESIZE オプション) ことに よって、PRINT ファイルで作成された印刷行の長さを制限することができます。 レコード長には印刷制御文字用の余分のバイト数を含める必要があります。 すなわち、レコード長は印刷される行の長さ より 1 バイト (V フォーマット・レコードの場合は、5 バイト) 長くなければなりません。 ユーザーが LINESIZE オプションに指定した値は、印刷される行の文字数 を参照します。コンパイラーは印刷制御文字を追加します。
レコードをブロック化しても、PRINT ファイルで 生成される出力の外観に影響はありませんが、 直接アクセス装置上でファイルがデータ・セットと関連付けられていれば、 補助記憶域をより効率よく使えるようになります。 なお、LINESIZE オプションを指定する場合は、行サイズとブロック・サイズと の互換性を確認する必要があります。F フォーマットのレコードの場合、 ブロック・サイズは正確に (行サイズ +1) の倍数で なくてはならず、V フォーマットのレコードの場合、 ブロック・サイズは行サイズよりも最低 9 バイト大きくなければなりません。
ファイルをいったんクローズし、新しい行サイズでもう一度オープンすれば、実 行中に PRINT ファイルの行サイズを変更できますが、PRINT ファイルを使って直接 アクセス装置上にデータ・セットを作成する場合は、注意が必要です。 ファイルを初めてオープンしたとき、 データ・セットに設定したレコード・フォーマットは変更できません。OPEN ステートメントに指定した行サイズと、 既に設定されているレコード長が矛盾すると、UNDEFINEDFILE 条件が発生します。 このような矛盾が生じないように、使用する予定の最大行サイズより最低 9 バイト大き いブロック・サイズを指定して V フォーマット・レコードを指定するか、 最初の OPEN ステートメントで最大行サイズを必ず指定するようにしてください。 (プリンターに送る予定の出力は、直接プリンターへ送ろうとする 場合でも、UNIT= を使ってプリンターを指定しない限り、一時的に直接アクセス装置に 保管することができます。)
PRINT ファイルは 120 文字のデフォルトの行サイズを持っています。 したがって、PRINT ファイルのレコード・フォーマットを指定する必要はありません。 また、他の情報がない場合には、コンパイラーは V フォーマットのレコードであると見なします。 完全なデフォルト値は、次のとおりです。
図 27 は、PRINT ファイルと、 ストリーム指向データ伝送ステートメントのオプションを使って、 テーブルをフォーマット設定して、 それを後で印刷できるように直接アクセス装置に書き込む方法を例示しています。 このテーブルは、6' 間隔の、0° から 359° 54' までの角度の正弦から成ります。
ENDPAGE ON ユニット内のステートメントによって、 各ページの下にページ番号が挿入され、次ページの見出しがセットアップされます。
このプログラムで作成されたデータ・セットを定義する DD ステートメントには、 レコード・フォーマットに関する情報は含まれていません。 ファイル TABLE をオープンするステートメントに指定されたファイル宣言およ び行サイズから、コンパイラーは次のように推測します。
図 31 のプログラムは、レコード単位データ伝送を 使って、図 27 のプログラムが作成するテーブルを 印刷します。
%PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
%PROCESS LIST;
SINE: PROC OPTIONS(MAIN);
DCL TABLE FILE STREAM OUTPUT PRINT;
DCL DEG FIXED DEC(5,1) INIT(0); /* INIT(0) FOR ENDPAGE */
DCL MIN FIXED DEC(3,1);
DCL PGNO FIXED DEC(2) INIT(0);
DCL ONCODE BUILTIN;
ON ERROR
BEGIN;
ON ERROR SYSTEM;
DISPLAY ('ONCODE = '|| ONCODE);
END;
ON ENDPAGE(TABLE)
BEGIN;
DCL I;
IF PGNO ¬= 0 THEN
PUT FILE(TABLE) EDIT ('PAGE',PGNO)
(LINE(55),COL(80),A,F(3));
IF DEG ¬= 360 THEN
DO;
PUT FILE(TABLE) PAGE EDIT ('NATURAL SINES') (A);
IF PGNO ¬= 0 THEN
PUT FILE(TABLE) EDIT ((I DO I = 0 TO 54 BY 6))
(SKIP(3),10 F(9));
PGNO = PGNO + 1;
END;
ELSE
PUT FILE(TABLE) PAGE;
END;
OPEN FILE(TABLE) PAGESIZE(52) LINESIZE(93);
SIGNAL ENDPAGE(TABLE);
PUT FILE(TABLE) EDIT
((DEG,(SIND(DEG+MIN) DO MIN = 0 TO .9 BY .1) DO DEG = 0 TO 359))
(SKIP(2), 5 (COL(1), F(3), 10 F(9,4) ));
PUT FILE(TABLE) SKIP(52);
END SINE;PRINT ファイルへのデータ指示出力およびリスト指示出力は、 事前設定されているタブ位置に合わせて配置されます。 タブ・テーブルの宣言方法の例については、図 14 および 図 28 の例を参照してください。 テーブル内にフィールドを定義する方法は、次のとおりです。
リンケージ・エディターを使って PLITABS への外部参照を解決すれば、ユーザー・ プログラムで PL/I のデフォルトのタブ設定を変更することができます。 この外部参照を解決するには、PLITABS という名前の テーブルを前述のフォーマットで与えます。
このタブ・テーブルを供給するには、ソース・プログラムに PLITABS という名前の PL/I 構造体を組み込みます。この構造体を、MAIN プロシージャー内、または MAIN プロシージャーとリンクされるプログラム内で、STATIC EXTERNAL として宣言する必要があります。 図 28 は、PL/I 構造体の例です。 この例では、位置 30、60、90 に 3 つのタブを設定し、 ページ・サイズおよび行サイズにはデフォルト値が使われています。TAB1 は行上に印刷される 2 番目の項目の位置を識別することに 注意してください。行上の第 1 項目は常に 左マージンから始まります。 構造体の第 1 項目は、NO_OF_TABS フィールドへのオフセットです。 なお、FILL1、FILL2、FILL3 は、オフセットの値を -6 で調整すれば省略できます。
DCL 1 PLITABS STATIC EXT,
2 (OFFSET INIT(14),
PAGESIZE INIT(60),
LINESIZE INIT(120),
PAGELENGTH INIT(0),
FILL1 INIT(0),
FILL2 INIT(0),
FILL3 INIT(0),
NO_OF_TABS INIT(3),
TAB1 INIT(30),
TAB2 INIT(60),
TAB3 INIT(90)) FIXED BIN(15,0);