我会认为这个库写得不好。如果您要编写一个供 COBOL 使用的低级库,您应该选择更易于 COBOL 操作的数据类型。在这种情况下,表示长字 (S9(9) COMP) 的 COMP 项对于 COBOL 来说会更容易处理。
假设您将这些值组合在一起以调用较低级别的库,您可以将它们加在一起以获得标志值。这是有效的,因为每个常量都有一个位集。
您可以将常量移动到临时重新定义区域,或者利用 COBOL 缺乏类型安全性并将它们传递给子程序进行操作。以下将适用于 VMS COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLEOR.
DATA DIVISION.
WORKING-STORAGE SECTION.
*
* OPTVAL field for IPV6_ADDR_PREFERENCES_FLAGS
*
01 IPV6-ADDR-PREFERENCES-FLAGS PIC X(4).
*
* IPV6_ADDR_PREFERENCES_FLAGS mappings
*
77 IPV6-PREFER-SRC-HOME PIC X(4) VALUE X'00000001'.
77 IPV6-PREFER-SRC-COA PIC X(4) VALUE X'00000002'.
77 IPV6-PREFER-SRC-TMP PIC X(4) VALUE X'00000004'.
77 IPV6-PREFER-SRC-PUBLIC PIC X(4) VALUE X'00000008'.
77 IPV6-PREFER-SRC-CGA PIC X(4) VALUE X'00000010'.
77 IPV6-PREFER-SRC-NONCGA PIC X(4) VALUE X'00000020'.
PROCEDURE DIVISION.
1.
CALL "BINARYOR"
USING IPV6-PREFER-SRC-HOME
IPV6-PREFER-SRC-COA
IPV6-ADDR-PREFERENCES-FLAGS.
CALL "BINARYOR"
USING IPV6-PREFER-SRC-PUBLIC
IPV6-ADDR-PREFERENCES-FLAGS
IPV6-ADDR-PREFERENCES-FLAGS.
IF IPV6-ADDR-PREFERENCES-FLAGS NOT = X'0000000B'
DISPLAY "Failure"
END-IF.
END PROGRAM SAMPLEOR.
IDENTIFICATION DIVISION.
PROGRAM-ID. BINARYOR.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
01 ARG1 PIC S9(9) COMP.
01 ARG2 PIC S9(9) COMP.
01 RESULT PIC S9(9) COMP.
PROCEDURE DIVISION USING ARG1 ARG2 RESULT.
1.
ADD ARG1 TO ARG2 GIVING RESULT.
END PROGRAM BINARYOR.
如果这不起作用,那么您将需要研究您的 COBOL 平台对二进制项的表示以找出正确的类型。
我在 COBOL 中(几十年前)做了很多(可能太多了)较低级别的事情。通常,你可以解决它。但在某些时候它变得太难了,不值得麻烦。在这一点上,调用一种更适合旋转位的语言(如 C)是值得的。