Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Casting ctype lookups

On Wed, 14 Nov 2012 15:05:01 +0200
Alan Barrett <> wrote:
> On Wed, 14 Nov 2012, D'Arcy J.M. Cain wrote:
> >Would this be safer?
> >
> >#define toupper(c)\
> >  ((int)((_toupper_tab_ + 1)[(int)(unsigned char)(c)]))
> No.  That would break when the caller passes the int value EOF.

Right.  Forgot about that.

> I believe that there's nothing wrong with NetBSD's definitions of 
> these functions and macros.  If the caller gets a warning about 
> them, then there's a problem in the caller's code.

Functions yes but the macros don't work the same.

$ cat t.c
#include <stdio.h>
#include <ctype.h>
void func(char *s)
  while (*s++) *s = toupper(*s);
int main(void)
  char s[] = "Test string";

  printf("%s\n", s);
  return 0;
$ gcc -Wall -Werror -o t t.c && ./t
cc1: warnings being treated as errors
t.c: In function 'func':
t.c:5:3: error: array subscript has type 'char'
$ gcc -Wall -Werror -D_CTYPE_NOINLINE -o t t.c && ./t

With my proposed change the function and the macro both act the same.

D'Arcy J.M. Cain <> IM:darcy%Vex.Net@localhost

Home | Main Index | Thread Index | Old Index