Den 26-12-2011 15:41, ik skrev:
Hello,

I'm trying to translate the following to Pascal:
------------
struct xt_option_call {
    const char *arg, *ext_name;
    const struct xt_option_entry *entry;
    void *data;
    unsigned int xflags;
    bool invert;
    uint8_t nvals;
    union {
        uint8_t u8, u8_range[2], syslog_level, protocol;
        uint16_t u16, u16_range[2], port, port_range[2];
        uint32_t u32, u32_range[2];
        uint64_t u64, u64_range[2];
        double dbl;
        struct {
            union nf_inet_addr haddr, hmask;
            uint8_t hlen;
        };
        struct {
            uint8_t tos_value, tos_mask;
        };
        struct {
            uint32_t mark, mask;
        };
        uint8_t ethermac[6];
    } val;
    /* Wished for a world where the ones below were gone: */
    union {
        struct xt_entry_match **match;
        struct xt_entry_target **target;
    };
    void *xt_entry;
    void *udata;
};

------
h2pas does not capable of translating it, and I'm not sure that I know to make the "case" statement that will be equivalent for this complex union.
How can I translate it ?

Thanks,
Ido
I think the following should do it:
uses ctypes;

{$PACKRECORDS C}

type
 xt_option_call_union = record
  case integer of
   0: (u8: cuint8);
   1: (u8_range: array[0..1] of cuint8);
   2: (sysloc_level: cuint8);
   3: (protocol: cuint8);
   4: (u16: cuint16);
   5: (u16_range: array[0..1] of cuint16);
   6: (port: cuint16);
   7: (port_range: array[0..1] of cuint16);
   8: (u32: cuint32);
   9: (u32_range: array[0..1] of cuint32);
   10: (u64: cuint64);
   11: (u64_range: array[0..1] of cuint64);
   12: (dbl: cdouble);
   13: (haddr: nf_inet_addr; hlen: cuint8);
   14: (hmask: nf_inet_addr);
   15: (tos_value, tos_mask: cuint8);
   16: (mark, mask: cuint32);
   17: (ethermac: array[0..5] of cuint8);
 end;

 xt_option_call = record
  arg,
  ext_name: pchar;
  entry: ^xt_option_entry;
  data: pointer;
  xflags: cuint;
  invert: cbool;
  nvals: cuint8;
  val: xt_option_call_union;
  case integer of
   0: (match: ^Pxt_entry_match; xt_entry, udata: pointer);
   1: (target: ^Pxt_entry_target);
 end;
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to