Файл приложил, но имейте ввиду - X-MACRO бьет по мозгам, как табак в самогонке, я просто беспокоюсь, что по этой причине вы отметете что-то хорошее (мое или не мое, неважно).
// names definitions
#undef IMPL_GET
#undef IMPL_SET
#undef IMPL_PROLOG
#undef IMPL_EPILOG
#undef IMPL_VARIABLE
// name of property
#define IMPL_PROLOG(obj)
#define IMPL_EPILOG()
#define IMPL_VARIABLE(obj, i, name, get, set) const NAME_TYPE obj##i##_name = name;
#include objects_file
#undef IMPL_PROLOG
#undef IMPL_EPILOG
#undef IMPL_VARIABLE
// pointers to properties names of one object
#define IMPL_PROLOG(obj) NAME_TYPE const * const obj##_names[] = {
#define IMPL_EPILOG() };
#define IMPL_VARIABLE(obj, i, name, get, set) &obj##i##_name,
#include objects_file
#undef IMPL_PROLOG
#undef IMPL_EPILOG
#undef IMPL_VARIABLE
//name
// get name function
#define IMPL_PROLOG(obj) void obj##GetName(DompParserResultType * dpr) \
{ if (COUNT_ELEMENTS(obj##_names) <= PN) AbsentP(); \
else \
{ \
dpr->name = obj##_names[PN]; \
} \
}
#define IMPL_EPILOG()
#define IMPL_VARIABLE(obj, i, name, get, set)
#include objects_file
#undef IMPL_PROLOG
#undef IMPL_EPILOG
#undef IMPL_VARIABLE
// get var function
#define IMPL_PROLOG(obj) void obj##GetVar(DompParserResultType * dpr) { switch (PN) {
#define IMPL_EPILOG() default: AbsentP(); } }
#define IMPL_VARIABLE(obj, i, name, get, set) case i: get;
#include objects_file
#undef IMPL_PROLOG
#undef IMPL_EPILOG
#undef IMPL_VARIABLE
// set var function
#define IMPL_PROLOG(obj) void obj##SetVar(DompParserResultType * dpr) { switch (PN) {
#define IMPL_EPILOG() default: AbsentP(); } }
#define IMPL_VARIABLE(obj, i, name, get, set) case i: set;
#include objects_file
#undef IMPL_PROLOG
#undef IMPL_EPILOG
#undef IMPL_VARIABLE
#define DECLARE_METHODS(dummy, obj_name) { obj_name##GetName, obj_name##GetVar, obj_name##SetVar }
const VOID_METHOD object_methods[][3] =
{
#ifdef _LAMP_
DECLARE_METHODS (A, system),
DECLARE_METHODS (B, control_temp),
DECLARE_METHODS (C, reserved),
DECLARE_METHODS (D, service),
DECLARE_METHODS (E, boot),
#endif
#ifdef _SENSOR_
DECLARE_METHODS (A, system),
DECLARE_METHODS (B, local_compare),
DECLARE_METHODS (C, illumination),
DECLARE_METHODS (D, service),
DECLARE_METHODS (E, boot),
#endif
#ifdef _CU_
#ifdef _APPLICATION_
DECLARE_METHODS (A, system),
DECLARE_METHODS (B, ports),
DECLARE_METHODS (C, mode),
DECLARE_METHODS (D, group),
DECLARE_METHODS (E, setup),
#endif
#ifdef _BOOT_
DECLARE_METHODS (A, system),
#endif
#endif
};
const u16 OBJECTS_QUANTITY = COUNT_ELEMENTS(object_methods);
void GetName(DompParserResultType * dpr)
{
if (OBJECTS_QUANTITY > ON)
{ object_methods[ON][0](dpr);
dpr->tx_op_code=UniGetName;
}
else
AbsentO();
}
void GetVar(DompParserResultType * dpr)
{
if (OBJECTS_QUANTITY > ON)
{ dpr->tx_op_code=UniGetValue;
object_methods[ON][1](dpr);
}
else
AbsentO();
}
void SetVar(DompParserResultType * dpr)
{
if (OBJECTS_QUANTITY > ON)
{
object_methods[ON][2](dpr);
dpr->tx_op_code=dpr->rx_op_code;
}
else
AbsentO();
}