C 呼び出し規則

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

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 パラメーターには BYVALUE 属性を指定してください。
  3. 通常、PL/I の引数は参照で渡されるため、CHARACTER(n) として宣言されている char * に BYVALUE 属性は必要ありません。ただし、ATOI_2 宣言のように、char * 引数が POINTER として宣言されている場合は、BYVALUE 属性が必要です。
  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 BYVALUE)
           RETURNS(FIXED BINARY(31)) 
           EXTERNAL('atoi'),
    
    STRTOL ENTRY(CHARACTER(80),
                 POINTER BYVALUE,
                 FIXED BINARY(31) BYVALUE) 
           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;