zoukankan      html  css  js  c++  java
  • 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代码
    作者:cpoint
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    【题解】2020 年电子科技大学 ACMICPC 暑假前集训 数据结构
    【逆向】某触控板驱动分析过程
    SME 2019 ACM 题解
    数据结构 & 算法模板汇总
    VS2010win32下cocos2dx控制台打印的方法
    CDMA写码与鉴权(转载)
    mapxtreme开发小结2(c#)
    LONG GetWindowLong函数功能
    无边框的对话框的大小拖动实现
    YUV介绍
  • 原文地址:https://www.cnblogs.com/cpoint/p/3367335.html
Copyright © 2011-2022 走看看