All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Egger <Christoph.Egger@amd.com>
To: qemu-devel@nongnu.org
Cc: Blue Swirl <blauwirbel@gmail.com>
Subject: [Qemu-devel] Re: [PATCH] fix warnings on NetBSD
Date: Mon, 10 Nov 2008 18:35:34 +0200	[thread overview]
Message-ID: <200811101735.34880.Christoph.Egger@amd.com> (raw)
In-Reply-To: <f43fc5580811100803qf21b3fbmd0d34fc29cbe421f@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1117 bytes --]

On Monday 10 November 2008 17:03:27 Blue Swirl wrote:
> On 11/10/08, Christoph Egger <Christoph.Egger@amd.com> wrote:
> >  Hi!
> >
> >  Attached patch fixes a series of this warning
> >  when compiling on NetBSD:
> >
> >  warning: array subscript has type 'char'
>
> There has been some discussion on ctype.h macro problems, please see:
> http://lists.gnu.org/archive/html/qemu-devel/2008-08/msg01239.html
>
> I'd vote for introducing qemu_isfoobar and qemu_towombat instead of casts.

Attached patch introduces a CTYPE macro as mentioned on this mail.
The diff in qemu-common.h has been taken from xen ioemu.

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>


-- 
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy

[-- Attachment #2: qemu.diff --]
[-- Type: text/x-diff, Size: 8858 bytes --]

Index: readline.c
===================================================================
--- readline.c	(revision 5666)
+++ readline.c	(working copy)
@@ -169,7 +169,7 @@
 
     /* find first word (backwards) */
     while (start > 0) {
-        if (!isspace(term_cmd_buf[start])) {
+        if (!CTYPE(isspace, term_cmd_buf[start])) {
             break;
         }
 
@@ -178,7 +178,7 @@
 
     /* find first space (backwards) */
     while (start > 0) {
-        if (isspace(term_cmd_buf[start])) {
+        if (CTYPE(isspace, term_cmd_buf[start])) {
             ++start;
             break;
         }
Index: block-vvfat.c
===================================================================
--- block-vvfat.c	(revision 5666)
+++ block-vvfat.c	(working copy)
@@ -1056,7 +1056,7 @@
 
     i = strrchr(dirname, ':') - dirname;
     assert(i >= 3);
-    if (dirname[i-2] == ':' && isalpha(dirname[i-1]))
+    if (dirname[i-2] == ':' && CTYPE(isalpha, dirname[i-1]))
 	/* workaround for DOS drive names */
 	dirname += i-1;
     else
Index: target-ppc/translate_init.c
===================================================================
--- target-ppc/translate_init.c	(revision 5666)
+++ target-ppc/translate_init.c	(working copy)
@@ -9458,7 +9458,7 @@
         p = name;
     check_pvr:
         for (i = 0; i < 8; i++) {
-            if (!isxdigit(*p++))
+            if (!CTYPE(isxdigit, *p++))
                 break;
         }
         if (i == 8)
Index: net.c
===================================================================
--- net.c	(revision 5666)
+++ net.c	(working copy)
@@ -279,7 +279,7 @@
     if (buf[0] == '\0') {
         saddr->sin_addr.s_addr = 0;
     } else {
-        if (isdigit(buf[0])) {
+        if (CTYPE(isdigit, buf[0])) {
             if (!inet_aton(buf, &saddr->sin_addr))
                 return -1;
         } else {
Index: cutils.c
===================================================================
--- cutils.c	(revision 5666)
+++ cutils.c	(working copy)
@@ -72,7 +72,7 @@
     p = str;
     q = val;
     while (*q != '\0') {
-        if (toupper(*p) != toupper(*q))
+        if (CTYPE(toupper, *p) != CTYPE(toupper, *q))
             return 0;
         p++;
         q++;
Index: audio/audio.c
===================================================================
--- audio/audio.c	(revision 5666)
+++ audio/audio.c	(working copy)
@@ -215,7 +215,7 @@
         pstrcat (r, len + sizeof (qemu_prefix), s);
 
         for (i = 0; i < len; ++i) {
-            u[i] = toupper (u[i]);
+            u[i] = CTYPE(toupper, u[i]);
         }
     }
     return r;
@@ -470,7 +470,7 @@
 
         /* copy while upper-casing, including trailing zero */
         for (i = 0; i <= preflen; ++i) {
-            optname[i + sizeof (qemu_prefix) - 1] = toupper (prefix[i]);
+            optname[i + sizeof (qemu_prefix) - 1] = CTYPE(toupper, prefix[i]);
         }
         pstrcat (optname, optlen, "_");
         pstrcat (optname, optlen, opt->name);
Index: qemu-common.h
===================================================================
--- qemu-common.h	(revision 5666)
+++ qemu-common.h	(working copy)
@@ -93,6 +93,17 @@
 int stristart(const char *str, const char *val, const char **ptr);
 time_t mktimegm(struct tm *tm);
 
+#define CTYPE(isfoobar,argumentchar) (isfoobar((unsigned char)(argumentchar)))
+  /* One must not pass a plain `char' to isupper, toupper, et al.  If
+   * it has the top bit set (ie, is negative if your chars are
+   * signed), undefined behaviour results.  The <ctype.h> functions
+   * are defined to take the value of an unsigned char, as an int.
+   * So use this macro.  You may pass toupper et al for isfoobar.
+   * Do not pass EOF as a character to this macro.  If you might have
+   * EOF then you ought to have it in an int representing an unsigned
+   * char, which is safe for the ctype macros directly.  Or test separately.
+   * Obviously don't use this for floating point things like isnan! */
+
 void *qemu_malloc(size_t size);
 void *qemu_realloc(void *ptr, size_t size);
 void *qemu_mallocz(size_t size);
Index: monitor.c
===================================================================
--- monitor.c	(revision 5666)
+++ monitor.c	(working copy)
@@ -1933,7 +1933,7 @@
 {
     if (pch != '\0') {
         pch++;
-        while (isspace(*pch))
+        while (CTYPE(isspace, *pch))
             pch++;
     }
 }
@@ -1992,7 +1992,7 @@
                     *q++ = *pch;
                 pch++;
             }
-            while (isspace(*pch))
+            while (CTYPE(isspace, *pch))
                 pch++;
             *q = 0;
             ret = get_monitor_def(&reg, buf);
@@ -2017,7 +2017,7 @@
             expr_error("invalid char in expression");
         }
         pch = p;
-        while (isspace(*pch))
+        while (CTYPE(isspace, *pch))
             pch++;
         break;
     }
@@ -2111,7 +2111,7 @@
         *pp = pch;
         return -1;
     }
-    while (isspace(*pch))
+    while (CTYPE(isspace, *pch))
         pch++;
     *pval = expr_sum();
     *pp = pch;
@@ -2126,7 +2126,7 @@
 
     q = buf;
     p = *pp;
-    while (isspace(*p))
+    while (CTYPE(isspace, *p))
         p++;
     if (*p == '\0') {
     fail:
@@ -2171,7 +2171,7 @@
         }
         p++;
     } else {
-        while (*p != '\0' && !isspace(*p)) {
+        while (*p != '\0' && !CTYPE(isspace, *p)) {
             if ((q - buf) < buf_size - 1) {
                 *q++ = *p;
             }
@@ -2217,12 +2217,12 @@
     /* extract the command name */
     p = cmdline;
     q = cmdname;
-    while (isspace(*p))
+    while (CTYPE(isspace, *p))
         p++;
     if (*p == '\0')
         return;
     pstart = p;
-    while (*p != '\0' && *p != '/' && !isspace(*p))
+    while (*p != '\0' && *p != '/' && !CTYPE(isspace, *p))
         p++;
     len = p - pstart;
     if (len > sizeof(cmdname) - 1)
@@ -2258,7 +2258,7 @@
                 int ret;
                 char *str;
 
-                while (isspace(*p))
+                while (CTYPE(isspace, *p))
                     p++;
                 if (*typestr == '?') {
                     typestr++;
@@ -2299,15 +2299,15 @@
             {
                 int count, format, size;
 
-                while (isspace(*p))
+                while (CTYPE(isspace, *p))
                     p++;
                 if (*p == '/') {
                     /* format found */
                     p++;
                     count = 1;
-                    if (isdigit(*p)) {
+                    if (CTYPE(isdigit, *p)) {
                         count = 0;
-                        while (isdigit(*p)) {
+                        while (CTYPE(isdigit, *p)) {
                             count = count * 10 + (*p - '0');
                             p++;
                         }
@@ -2346,7 +2346,7 @@
                         }
                     }
                 next:
-                    if (*p != '\0' && !isspace(*p)) {
+                    if (*p != '\0' && !CTYPE(isspace, *p)) {
                         term_printf("invalid char in format: '%c'\n", *p);
                         goto fail;
                     }
@@ -2380,7 +2380,7 @@
             {
                 int64_t val;
 
-                while (isspace(*p))
+                while (CTYPE(isspace, *p))
                     p++;
                 if (*typestr == '?' || *typestr == '.') {
                     if (*typestr == '?') {
@@ -2391,7 +2391,7 @@
                     } else {
                         if (*p == '.') {
                             p++;
-                            while (isspace(*p))
+                            while (CTYPE(isspace, *p))
                                 p++;
                             has_arg = 1;
                         } else {
@@ -2436,7 +2436,7 @@
                 c = *typestr++;
                 if (c == '\0')
                     goto bad_type;
-                while (isspace(*p))
+                while (CTYPE(isspace, *p))
                     p++;
                 has_option = 0;
                 if (*p == '-') {
@@ -2461,7 +2461,7 @@
         }
     }
     /* check that all arguments were parsed */
-    while (isspace(*p))
+    while (CTYPE(isspace, *p))
         p++;
     if (*p != '\0') {
         term_printf("%s: extraneous characters at the end of line\n",
@@ -2609,7 +2609,7 @@
     p = cmdline;
     nb_args = 0;
     for(;;) {
-        while (isspace(*p))
+        while (CTYPE(isspace, *p))
             p++;
         if (*p == '\0')
             break;
@@ -2643,7 +2643,7 @@
     /* if the line ends with a space, it means we want to complete the
        next arg */
     len = strlen(cmdline);
-    if (len > 0 && isspace(cmdline[len - 1])) {
+    if (len > 0 && CTYPE(isspace, cmdline[len - 1])) {
         if (nb_args >= MAX_ARGS)
             return;
         args[nb_args++] = qemu_strdup("");

  reply	other threads:[~2008-11-10 16:36 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-10  9:55 [Qemu-devel] [PATCH] fix warnings on NetBSD Christoph Egger
2008-11-10 16:03 ` [Qemu-devel] " Blue Swirl
2008-11-10 16:35   ` Christoph Egger [this message]
2008-11-10 16:56     ` Blue Swirl
2008-11-11  9:46       ` Christoph Egger
2008-11-11 17:45         ` Blue Swirl
2008-11-11 17:53           ` Anthony Liguori
2008-11-16 14:04         ` Blue Swirl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200811101735.34880.Christoph.Egger@amd.com \
    --to=christoph.egger@amd.com \
    --cc=blauwirbel@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.