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,变成了小写形式,这行代码还是很优雅的。
阅读(2038) | 评论(0) | 转发(0) |