Uçbirim Tanımının Sorgulanması
Önceki Termcap Kütüphanesi Sonraki
Uçbirim Tanımının Sorgulanması
Bir uçbirim tanımında kayıtlı her bilgi parçasına yetenek adı verilir. Kayıtlı her uçbirim yeteneğinin özel bir anlamı olan ve iki harfle kodlanan bir ismi vardır. Örneğin sütun sayısının ismi co'dur. Standart yetenek isimlerinin tamamını Uçbirim Yeteneklerinin Tanımları bölümünde bulabilirsiniz.
tgetent ile uygun uçbirim tanımını bulduktan sonra, artık uygulama yazılımınız çeşitli uçbirim yeteneklerini sorgulamaya hazır demektir. Aradığınız yetenek ile ilgili bilgi almak için yeteneğin iki harflik kodunu belirtmeniz gerekir.
Yeteneklerin değerleri sayısal, mantıksal (yetenek var/yok tarzında) ya da dizge biçiminde olabilir. Her yetenek değerinin kendine özgü bir değer türü vardır. Örneğin, co daima bir sayısal değer içerirken am (kenarlarda özdevinimli sarmalama) daima bir var/yok değeri içerir. cm (imleç hareket komutu) ise daima bir dizge değere sahiptir. Her yeteneğin değerinin hangi türde olduğu bu kılavuzda açıklanmıştır.
Bir yeteneğin değerini öğrenmek için kullanabileceğiniz üç işlev vardır ve yeteneğin değerinin türüne göre bunlardan biri kullanılır:
int tgetnum
(char *isim);
işlev
tgetnum işlevi, değeri sayısal olan bir yeteneği sorgulamakta kullanılır. isim argümanı yeteneğin iki harflik kodu olmalıdır. Eğer belirtilen yetenek mevcutsa, tgetnum onun değerini negatif olmayan bir değer olarak döndürür. Eğer belirtilen yetenek uçbirim tanımında yoksa, işlev -1 değeri ile döner.
int tgetflag
(char *isim);
işlev
tgetflag işlevi, değeri mantıksal olan bir yeteneği sorgulamakta kullanılır. Eğer belirtilen yetenek uçbirim tanımında mevcutsa, tgetflag 1 ile yoksa 0 ile döner.
char *tgetstr
(char  *isim,
 char **alan);
işlev
tgetstr işlevi, dizge değerli bir yeteneği sorgulamakta kullanılır. Belirtilen isim uçbirim tanımında mevcut bir yeteneğin ismiyse işlev yeteneğin değerine bir gösterici ile, aksi takdirde bir boş gösterici ile döner.
tgetstr işlevinin döndüreceği dizgenin saklanacağı alanı ayırmanın iki yolu vardır:
  • Alanı ayırmasını tgetstr işlevinden talep edersiniz. alan argümanı ile işleve bir boş gösterici aktarırsanız, tgetstr yeterli alanı ayırmak için malloc işlevini kullanacaktır. Termcap bu alanı serbest bırakmayacağı gibi aynı alanı tekrar kullanmayacağından, işiniz bittiğinde bu alanı sizin serbest bırakmanız gerekir.
    Ne kadar alan ayrılacağını düşünmeyi gerektirmediğinden bu yöntem daha sağlamsa da, sadece GNU termcap kütüphanesi tarafından desteklenmektedir.
  • Gerekli alanı kendiniz ayırırsınız. alan argümanı olarak char * türünde bir göstericinin adresini vermelisiniz. tgetstr işlevini çağırmadan önce bu değişkeni yeterli alanla ilklendirmelisiniz. İşlev çağrıldığında dizge değerini bu alana kaydedecek ve göstericiyi bu kullanılan alanın sonrasını gösterecek şekilde arttıracaktır. Böylece, aynı göstericiyi çok sayıda tgetstr çağrısı yapmak için kullanabilmeniz mümkün kılınmıştır.
    Tek bir dizge için ne kadar alan gerektiğini saptamanın bir yolu olmadığı gibi ne sizin tarafınızdan ne de kütüphane tarafından bellek taşmalarını önlemenin bir yolu yoktur. Ancak, bir uçbirim tanımından elde edilebilecek tüm dizge değerli yeteneklerin değerlerinin toplam uzunluğu uçbirim tanımı için ayrılan alandan daha büyük olamayacağından aynı uzunlukta bir alanı ayırmak en iyi seçim olacaktır (tabii, aynı yeteneği birden fazla sorgulamamak şartıyla). Böyle bir alanı ayırırken, belirtilecek alanın uzunluğunu tgetent işlevine ayrılan tamponun uzunluğu olarak strlen işlevi ile saptayabilirsiniz. Aşağıda böyle bir örneğe yer verilmiştir.
    Gerekli alanı kendinizin ayırması gerekliliği termcap'ın Unix sürümü tarafından desteklenen tek yöntemdir.
Sorgulama işlevlerinde bir uçbirim ismi ya da bir uçbirim tanımı belirtmek zorunda olmadığınızın farkına varmış olmalısınız. Bu işlevler son yapılan tgetent çağrısında bulunan tanımı özdevinimli kullanırlar.
Bu örnekte, bir uçbirim tanımındaki çeşitli yetenekler sorgulanırken, koşullar kodun çalışacağı sisteme göre Unix veya GNU yöntemlerine göre ayarlanmaktadır:
char *tgetstr ();

char *cl_string, *cm_string;
int height;
int width;
int auto_wrap;

char PC;   /*  tputs için.  */
char *BC;  /* tgoto için.  */
char *UP;

interrogate_terminal ()
{
#ifdef UNIX
  /* Burada tgetent'e term_buffer'ın bizim
     tarafımızdan sağlandığı varsayılmıştır. */
  char *buffer
    = (char *) malloc (strlen (term_buffer));
#define BUFFADDR &buffer
#else
#define BUFFADDR 0
#endif

  char *temp;

  /* Kullanacağımız bilgileri alalım.  */
  cl_string = tgetstr ("cl", BUFFADDR);
  cm_string = tgetstr ("cm", BUFFADDR);
  auto_wrap = tgetflag ("am");
  height = tgetnum ("li");
  width = tgetnum ("co");

  /* termcap işlevlerinin kullanacağı bilgileri alalım.  */
  temp = tgetstr ("pc", BUFFADDR);
  PC = temp ? *temp : 0;
  BC = tgetstr ("le", BUFFADDR);
  UP = tgetstr ("up", BUFFADDR);
}
PC değişkeni ile ilgili bilgiler için Geciktirme bölümüne, UP ve BC için ise Ekran Komutlarının Parametrelerle Gönderilmesi bölümüne bakınız.
Önceki Üst Ana Başlık Sonraki
Uçbirim Tanımının Bulunması Başlangıç Termcap Kullanımı için İlklendirme
Bir Linux Kitaplığı Sayfası