From 0310d28218547fe0f769b33b0aa7dbeb6a0ba79c Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 14 Apr 2016 10:22:05 +0200 Subject: [PATCH] mdhelp: create nice macro helpers to reduce C code --- src/access.c | 6 +++--- src/config.c | 41 +++++++++----------------------------- src/descrambler/caclient.c | 2 +- src/dvr/dvr_autorec.c | 2 +- src/dvr/dvr_config.c | 12 +++-------- src/dvr/dvr_db.c | 33 +++++++----------------------- src/dvr/dvr_timerec.c | 13 +++--------- src/idnode.h | 2 ++ src/imagecache.c | 2 +- src/memoryinfo.c | 2 +- src/prop.h | 7 +++++++ src/satip/server.c | 2 +- 12 files changed, 39 insertions(+), 85 deletions(-) diff --git a/src/access.c b/src/access.c index cbd9bb281..0a6aa214e 100644 --- a/src/access.c +++ b/src/access.c @@ -1309,7 +1309,7 @@ theme_get_ui_list ( void *p, const char *lang ) return strtab2htsmsg_str(tab, 1, lang); } -extern const char *tvh_doc_access_entry_class[]; +CLASS_DOC(access_entry) const idclass_t access_entry_class = { .ic_class = "access", @@ -1741,7 +1741,7 @@ passwd_entry_class_password2_set(void *o, const void *v) return 0; } -extern const char *tvh_doc_passwd_class[]; +CLASS_DOC(passwd) const idclass_t passwd_entry_class = { .ic_class = "passwd", @@ -1893,7 +1893,7 @@ ipblock_entry_class_prefix_get(void *o) return &ret; } -extern const char *tvh_doc_ipblocking_class[]; +CLASS_DOC(ipblocking) const idclass_t ipblock_entry_class = { .ic_class = "ipblocking", diff --git a/src/config.c b/src/config.c index af44f32c3..975e33e0e 100644 --- a/src/config.c +++ b/src/config.c @@ -1968,35 +1968,12 @@ config_muxconfpath_notify ( void *o, const char *lang ) #endif } -static char * -config_channelicon_path_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_config_channelicon_path_property[]; - return prop_md_doc(tvh_doc_config_channelicon_path_property, lang); -} - -static char * -config_channelname_scheme_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_config_channelname_scheme_property[]; - return prop_md_doc(tvh_doc_config_channelname_scheme_property, lang); -} - -static char * -config_picon_path_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_config_picon_path_property[]; - return prop_md_doc(tvh_doc_config_picon_path_property, lang); -} - -static char * -config_picon_servicetype_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_config_picon_servicetype_property[]; - return prop_md_doc(tvh_doc_config_picon_servicetype_property, lang); -} -extern const char *tvh_doc_config_class[]; +CLASS_DOC(config) +PROP_DOC(config_channelicon_path) +PROP_DOC(config_channelname_scheme) +PROP_DOC(config_picon_path) +PROP_DOC(config_picon_servicetype) const idclass_t config_class = { .ic_snode = &config.idnode, @@ -2293,7 +2270,7 @@ const idclass_t config_class = { "(file://) or remote (http://) image. " "See Help for more infomation."), .off = offsetof(config_t, chicon_path), - .doc = config_channelicon_path_doc, + .doc = prop_doc_config_channelicon_path, .opts = PO_ADVANCED, .group = 6, }, @@ -2304,7 +2281,7 @@ const idclass_t config_class = { .desc = N_("Scheme to generate the the channel icon names " "(all lower-case, service name picons etc.)."), .list = config_class_chiconscheme_list, - .doc = config_channelname_scheme_doc, + .doc = prop_doc_config_channelname_scheme, .off = offsetof(config_t, chicon_scheme), .opts = PO_ADVANCED, .group = 6, @@ -2316,7 +2293,7 @@ const idclass_t config_class = { .desc = N_("Path to a directory (folder) containing your picon " "collection. See Help for more detailed " "information."), - .doc = config_picon_path_doc, + .doc = prop_doc_config_picon_path, .off = offsetof(config_t, picon_path), .opts = PO_ADVANCED, .group = 6, @@ -2328,7 +2305,7 @@ const idclass_t config_class = { .desc = N_("Select scheme to generate the picon names " "(standard, force service type to 1)"), .list = config_class_piconscheme_list, - .doc = config_picon_servicetype_doc, + .doc = prop_doc_config_picon_servicetype, .off = offsetof(config_t, picon_scheme), .opts = PO_ADVANCED, .group = 6, diff --git a/src/descrambler/caclient.c b/src/descrambler/caclient.c index 7df2b88e1..574eacd66 100644 --- a/src/descrambler/caclient.c +++ b/src/descrambler/caclient.c @@ -237,7 +237,7 @@ caclient_class_status_get(void *o) return &ret; } -extern const char *tvh_doc_caclient_class[]; +CLASS_DOC(caclient) const idclass_t caclient_class = { diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index 1633030f0..dc592fad6 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -981,7 +981,7 @@ dvr_autorec_entry_class_owner_opts(void *o) return PO_RDONLY | PO_ADVANCED; } -extern const char *tvh_doc_dvrautorec_class[]; +CLASS_DOC(dvrautorec) const idclass_t dvr_autorec_entry_class = { .ic_class = "dvrautorec", diff --git a/src/dvr/dvr_config.c b/src/dvr/dvr_config.c index 4d53e3c65..ed8c73845 100644 --- a/src/dvr/dvr_config.c +++ b/src/dvr/dvr_config.c @@ -791,14 +791,8 @@ dvr_config_class_pathname_set(void *o, const void *v) return 0; } -static char * -dvr_config_prop_pathname_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_postprocessor_property[]; - return prop_md_doc(tvh_doc_postprocessor_property, lang); -} - -extern const char *tvh_doc_dvrconfig_class[]; +CLASS_DOC(dvrconfig) +PROP_DOC(postprocessor) const idclass_t dvr_config_class = { .ic_class = "dvrconfig", @@ -1133,7 +1127,7 @@ const idclass_t dvr_config_class = { .desc = N_("The string allows you to manually specify the " "full path generation using predefined " "modifiers. See Help for full details."), - .doc = dvr_config_prop_pathname_doc, + .doc = prop_doc_postprocessor, .set = dvr_config_class_pathname_set, .off = offsetof(dvr_config_t, dvr_pathname), .opts = PO_EXPERT, diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 77ab6e1ef..a30ef82e8 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -2812,34 +2812,15 @@ dvr_entry_class_content_type_list(void *o, const char *lang) return m; } -static char * -dvr_entry_prop_status_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_dvr_status_property[]; - return prop_md_doc(tvh_doc_dvr_status_property, lang); -} - -static char * -dvr_entry_prop_start_extra_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_dvr_start_extra_property[]; - return prop_md_doc(tvh_doc_dvr_start_extra_property, lang); -} - -static char * -dvr_entry_prop_dvr_stop_extra_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_dvr_stop_extra_property[]; - return prop_md_doc(tvh_doc_dvr_stop_extra_property, lang); -} - -extern const char *tvh_doc_dvrentry_class[]; +CLASS_DOC(dvrentry) +PROP_DOC(dvr_status) +PROP_DOC(dvr_start_extra) +PROP_DOC(dvr_stop_extra) const idclass_t dvr_entry_class = { .ic_class = "dvrentry", .ic_caption = N_("DVR Entries"), .ic_event = "dvrentry", - /*.ic_doc = tvh_doc_dvrentry_class,*/ .ic_doc = tvh_doc_dvrentry_class, .ic_changed = dvr_entry_class_changed, .ic_save = dvr_entry_class_save, @@ -2870,7 +2851,7 @@ const idclass_t dvr_entry_class = { .name = N_("Pre-recording padding"), .desc = N_("Start recording earlier than the " "EPG/timer-defined start time by x minutes."), - .doc = dvr_entry_prop_start_extra_doc, + .doc = prop_doc_dvr_start_extra, .off = offsetof(dvr_entry_t, de_start_extra), .set = dvr_entry_class_start_extra_set, .list = dvr_entry_class_extra_list, @@ -2898,7 +2879,7 @@ const idclass_t dvr_entry_class = { .name = N_("Post-recording padding"), .desc = N_("Continue recording for x minutes after scheduled " "stop time."), - .doc = dvr_entry_prop_dvr_stop_extra_doc, + .doc = prop_doc_dvr_stop_extra, .off = offsetof(dvr_entry_t, de_stop_extra), .list = dvr_entry_class_extra_list, .opts = PO_SORTKEY | PO_ADVANCED | PO_DOC_NLIST, @@ -3222,7 +3203,7 @@ const idclass_t dvr_entry_class = { .type = PT_STR, .id = "status", .name = N_("Status"), - .doc = dvr_entry_prop_status_doc, + .doc = prop_doc_dvr_status, .desc = N_("The recording/entry status."), .get = dvr_entry_class_status_get, .opts = PO_RDONLY | PO_NOSAVE | PO_LOCALE, diff --git a/src/dvr/dvr_timerec.c b/src/dvr/dvr_timerec.c index 8af4b722e..a45d3cfba 100644 --- a/src/dvr/dvr_timerec.c +++ b/src/dvr/dvr_timerec.c @@ -517,15 +517,8 @@ dvr_timerec_entry_class_owner_opts(void *o) return PO_RDONLY | PO_ADVANCED; } -static char * -dvr_timerec_prop_titleformat_doc(const struct property *p, const char *lang) -{ - extern const char *tvh_doc_dvr_timerec_title_format_property[]; - return prop_md_doc(tvh_doc_dvr_timerec_title_format_property, lang); -} - - -extern const char *tvh_doc_dvrtimerec_class[]; +CLASS_DOC(dvrtimerec) +PROP_DOC(dvr_timerec_title_format) const idclass_t dvr_timerec_entry_class = { .ic_class = "dvrtimerec", @@ -557,7 +550,7 @@ const idclass_t dvr_timerec_entry_class = { .id = "title", .name = N_("Title"), .desc = N_("Title of the recording."), - .doc = dvr_timerec_prop_titleformat_doc, + .doc = prop_doc_dvr_timerec_title_format, .off = offsetof(dvr_timerec_entry_t, dte_title), .def.s = "Time-%F_%R", }, diff --git a/src/idnode.h b/src/idnode.h index 38e85cea1..f30ba6a17 100644 --- a/src/idnode.h +++ b/src/idnode.h @@ -61,6 +61,8 @@ typedef struct property_group */ #define IDCLASS_ALWAYS_SAVE (1<<0) ///< Always call the save callback +#define CLASS_DOC(name) extern const char *tvh_doc_##name##_class[]; + typedef struct idclass idclass_t; struct idclass { const struct idclass *ic_super; ///< Parent class diff --git a/src/imagecache.c b/src/imagecache.c index 48b7af418..761e3c5b9 100644 --- a/src/imagecache.c +++ b/src/imagecache.c @@ -71,7 +71,7 @@ struct imagecache_config imagecache_conf = { static htsmsg_t *imagecache_save(idnode_t *self, char *filename, size_t fsize); -extern const char *tvh_doc_imagecache_class[]; +CLASS_DOC(imagecache) const idclass_t imagecache_class = { .ic_snode = (idnode_t *)&imagecache_conf, diff --git a/src/memoryinfo.c b/src/memoryinfo.c index bdd5dda41..c23b5677f 100644 --- a/src/memoryinfo.c +++ b/src/memoryinfo.c @@ -29,7 +29,7 @@ service_class_get_title ( idnode_t *self, const char *lang ) return ((memoryinfo_t *)self)->my_name; } -extern const char *tvh_doc_memoryinfo_class[]; +CLASS_DOC(memoryinfo) const idclass_t memoryinfo_class = { .ic_class = "memoryinfo", diff --git a/src/prop.h b/src/prop.h index 1bed0fc4b..392f3e6a9 100644 --- a/src/prop.h +++ b/src/prop.h @@ -152,6 +152,13 @@ static inline int64_t prop_intsplit_from_str(const char *s, int64_t intsplit) char * prop_md_doc(const char **md, const char *lang); +#define PROP_DOC(name) \ +extern const char *tvh_doc_##name##_property[]; \ +static char * \ +prop_doc_##name(const struct property *p, const char *lang) \ +{ return prop_md_doc(tvh_doc_##name##_property, lang); } + + #endif /* __TVH_PROP_H__ */ /****************************************************************************** diff --git a/src/satip/server.c b/src/satip/server.c index c887179c8..d49a013e3 100644 --- a/src/satip/server.c +++ b/src/satip/server.c @@ -566,7 +566,7 @@ static htsmsg_t *satip_server_class_muxcfg_list ( void *o, const char *lang ) return strtab2htsmsg(tab, 1, lang); } -extern const char *tvh_doc_satip_server_class[]; +CLASS_DOC(satip_server) const idclass_t satip_server_class = { .ic_snode = (idnode_t *)&satip_server_conf, -- 2.47.3