Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330989
  • 博文数量: 100
  • 博客积分: 2620
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 02:50
文章分类

全部博文(100)

文章存档

2011年(5)

2010年(12)

2009年(83)

分类:

2010-01-14 16:32:41

String in Nginx

 由于Nginx是C写的,为了方便Nginx封装了一套字符串操作函数,提供了很多字符串和编码解码函数,有点特别的就是,再封装atoi系列函数时(atosz,atotm,atoof等)这些函数的实现基本一样,只是返回值的类型不一样,但是确将同一份代码拷贝了多遍,每个函数内部只是把返回值的类型修改一下,为什么不提供统一的函数返回一个值,不同的返回值再强制转换一下呢?
ngx_int_t
ngx_atoi(u_char *line, size_t n)
{
    ngx_int_t  value;//返回值
    if (n == 0) {
        return NGX_ERROR;
    }   
    for (value = 0; n--; line++) {
        if (*line < '0' || *line > '9') {
            return NGX_ERROR;
        }   
        value = value * 10 + (*line - '0');
    }   
    if (value < 0) {
        return NGX_ERROR;
    } else {
        return value;
    }   
}
 另外,nginx提供了一个将16进制字符串转换成10进制数字的函数ngx_hextoi,其中将大小写统一处理的一行代码比较好:
ngx_int_t
ngx_hextoi(u_char *line, size_t n)
{
    u_char     c, ch;
    ngx_int_t  value;
    if (n == 0) {
        return NGX_ERROR;
    }
    for (value = 0; n--; line++) {
        ch = *line;
        if (ch >= '0' && ch <= '9') {
            value = value * 16 + (ch - '0');
            continue;
        }
        c = (u_char) (ch | 0x20); //这里
        if (c >= 'a' && c <= 'f') {
            value = value * 16 + (c - 'a' + 10);
            continue;
        }
        return NGX_ERROR;
    }
    if (value < 0) {
        return NGX_ERROR;
    } else {
        return value;
    }
}
 相当于把字母都加了32,变成了小写形式,这行代码还是很优雅的。
阅读(2045) | 评论(0) | 转发(0) |
0

上一篇:Array in Nginx

下一篇:深入学习MySQL授权表

给主人留下些什么吧!~~