Öznitelikler

Karakterlere özel etkilerle nasıl öznitelikler kazandırılabileceğini daha önce görmüştük. Öznitelikler, özenli ayarlanmaları halinde, verilerin kolay ve anlaşılır bir şekilde basılmasını sağlarlar. Aşağıdaki program bir C dosyasını parametre olarak almakta ve yorum satırlarını koyu olarak göstermektedir. Kodu inceleyin.

Örnek 5.10. Basit bir öznitelik verme örneği

/* pager functionality by Joseph Spainhour" <spainhou (at) bellsouth.net> */
#include <ncurses.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int ch, prev, row, col;
  prev = EOF;
  FILE *fp;
  int y, x;

  if(argc != 2)
  {
    printf("Kullanım: %s <bir dosya adı>\n", argv[0]);
    exit(1);
  }
  fp = fopen(argv[1], "r");
  if(fp == NULL)
  {
    perror("Girdi dosyası açılamadı");
    exit(1);
  }
  initscr();                            /* Curses kipi başlangıcı    */
  getmaxyx(stdscr, row, col);           /* ekran sınırlarını bul     */
  while((ch = fgetc(fp)) != EOF)        /* dosyayı sonuna kadar oku  */
  {
    getyx(stdscr, y, x);                /* o anki imleç konumunu al  */
    if(y == (row - 1))                  /* ekranın sonunda mıyız?    */
    {
      printw("<-Bir tuşa basınız->");
                              /* kullanıcıya bir tuşa basmasını söyle */
      getch();
      clear();                          /* ekranı temizle */
      move(0, 0);                       /* ekranın başına git */
    }
    if(prev == '/' && ch == '*') /* Eğer sadece / ve * karakteri ise
                                         * koyu göstermeyi etkinleştir */
    {
      attron(A_BOLD);                   /* koyu gösterme etkin */
      getyx(stdscr, y, x);              /* imlecin o anki konumunu al */
      move(y, x - 1);                   /* bir karakter geri git */
      printw("%c%c", '/', ch);          /* esas görüntüleme burada yapılmakta */
    }
    else
      printw("%c", ch);
    refresh();
    if(prev == '*' && ch == '/')
      attroff(A_BOLD);                  /* eğer * ve / okunduysa *
                                         * koyu göstermeyi kapat */
    prev = ch;
  }
  endwin();                             /* curses kipi sonu */
  fclose(fp);
  return 0;
}

Tüm şu ilklendirme ve ıvır zıvırlardan korkmayın. While döngüsüne dikkatinizi verin. Her bir karakteri okuyarak /* karakter ikilisini aranmaktadır. Bir kere örüntüyü buldu mu attron() ile BOLD (koyu gösterme) özelliğini etkin hale getirmektedir. */ karakter ikilisi okunduğunda bu öznitelik attroff() ile kapatılmaktadır.

Yukarıdaki program bize getyx() ve move() gibi iki faydalı işlevi tanıtmaktadır. İlk işlev imlecin o anki koordinatlarını y, x değerlerine alır. getyx() bir makro olduğundan işleve gösterici aktarmak zorunda değiliz. move() işlevi imleci verilen koordinatlara hareket ettirir.

Yukarıdaki program pek de fazla bir iş yapmayan gerçekten de basit bir örnektir. Bu satırlarda birileri bir C dosyasını okuyup, onu ayrıştırıp değişik renklerde gösteren daha kullanışlı bir program yazabilir. Birisi bunu başka dillere de genişletebilir.