Subject: isspace and compiler warnings
To: None <tech-userlevel@netbsd.org>
From: Greg Troxel <gdt@ir.bbn.com>
List: tech-userlevel
Date: 10/18/2006 08:42:57
--=-=-=
In ufraw (pkgsrc/graphics/gimp-ufraw), I see warnings:
ufraw_routines.c:262: warning: array subscript has type 'char'
ufraw_routines.c:263: warning: array subscript has type 'char'
These are from the following code, which passes a 'const gchar' to
isspace:
void conf_parse_text(GMarkupParseContext *context, const gchar *text, gsize len,
gpointer user, GError **error)
{
conf_data *c = user;
const gchar *element = g_markup_parse_context_get_element(context);
char temp[max_path];
int i;
error = error;
for(; len>0 && isspace(*text); len--, text++);
for(; len>0 && isspace(text[len-1]); len--);
man isspace says that it is a function taking an int.
But, our implementation is a macro, so promotion doesn't happen and
the warning occurs due to the expansion.
Inside __BEGIN_DECLS, we have
int isspace(int);
and then
#define isspace(c) ((int)((_ctype_ + 1)[(c)] & _S))
So, is the ufraw code above wrong? If so, should I cast to int? Do
I need to verify that the gchar is positive? Or is casting to int a
do-no-harm since promotion would happen were this a real function?
Or is our macro implementation wrong because it doesn't have the same
semantics (including warnings) as the C99/POSIX-specified function?
I see at http://www.opengroup.org/onlinepubs/009695399/ that macros
are explicitly allowed.
--=-=-=
Content-Type: application/pgp-signature
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (NetBSD)
iD8DBQFFNiFR+vesoDJhHiURAuP9AJ9wBc5R7HJBtoEUAu7VfI22SRTTmQCdE0FX
yJLgvpX1JAmx5AUfM0U3B+E=
=TBVJ
-----END PGP SIGNATURE-----
--=-=-=--