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.