Aşağıdaki kodu anlamak istiyorum:
//...
#define _C 0x20
extern const char *_ctype_;
//...
__only_inline int iscntrl(int _c)
{
return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
}
Obenbsd işletim sistemi kaynak kodundan ctype.h dosyasından kaynaklanır . Bu işlev, bir karakterin bir kontrol karakteri mi yoksa ascii aralığının içindeki yazdırılabilir bir harf olup olmadığını kontrol eder. Bu benim şu andaki düşünce zincirim:
- iscntrl ('a') çağrılır ve 'a' tam sayı değerine dönüştürülür
- önce _c'nin -1 olup olmadığını kontrol edin, sonra 0 döndürün ...
- adsız undef işaretçi puanları artırmak tarafından 1
- bu adresi bir uzunluk dizisine işaretçi olarak bildir (işaretsiz karakter) ((int) 'a')
- bitsel ve operatörü _C (0x20) ve diziye (???) uygulayın
Her nasılsa, garip bir şekilde çalışır ve 0 döndürüldüğünde her zaman verilen char _c yazdırılabilir bir karakter değildir. Aksi takdirde, yazdırılabilir durumdaysa işlev yalnızca özel bir ilgisi olmayan bir tamsayı değeri döndürür. Anlama problemim adım 3, 4 (biraz) ve 5'te.
Herhangi bir yardım için teşekkürler.
(unsigned char)
karakterlerin imzalı ve olumsuz olma ihtimalini gözetmektir.
_ctype_
aslında bir dizi bit maskesi. İlgilenilen karakterle endeksleniyor. Yani_ctype_['A']
"alfa" ve "büyük harf" e_ctype_['a']
karşılık gelen bitler içerecek, "alfa" ve "küçük harf" e karşılık gelen bitler_ctype_['1']
içerecek, "basamak" a karşılık gelen bir bit içerecektir, vb. Görünüşe göre0x20
"kontrol" e karşılık gelen bit . Ancak bir nedenle_ctype_
dizi 1 ile dengelenir, bu nedenle bitler'a'
gerçekten içeridedir_ctype_['a'+1]
. (Bu muhtemelenEOF
ekstra test olmadan bile çalışmasına izin