第一个数据结构ngx_str

来源:互联网 发布:api原油库存今天数据 编辑:程序博客网 时间:2024/06/05 13:30

     大笑第一个数据结构 ngx_str:

ngx_str 在core\ngx_string里面。 字符串的重要性咱就不用多说了。反正基本上就是没有啥程序不用到字符串操作的。

打开ngx_string 首先看到的就是咱们的ngx_str的定义

typedefstruct {

    size_t      len;

     u_char     *data;

        } ngx_str_t;

   特别的简单粗暴,保存一个指针,再保存一个长度就收工了。或许你会感觉 这个len 可以不需要要嘛,最多是节约下 获取长度的时候进行的strlen操作嘛。具体是为啥,看了下面的定义就知道了。

#define ngx_string(str)     { sizeof(str) - 1, (u_char *) str }

#define ngx_null_string     { 0, NULL }

#define ngx_str_set(str, text)                                               \

    (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text

从上面的初始化和赋值函数上来看。在长度的这块并不是使用常规的方式,调用的strlen。而是使用的sizeof操作。所以,咱们保存的data不是必须是以'\0'结尾的字符串。所以在操作上会有很大的不同,咱们也需要时刻记住,这货遇到'\0'也不一定后面就没了。

所以说初始化的话 咱们就可以酱紫

ngx_str_t magic = ngx_string("magic");

ngx_str_t null_str =ngx_null_string;

改变值的话:

ngx_str_set(&magic,"hello");

如果来个

magic = ngx_null_string;

酱紫就是错误的。具体的错误喃,属于C语言基础上的。

下面说下对操作:

因为咱们保存的data不是以'\0'结尾的,所以在很大程度的操作上,会有很大的问题,因为大家都知道系统提供的api,都是以'\0',所以一般在取出data进行操作的时候,要么是拷贝个出来,把它加上'\0',要么是暴力的在data后面加个'\0',然后完了换回去,不过后面那种操作可能会存在问题,就是这个会不会越界啥的。


#define ngx_tolower(c)      (u_char) ((c >= 'A' && c <='Z') ? (c | 0x20) : c)

#define ngx_toupper(c)      (u_char) ((c >= 'a' && c <='z') ? (c & ~0x20) : c)

大小写转换的函数

void ngx_strlow(u_char *dst,u_char *src, size_t n);

把src转换为小写,赋值给dst。不改变src。一般来说,要注意的问题就是两个的内存大小都要有n。不然你懂的。

#define ngx_strncmp(s1, s2, n)  strncmp((const char *) s1, (const char *) s2, n)

#define ngx_strcmp(s1, s2)  strcmp((const char *) s1, (const char *) s2)

#define ngx_strstr(s1, s2)  strstr((const char *) s1, (const char *) s2)

#define ngx_strlen(s)       strlen((const char *) s)

#define ngx_strchr(s1, c)   strchr((const char *) s1, (int) c)

这些经常看到没啥说的 都是保证咱们命名规则嘛。

static ngx_inlineu_char *

ngx_strlchr(u_char *p,u_char *last, u_char c);

p为开始,last为结束,找到一个c的位置。


u_char * ngx_cdecl ngx_sprintf(u_char *buf,const char *fmt, ...);

u_char * ngx_cdecl ngx_snprintf(u_char *buf,size_t max, constchar *fmt, ...);

u_char * ngx_cdecl ngx_slprintf(u_char *buf,u_char *last, constchar *fmt,

    ...);

u_char *ngx_vslprintf(u_char *buf,u_char *last, constchar *fmt, va_list args);

#define ngx_vsnprintf(buf, max, fmt, args)                                   \

    ngx_vslprintf(buf, buf + (max), fmt, args)

/*

 * supported formats:

 *    %[0][width][x][X]O        off_t

 *    %[0][width]T              time_t

 *    %[0][width][u][x|X]z      ssize_t/size_t

 *    %[0][width][u][x|X]d      int/u_int

 *    %[0][width][u][x|X]l      long

 *    %[0][width|m][u][x|X]i    ngx_int_t/ngx_uint_t

 *    %[0][width][u][x|X]D      int32_t/uint32_t

 *    %[0][width][u][x|X]L      int64_t/uint64_t

 *    %[0][width|m][u][x|X]A    ngx_atomic_int_t/ngx_atomic_uint_t

 *    %[0][width][.width]f      double, max valid number fits to %18.15f

 *    %P                        ngx_pid_t

 *    %M                        ngx_msec_t

 *    %r                        rlim_t

 *    %p                        void *

 *    %V                        ngx_str_t *

 *    %v                        ngx_variable_value_t *

 *    %s                        null-terminated string

 *    %*s                       length and string

 *    %Z                        '\0'

 *    %N                        '\n'

 *    %c                        char

 *    %%                        %

 *

 *  reserved:

 *    %t                        ptrdiff_t

 *    %S                        null-terminated wchar string

 *    %C                        wchar

 */

支持的类型

来看

ngx_vslprintf(u_char *buf,u_char *last, constchar *fmt, va_list args)

buf 要写入的but

last buf的结束位置

fmt 格式

args 参数

一般来说最好使用带有buf长度,避免溢出。

剩下的函数都是比如base64_encode 都是一些常规函数,可以用的时候看








0 0
原创粉丝点击