Browse Source

Pass 'unsigned char' type to isdigit()/isspace()/isprint() functions

The isdigit(), isprint(), etc. functions take an int, whose value is
required to be in the range of an _unsigned_ char, or EOF.  This, horribly,
means that systems which have a signed char by default need casts to pass
a char variable safely to these functions.

We can't do this more nicely by making the variables themselves 'unsigned
char *' because then we'll get warnings passing them to the strchr() etc.
functions.

At least the cygwin version of these functions, are designed to generate
warnings if this isn't done, as explained by this comment from ctype.h:
   These macros are intentionally written in a manner that will trigger
   a gcc -Wall warning if the user mistakenly passes a 'char' instead
   of an int containing an 'unsigned char'.

Signed-off-by: Serge Lamikhov-Center <Serge.Lamikhov@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Serge Lamikhov-Center 11 years ago committed by David Gibson
parent
commit
17119ab0a5
  1. 4
      dtc-lexer.l
  2. 4
      treesource.c
  3. 2
      util.c

4
dtc-lexer.l

@ -75,11 +75,11 @@ static bool pop_input_file(void); @@ -75,11 +75,11 @@ static bool pop_input_file(void);
char *line, *tmp, *fn;
/* skip text before line # */
line = yytext;
while (!isdigit(*line))
while (!isdigit((unsigned char)*line))
line++;
/* skip digits in line # */
tmp = line;
while (!isspace(*tmp))
while (!isspace((unsigned char)*tmp))
tmp++;
/* "NULL"-terminate line # */
*tmp = '\0';

4
treesource.c

@ -56,7 +56,7 @@ static void write_prefix(FILE *f, int level) @@ -56,7 +56,7 @@ static void write_prefix(FILE *f, int level)

static bool isstring(char c)
{
return (isprint(c)
return (isprint((unsigned char)c)
|| (c == '\0')
|| strchr("\a\b\t\n\v\f\r", c));
}
@ -119,7 +119,7 @@ static void write_propval_string(FILE *f, struct data val) @@ -119,7 +119,7 @@ static void write_propval_string(FILE *f, struct data val)
fprintf(f, "\"");
break;
default:
if (isprint(c))
if (isprint((unsigned char)c))
fprintf(f, "%c", c);
else
fprintf(f, "\\x%02hhx", c);

2
util.c

@ -87,7 +87,7 @@ bool util_is_printable_string(const void *data, int len) @@ -87,7 +87,7 @@ bool util_is_printable_string(const void *data, int len)

while (s < se) {
ss = s;
while (s < se && *s && isprint(*s))
while (s < se && *s && isprint((unsigned char)*s))
s++;

/* not zero, or not done yet */

Loading…
Cancel
Save