首先,是整數類型:
src/core/ngx_config.h
typedef intptr_t ngx_int_t;
typedef uintptr_t ngx_uint_t;
typedef intptr_t ngx_flag_t;
即整數、無符號整數和bool。intptr_t 等三種類型定義如下:
/usr/local/include/stdint.h
/* Types for `void *' pointers. */
#if __WORDSIZE == 64
# ifndef __intptr_t_defined
typedef long int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned long int uintptr_t;
#else
# ifndef __intptr_t_defined
typedef int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned int uintptr_t;
#endif
即:64系統則使用長整形(8字節),否則使用整形(4字節)。
然後是字符串型:
/src/core/ngx_string.h
typedef struct {
size_t len;
u_char *data;
} ngx_str_t;
接着,定義了一堆字符串相關的函數,類似於對應於ngx_str_t的成員函數吧。
函數 | 描述 |
---|---|
ngx_string(str) | 構造函數,str指向\0結尾的字符串 |
ngx_null_string | 空構造函數 |
ngx_str_set(str, text) | text指向\0結尾的字符串,將它set給ngx_str_t對象str |
ngx_strncmp | 封裝strncmp |
ngx_strcmp | 封裝strcmp |
… | … |
此外,順便定義了其他幾個類型:
typedef struct {
ngx_str_t key;
ngx_str_t value;
} ngx_keyval_t;
typedef struct { // 位域用來標示類型等元信息
unsigned len:28;
unsigned valid:1;
unsigned no_cacheable:1;
unsigned not_found:1;
unsigned escape:1;
u_char *data;
} ngx_variable_value_t;
typedef struct {
ngx_rbtree_node_t node;
ngx_str_t str;
} ngx_str_node_t;
定義了自己的錯誤類型:(原因是系統的strerror和strerror_r函數不是信號安全的,因此作者將錯誤碼對應的錯誤msg拷貝了一遍,自己維護,自己的函數寫的很簡單,是信號安全的)
src/os/unix/ngx_errno.h
typedef int ngx_err_t;
// 根據錯誤號err,將對應的描述信息拷貝到errstr,最多拷貝size字節
u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size);
ngx_int_t ngx_strerror_init(void);
系統的errno.h中定義了錯誤號,多層include後最終錯誤號定義於/usr/include/asm-generic/errno.h中。
而strerror和strerror_r函數聲明於string.h