From: M.Fujii <boo...@m4...> - 2003-10-17 19:49:29
|
I found getc/getchar/putc/putchar in mingw-runtime 3.2 sometimes return strange values. getc should read a character as an unsigned char and cast to int. However, getc in mingw-runtime 3.2 reads a character as an unqualified char, which is a signed char by default. So getc sometimes returns a negative value when it read a character whose code is greater than 0x80. I guess inline definition of getc is wrong. (Likewise, getchar, putc and putchar are) I would like the following patch applied. --- stdio.h.orig 2003-10-11 00:25:37.001000000 +0900 +++ stdio.h 2003-10-18 02:59:29.770750000 +0900 @@ -265,28 +265,28 @@ __CRT_INLINE int __cdecl getc (FILE* __F) { return (--__F->_cnt >= 0) - ? (int) *__F->_ptr++ + ? (int) *(unsigned char *)(__F->_ptr++) : _filbuf (__F); } __CRT_INLINE int __cdecl putc (int __c, FILE* __F) { return (--__F->_cnt >= 0) - ? (int)(*__F->_ptr++ = (char)__c) + ? (int)((unsigned char)(*__F->_ptr++ = (char)__c)) : _flsbuf (__c, __F); } __CRT_INLINE int __cdecl getchar (void) { return (--stdin->_cnt >= 0) - ? (int) *stdin->_ptr++ + ? (int) *(unsigned char *)(stdin->_ptr++) : _filbuf (stdin); } __CRT_INLINE int __cdecl putchar(int __c) { return (--stdout->_cnt >= 0) - ? (int)(*stdout->_ptr++ = (char)__c) + ? (int)((unsigned char)(*stdout->_ptr++ = (char)__c)) : _flsbuf (__c, stdout);} #else /* Use library functions. */ ---------- My environment (Cygwin 1.5.5): $ uname -svr CYGWIN_NT-5.0 1.5.5(0.94/3/2) 2003-09-20 16:31 $ cygcheck -c gcc gcc-mingw mingw-runtime w32api Cygwin Package Information Package Version Status gcc 3.3.1-2 OK gcc-mingw 20030911-3 OK mingw-runtime 3.2-1 OK w32api 2.4-1 OK ---------- -- Masayuki FUJII ( boo...@m4... ) |