1521fa314SDavid van Moolenbroek 2*b58e161cSDavid van Moolenbroek #define COUNT(s) (__arraycount(s)) 3521fa314SDavid van Moolenbroek 4521fa314SDavid van Moolenbroek struct call_handler { 5521fa314SDavid van Moolenbroek const char *name; 6521fa314SDavid van Moolenbroek const char *(*namefunc)(const message *m_out); 7521fa314SDavid van Moolenbroek int (*outfunc)(struct trace_proc *proc, const message *m_out); 8521fa314SDavid van Moolenbroek void (*infunc)(struct trace_proc *proc, const message *m_out, 9521fa314SDavid van Moolenbroek const message *m_in, int failed); 10521fa314SDavid van Moolenbroek }; 11521fa314SDavid van Moolenbroek #define HANDLER(n,o,i) { .name = n, .outfunc = o, .infunc = i } 12521fa314SDavid van Moolenbroek #define HANDLER_NAME(n,o,i) { .namefunc = n, .outfunc = o, .infunc = i } 13521fa314SDavid van Moolenbroek 14521fa314SDavid van Moolenbroek struct calls { 15521fa314SDavid van Moolenbroek endpoint_t endpt; 16521fa314SDavid van Moolenbroek unsigned int base; 17521fa314SDavid van Moolenbroek const struct call_handler *map; 18521fa314SDavid van Moolenbroek unsigned int count; 19521fa314SDavid van Moolenbroek }; 20521fa314SDavid van Moolenbroek 21521fa314SDavid van Moolenbroek struct flags { 22521fa314SDavid van Moolenbroek unsigned int mask; 23521fa314SDavid van Moolenbroek unsigned int value; 24521fa314SDavid van Moolenbroek const char *name; 25521fa314SDavid van Moolenbroek }; 26521fa314SDavid van Moolenbroek #define FLAG(f) { f, f, #f } 27521fa314SDavid van Moolenbroek #define FLAG_MASK(m,f) { m, f, #f } 28521fa314SDavid van Moolenbroek #define FLAG_ZERO(f) { ~0, f, #f } 29521fa314SDavid van Moolenbroek 30521fa314SDavid van Moolenbroek /* not great, but it prevents a massive potential for typos.. */ 31521fa314SDavid van Moolenbroek #define NAME(r) case r: return #r 32521fa314SDavid van Moolenbroek #define TEXT(v) case v: text = #v; break 33