C 呼び出し規則

次のプログラムは、2 つの標準 C ライブラリ関数である、「atoi」および「strtol」を宣言して呼び出す方法を示しています。

int atoi(const char *str)

long strtol(const char *str, char **endptr, int base)

次の点に注意してください。

  1. C では大文字小文字を区別し、PL/I では区別しないため、EXTERNAL('name') を使用して PL/I 名を関数の実際の名前にマップしてください。
  2. C の引数は即値によって渡されるため、各 FIXED BINARY パラメーターには VALUE 属性を指定してください。
  3. 通常、PL/I の引数はリファレンスによって渡されるため、CHARACTER(n) として宣言されている char * に VALUE 属性は必要ありません。ただし、ATOI_2 宣言のように、char * 引数が POINTER として宣言されている場合は、VALUE 属性が必要です。
  4. 規則により、C ストリングは NULL バイトで終端します。
  5. この例では、char * は CHARACTER(80) として宣言されていますが、ストリングと終端の NULL バイトを保持する十分な長さがあれば問題ありません。もちろん、C 関数で特定の長さの文字列へのポインターが想定されている場合は、PL/I および C の宣言を合わせる必要があります。
  6. C 型の null 終了ストリングとの互換性のために z 文字定数が使用されていることに注意してください。また、デフォルトで -1 を返す NULL() 埋め込み関数ではなく、0 を返す SYSNULL() 埋め込み関数が使用されていることにも注意してください。
    CALLC:PROCEDURE OPTIONS(MAIN);
    
    DECLARE
    
    ATOI   ENTRY(CHARACTER(80))
    RETURNS(FIXED BINARY(31))
    EXTERNAL('atoi'),
    
    ATOI_2 ENTRY(POINTER VALUE)
    RETURNS(FIXED BINARY(31))
    EXTERNAL('atoi'),
    
    STRTOL ENTRY(CHARACTER(80),
    POINTER VALUE,
    FIXED BINARY(31) VALUE)
    RETURNS(FIXED BINARY(31))
    EXTERNAL('strtol'),
    
    BASE   FIXED BINARY(31),
    ENDPTR POINTER,
    INT    FIXED BINARY(31),
    LONG   FIXED BINARY(31),
    STR    CHARACTER(80),
    STRPTR POINTER;
    
    STR    = '2147483647'z;
    INT    = ATOI(STR);
    
    PUT SKIP LIST(INT);
    
    STRPTR = ADDR(STR);
    INT    = ATOI_2(STRPTR);
    
    PUT SKIP LIST(INT);
    
    STR    = '0x7fffffff'z;
    ENDPTR = SYSNULL();
    BASE   = 16;
    LONG   = STRTOL(STR, ENDPTR, BASE);
    
    PUT SKIP LIST(LONG);
    
    PUT SKIP LIST(STRTOL('0x7fffffff'z, SYSNULL(), 16));
    
    END CALLC;