元プログラム

こんな感じでした。

typedef struct hoge_tag {
    unsigned char  *name;
    unsigned short type;
    void           *p;
} hoge_t;

enum {
    TYPE_STR = 0,
    TYPE_INT,
    TYPE_MASK = 0x7f,

    TYPE_RO = 0x80,
};

static const hoge_t hoge_tbl[] = {
    { "hoge", TYPE_STR, ... },
    { "kma",  TYPE_INT|TYPE_RO, ... },
};

void
hoge_write(void) {
    hoge_t *p = hoge;
    hoge_t *endp = hoge + (sizeof(hoge) / sizeof(hoge[0]));

    while (p < endp) {
        switch (p->type & TYPE_MASK) {
        ...
        }
        p++;
    }
}