nginx中關於字串的資料結構位於src/core/ngx_string.c和src/core/ngx_string.h中
先來看一下資料結構:
1 typedef structngx_str_t;
data指標指向字串起始位址,len表示字串的有效長度。這裡面的data並不保證以'\0'結尾,所以必須配合len去使用,否則極其容易造成緩衝區溢位。另外,不保證以'\0'也就說明它是二進位制安全的。
下面看一下比較簡單的一些函式,都是用巨集對c語言中字串的庫函式做了一層封裝而已。
nginx 字串的初始化使用 ngx_string 或 ngx_null_string ,這兩個巨集定義如下:
1#define ngx_string(str)
2#define ngx_null_string
若已經定義了 nginx 字串變數之後再賦值,則必須使用 ngx_str_set, ngx_str_null 巨集定義:
1#define ngx_str_set(str, text)
2 (str)->len = sizeof(text)-1; (str)->data = (u_char *)text34
#define ngx_str_null(str) (str)->len = 0; (str)->data = null
以下是例子:
1/*例如:*/2
/*正確寫法
*/3 ngx_str_t str1 = ngx_string("
hello nginx");
4 ngx_str_t str2 =ngx_null_string;56
/*錯誤寫法*/7
ngx_str_t str1, str2;
8 str1 = ngx_string("
hello nginx
"); /*
編譯出錯
*/9 str2 = ngx_null_string; /*
編譯出錯
*/10
11/*
正確寫法
*/12
ngx_str_t str1, str2;
13 ngx_str_set(&str1, "
hello nginx");
14 ngx_str_null(&str2);
15/*
注意:ngx_string 和 ngx_str_set 字串引數必須是常量字串,不能是變數字串
*/
1 #define ngx_strncmp(s1, s2, n) strncmp((const char *) s1, (const char *) s2, n)
1#define ngx_strcmp(s1, s2) strcmp((const char *) s1, (const char *) s2)
1#define ngx_strstr(s1, s2) strstr((const char *) s1, (const char *) s2)
1#define ngx_strlen(s) strlen((const char *) s)
1#define ngx_strchr(s1, c) strchr((const char *) s1, (int) c)
1#define ngx_memzero(buf, n) (void) memset(buf, 0, n)
2#define ngx_memset(buf, c, n) (void) memset(buf, c, n)
1#define ngx_memcpy(dst, src, n) (void) memcpy(dst, src, n)
2#define ngx_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n))
1#define ngx_memmove(dst, src, n) (void) memmove(dst, src, n)
2#define ngx_movemem(dst, src, n) (((u_char *) memmove(dst, src, n)) + (n))
1#define ngx_memcmp(s1, s2, n) memcmp((const char *) s1, (const char *) s2, n)
這些函式都沒有什麼好解釋的。
轉換大小寫的函式:
1#define ngx_tolower(c) (u_char) ((c >= 'a' && c <= 'z') ? (c | 0x20) : c)
2#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)
這裡非常巧妙,就是對第6位進行處理,大小寫字母的差是32,而0x20對應32。
還有一些需要再補充……
nginx原始碼學習 資料結構 ngx int
nginx中關於整型的資料結構位於src core ngx config.h中 結構比較簡單,就是乙個typedef的操作,具體如下 1 typedef intptr t ngx int t 2typedef uintptr t ngx uint t 3 typedef intptr t ngx f...
Nginx原始碼結構
上一章對nginx的架構有了乙個初步的了解。這章,為了對原始碼仔細的剖析,先要對nginx的原始碼結構有乙個了解。從巨集觀上把握原始碼模組的結構。一.nginx原始碼的3個目錄結構 在安裝的nginx的目錄下,有乙個目錄src,這裡邊存放了nginx的所有源 包括 core,event,http,m...
資料結構原始碼 迷宮
include include include include include define stack init size 1000 define stack more 10 define overflow 2 define ok 1 define error 0 define true 1 de...