#define MDATA_CONCAT_(a,b) a##b #define MDATA_CONCAT(a,b) MDATA_CONCAT_(a,b) #define BE32(x) 0,0,0,0 #define BE16(x) 0,0 .header = { 0,0,0,0, BE32(offsetof(struct M_NAME, data)), BE16(M_BASE & M_MASK), BE16(sizeof(MDATA_CONCAT(M_NAME,_offsets))/2-1), }, .offsets = { #define M(n, s) \ [2*((n)-M_BASE)] = \ (offsetof(struct MDATA_CONCAT(M_NAME,_data), m_##n)+1)/256,\ (offsetof(struct MDATA_CONCAT(M_NAME,_data), m_##n)+1)%256, #include M_SOURCE #undef M }, .data = { #define M(n, s) .m_##n = s, #include M_SOURCE #undef M }, #undef MDATA_CONCAT #undef MDATA_CONCAT_