On 20 July 2017 at 22:29, Eric Blake <ebl...@redhat.com> wrote: > On 07/20/2017 04:03 PM, Peter Maydell wrote: >> https://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sys/sys/ctype_inline.h >> The implementation is >> #define toupper(c) ((int)((_toupper_tab_ + 1)[(c)])) >> >> (where I assume _toupper_tab_ is the obvious array.) > > In fact, if NetBSD's implementation is anything like Cygwin's, then it > is a safe bet that _toupper_tab_ is a symbol that lands in the middle of > a larger 384-byte array, such that _toupper_tab_[-1] (for (signed > char)'\xfe') happens to resolve to a valid image address, and will have > the same contents as _toupper_tab_[255] (for (unsigned char)'\xfe'), > precisely to cater to so many clueless programs have forgotten about > signed char widening to negative values (even though the standard says > the behavior is undefined, quality-of-implementation demands that you > try to do the sane thing anyway).
Nope, looks like they just implement as _toupper_tab_[0] is for EOF, and indexes >0 are for the characters, if I've found the right bit of their libc: https://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/lib/libc/locale/rune.c thanks -- PMM