From ee7b76eab9715c9db7ae31d727baf2870b714d91 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Mon, 3 Nov 2014 20:14:31 +0000 Subject: [PATCH] Filter out redundant ioctl entries early For two ioctl entries with the same code, if one's name is a prefix to another's name, keep the entry with a shorter name. Filter out redundant ioctl entries at ioctlsort stage so that distributed ioctlent.h.in files will be already filtered. * linux/ioctlsort.c (is_not_prefix): New function. (main): Use it. * linux/ioctlent-filter.awk: Remove. * Makefile.am (EXTRA_DIST): Remove linux/ioctlent-filter.awk. ($(ioctlent_h)): Don't use linux/ioctlent-filter.awk. --- Makefile.am | 4 +--- linux/ioctlent-filter.awk | 19 ------------------- linux/ioctlsort.c | 12 ++++++++++-- 3 files changed, 11 insertions(+), 24 deletions(-) delete mode 100644 linux/ioctlent-filter.awk diff --git a/Makefile.am b/Makefile.am index 703f4da1..fa6e73e6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -127,7 +127,6 @@ EXTRA_DIST = \ linux/ia64/syscallent.h \ linux/inet_diag.h \ linux/inotify.h \ - linux/ioctlent-filter.awk \ linux/ioctlent.h.in \ linux/ioctlent.sh \ linux/ioctlsort.c \ @@ -316,5 +315,4 @@ $(ioctlent_h): $(top_builddir)/config.status $(ioctlent_h_deps) $(MKDIR_P) $(builddir)/$(OS) cat $(ioctlent_h_deps) | \ $(COMPILE) -E -P - | \ - LC_ALL=C sort -u -k3,3 -k2,2 | \ - awk -f $(srcdir)/linux/ioctlent-filter.awk > $@ + LC_ALL=C sort -u -k3,3 -k2,2 > $@ diff --git a/linux/ioctlent-filter.awk b/linux/ioctlent-filter.awk deleted file mode 100644 index 181c4bf7..00000000 --- a/linux/ioctlent-filter.awk +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/awk -f -# Filter out redundant "*32" symbols. - -BEGIN { - s="" - c="" -} - -NF == 3 && $2 ~ /^"[^",]*",$/ { - if ($2 == s && $3 == c) - next - s = $2 - sub(/",$/, "32\",", s) - c = $3 -} - -{ - print -} diff --git a/linux/ioctlsort.c b/linux/ioctlsort.c index dab30f12..393b5349 100644 --- a/linux/ioctlsort.c +++ b/linux/ioctlsort.c @@ -30,6 +30,14 @@ int compare(const void* a, const void* b) { return (code1 > code2) ? 1 : (code1 < code2) ? -1 : strcmp(name1, name2); } +static int is_not_prefix(const char *s1, const char *s2) { + size_t len = strlen(s1); + + if (len > strlen(s2)) + return 1; + return memcmp(s1, s2, len); +} + int main(int argc, char** argv) { int i; @@ -41,8 +49,8 @@ int main(int argc, char** argv) { qsort(ioctls, nioctls, sizeof(ioctls[0]), compare); puts("\t/* Generated by ioctlsort */"); for (i = 0; i < nioctls; i++) - if (i == 0 || ioctls[i].code != ioctls[i-1].code || - strcmp(ioctls[i].name, ioctls[i-1].name)) + if (i == 0 || ioctls[i-1].code != ioctls[i].code || + is_not_prefix(ioctls[i-1].name, ioctls[i].name)) printf("\t{\"%s\",\t\"%s\",\t%#06lx},\n", ioctls[i].header, ioctls[i].name, ioctls[i].code); -- 2.40.0