標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
Language Environment® | 両方 |
#include <stdio.h>
int svc99(__S99parms *string);
ユーザーのネーム・スペースが侵害されるのを回避するため、この非標準関数には 2 つの名前があります。1 つの名前の接頭部には 2 つの下線文字が付き、もう 1 つの名前の接頭部には付きません。接頭部下線文字が付いていない名前は、LANGLVL(EXTENDED) を使用する場合にのみ表示されます。
この関数を使用するには、その外部エントリー・ポイント名を使用する関数 (つまり、2 つの下線文字で始まる名前) を呼び出すか、または LANGLVL(EXTENDED) で コンパイルする必要があります。LANGLVL(EXTENDED) を使用すると、ヘッダー内の関連情報も表示されます。
__S99parms 構造体は、31 ビットのアドレス可能ストレージ内にあることが必要です。64 ビットのアドレス可能ストレージを指定して svc99() を呼び出すと、-1 の戻りコードが出されます。
__S99TXTPP エレメントは、テキスト・ユニット・ポインターの配列を含む 31 ビットのアドレス可能ストレージを指す、32 ビット幅のポインターであることが必要です。 テキスト・ユニット・ポインターはそれぞれ、32 ビット幅のポインターであることが必要です。それぞれのポインターは、テキスト・ユニットを含む 31 ビットのアドレス可能ストレージを指すか、または NULL ポインターであっても構いません。 最後のテキスト・ユニット・ポインターの高位ビット (従来型の 31 ビット amode 高位ビット) をオンにして、テキスト・ユニットの最後に達したことを示す必要があります。
__S99S99X エレメントは、__S99rbx 構造体を含む 31 ビットのアドレス可能ストレージ (必要な場合) を指す、32 ビット幅のポインターであることが必要です。 このことは、前に概説した __dyn_t 構造体のエレメント __rbx の要件と整合します。
__S99parms 構造体は、stdio.h で 定義されます。これは、ブロック拡張要求のアドレスをインクルードするために、変更 されました。ブロック拡張要求およびエラー・メッセージ・パラメーター・リスト を使用して、エラーが発生したときに、SVC99 で戻されたメッセージ を処理できます。このフィーチャーを使用するには、これらの構造体の割り振りおよび初期設定する必要があります。
フィールド | 型 | 保管済みの値 |
---|---|---|
__S99RBLN | 符号なし char | 要求ブロックの SVC99 の長さ |
__S99VERB | 符号なし char | SVC99 動詞コード |
__S99FLAG1 | 符号なし short | SVC99 フラグ 1 フィールド |
__S99ERROR | 符号なし short | SVC99 エラー・コード・フィールド |
__S99INFO | 符号なし short | SVC99 情報コード |
__S99TXTPP | void * __ptr32 | テキスト単位ポインターのリストの SVC99 ポインター |
__S99S99X | void * __ptr32 | 拡張要求ブロックの SVC99 ポインター |
__S99FLAG2 | unsigned int | APF 許可プログラムの SVC99 フラグ 2 フィールド |
入力ポインターが NULL 以外の場合、svc99() は、CICS® で実行中のときは 0 を、そうでないときはゼロ以外の値を戻します。ゼロ以外の値は、svc99() が現行のオペレーティング・システム (つまり、z/OS の CICS 以外) の環境でサポートされることを示しています。入力が NULL 以外の場合、CICS のもとで実行中の場合は、svc99() は -1 (エラーを 示す) を戻し、そうでない場合には、svc99() からの結果であるコードを 戻します。
入力が NULL 以外で、svc99() がシステムでサポートされていない場合には、-1 を戻します。
⁄* CELEBS58
This example uses the svc99() function to dynamically allocate a data
set called USERID.EXAMPLE.
*⁄
#define MASK 0x80000000
#define _EXT
#include <stdio.h>
#include <string.h>
int main(void)
{
int rc;
struct __S99struc parmlist;
char *s[10] = { ⁄* array of text pointers *⁄
⁄* text units follow *⁄
"¥0¥x02¥0¥x01¥0¥x0E""USERID.EXAMPLE", ⁄* DSN=EXAMPLE *⁄
"¥0¥x05¥0¥x01¥0¥x01¥x02", ⁄* DISP=(,CATLG) *⁄
"¥0¥x07¥0¥0", ⁄* SPACE=(TRK,.. *⁄
"¥0¥x0A¥0¥x01¥0¥x03¥0¥0¥x14", ⁄* primary=20 *⁄
"¥0¥x0B¥0¥x01¥0¥x03¥0¥0¥x01", ⁄* secondary=1 *⁄
"¥0¥x15¥0¥x01¥0¥x05SYSDA", ⁄* UNIT=SYSDA *⁄
"¥0¥x30¥0¥x01¥0¥x02¥0¥x50", ⁄* BLKSIZE=80 *⁄
"¥0¥x3C¥0¥x01¥0¥x02¥x40¥0", ⁄* DSORG=PS *⁄
"¥0¥x42¥0¥x01¥0¥x02¥0¥x50", ⁄* LRECL=80 *⁄
"¥0¥x49¥0¥x01¥0¥x01¥x80"}; ⁄* RECFM=F *⁄
memset(&parmlist, 0, sizeof(parmlist));
parmlist.__S99RBLN = 20;
parmlist.__S99VERB = 1; ⁄* verb for dsname allocation *⁄
parmlist.__S99FLAG1 = 0x4000; ⁄* do not use existing allocation *⁄
parmlist.__S99TXTPP = s; ⁄* pointer to pointer to text units *⁄
s[9] = (char *)((long unsigned) (s[9]) | MASK);
rc = svc99(&parmlist);
if (rc != 0)
printf(" Error code = %d Information code = %d¥n",
parmlist.__S99ERROR, parmlist.__S99INFO);
}
ユーザー ID が A から F の文字いずれかで開始する場合には、ユーザー ID の先頭文字が 16 進数字以外の文字として解釈されるように、ユーザー ID の前に 2 つの二重引用符 (") を追加することが必要です。
前述の例は、シンボル名およびデータ構造体を使用して、以下で示された例より読みやすくなっています。SYS1.MACLIB のメンバー IEFZB4DB、IEFZB4D0、および IEFZB4D2 には、ほとんどのアセンブラー言語プログラムでなじみのシンボル名が 含まれています。
#include <stdio.h>
#include <string.h>
#define MASK 0x80000000
#define CHAR_BIT 4
/* Defines one text unit with an integer of size 'bytes' */
#define __S99TUNIT_INT(bytes) struct {
short unsigned __S99TUKEY; /* KEY */
short unsigned __S99TUNUM; /* NO. OF LENGTH+PARM ENTRIES */
struct { /* TEXT ENTRY OF LENGTH+PARM */
short unsigned __S99TULNG; /* LENGTH OF 1ST (ONLY) PARM */
unsigned int __S99TUPAR : /* PARAMETER */
(bytes) * CHAR_BIT;
} __S99TUENT;
}
/* initialize by: __S99TUNUM = 1; */
/* __S99TUENT.__S99TULNG = <bytes>; */
/* __S99TUENT.__S99TUPAR = <value>; */
#define __DALPRIME 0x000A /*PRIMARY SPACE QUANTITY */
static const __S99TUNIT_INT(3) primary = {__DALPRIME, 1, 3, 20};
int main(void)
{
int rc;
struct __S99struc parmlist;
memset(&parmlist, 0, sizeof(parmlist));
void *s[10] = { /* array of text pointers */
/* text units follow */
. , /* DSN=EXAMPLE */
. , /* DISP=(,CATLG)*/
. , /* SPACE=(TRK,..*/
&primary, /* primary=20 */
. , /* secondary=1 */
. , /* UNIT=SYSDA */
. , /* BLKSIZE=80 */
. , /* DSORG=PS */
. , /* LRECL=80 */
. }; /* RECFM=F */
parmlist.__S99RBLN = 20;
parmlist.__S99VERB = 01; /* verb for dsname allocation */
parmlist.__S99FLAG1 = 0x4000; /* do not use existing allocation */
parmlist.__S99TXTPP = s; /* pointer to pointer to text units */
s[9] = (char *)((long unsigned) (s[9]) │ MASK);
rc = svc99(&parmlist);
if (rc != 0)
printf(" Error code = %d Information code = %d¥n",
parmlist.__S99ERROR, parmlist.__S99INFO);
}