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, };
作者:cpoint
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.