linux/lib/ctype.c 에 관해서..

oprsystem의 이미지

이 코드가 무엇을 하는지 모르겠습니다. 아시는 분은 도움주시면 감사드립니다..

[b]const unsigned char _ctype[] = {
_C,_C,_C,_C,_C,_C,_C,_C,			/* 0-7 */
_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,		/* 8-15 */
_C,_C,_C,_C,_C,_C,_C,_C,			/* 16-23 */
_C,_C,_C,_C,_C,_C,_C,_C,			/* 24-31 */
_S|_SP,_P,_P,_P,_P,_P,_P,_P,			/* 32-39 */
_P,_P,_P,_P,_P,_P,_P,_P,			/* 40-47 */
_D,_D,_D,_D,_D,_D,_D,_D,			/* 48-55 */
_D,_D,_P,_P,_P,_P,_P,_P,			/* 56-63 */
_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,	/* 64-71 */
_U,_U,_U,_U,_U,_U,_U,_U,			/* 72-79 */
_U,_U,_U,_U,_U,_U,_U,_U,			/* 80-87 */
_U,_U,_U,_P,_P,_P,_P,_P,			/* 88-95 */
_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,	/* 96-103 */
_L,_L,_L,_L,_L,_L,_L,_L,			/* 104-111 */
_L,_L,_L,_L,_L,_L,_L,_L,			/* 112-119 */
_L,_L,_L,_P,_P,_P,_P,_C,			/* 120-127 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,		/* 128-143 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,		/* 144-159 */
_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,   /* 160-175 */
_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,       /* 176-191 */
_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,       /* 192-207 */
_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,       /* 208-223 */
_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,       /* 224-239 */
_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L};      /* 240-255 */[/b]
tifler의 이미지

/* from ctype.h */

#define _U  0x01    /* upper */
#define _L  0x02    /* lower */
#define _D  0x04    /* digit */
#define _C  0x08    /* cntrl */
#define _P  0x10    /* punct */
#define _S  0x20    /* white space (space/lf/tab) */
#define _X  0x40    /* hex digit */
#define _SP 0x80    /* hard space (0x20) */


const unsigned char _ctype[] = { 
_C,_C,_C,_C,_C,_C,_C,_C,         /* 0-7 */ 
_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,      /* 8-15 */ 
_C,_C,_C,_C,_C,_C,_C,_C,         /* 16-23 */ 
_C,_C,_C,_C,_C,_C,_C,_C,         /* 24-31 */ 
_S|_SP,_P,_P,_P,_P,_P,_P,_P,         /* 32-39 */ 
_P,_P,_P,_P,_P,_P,_P,_P,         /* 40-47 */ 
_D,_D,_D,_D,_D,_D,_D,_D,         /* 48-55 */ 
_D,_D,_P,_P,_P,_P,_P,_P,         /* 56-63 */ 
_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,   /* 64-71 */ 
_U,_U,_U,_U,_U,_U,_U,_U,         /* 72-79 */ 
_U,_U,_U,_U,_U,_U,_U,_U,         /* 80-87 */ 
_U,_U,_U,_P,_P,_P,_P,_P,         /* 88-95 */ 
_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,   /* 96-103 */ 
_L,_L,_L,_L,_L,_L,_L,_L,         /* 104-111 */ 
_L,_L,_L,_L,_L,_L,_L,_L,         /* 112-119 */ 
_L,_L,_L,_P,_P,_P,_P,_C,         /* 120-127 */ 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,      /* 128-143 */ 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,      /* 144-159 */ 
_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,   /* 160-175 */ 
_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,       /* 176-191 */ 
_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,       /* 192-207 */ 
_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,       /* 208-223 */ 
_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,       /* 224-239 */ 
_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L};      /* 240-255 */

#define __ismask(x) (_ctype[(int)(unsigned char)(x)])

#define isalnum(c)  ((__ismask(c)&(_U|_L|_D)) != 0)
#define isalpha(c)  ((__ismask(c)&(_U|_L)) != 0)
#define iscntrl(c)  ((__ismask(c)&(_C)) != 0)
#define isdigit(c)  ((__ismask(c)&(_D)) != 0)
#define isgraph(c)  ((__ismask(c)&(_P|_U|_L|_D)) != 0)
#define islower(c)  ((__ismask(c)&(_L)) != 0)
#define isprint(c)  ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
#define ispunct(c)  ((__ismask(c)&(_P)) != 0)
#define isspace(c)  ((__ismask(c)&(_S)) != 0)
#define isupper(c)  ((__ismask(c)&(_U)) != 0)
#define isxdigit(c) ((__ismask(c)&(_D|_X)) != 0)

#define isascii(c) (((unsigned char)(c))<=0x7f)
#define toascii(c) (((unsigned char)(c))&0x7f)

즉 ascii영역 전체에 대해 flag를 지정해 놓은 배열입니다.

/***********************
* while(1) sleep(INFINITE);
***********************/

oprsystem의 이미지

답변 진심으로 감사 드립니다.
꼬리에 꼬리를 무는 질문은 참으로 좋지 아니하지만
하나더 드는 의문의 있습니다.
ASCII 하나에 1Byte 씩 할당되었다면, 어디에 쓸려고 저리 했는지도 궁금하고,저 괴상한 글자는 무엇인지도 궁금합니다.

황혼보다 어두운 자여
내 몸에 흐르는 피보다 더 붉은 자여
시간의 흐름 속에 파뭍힌 위대한 그대의 이름을 걸고 나 여기서 어둠에 맹세하노라
우리 앞을 가로막고 있는 모든 어리석은 자 들에게
나와 그대의 힘을
위대한 파멸의 힘을 보여줄 것을

oprsystem의 이미지

지금 보니 괴상한글자가 아니라 특정한 패턴이 있는거 같습니다.

or 연산한것도 보이고..

더 궁금해 지는군요..

황혼보다 어두운 자여
내 몸에 흐르는 피보다 더 붉은 자여
시간의 흐름 속에 파뭍힌 위대한 그대의 이름을 걸고 나 여기서 어둠에 맹세하노라
우리 앞을 가로막고 있는 모든 어리석은 자 들에게
나와 그대의 힘을
위대한 파멸의 힘을 보여줄 것을

방준영의 이미지

_U가 지정된 글자는 대문자라는 뜻입니다. 그럼 그 글자는 isupper() 매크로에 넣으면 결과가 1(참)로 나오겠죠? _L은 소문자이고, _D는 숫자, 기타 등등...

정태영의 이미지

바람돌이 wrote:
지금 보니 괴상한글자가 아니라 특정한 패턴이 있는거 같습니다.

or 연산한것도 보이고..

더 궁금해 지는군요..

#define _U  0x01    /* upper */ 
#define _L  0x02    /* lower */ 
#define _D  0x04    /* digit */ 
#define _C  0x08    /* cntrl */ 
#define _P  0x10    /* punct */ 
#define _S  0x20    /* white space (space/lf/tab) */ 
#define _X  0x40    /* hex digit */ 
#define _SP 0x80    /* hard space (0x20) */ 

우선 이부분에서.. 몇가지 매크로를 만들었구요..

00000001 0x01 /* upper */
00000010 0x02 /* lower */
00000100 0x04 /* digit */
00001000 0x08 /* cntrl */
00010000 0x10 /*punct */
00100000 0x20 /* white space (space / lf /tab ) */
01000000 0x40 /* hex digit */
10000000 0x80 /* hard space (0x20) */

왜 저런 숫자를 사용했는지는 2진수로 바꿔보면 알 수 있습니다 ;)

const unsigned char _ctype[] = { 
_C,_C,_C,_C,_C,_C,_C,_C,         /* 0-7 */ 
_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,      /* 8-15 */ 
_C,_C,_C,_C,_C,_C,_C,_C,         /* 16-23 */ 
_C,_C,_C,_C,_C,_C,_C,_C,         /* 24-31 */ 
_S|_SP,_P,_P,_P,_P,_P,_P,_P,         /* 32-39 */ 
_P,_P,_P,_P,_P,_P,_P,_P,         /* 40-47 */ 
_D,_D,_D,_D,_D,_D,_D,_D,         /* 48-55 */ 
_D,_D,_P,_P,_P,_P,_P,_P,         /* 56-63 */ 
_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,   /* 64-71 */ 
_U,_U,_U,_U,_U,_U,_U,_U,         /* 72-79 */ 
_U,_U,_U,_U,_U,_U,_U,_U,         /* 80-87 */ 
_U,_U,_U,_P,_P,_P,_P,_P,         /* 88-95 */ 
_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,   /* 96-103 */ 
_L,_L,_L,_L,_L,_L,_L,_L,         /* 104-111 */ 
_L,_L,_L,_L,_L,_L,_L,_L,         /* 112-119 */ 
_L,_L,_L,_P,_P,_P,_P,_C,         /* 120-127 */ 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,      /* 128-143 */ 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,      /* 144-159 */ 
_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,   /* 160-175 */ 
_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,       /* 176-191 */ 
_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,       /* 192-207 */ 
_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,       /* 208-223 */ 
_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,       /* 224-239 */ 
_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L};      /* 240-255 */ 

그리고 여기서 asc ii 코드 0~255까지의 값에 대해.. 어떤 것들에 속하는지를
미리 정의해 둔 걸로 보이는군요 :D

흠흠 만만한 한 줄을 예로 보면요 ;)
_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */

97~122까지는 abcdefgh...z 가 매핑되어 있습니다..
abcdef 까지는.. 소문자이고.. hex에 사용될 수 있는 글자겠죠..?

그럼 _L (lower) 와.. _H (hex) 이 두가지 속성임을 말해줘야겠군요 ;)
흠 실제로도 _L | _X 란 값을 가지고 있군요.. =3=33

그리고 103번 값은 .. g가 되기 때문에.. hex속성은 갖지 못했군요..
나머지도 비슷하게 보심되겠습니다 ;)

#define __ismask(x) (_ctype[(int)(unsigned char)(x)]) 

#define isalnum(c)  ((__ismask(c)&(_U|_L|_D)) != 0) 
#define isalpha(c)  ((__ismask(c)&(_U|_L)) != 0) 
#define iscntrl(c)  ((__ismask(c)&(_C)) != 0) 
#define isdigit(c)  ((__ismask(c)&(_D)) != 0) 
#define isgraph(c)  ((__ismask(c)&(_P|_U|_L|_D)) != 0) 
#define islower(c)  ((__ismask(c)&(_L)) != 0) 
#define isprint(c)  ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0) 
#define ispunct(c)  ((__ismask(c)&(_P)) != 0) 
#define isspace(c)  ((__ismask(c)&(_S)) != 0) 
#define isupper(c)  ((__ismask(c)&(_U)) != 0) 
#define isxdigit(c) ((__ismask(c)&(_D|_X)) != 0) 

#define isascii(c) (((unsigned char)(c))<=0x7f) 
#define toascii(c) (((unsigned char)(c))&0x7f)

여기서도 만만한 몇가지를 ;)
islower(c) 라면.. _L 속성이 세팅되어 있는지를 체크해보면 되겠군요 ;)

그렇다면.. (c&_L) 을 해보면 알 수 있겠군요.. 나머지도 다 비슷한 식이니
잠깐만 생각하면 어떤 식인지 알 수 있을거 같군요 :D

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

oprsystem의 이미지

아. .이제 이해가 됩니다.. 감사합니다.

황혼보다 어두운 자여
내 몸에 흐르는 피보다 더 붉은 자여
시간의 흐름 속에 파뭍힌 위대한 그대의 이름을 걸고 나 여기서 어둠에 맹세하노라
우리 앞을 가로막고 있는 모든 어리석은 자 들에게
나와 그대의 힘을
위대한 파멸의 힘을 보여줄 것을

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.