例 - 列挙宣言の翻訳

Header-to-copy ユーティリティが C ソース コード内の列挙宣言を等価な COBOL COPY ファイル形式に翻訳する例を次に示します。

C のソース

enum input_type { GPICK = 0x0001, GANK= 0x0002, GPFK = 0x0004,
                  FP_NOINBUF = 0x10000, FP_WTMAX = 0x20000 };
typedef struct qqel {   /* queue element*/
   enum input_type type;  /* enum input_type value */
   int time;    /* timestamp */
   struct {
      unsigned bad_data :1;  /* extra data io failed  */
      unsigned no_data  :1;  /* queue empty (for K_POLL) */
      unsigned reserved :6;  /* reserved  */
      char rsvd[3];    /* reserved  */
   } flags;
   int data_len;    /* length of appended data */
} q_qel;

生成される COBOL コード

 01  input-type  is typedef  usage uns-int.
 78  gpick           value  1.
 78  gank            value 2.
 78  gpfk            value 4.
 78  fp-noinbuf      value 65536.
 78  fp-wtmax        value 131072.
 01  qqel   is typedef.
     02  type        usage input-type.
     02  time        usage int.
     02  flags.
         03  bad-data.
             04  bad-data       usage uns-int. *>> 1 Bit
         03  filler redefines bad-data.
             04  no-data        usage uns-int. *>> 1 Bit
         03  filler redefines bad-data.
             04  reserved       usage uns-int. *>> 6 Bits
         03  rsvd               pic x(3).
         03  filler             pic x(1).
     02  data-len               usage int.
 01  q-qel   is typedef  usage qqel.

rsvd は 3 バイト長の項目です。直前の 8 ビットで 1 バイトの記憶域が割り当てられることを前提としていましたが、ANSI C ではビットフィールドに整数型の項目を充てるように定義されているため、実際には 16 ビットの領域が割り当てられます。したがって、H2cpy は末尾に空白詰め用の 1 バイト項目を追加する必要があります。