Source-Changes-D archive

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

Re: CVS commit: src/lib/libc/locale



hi, all

> I was just wondering why this change was made? It seems to be a backwards
> step to me?

my intension is quite paranoia.

changing uint8_t -> unsigned char / int16_t -> short is because
_ctype_ / _tolower_tab_ / _toupper_tab_ in ctype.h (now splitted
sys/ctype_bits.h)
declared as unsigned char / short.

        ctype.h(rev1.29) -- http://tinyurl.com/365ycfq

        extern const unsigned char      *_ctype_;
        extern const short      *_tolower_tab_;
        extern const short      *_toupper_tab_;


but ctypeio.c read them from LC_CTYPE as uint8_t / int16_t and network endian
and directly cast to unsigned char/short.

        ctypeio.c(rev1.11) -- http://tinyurl.com/22my4t8

        if (fread((void *)ptr, sizeof(uint8_t), len, fp) != len)
        ...
        if (fread((void *)ptr, sizeof(int16_t), len, fp) != len)
        ...
        if (fread((void *)ptr, sizeof(int16_t), len, fp) != len)
        ...
#if BYTE_ORDER == LITTLE_ENDIAN
        for (i = 1; i <= len; i++) {
                new_toupper[i] = ntohs(new_toupper[i]);
                new_tolower[i] = ntohs(new_tolower[i]);
        }
#endif
        ...
        data->ctype_tab = (const unsigned char *)new_ctype;
        data->toupper_tab = (const short *)new_toupper;
        data->tolower_tab = (const short *)new_tolower;

if the case, someone port to the machine that sizeof(unsigned char) !=
sizeof(uint8_t)
or sizeof(short) != sizeof(int16_t), is*/to* function doesn't work correctlly.
# such as NetBSD/pdp10(9bit char), or cray1(64bit char)


> If you ever port to a 36-bit machine, you are going to have to lie and
> define int32_t as 'int' anyway....

intN_t is not portable type, these are optimal:

ISO/IEC9899:1999 7.18.1.1

        3 These types are optional. However, if an implementation provides
        integer types with widths of 8, 16, 32, or 64 bits, no padding bits,
        and (for the signed types) that have a two’s complement representation,
        it shall define the corresponding typedef names.

NetBSD/pdp10 seems that providing them by using gcc extension
__attribute__((size N)).


> The [u]int_leastN_t types may be useful in this sort of code.

exactly, but it require C99 stdint.h(or sys/types.h).
ctype.h should keep C90 namespace, i'm not willing to include it.


P.S.

i'm now attempting increase _ctype_ bits 8 -> 16 before branching netbsd-6.
because these ancient code(delived from 4BSD) have two bugs:

        1. _B bit desn't means isblank(3) but isprint(3) && !isgraph(3).
           so we have to provide real "isblank" bit, but there is no bit space 
left.

        2. isprint(3) doesn't recognize some japanese half-width character
           and vietnamese's phonogram character, we have to provide
"phonogram" bit too.

i'll post patch to tech-userlevel@, this weekend or next week.


very truly yours.
--
Takehiko NOZAKI <tnozaki%NetBSD.org@localhost>


Home | Main Index | Thread Index | Old Index