From 978998a1fe0a78829452f5432efe1b74c5049de4 Mon Sep 17 00:00:00 2001 From: Vincent Lefevre Date: Mon, 27 Oct 2014 10:50:30 +0100 Subject: xkbcomp: Improved -w option parsing This patch improves -w option parsing even further, for cases like "xkbcomp -w6 4.xkb out.xkb" (which were not handled by the fix of the warning level is still optional (set to 0 if not present), and errors like "xkbcomp -wfoo in out" are detected and reported. https://bugs.freedesktop.org/show_bug.cgi?id=66344 Signed-off-by: Vincent Lefevre Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- xkbcomp.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/xkbcomp.c b/xkbcomp.c index 956e79c..adfa89a 100644 --- a/xkbcomp.c +++ b/xkbcomp.c @@ -576,17 +576,37 @@ parseArgs(int argc, char *argv[]) } else if (strncmp(argv[i], "-w", 2) == 0) { - if ((i >= (argc - 1)) || (!isdigit(argv[i + 1][0]))) + unsigned long utmp; + char *tmp2; + /* If text is just after "-w" in the same word, then it must + * be a number and it is the warning level. Otherwise, if the + * next argument is a number, then it is the warning level, + * else the warning level is assumed to be 0. + */ + if (argv[i][2] == '\0') { warningLevel = 0; - if (isdigit(argv[i][2])) - if (sscanf(&argv[i][2], "%i", &itmp) == 1) - warningLevel = itmp; + if (i < argc - 1) + { + utmp = strtoul(argv[i+1], &tmp2, 10); + if (argv[i+1][0] != '\0' && *tmp2 == '\0') + { + warningLevel = utmp > 10 ? 10 : utmp; + i++; + } + } } else { - if (sscanf(argv[++i], "%i", &itmp) == 1) - warningLevel = itmp; + utmp = strtoul(&argv[i][2], &tmp2, 10); + if (*tmp2 == '\0') + warningLevel = utmp > 10 ? 10 : utmp; + else + { + ERROR1("Unknown flag \"%s\" on command line\n", argv[i]); + Usage(argc, argv); + return False; + } } } else if ((strcmp(argv[i], "-xkb") == 0) && (!xkblist)) -- cgit v1.2.3