|
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; }
|