Saya ingin memahami kode berikut:
//...
#define _C 0x20
extern const char *_ctype_;
//...
__only_inline int iscntrl(int _c)
{
return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
}
Itu berasal dari file ctype.h dari kode sumber sistem operasi obenbsd. Fungsi ini memeriksa apakah char adalah karakter kontrol atau huruf yang dapat dicetak di dalam rentang ascii. Inilah rantai pemikiran saya saat ini:
- iscntrl ('a') dipanggil dan 'a' dikonversi ke nilai integernya
- periksa dulu apakah _c adalah -1 lalu kembalikan 0 lagi ...
- menambah alamat titik penunjuk yang tidak ditentukan sebesar 1
- menyatakan alamat ini sebagai penunjuk ke array panjang (unsigned char) ((int) 'a')
- terapkan bitwise dan operator ke _C (0x20) dan array (???)
Entah bagaimana, anehnya, ia berfungsi dan setiap kali 0 dikembalikan, karakter yang diberikan bukanlah karakter yang dapat dicetak. Kalau tidak, ketika itu dapat dicetak fungsi hanya mengembalikan nilai integer yang tidak menarik. Masalah pemahaman saya ada di langkah 3, 4 (sedikit) dan 5.
Terima kasih atas bantuannya.
(unsigned char)
adalah untuk menjaga kemungkinan karakter ditandatangani dan negatif.
_ctype_
pada dasarnya adalah array dari bitmask. Itu diindeks oleh karakter yang menarik. Jadi_ctype_['A']
akan mengandung bit yang sesuai dengan "alpha" dan "huruf besar",_ctype_['a']
akan mengandung bit yang sesuai dengan "alpha" dan "huruf kecil",_ctype_['1']
akan mengandung bit yang sesuai dengan "digit", dll. Sepertinya0x20
bit yang sesuai dengan "control" . Tapi untuk beberapa alasan_ctype_
array diimbangi dengan 1, sehingga bit untuk'a'
benar-benar dalam_ctype_['a'+1]
. (Itu mungkin membuatnya bekerjaEOF
bahkan tanpa tes tambahan.)