type+value arguments for dynamic APIs; see: doc/ref/arg.html

typedef struct mbtk_arg_s mbtk_arg_t; typedef struct mbtk_color_s { unsigned char r, g, b, a; } mbtk_color_t; typedef enum mbtk_value_type_e { MBTK_INVALID, MBTK_BOOL, MBTK_LONG, MBTK_ULONG, MBTK_DOUBLE, MBTK_STRING, MBTK_COORD, /* modifiers: */ MBTK_ARG_DELTA = 0x100, MBTK_ARG_MULT = 0x200 } mbtk_value_type_t; #define MBTK_ARG_MASK_BASE 0xFF struct mbtk_arg_s { mbtk_value_type_t type; union { int b; long int l; unsigned long int ul; double d; const char *s; struct { /* on a typical 32 or 64 bit system this should be 2*32 bits, same as sizeof(double) */ int x; int y; } c; } v; /* value */ }; /* Setters returning 0 on success; set native value from arg */ int mbtk_arg_set_int(int *dst, const mbtk_arg_t *src); int mbtk_arg_set_short(short int *dst, const mbtk_arg_t *src); int mbtk_arg_set_uchar(unsigned char *dst, const mbtk_arg_t *src); int mbtk_arg_set_schar(signed char *dst, const mbtk_arg_t *src); int mbtk_arg_set_color(mbtk_color_t *dst, const mbtk_arg_t *src); int mbtk_arg_set_bool(mbtk_bool_t *dst, const mbtk_arg_t *src); /* Getters return 0 on success; get arg from native value */ int mbtk_arg_get_int(mbtk_arg_t *dst, int src); int mbtk_arg_get_short(mbtk_arg_t *dst, int src); int mbtk_arg_get_uchar(mbtk_arg_t *dst, unsigned char src); int mbtk_arg_get_schar(mbtk_arg_t *dst, signed char src); int mbtk_arg_get_color(mbtk_arg_t *dst, mbtk_color_t src); int mbtk_arg_get_bool(mbtk_arg_t *dst, mbtk_bool_t src); /* Wrappers for combined get and set */ int mbtk_arg_getset_int(int *nat, mbtk_arg_t *get, const mbtk_arg_t *set); int mbtk_arg_getset_short(short int *nat, mbtk_arg_t *get, const mbtk_arg_t *set); int mbtk_arg_getset_uchar(unsigned char *nat, mbtk_arg_t *get, const mbtk_arg_t *set); int mbtk_arg_getset_schar(signed char *nat, mbtk_arg_t *get, const mbtk_arg_t *set); int mbtk_arg_getset_color(mbtk_color_t *nat, mbtk_arg_t *get, const mbtk_arg_t *set); int mbtk_arg_getset_bool(mbtk_bool_t *nat, mbtk_arg_t *get, const mbtk_arg_t *set); /* Convert a to a string; if a's type is string, just return the string field, else render into out and return that. */ const char *mbtk_arg_print(char *out, int outlen, const mbtk_arg_t *a); MBTK_INLINE mbtk_arg_t mbtk_arg_long(long l) { mbtk_arg_t a; a.type = MBTK_LONG; a.v.l = l; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_long_delta(long l) { mbtk_arg_t a; a.type = MBTK_LONG | MBTK_ARG_DELTA; a.v.l = l; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_long_mult(long l) { mbtk_arg_t a; a.type = MBTK_LONG | MBTK_ARG_MULT; a.v.l = l; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_dbl(double d) { mbtk_arg_t a; a.type = MBTK_DOUBLE; a.v.d = d; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_dbl_delta(double d) { mbtk_arg_t a; a.type = MBTK_DOUBLE | MBTK_ARG_DELTA; a.v.d = d; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_dbl_mult(double d) { mbtk_arg_t a; a.type = MBTK_DOUBLE | MBTK_ARG_MULT; a.v.d = d; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_str(const char *s) { mbtk_arg_t a; a.type = MBTK_STRING; a.v.s = s; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_str_delta(const char *s) { mbtk_arg_t a; a.type = MBTK_STRING | MBTK_ARG_DELTA; a.v.s = s; return a; } MBTK_INLINE mbtk_arg_t mbtk_arg_str_mult(const char *s) { mbtk_arg_t a; a.type = MBTK_STRING | MBTK_ARG_MULT; a.v.s = s; return a; }