Ich möchte den folgenden Code verstehen:
//...
#define _C 0x20
extern const char *_ctype_;
//...
__only_inline int iscntrl(int _c)
{
return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
}
Es stammt aus der Datei ctype.h aus dem Quellcode des Betriebssystems obenbsd. Diese Funktion prüft, ob ein Zeichen ein Steuerzeichen oder ein druckbarer Buchstabe innerhalb des ASCII-Bereichs ist. Dies ist meine aktuelle Gedankenkette:
- iscntrl ('a') wird aufgerufen und 'a' wird in seinen ganzzahligen Wert konvertiert
- Überprüfen Sie zuerst, ob _c -1 ist, und geben Sie dann 0 zurück.
- Erhöhen Sie die Adresse, auf die der undefinierte Zeiger zeigt, um 1
- Deklarieren Sie diese Adresse als Zeiger auf ein Array mit einer Länge (vorzeichenloses Zeichen) ((int) 'a').
- Wende das Bit und den Operator auf _C (0x20) und das Array (???) an.
Seltsamerweise funktioniert es irgendwie und jedes Mal, wenn 0 zurückgegeben wird, ist das angegebene Zeichen _c kein druckbares Zeichen. Andernfalls gibt die Funktion beim Drucken nur einen ganzzahligen Wert zurück, der nicht von besonderem Interesse ist. Mein Verständnisproblem ist in Schritt 3, 4 (ein bisschen) und 5.
Vielen Dank für jede Hilfe.
(unsigned char)
besteht darin, sich um die Möglichkeit zu kümmern, dass Zeichen signiert und negativ sind.
_ctype_
ist im Wesentlichen eine Reihe von Bitmasken. Es wird nach dem Charakter des Interesses indiziert. So_ctype_['A']
Bits enthalten würde „Alpha“ entspricht , und „Großbuchstaben“,_ctype_['a']
würde Bits entsprechend „Alpha“ und „kleinen“ enthalten,_ctype_['1']
würde ein wenig enthalten , um „digit“ entspricht, usw. Es sieht aus wie0x20
wird das Bit entsprechend „Kontrolle“ . Aber aus irgendeinem Grund ist das_ctype_
Array um 1 versetzt, so dass die Bits für'a'
wirklich in sind_ctype_['a'+1]
. (Das war wahrscheinlich, um esEOF
auch ohne den zusätzlichen Test funktionieren zu lassen .)