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,
(…dır) makrolarının nasıl çalıştığını açıklamak zor olmayacaktır.
is
…__isascii
(ASCII karakteri) olup olmadığını test eder.
Diğer makroların açıklaması kolaydır ve okuyucuya bırakılmıştır.