if (oflags & _O_APPEND) wxflags |= WX_APPEND;
if (oflags & _O_BINARY) {/* Nothing to do */}
else if (oflags & _O_TEXT) wxflags |= WX_TEXT;
+ else if (oflags & _O_WTEXT) wxflags |= WX_TEXT;
+ else if (oflags & _O_U16TEXT) wxflags |= WX_TEXT;
+ else if (oflags & _O_U8TEXT) wxflags |= WX_TEXT;
else if (*__p__fmode() & _O_BINARY) {/* Nothing to do */}
else wxflags |= WX_TEXT; /* default to TEXT*/
if (oflags & _O_NOINHERIT) wxflags |= WX_DONTINHERIT;
_O_TRUNC|_O_EXCL|_O_CREAT|
_O_RDWR|_O_WRONLY|_O_TEMPORARY|
_O_NOINHERIT|
- _O_SEQUENTIAL|_O_RANDOM|_O_SHORT_LIVED
+ _O_SEQUENTIAL|_O_RANDOM|_O_SHORT_LIVED|
+ _O_WTEXT|_O_U16TEXT|_O_U8TEXT
)))
ERR(":unsupported oflags 0x%04x\n",unsupp);
/*********************************************************************
* fgetwc (MSVCRT.@)
- *
- * In _O_TEXT mode, multibyte characters are read from the file, dropping
- * the CR from CR/LF combinations
*/
wint_t CDECL fgetwc(FILE* file)
{
- int c;
+ wint_t ret;
+ int ch;
_lock_file(file);
- if (!(get_ioinfo(file->_file)->wxflag & WX_TEXT))
- {
- wchar_t wc;
- unsigned int i;
- int j;
- char *chp, *wcp;
- wcp = (char *)&wc;
- for(i=0; i<sizeof(wc); i++)
- {
- if (file->_cnt>0)
- {
- file->_cnt--;
- chp = file->_ptr++;
- wcp[i] = *chp;
- }
- else
- {
- j = _filbuf(file);
- if(file->_cnt<=0)
- {
- file->_flag |= (file->_cnt == 0) ? _IOEOF : _IOERR;
- file->_cnt = 0;
- _unlock_file(file);
- return WEOF;
- }
- wcp[i] = j;
- }
- }
+ if((get_ioinfo(file->_file)->exflag & (EF_UTF8 | EF_UTF16))
+ || !(get_ioinfo(file->_file)->wxflag & WX_TEXT)) {
+ char *p;
- _unlock_file(file);
- return wc;
- }
+ for(p=(char*)&ret; (wint_t*)p<&ret+1; p++) {
+ ch = fgetc(file);
+ if(ch == EOF) {
+ ret = WEOF;
+ break;
+ }
+ *p = (char)ch;
+ }
+ }else {
+ char mbs[MB_LEN_MAX];
+ int len = 0;
+
+ ch = fgetc(file);
+ if(ch != EOF) {
+ mbs[0] = (char)ch;
+ if(isleadbyte((unsigned char)mbs[0])) {
+ ch = fgetc(file);
+ if(ch != EOF) {
+ mbs[1] = (char)ch;
+ len = 2;
+ }
+ }else {
+ len = 1;
+ }
+ }
- c = fgetc(file);
- if ((__mb_cur_max > 1) && isleadbyte(c))
- {
- FIXME("Treat Multibyte characters\n");
+ if(!len || mbtowc(&ret, mbs, len)==-1)
+ ret = WEOF;
}
- _unlock_file(file);
- if (c == EOF)
- return WEOF;
- else
- return (wint_t)c;
+ _unlock_file(file);
+ return ret;
}
/*********************************************************************