Minix中的字符判定ctype.c

minix中关于如何判定一个字符的类型,如大写、小写、数字……
如果采用传统的方法,如判断一个字母大写的方法:

if(c>='A' && c<'Z')  return true;

但是如果判断一个字符是数字或是字母,则采用下面的代码:

if((c<'z' && c>'a') || (c<'Z' && c>'A') || (c>'0' && c<'9'))  return true

如果假设更多的局限,效率明显下降
minix的做法是定义一个256元素的unsigned char _ctypes[]数组,由于8位需要8种属性分别描述,如下:

#define _U        0x01    /* this bit is for upper-case letters [A-Z] */
#define _L        0x02    /* this bit is for lower-case letters [a-z] */
#define _N        0x04    /* this bit is for numbers [0-9] */
#define _S        0x08    /* this bit is for white space \t \n \f etc */
#define _P        0x10    /* this bit is for punctuation characters */
#define _C        0x20    /* this bit is for control characters */
#define _X        0x40    /* this bit is for hex digits [a-f] and [A-F]*/#define    _PROTOTYPE(function, params)    function params

判断字符函数原型:

_PROTOTYPE( int isalnum, (int  _c)  );    /* alphanumeric [a-z], [A-Z], [0-9] */
_PROTOTYPE( int isalpha, (int  _c)  );    /* alphabetic */
_PROTOTYPE( int iscntrl, (int  _c)  );    /* control characters */
_PROTOTYPE( int isdigit, (int  _c)  );    /* digit [0-9] */
_PROTOTYPE( int isgraph, (int  _c)  );    /* graphic character */
_PROTOTYPE( int islower, (int  _c)  );    /* lower-case letter [a-z] */
_PROTOTYPE( int isprint, (int  _c)  );    /* printable character */
_PROTOTYPE( int ispunct, (int  _c)  );    /* punctuation mark */
_PROTOTYPE( int isspace, (int  _c)  );    /* white space sp, \f, \n, \r, \t, \v*/
_PROTOTYPE( int isupper, (int  _c)  );    /* upper-case letter [A-Z] */
_PROTOTYPE( int isxdigit,(int  _c)  );    /* hex digit [0-9], [a-f], [A-F] */
_PROTOTYPE( int tolower, (int  _c)  );    /* convert to lower-case */
_PROTOTYPE( int toupper, (int  _c)  );    /* convert to upper-case */

以上函数都是通过宏定义:

#define isalnum(c)    ((__ctype+1)[c]&(_U|_L|_N))
#define isalpha(c)    ((__ctype+1)[c]&(_U|_L))
#define iscntrl(c)    ((__ctype+1)[c]&_C)
#define isgraph(c)    ((__ctype+1)[c]&(_P|_U|_L|_N))
#define ispunct(c)    ((__ctype+1)[c]&_P)
#define isspace(c)    ((__ctype+1)[c]&_S)
#define isxdigit(c)    ((__ctype+1)[c]&(_N|_X))

#define isdigit(c)    ((unsigned) ((c)-'0') < 10)
#define islower(c)    ((unsigned) ((c)-'a') < 26)
#define isupper(c)    ((unsigned) ((c)-'A') < 26)
#define isprint(c)    ((unsigned) ((c)-' ') < 95)
#define isascii(c)    ((unsigned) (c) < 128)

minix将_ctype[]初始化为:

char __ctype[] = {
0,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C|_S,
_C|_S,
_C|_S,
_C|_S,
_C|_S,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_C,
_S,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_N,
_N,
_N,
_N,
_N,
_N,
_N,
_N,
_N,
_N,
_P,
_P,
_P,
_P,
_P,
_P,
_P,
_U|_X,
_U|_X,
_U|_X,
_U|_X,
_U|_X,
_U|_X,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_U,
_P,
_P,
_P,
_P,
_P,
_P,
_L|_X,
_L|_X,
_L|_X,
_L|_X,
_L|_X,
_L|_X,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_L,
_P,
_P,
_P,
_P,
_C,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
};
C代码

 

posted @ 2013-08-19 14:37  cpoint  阅读(433)  评论(0编辑  收藏  举报
浏览次数:travelocity promotion codes