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:

 1. /***
 2. *ctype.h - karakter donusum makrolari ve ctype makrolari
 3. *
 4. *   Copyright (c) 1985-1992, Microsoft Corp. Her hakki saklidir.
 5. *
 6. *Amac:
 7. *   Karakter siniflandirmasi ve donusumu icin makrolar tanimlar.
 8. *   [ANSI/Sistem V]
 9. *
10. ****/
11.
12. #ifndef _INC_CTYPE
13.
14. /* ... */
15.
16. /* Asagidaki tanim, kullanicinin, ctype.obj'da
17.  * tanimlanmis bulunan _ctype adli karakter tipi
18.  * dizisine erisimini saglar.
19.  */
20.
21. extern unsigned char /* ... */ _ctype[];
22.
23. /* olasi karakter tipleri icin bit ortulerinin tanimlanmasi */
24.
25. #define _UPPER      0x1   /* buyuk harf */
26. #define _LOWER      0x2   /* kucuk harf */
27. #define _DIGIT      0x4   /* rakam[0-9] */
28. #define _SPACE      0x8   /* durak, satir basi, yeni satir, */
29.                           /* dikey durak veya sayfa ilerletme */
30. #define _PUNCT     0x10   /* noktalama karakteri */
31. #define _CONTROL   0x20   /* kontrol karakteri */
32. #define _BLANK     0x40   /* bosluk karakteri */
33. #define _HEX       0x80   /* onaltili rakam */
34.
35. /* ... */
36.
37. /* karakter siniflandirilmasi ile ilgili makro tanimlari */
38.
39. #define isalpha(_c)   ( (_ctype+1)[_c] & (_UPPER|_LOWER) )
40. #define isupper(_c)   ( (_ctype+1)[_c] & _UPPER )
41. #define islower(_c)   ( (_ctype+1)[_c] & _LOWER )
42. #define isdigit(_c)   ( (_ctype+1)[_c] & _DIGIT )
43. #define isxdigit(_c)  ( (_ctype+1)[_c] & _HEX )
44. #define isspace(_c)   ( (_ctype+1)[_c] & _SPACE )
45. #define ispunct(_c)   ( (_ctype+1)[_c] & _PUNCT )
46. #define isalnum(_c)   ( (_ctype+1)[_c] & (_UPPER|_LOWER|_DIGIT)  )
47. #define isprint(_c)   ( (_ctype+1)[_c] & (_BLANK|_PUNCT| \
48.                                            _UPPER|_LOWER|_DIGIT) )
49. #define isgraph(_c)   ( (_ctype+1)[_c] & (_PUNCT|_UPPER| \
50.                                            _LOWER|_DIGIT) )
51. #define iscntrl(_c)   ( (_ctype+1)[_c] & _CONTROL )
52. #ifndef __STDC__
53. #define toupper(_c)   ( (islower(_c)) ? _toupper(_c) : (_c) )
54. #define tolower(_c)   ( (isupper(_c)) ? _tolower(_c) : (_c) )
55. #endif
56. #define _tolower(_c)  ( (_c)-'A'+'a' )
57. #define _toupper(_c)  ( (_c)-'a'+'A' )
58. #define __isascii(_c) ( (unsigned)(_c) < 0x80 )
59. #define __toascii(_c) ( (_c) & 0x7f )
60.
61. /* genisletilmis ctype makrolari */
62.
63. #define __iscsymf(_c) (isalpha(_c) || ((_c) == '_'))
64. #define __iscsym(_c)  (isalnum(_c) || ((_c) == '_'))
65.
66. /* ... */
67.
68. #define _INC_TYPE
69. #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.