Standart C Programlama Dili


6.6. Bir Örnek—ctype.h Başlık Dosyası

Aşağıda eski bir derleyiciye ait ctype.h başlık dosyasının basitleştirilmiş ve Türkçeleştirilmiş bir uyarlaması verilmektedir:

/***
*ctype.h - karakter dönüşüm makroları ve ctype makroları
*
*   Copyright (c) 1985-1992, Microsoft Corp. Her hakkı saklıdır.
*
*Amaç:
*   Karakter sınıflandırması ve dönüşümü için makrolar tanımlar.
*   [ANSI/Sistem V]
*
****/

#ifndef _INC_CTYPE

/* … */

/* Aşağıdaki tanım, kullanıcının, ctype.obj’da
 * tanımlanmış bulunan _ctype adlı karakter tipi
 * dizisine erişimini sağlar.
 */

extern unsigned char /* … */ _ctype[];

/* olası karakter tipleri için bit örtülerinin tanımlanması */

#define _UPPER      0x1   /* büyük harf */
#define _LOWER      0x2   /* küçük harf */
#define _DIGIT      0x4   /* rakam[0-9] */
#define _SPACE      0x8   /* durak, satır başı, yeni satır, */
                          /* dikey durak veya sayfa ilerletme */
#define _PUNCT     0x10   /* noktalama karakteri */
#define _CONTROL   0x20   /* kontrol karakteri */
#define _BLANK     0x40   /* boşluk karakteri */
#define _HEX       0x80   /* onaltılı rakam */

/* … */

/* karakter sınıflandırılması ile ilgili makro tanımları */

#define isalpha(_c)   ( (_ctype+1)[_c] & (_UPPER|_LOWER) )
#define isupper(_c)   ( (_ctype+1)[_c] & _UPPER )
#define islower(_c)   ( (_ctype+1)[_c] & _LOWER )
#define isdigit(_c)   ( (_ctype+1)[_c] & _DIGIT )
#define isxdigit(_c)  ( (_ctype+1)[_c] & _HEX )
#define isspace(_c)   ( (_ctype+1)[_c] & _SPACE )
#define ispunct(_c)   ( (_ctype+1)[_c] & _PUNCT )
#define isalnum(_c)   ( (_ctype+1)[_c] & (_UPPER|_LOWER|_DIGIT)  )
#define isprint(_c)   ( (_ctype+1)[_c] & (_BLANK|_PUNCT| \
                                          _UPPER|_LOWER|_DIGIT) )
#define isgraph(_c)   ( (_ctype+1)[_c] & (_PUNCT|_UPPER| \
                                          _LOWER|_DIGIT) )
#define iscntrl(_c)   ( (_ctype+1)[_c] & _CONTROL )
#ifndef __STDC__
#define toupper(_c)   ( (islower(_c)) ? _toupper(_c) : (_c) )
#define tolower(_c)   ( (isupper(_c)) ? _tolower(_c) : (_c) )
#endif
#define _tolower(_c)  ( (_c)-'A'+'a' )
#define _toupper(_c)  ( (_c)-'a'+'A' )
#define __isascii(_c) ( (unsigned)(_c) < 0x80 )
#define __toascii(_c) ( (_c) & 0x7f )

/* genişletilmiş ctype makroları */

#define __iscsymf(_c) (isalpha(_c) || ((_c) == '_'))
#define __iscsym(_c)  (isalnum(_c) || ((_c) == '_'))

/* … */

#define _INC_TYPE
#endif

Bu dosyanın başında (_ctype) extern dizisinin bildirimi yapılmaktadır. Bu 129 elemanlık bir dizidir. İlk elemanının değeri 0’dır, böylece ikinci elemandan başlamamız gerekir. İlk elemanını atlamak için, dizi şu şekilde indislenebilir:

(_ctype+1)[indis]

Her eleman, indis olarak kullanılan karaktere karşılık gelen bir kod içerir. Örneğin:

(_ctype+1)[' ']’in değeri 0x48’dir

(_ctype+1)['A']’in değeri 0x81’dir

Bu sayılar, herbirinin özel bir anlamı olan, 8 bitten oluşmaktadır. Bu bitlerin anlamları 25’ten 33’e kadar olan satırlarda verilmiştir. Örneğin, 0x48 _BLANK (boşluk) ve _SPACE (görünmeyen karakter) anlamına gelir, 0x81 _HEX (onaltılı rakam) ve _UPPER (büyük harf) demektir. Bu bilgi ile, is (…dır) makrolarının nasıl çalıştığını açıklamak zor olmayacaktır. __isascii (ASCII karakteri) olup olmadığını test eder.

Diğer makroların açıklaması kolaydır ve okuyucuya bırakılmıştır.