Add utils_generate_optstring() to libcommon
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 16 Dec 2013 22:15:04 +0000 (17:15 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Tue, 17 Dec 2013 19:24:24 +0000 (14:24 -0500)
This function generates the optstring argument exepected by getopt_long
from a NULL-terminated struct option array.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/common/utils.c
src/common/utils.h

index ce25f232d5209b7c08b644ce21a7fa526d70a244..ea1e5db0ee31dd192d7661dd2537f9a9c5c30298 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2012 - David Goulet <dgoulet@efficios.com>
  * Copyright (C) 2013 - Raphaël Beamonte <raphael.beamonte@gmail.com>
+ * Copyright (C) 2013 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
  *
  * 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;
+}
index c23dfb932e147fe3de5ea68b6509cb082d3a792d..e92ca7006542e2e8cd5276e27eac197f29e7c681 100644 (file)
@@ -21,6 +21,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include <stdint.h>
+#include <getopt.h>
 
 #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 */
This page took 0.028045 seconds and 5 git commands to generate.