#include <stdint.h>
typedef union
{
void (*fp1p)(void);
void (*fp2p)(uint32_t);
void (*fp3p)(uint32_t, uint32_t);
void (*fp4p)(uint32_t, uint32_t, uint32_t);
uint32_t (*fp5p)(uint32_t);
uint32_t (*fp6p)(uint32_t, uint32_t);
uint32_t (*fp7p)(uint32_t, uint32_t, uint32_t);
} fp;
void fp1(void)
{
}
void fp2(uint32_t a)
{
}
void fp3(uint32_t a, uint32_t

{
}
void fp4(uint32_t a, uint32_t b, uint32_t c)
{
}
uint32_t fp5(uint32_t a)
{
return a * a;
}
uint32_t fp6(uint32_t a, uint32_t

{
return a * b;
}
struct command
{
char *name; //command name
fp read_func_pointer;
fp write_func_pointer;
};
struct command commands[] =
{
[0] = { "gsm", fp1, .write_func_pointer.fp2p = fp2 },
[1] = { "ifb", .read_func_pointer.fp3p = fp3, .write_func_pointer.fp4p = fp4 },
[2] = { "bdsm", .read_func_pointer.fp5p = fp5, .write_func_pointer.fp6p = fp6 },
};
int main()
{
int res;
commands[0].read_func_pointer.fp1p();
commands[0].write_func_pointer.fp2p(1);
commands[1].read_func_pointer.fp3p(1, 2);
commands[1].write_func_pointer.fp4p(1, 2, 3);
res = commands[2].read_func_pointer.fp5p(1);
res = commands[2].write_func_pointer.fp6p(1, 2);
return res;
}