X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=filter_common.c;h=5533d4dcd6d25fba87a242b2c09efa4b2c76e940;hb=66b97974ebba5c6ea967b713f84f62a1b72da8d2;hp=5a5e9d037a96ce1e8db44ae9f60964688ae8a5f5;hpb=4adde8dae3317fa83b81e7a860c9ed9133e99bb0;p=paraslash.git diff --git a/filter_common.c b/filter_common.c index 5a5e9d03..5533d4dc 100644 --- a/filter_common.c +++ b/filter_common.c @@ -21,22 +21,22 @@ #include "string.h" /** Iterate over all filters. */ -#define FOR_EACH_FILTER(j) for (j = 1; lls_cmd(j, filter_cmd_suite); j++) +#define FOR_EACH_FILTER(j) for (j = 1; FILTER_CMD(j); j++) /** * Obtain a reference to a filter structure. * * \param filter_num Between zero and NUM_SUPPORTED_FILTERS, inclusively. * - * \return Pointer to the filter identified by the given filter number. + * \return Pointer to the filter identified by the given filter number, or + * NULL if the filter number is out of range. * - * It is a fatal error if the given number is out of range. In this case - * the function aborts. + * \sa filter_name(). */ const struct filter *filter_get(int filter_num) { - assert(filter_num >= 1); - assert(filter_num <= LSG_NUM_FILTER_CMD_SUBCOMMANDS); + if (filter_num < 1 || filter_num > LSG_NUM_FILTER_CMD_SUBCOMMANDS) + return NULL; return lls_user_data(FILTER_CMD(filter_num)); } @@ -45,8 +45,18 @@ static inline bool filter_supported(int filter_num) return lls_user_data(FILTER_CMD(filter_num)); } +/** + * Return the name of a filter, given its number. + * + * \param filter_num See \ref filter_get(). + * + * \return A pointer to a string literal, or NULL if filter_num is out of + * range. The caller must not attempt to call free(3) on the returned pointer. + */ const char *filter_name(int filter_num) { + if (filter_num < 1 || filter_num > LSG_NUM_FILTER_CMD_SUBCOMMANDS) + return NULL; return lls_command_name(FILTER_CMD(filter_num)); } @@ -142,6 +152,26 @@ void print_filter_helps(bool detailed) } } +/** + * Print a short summary of all available filters to stdout. + * + * For each supported filter, the filter name and the purpose text is printed + * in a single line. Since no options are shown, the filter list is more + * concise than the text obtained from print_filter_helps(). + */ +void print_filter_list(void) +{ + int i; + + printf("Available filters:\n"); + FOR_EACH_FILTER(i) { + const struct lls_command *cmd = FILTER_CMD(i); + if (!filter_supported(i)) + continue; + printf("%-9s %s\n", filter_name(i), lls_purpose(cmd)); + } +} + /** * Set select timeout of the scheduler. *