Following up on this thread: http://thread.gmane.org/gmane.comp.emulators.libvirt/6338/focus=6349 This change removes all uses of ctype macros and ensures that no new ones will be added. The other changes I mentioned will come later. >From 3966a3ebaaacc14b4f330677fd2ed8f8546c6f4a Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyering@xxxxxxxxxx> Date: Fri, 9 May 2008 12:55:29 +0200 Subject: [PATCH] Use gnulib's c-ctype.h, not <ctype.h>. re=$(man isspace|grep is.....,.is|sed 's/ -.*//' \ |tr -s ', \n' \||sed 's/^|//;s/|$//') git grep -l -E "$re"|grep -Ev 'Chan|gnulib' \ |xargs perl -pi -e 's/\b('"$re"')\b/c_$1/g' git grep -l to_uchar|xargs perl -pi -e 's/to_uchar\((.*?)\)/$1/g' * src/util.h (to_uchar): Remove definition. (TOLOWER): Remove definition. (__virMacAddrCompare): Use c_tolower, not TOLOWER. Globally: Where needed, change <ctype.h> to <c-ctype.h>. Remove unnecessary inclusion of <ctype.h>. Ensure the global changes are never needed again: * Makefile.maint (sc_avoid_ctype_macros): Prohibit use of ctype macros. Recommend c-ctype.h instead. (sc_prohibit_c_ctype_without_use): New rule. (sc_prohibit_ctype_h): New rule. Disallow use of <ctype.h>. --- Makefile.maint | 16 +++++++++++++--- qemud/remote.c | 1 - src/buf.c | 3 +-- src/nodeinfo.c | 12 ++++++------ src/openvz_driver.c | 1 - src/qemu_driver.c | 4 ++-- src/sexpr.c | 4 ++-- src/stats_linux.c | 8 ++++---- src/util.c | 15 ++++++--------- src/util.h | 5 ----- src/virsh.c | 8 ++++---- src/xend_internal.c | 1 - 12 files changed, 38 insertions(+), 40 deletions(-) diff --git a/Makefile.maint b/Makefile.maint index bab8e1d..0f79ed7 100644 --- a/Makefile.maint +++ b/Makefile.maint @@ -157,6 +157,16 @@ sc_prohibit_quotearg_without_use: sc_prohibit_quote_without_use: @h='"quote.h"' re='\<quote(_n)? *\(' $(_header_without_use) +# Prohibit the inclusion of c-ctype.h without an actual use. +sc_prohibit_c_ctype_without_use: + @h='[<"]c-ctype.h[">]' re='\<c_($(ctype_re)) *\(' $(_header_without_use) + +# Prohibit the inclusion of <ctype.h>. +sc_prohibit_ctype_h: + @grep -E '^# *include *<ctype\.h>' $$($(VC_LIST_EXCEPT)) && \ + { echo "$(ME): don't use ctype.h; instead, use c-ctype.h" \ + 1>&2; exit 1; } || : + sc_obsolete_symbols: @grep -nE '\<(HAVE''_FCNTL_H|O''_NDELAY)\>' \ $$($(VC_LIST_EXCEPT)) && \ @@ -305,10 +315,10 @@ sc_TAB_in_indentation: ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\ |isprint|ispunct|isspace|isupper|isxdigit|tolower|toupper -sc_risky_ctype_macros: +sc_avoid_ctype_macros: @grep -E '\b($(ctype_re)) *\(' /dev/null \ - $$($(VC_LIST_EXCEPT)) | grep -v to_uchar && \ - { echo '$(ME): found ctype macro use without to_uchar' \ + $$($(VC_LIST_EXCEPT)) && \ + { echo "$(ME): don't use ctype macros (use c-ctype.h)" \ 1>&2; exit 1; } || : # Match lines like the following, but where there is only one space diff --git a/qemud/remote.c b/qemud/remote.c index e249529..22dd86e 100644 --- a/qemud/remote.c +++ b/qemud/remote.c @@ -41,7 +41,6 @@ #include <syslog.h> #include <string.h> #include <errno.h> -#include <ctype.h> #include <fnmatch.h> #ifdef HAVE_POLKIT diff --git a/src/buf.c b/src/buf.c index 2e17fbb..b56a9c1 100644 --- a/src/buf.c +++ b/src/buf.c @@ -1,7 +1,7 @@ /* * buf.c: buffers for libvirt * - * Copyright (C) 2005-2007 Red Hat, Inc. + * Copyright (C) 2005-2008 Red Hat, Inc. * * See COPYING.LIB for the License of this software * @@ -16,7 +16,6 @@ #include <stdlib.h> #include <string.h> #include <stdarg.h> -#include <ctype.h> #define __VIR_BUFFER_C__ diff --git a/src/nodeinfo.c b/src/nodeinfo.c index c1e8013..e227c69 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -27,7 +27,7 @@ #include <string.h> #include <stdlib.h> #include <errno.h> -#include <ctype.h> +#include <c-ctype.h> #ifdef HAVE_SYS_UTSNAME_H #include <sys/utsname.h> @@ -59,7 +59,7 @@ int linuxNodeInfoCPUPopulate(virConnectPtr conn, FILE *cpuinfo, virNodeInfoPtr n char *buf = line; if (STREQLEN(buf, "processor", 9)) { /* aka a single logical CPU */ buf += 9; - while (*buf && isspace(to_uchar(*buf))) + while (*buf && c_isspace(*buf)) buf++; if (*buf != ':') { __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR, @@ -72,7 +72,7 @@ int linuxNodeInfoCPUPopulate(virConnectPtr conn, FILE *cpuinfo, virNodeInfoPtr n char *p; unsigned int ui; buf += 9; - while (*buf && isspace(to_uchar(*buf))) + while (*buf && c_isspace(*buf)) buf++; if (*buf != ':' || !buf[1]) { __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR, @@ -82,13 +82,13 @@ int linuxNodeInfoCPUPopulate(virConnectPtr conn, FILE *cpuinfo, virNodeInfoPtr n } if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 /* Accept trailing fractional part. */ - && (*p == '\0' || *p == '.' || isspace(to_uchar(*p)))) + && (*p == '\0' || *p == '.' || c_isspace(*p))) nodeinfo->mhz = ui; } else if (STREQLEN(buf, "cpu cores", 9)) { /* aka cores */ char *p; unsigned int id; buf += 9; - while (*buf && isspace(to_uchar(*buf))) + while (*buf && c_isspace(*buf)) buf++; if (*buf != ':' || !buf[1]) { __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR, @@ -97,7 +97,7 @@ int linuxNodeInfoCPUPopulate(virConnectPtr conn, FILE *cpuinfo, virNodeInfoPtr n return -1; } if (virStrToLong_ui(buf+1, &p, 10, &id) == 0 - && (*p == '\0' || isspace(to_uchar(*p))) + && (*p == '\0' || c_isspace(*p)) && id > nodeinfo->cores) nodeinfo->cores = id; } diff --git a/src/openvz_driver.c b/src/openvz_driver.c index 0bae4fd..22c898a 100644 --- a/src/openvz_driver.c +++ b/src/openvz_driver.c @@ -45,7 +45,6 @@ #include <fcntl.h> #include <signal.h> #include <paths.h> -#include <ctype.h> #include <pwd.h> #include <stdio.h> #include <sys/wait.h> diff --git a/src/qemu_driver.c b/src/qemu_driver.c index cf52a07..10868c1 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -41,7 +41,7 @@ #include <fcntl.h> #include <signal.h> #include <paths.h> -#include <ctype.h> +#include <c-ctype.h> #include <pwd.h> #include <stdio.h> #include <sys/wait.h> @@ -519,7 +519,7 @@ static int qemudExtractMonitorPath(const char *haystack, */ tmp = path; while (*tmp) { - if (isspace(to_uchar(*tmp))) { + if (c_isspace(*tmp)) { *tmp = '\0'; *offset += (sizeof(needle)-1) + strlen(path); return 0; diff --git a/src/sexpr.c b/src/sexpr.c index 4cb4edf..85b289c 100644 --- a/src/sexpr.c +++ b/src/sexpr.c @@ -15,7 +15,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <ctype.h> +#include <c-ctype.h> #include <errno.h> #include "internal.h" @@ -358,7 +358,7 @@ _string2sexpr(const char *buffer, size_t * end) } else { start = ptr; - while (*ptr && !isspace(to_uchar(*ptr)) + while (*ptr && !c_isspace(*ptr) && *ptr != ')' && *ptr != '(') { ptr++; } diff --git a/src/stats_linux.c b/src/stats_linux.c index e84e24f..cb647fe 100644 --- a/src/stats_linux.c +++ b/src/stats_linux.c @@ -18,7 +18,7 @@ #include <fcntl.h> #include <string.h> #include <unistd.h> -#include <ctype.h> +#include <c-ctype.h> #ifdef WITH_XEN #include <xs.h> @@ -262,7 +262,7 @@ xenLinuxDomainDeviceID(virConnectPtr conn, int domid, const char *path) } if (path[4] != '\0') { - if (!isdigit(to_uchar(path[4])) || path[4] == '0' || + if (!c_isdigit(path[4]) || path[4] == '0' || virStrToLong_i(path+4, NULL, 10, &part) < 0 || part < 1 || part > 15) { statsErrorFunc (conn, VIR_ERR_INVALID_ARG, __FUNCTION__, @@ -306,7 +306,7 @@ xenLinuxDomainDeviceID(virConnectPtr conn, int domid, const char *path) } else { p = path + 3; } - if (p && (!isdigit(to_uchar(*p)) || *p == '0' || + if (p && (!c_isdigit(*p) || *p == '0' || virStrToLong_i(p, NULL, 10, &part) < 0 || part < 1 || part > 15)) { statsErrorFunc (conn, VIR_ERR_INVALID_ARG, __FUNCTION__, @@ -332,7 +332,7 @@ xenLinuxDomainDeviceID(virConnectPtr conn, int domid, const char *path) } if (path[3] != '\0') { - if (!isdigit(to_uchar(path[3])) || path[3] == '0' || + if (!c_isdigit(path[3]) || path[3] == '0' || virStrToLong_i(path+3, NULL, 10, &part) < 0 || part < 1 || part > 63) { statsErrorFunc (conn, VIR_ERR_INVALID_ARG, __FUNCTION__, diff --git a/src/util.c b/src/util.c index 4cef6d2..f354a48 100644 --- a/src/util.c +++ b/src/util.c @@ -37,7 +37,7 @@ #include <sys/wait.h> #endif #include <string.h> -#include <ctype.h> +#include <c-ctype.h> #ifdef HAVE_PATHS_H #include <paths.h> @@ -57,9 +57,6 @@ #define MAX_ERROR_LEN 1024 -#define TOLOWER(Ch) (isupper (to_uchar(Ch)) \ - ? tolower (to_uchar (Ch)) : (to_uchar (Ch))) - #define virLog(msg...) fprintf(stderr, msg) #ifndef PROXY @@ -705,12 +702,12 @@ __virMacAddrCompare (const char *p, const char *q) { unsigned char c, d; do { - while (*p == '0' && isxdigit (to_uchar(p[1]))) + while (*p == '0' && c_isxdigit (p[1])) ++p; - while (*q == '0' && isxdigit (to_uchar(q[1]))) + while (*q == '0' && c_isxdigit (q[1])) ++q; - c = TOLOWER (*p); - d = TOLOWER (*q); + c = c_tolower (*p); + d = c_tolower (*q); if (c == 0 || d == 0) break; @@ -750,7 +747,7 @@ virParseMacAddr(const char* str, unsigned char *addr) /* This is solely to avoid accepting the leading * space or "+" that strtoul would otherwise accept. */ - if (!isxdigit(to_uchar(*str))) + if (!c_isxdigit(*str)) break; result = strtoul(str, &end_ptr, 16); diff --git a/src/util.h b/src/util.h index af68bc8..2516504 100644 --- a/src/util.h +++ b/src/util.h @@ -27,11 +27,6 @@ #include "internal.h" #include "util-lib.h" -/* Convert a possibly-signed character to an unsigned character. This is - a bit safer than casting to unsigned char, since it catches some type - errors that the cast doesn't. */ -static inline unsigned char to_uchar (char ch) { return ch; } - int virExec(virConnectPtr conn, char **argv, int *retpid, int infd, int *outfd, int *errfd); int virExecNonBlock(virConnectPtr conn, char **argv, int *retpid, diff --git a/src/virsh.c b/src/virsh.c index 00dbda8..5a35f36 100644 --- a/src/virsh.c +++ b/src/virsh.c @@ -26,7 +26,7 @@ #include <getopt.h> #include <sys/types.h> #include <sys/time.h> -#include <ctype.h> +#include <c-ctype.h> #include <fcntl.h> #include <locale.h> #include <time.h> @@ -1763,7 +1763,7 @@ cmdVcpupin(vshControl * ctl, vshCmd * cmd) for (i = 0; cpulist[i]; i++) { switch (state) { case expect_num: - if (!isdigit (to_uchar(cpulist[i]))) { + if (!c_isdigit (cpulist[i])) { vshError( ctl, FALSE, _("cpulist: %s: Invalid format. Expecting digit at position %d (near '%c')."), cpulist, i, cpulist[i]); virDomainFree (dom); return FALSE; @@ -1773,7 +1773,7 @@ cmdVcpupin(vshControl * ctl, vshCmd * cmd) case expect_num_or_comma: if (cpulist[i] == ',') state = expect_num; - else if (!isdigit (to_uchar(cpulist[i]))) { + else if (!c_isdigit (cpulist[i])) { vshError(ctl, FALSE, _("cpulist: %s: Invalid format. Expecting digit or comma at position %d (near '%c')."), cpulist, i, cpulist[i]); virDomainFree (dom); return FALSE; @@ -5673,7 +5673,7 @@ vshCommandGetToken(vshControl * ctl, char *str, char **end, char **res) if (tk == VSH_TK_NONE) { if (*p == '-' && *(p + 1) == '-' && *(p + 2) - && isalnum(to_uchar(*(p + 2)))) { + && c_isalnum(*(p + 2))) { tk = VSH_TK_OPTION; p += 2; } else { diff --git a/src/xend_internal.c b/src/xend_internal.c index 0c9f5bc..e964159 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -30,7 +30,6 @@ #include <arpa/inet.h> #include <netdb.h> #include <libxml/uri.h> -#include <ctype.h> #include <errno.h> #include "libvirt/libvirt.h" -- 1.5.5.1.148.gbc1be -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list