From 8db0dc005c98126fb0e6ede59a695e399ad31e01 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Mon, 16 Dec 2013 17:15:04 -0500 Subject: [PATCH] Add utils_generate_optstring() to libcommon MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/common/utils.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/common/utils.h | 3 +++ 2 files changed, 47 insertions(+) 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 */ -- 2.34.1