Recent changes (master)
The following changes since commit 250e878ab5f26b32facbb6e134f3738aa1aa0120:
include sys/sysmacros.h for major/minor (2016-04-21 07:47:26 -0400)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to 603e604eb6d9b3ba9f201a6bff0a18da1a6c0967:
oslib/getopt_long: allow (unique) short match (2016-04-22 18:14:24 -0400)
----------------------------------------------------------------
Jens Axboe (1):
oslib/getopt_long: allow (unique) short match
oslib/getopt_long.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-)
---
Diff of recent changes:
oslib/getopt_long.c +31 -5
@@ -26,14 +26,14 @@ static struct getopt_private_state { } pvt;static inline const char *option_matches (const char *arg_str, -const char *opt_name) +const char *opt_name,int smatch) {while (*arg_str !='\0' && *arg_str !='=' ) {if (*arg_str++ != *opt_name++)return NULL ; } -if (*opt_name) +if (*opt_name && !smatch)return NULL ;return arg_str;
@@ -84,11 +84,37 @@ int getopt_long_only(int argc, char *const *argv, const char *optstring, }for (lo = longopts; lo->name; lo++) { -if ((opt_end =option_matches (carg+2 , lo->name))) + opt_end =option_matches (carg+2 , lo->name,0 ); +if (opt_end)break ; } -if (!opt_end) -return '?' ; +/* +* The GNU getopt_long_only() apparently allows a short match, +* if it's unique and if we don't have a full match. Let's +* do the same here, search and see if there is one (and only +* one) short match. +*/ +if (!opt_end) { +const struct option *lo_match =NULL ; + +for (lo = longopts; lo->name; lo++) { +const char *ret; + + ret =option_matches (carg+2 , lo->name,1 ); +if (!ret) +continue ; +if (!opt_end) { + opt_end = ret; + lo_match = lo; + }else { + opt_end =NULL ; +break ; + } + } +if (!opt_end) +return '?' ; + lo = lo_match; + }if (longindex) *longindex = lo-longopts;