Fix calls to ctype functions.
authorBen Pfaff <blp@nicira.com>
Fri, 15 Apr 2011 16:31:36 +0000 (09:31 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 18 Apr 2011 17:26:17 +0000 (10:26 -0700)
The ctype functions often need casts to be fully C standards compliant.
Here's the full explanation that I used to post to comp.lang.c from time
to time when the issue came up:

    With the to*() and is*() functions, you should be careful to cast
    `char' arguments to `unsigned char' before calling them.  Type `char'
    may be signed or unsigned, depending on your compiler or its
    configuration.  If `char' is signed, then some characters have
    negative values; however, the arguments to is*() and to*() functions
    must be nonnegative (or EOF).  Casting to `unsigned char' fixes this
    problem by forcing the character to the corresponding positive value.

This fixes the following warnings from some version of GCC:

lib/ofp-parse.c:828: warning: array subscript has type 'char'
lib/ofp-print.c:617: warning: array subscript has type 'char'

Reported-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
AUTHORS
lib/ofp-parse.c
lib/ofp-print.c

diff --git a/AUTHORS b/AUTHORS
index bc0f3f6a074f83536f0be01f87cedfa416aaffe6..180428af8e40a3ee37bb244e31887571635c9169 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -80,6 +80,7 @@ Stephen Hemminger       shemminger@vyatta.com
 Takayuki HAMA           t-hama@cb.jp.nec.com
 Teemu Koponen           koponen@nicira.com
 Vishal Swarankar        vishal.swarnkar@gmail.com
+YAMAMOTO Takashi        yamamoto@valinux.co.jp
 Yongqiang Liu           liuyq7809@gmail.com
 kk yap                  yapkke@stanford.edu
 
index 4c4811b657874e0be942bdc4bb15c5549140558a..7e9a965313dbad5826de780b941826dcef92a01e 100644 (file)
@@ -825,7 +825,8 @@ parse_ofp_str(struct flow_mod *fm, uint8_t *table_idx,
                 } else {
                     parse_field_value(&fm->cr, f->index, value);
                 }
-            } else if (!strncmp(name, "reg", 3) && isdigit(name[3])) {
+            } else if (!strncmp(name, "reg", 3)
+                       && isdigit((unsigned char) name[3])) {
                 unsigned int reg_idx = atoi(name + 3);
                 if (reg_idx >= FLOW_N_REGS) {
                     ovs_fatal(0, "only %d registers supported", FLOW_N_REGS);
index f5eb9ad06f6f6b62b463d9a3f2098e48fe7096ed..6560f32a9bcf10a0ac89f220a21a0cf1c5b9722b 100644 (file)
@@ -614,7 +614,7 @@ ofp_print_phy_port(struct ds *string, const struct ofp_phy_port *port)
 
     memcpy(name, port->name, sizeof name);
     for (j = 0; j < sizeof name - 1; j++) {
-        if (!isprint(name[j])) {
+        if (!isprint((unsigned char) name[j])) {
             break;
         }
     }