typedef struct ngx_str_t;
/*通過乙個以』\0』結尾的普通字串str構造乙個nginx的字串,
鑑於其中採用sizeof操作符計算字串長度,因此引數必須是乙個常量字串。*/
#define ngx_string(str)
/*使用ngx_null_string初始化字串為空字串*/
#define ngx_null_string
/*設定字串str為text,text必須為常量字串*/
#define ngx_str_set(str, text) \
(str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
/*設定str為空串*/
#define ngx_str_null(str) (str)->len = 0; (str)->data = null
/***ngx_str_t的賦值、初始化***/
ngx_str_t str = ngx_string("hello world"); //right
ngx_str_t str1 = ngx_null_string; //right
ngx_str_t str, str1;
str = ngx_string("hello world"); // 編譯出錯,在c中結構體中涉及到指標時,是不允許直接賦值的
str1 = ngx_null_string; // 編譯出錯
ngx_str_set(&str, "hello world"); //right
ngx_str_null(&str1); //right
str = (ngx_str_t) ngx_string("hello world");//c99標準允許編譯
str1 = (ngx_str_t) ngx_null_string; //c99標準允許編譯
/*由於ngx_str_set與ngx_str_null實際上是兩行語句,故在if/for/while等語句中單獨使用需要用花括號括起來,*/
ngx_str_t str;
if (cond)
ngx_str_set(&str, "true"); // 問題產生
else
ngx_str_set(&str, "false"); // 問題產生
void ngx_strlow(u_char *dst, u_char *src, size_t n);//將src的前n個字元轉換成小寫存放在dst字串中,呼叫者需要保證dst指向的空間大於等於n。
void ngx_strncmp(u_char *dst, u_char *src, size_t n);//區分大小寫的字串比較,只比較前n個字元。
void ngx_strcmp(u_char *dst, u_char *src);//區分大小寫的不帶長度的字串比較。
ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2);//不區分大小寫的不帶長度的字串比較。
ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n);//不區分大小寫的帶長度的字串比較,只比較前n個字元。
/*下面這三個函式用於字串格式化,
ngx_snprintf的第二個引數max指明buf的空間大小,
ngx_slprintf則通過last來指明buf空間的大小。
推薦使用第二個或第三個函式來格式化字串,ngx_sprintf函式還是比較危險的,容易產生緩衝區溢位漏洞。
在這一系列函式中,nginx在相容glibc中格式化字串的形式之外,還新增了一些方便格式化nginx型別的一些轉義字元,
比如%v用於格式化ngx_str_t結構。
在nginx原始檔的ngx_string.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, const char *fmt, ...);
u_char * ngx_cdecl ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...);
//對src進行反編碼,type可以是0、ngx_unescape_uri、ngx_unescape_redirect這三個值。
void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);
uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size);//對html標籤進行編碼。
nginx原始碼學習 資料結構 ngx str
nginx中關於字串的資料結構位於src core ngx string.c和src core ngx string.h中 先來看一下資料結構 1 typedef struct ngx str t data指標指向字串起始位址,len表示字串的有效長度。這裡面的data並不保證以 0 結尾,所以必須...
nginx資料結構 ngx array t
typedef struct ngx array s ngx array t struct ngx array s 建立乙個新的陣列物件,並返回這個物件。p 陣列分配記憶體使用的記憶體池。n 陣列的初始容量大小,即在不擴容的情況下最多可以容納的元素個數。size 單個元素的大小,單位是位元組。ngx...
nginx中ngx list的資料結構
今天沒事了,在檢視nginx源 中看到ngx list的結構,發現設計為鍊錶陣列的形式,不知道為什麼這樣設計 struct ngx list part s typedef struct ngx list t 只實現三個方法 ngx list t ngx list create ngx pool t ...