int
file_mbsrtowcs (int input, int output)
{
/* MB_LEN_MAX kullanmalıyız.
MB_CUR_MAX urada taşınabilir değildir. */
char buffer[BUFSIZ + MB_LEN_MAX];
mbstate_t state;
int filled = 0;
int eof = 0;
/* state'i ilklendirelim. */
memset (&state, '\0', sizeof (state));
while (!eof)
{
ssize_t nread;
ssize_t nwrite;
char *inp = buffer;
wchar_t outbuf[BUFSIZ];
wchar_t *outp = outbuf;
/* buffer'ı girdi dosyasından dolduralım. */
nread = read (input, buffer + filled, BUFSIZ);
if (nread < 0)
{
perror ("read");
return 0;
}
/* Dosya sonuna geldiğimizde bunu belirleyelim. */
if (nread == 0)
eof = 1;
/* tampona aktarılan baytları sayalım */
filled += nread;
/* Bu baytları mümkün olduğunda geniş karakterlere dönüştürelim. */
while (1)
{
size_t thislen = mbrtowc (outp, inp, filled, &state);
/* Geçersiz karaktere rastlandığında dur;
böylece son geçerli karaktere kadar olan parçayı okumuş olacağız */
if (thislen == (size_t) -1)
break;
/* Dizge içinde boş karakter bulursak 0 değeri ile döneceğiz.
Bu bir düzeltme gerektirir. */
if (thislen == 0)
thislen = 1;
/* Bu karakterle işimiz bitti, sonrakine geçelim. */
inp += thislen;
filled -= thislen;
++outp;
}
/* Dönüştürülen geniş karakterleri yazalım. */
nwrite = write (output, outbuf,
(outp - outbuf) * sizeof (wchar_t));
if (nwrite < 0)
{
perror ("write");
return 0;
}
/* Gerçekten bir geçersiz karakterimiz var mı bakalım. */
if ((eof && filled > 0) || filled >= MB_CUR_MAX)
{
error (0, 0, "cokbaytli karakter gecersiz");
return 0;
}
/* karakterleri tamponun başından itibaren yerleştirelim. */
if (filled > 0)
memmove (inp, buffer, filled);
}
return 1;
}