From: Jérémie Galarneau Date: Mon, 16 Dec 2013 22:15:04 +0000 (-0500) Subject: Add utils_generate_optstring() to libcommon X-Git-Tag: v2.5.0-rc1~272 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=8db0dc005c98126fb0e6ede59a695e399ad31e01;p=lttng-tools.git Add utils_generate_optstring() to libcommon This function generates the optstring argument exepected by getopt_long from a NULL-terminated struct option array. Signed-off-by: Jérémie Galarneau Signed-off-by: David Goulet --- diff --git a/src/common/utils.c b/src/common/utils.c index ce25f232d..ea1e5db0e 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2012 - David Goulet * Copyright (C) 2013 - Raphaël Beamonte + * Copyright (C) 2013 - Jérémie Galarneau * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License, version 2 only, as @@ -900,3 +901,46 @@ gid_t utils_get_group_id(const char *name) } return grp->gr_gid; } + +/* + * Return a newly allocated option string. This string is to be used as the + * optstring argument of getopt_long(), see GETOPT(3). opt_count is the number + * of elements in the long_options array. Returns NULL if the string's + * allocation fails. + */ +LTTNG_HIDDEN +char *utils_generate_optstring(const struct option *long_options, + size_t opt_count) +{ + int i; + size_t string_len = opt_count, str_pos = 0; + char *optstring; + + /* + * Compute the necessary string length. One letter per option, two when an + * argument is necessary, and a trailing NULL. + */ + for (i = 0; i < opt_count; i++) { + string_len += long_options[i].has_arg ? 1 : 0; + } + + optstring = zmalloc(string_len); + if (!optstring) { + goto end; + } + + for (i = 0; i < opt_count; i++) { + if (!long_options[i].name) { + /* Got to the trailing NULL element */ + break; + } + + optstring[str_pos++] = (char)long_options[i].val; + if (long_options[i].has_arg) { + optstring[str_pos++] = ':'; + } + } + +end: + return optstring; +} diff --git a/src/common/utils.h b/src/common/utils.h index c23dfb932..e92ca7006 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -21,6 +21,7 @@ #include #include #include +#include #define KIBI_LOG2 10 #define MEBI_LOG2 20 @@ -47,5 +48,7 @@ int utils_get_count_order_u32(uint32_t x); char *utils_get_home_dir(void); size_t utils_get_current_time_str(const char *format, char *dst, size_t len); gid_t utils_get_group_id(const char *name); +char *utils_generate_optstring(const struct option *long_options, + size_t opt_count); #endif /* _COMMON_UTILS_H */