/* This file contains a fixed implementation of fgetwc since glibc's one is a little segfaulty when used on fmemopen'ed files. */ #include #include #include #include #include #include "fgetwc_fix.h" /* code blatantly ripped from newlib. If you are from newlib: newlib rocks, keep going! */ wint_t _fgetwc_fixed(FILE *fp) { wchar_t wc; size_t res; size_t nconv = 0; char buf[MB_CUR_MAX]; mbstate_t mbstate; memset(&mbstate, 0, sizeof(mbstate)); while((buf[nconv++] = fgetc(fp)) != EOF){ res = mbrtowc(&wc, buf, nconv, &mbstate); if (res == (size_t)-1) /* invalid sequence */ break; else if (res == (size_t)-2) /* incomplete sequence */ continue; else if (res == 0) return L'\0'; else return wc; } errno = EILSEQ; return WEOF; }