Çokbaytlı Dönüşüm Örneği
Önceki Geridönüşümlü Çok Baytlı Dönüşüm Sonraki
Çokbaytlı Dönüşüm Örneği
Bundan önceki bölümlerde verilen örnekler birer özetti ve hata denetimlerini içermiyordu. Burada tam ve belgelemesi yapılmış bir örneğe yer verilmiştir. mbrtowc işlevi kullanılmışsa da diğer sürümleri başka işlevlerin yardımıyla gerçeklenmiştir.
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;
}
Önceki Üst Ana Başlık Sonraki
Dizge Dönüşümleri Başlangıç Evresel Olmayan Dönüşümler
Bir Linux Kitaplığı Sayfası