मैं निम्नलिखित कोड समझना चाहता हूं:
//...
#define _C 0x20
extern const char *_ctype_;
//...
__only_inline int iscntrl(int _c)
{
return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
}
यह फ़ाइल ctype.h से ओबन्सबर्ड ऑपरेटिंग सिस्टम सोर्स कोड से उत्पन्न होता है । यह फ़ंक्शन जाँचता है कि क्या एक चार्ली नियंत्रण वर्ण या एससीआई रेंज के अंदर एक मुद्रण योग्य पत्र है। यह मेरे विचार की वर्तमान श्रृंखला है:
- iscntrl ('a') कहलाता है और 'a' इसे पूर्णांक मान में परिवर्तित करता है
- पहले जांचें कि क्या _c -1 है तो 0 और लौटाएं ...
- 1 से अपरिभाषित सूचक बिंदुओं को बढ़ाएँ
- इस एड्रेस को एक पॉइंटर के रूप में लंबाई (अहस्ताक्षरित चार) ((int) 'a') घोषित करें
- बिटकॉइन और ऑपरेटर को _C (0x20) और सरणी (???) पर लागू करें
किसी तरह, अजीब तरह से, यह काम करता है और हर बार जब 0 दिया गया चार _ _ प्रिंट करने योग्य चरित्र नहीं होता है। अन्यथा जब यह मुद्रण योग्य होता है तो फ़ंक्शन केवल पूर्णांक मान लौटाता है जो किसी विशेष हित का नहीं है। मेरी समझ की समस्या चरण 3, 4 (थोड़ा) और 5 में है।
हर प्रकार की सहायता के लिए आपका धन्यवाद।
(unsigned char)
हस्ताक्षर और नकारात्मक होने की संभावना का ध्यान रखना है।
_ctype_
अनिवार्य रूप से बिटमास्क की एक सरणी है। यह ब्याज के चरित्र द्वारा अनुक्रमित किया जा रहा है। तो_ctype_['A']
"अल्फ़ा" और "अपरकेस" के_ctype_['a']
समान बिट्स होंगे , जिनमें "अल्फ़ा" और "लोअरकेस" के अनुरूप बिट्स_ctype_['1']
होंगे , जिनमें "अंक" के समान थोड़ा सा होगा, आदि ऐसा लगता0x20
है कि "नियंत्रण" के अनुरूप बिट है। । लेकिन किसी कारण से_ctype_
सरणी 1 से ऑफसेट है, इसलिए बिट्स'a'
वास्तव में हैं_ctype_['a'+1]
। (यहEOF
अतिरिक्त परीक्षण के बिना भी काम करने देना था ।)