워게임 문제에 아래와 같은 줄이 나왔는데 뭔 소리인지 모르겠어서 공부해보았다.
About __ctype_b_loc
__ctype_b_loc은 <ctype.h>에 들어있는 internal function이다.
<ctype.h>에는 우리가 많이 봤던 isnum(int c), isalpha(int c)... 이런 함수들이 들어있는 헤더파일이다.
이때 isalnum(char), isupper(char), isblank(char)이 호출될 때 __isctype(c,type)이라는 함수가 호출되는데, 걍 'c'가 이 'type'이 맞니?를 체크해주는 함수다.
그런데 __isctype에서 __ctype_b_loc을 호출하게 된다.
# define __isctype(c, type) \
((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type)
__ctype_b_loc의 원형
extern const unsigned short int **__ctype_b_loc (void)
__THROW __attribute__ ((__const__));
__ctype_b_loc은 위와 같이 구성되는데 unsigned short int** 자료형이다.
즉 __ctype_b_loc는 unsigned short int들로 구성된 테이블의 포인터를 반환한다. (아니면 지적해주세요)
이 테이블은 384개의 원소로 이루어져있다.
- any unsigned char value [0,255]
- EOF (-1)
- any signed char value [-128,-1)
이런식으로 ! (256+1+128=384)
__ctype_b_loc 가 호출되면 아래와 같이 각 숫자별로 설정된 비트값을 가지는 배열을 생성하고 해당 배열의 시작 주소가 들어있는 주소값을 돌려준다.
각 원소(비트값)들은 2 byte로 이루어져있다. 각 원소들은 각 char의 속성을 나타낸다.
그러면 저 숫자별로 설정된 비트값, 즉 원소들(0x0002,0x2003등....)은 무엇을 의미하냐?
각 비트들은 cytpe.h에 정의된 아래 enum를 참고한다.
enum
{
_ISupper = _ISbit (0), /* UPPERCASE. */
_ISlower = _ISbit (1), /* lowercase. */
_ISalpha = _ISbit (2), /* Alphabetic. */
_ISdigit = _ISbit (3), /* Numeric. */
_ISxdigit = _ISbit (4), /* Hexadecimal numeric. */
_ISspace = _ISbit (5), /* Whitespace. */
_ISprint = _ISbit (6), /* Printing. */
_ISgraph = _ISbit (7), /* Graphical. */
_ISblank = _ISbit (8), /* Blank (usually SPC and TAB). */
_IScntrl = _ISbit (9), /* Control character. */
_ISpunct = _ISbit (10), /* Punctuation. */
_ISalnum = _ISbit (11) /* Alphanumeric. */
};
_ISbit(bit) will return an int where the only 1 in the binary representation is at location "bit". For instance _ISbit(3) = 0b01000, and _ISbit(0) = 0b0001.
예를 들어 __cytpe_b_loc() 테이블에서 0x30('0')의 비트로는 뭐가 나오냐면 0x08d8이 나올 것이다.
0x08d8=0000 1000 1101 1000 (Alphanumeric, Graphical, Printing, Hexadecimal, Numeric)
따라서 얘를 다시 해석해보자
0x800을 이진수로 나타내면 0000 1000 0000 0000 이다.
따라서 얘가 hexadecimal numreric이어야 한다는 뜻이다. 즉 위 조건문은 isxdigit(a1)과 같은 역할을 하게 되는 것이다
References
https://stackoverflow.com/questions/53446974/ctype-b-table-and-its-usage
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dmbs335&logNo=220024158102
https://braincoke.fr/blog/2018/05/what-is-ctype-b-loc/#about-__ctype_b_loc