nginx 源碼學習筆記(六)——nginx基本數據結構


簡單的數據類型

在core/ngx_confing.h中定義了基本的數據類型的映射,大部分都映射到c語言自身的數據類型:

typedef intptr_t        ngx_int_t;

typedef uintptr_t       ngx_uint_t;

typedef intptr_t        ngx_flag_t;

其中ngx_int_t,ngx_flag_t都映射為intptr_t;ngx_uint_t映射為uintptr_t。

這兩個類型在/usr/include/stdint.h的定義為:



看到這里大家應該理解,基本操作應該都是一樣的。

 

字符串的數據類型

nginx對c語言字符串類型進行了簡單的封裝,core/ngx_string.h/c里面包含了這些封裝的內容。其中定義了

ngx_str_t,

ngx_keyval_t,

ngx_variable_value_t

這幾個基礎類型:


ngx_str_t 包含兩個屬性:len即長度, data為數據;初始化使用ngx_string宏進行:

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

 

該模塊在ngx_string.h和ngx_string.c中。字符串的操作一般包括:初始化,復制,格式化輸出,大小寫轉換,查找子字符,查找子字符串,字符串轉換成數字,字符串編碼類型相關函數,字符串比較,trim,split等函數。在這個類中間沒有調用其他模塊的函數,作為一個http服務器,還需要實現URL轉換,簡單的html轉換等函數。字符串的結構體非常簡單實用,是非常值得剛入門的linux開發工程師學習的。

 

函數                                                                                       說明
ngx_string                                                                                        初始化函數
ngx_null_string                                                                                初始化空字符串函數
ngx_tolower                                                                                     字符轉小寫函數
ngx_toupper                                                                                     字符轉大寫函數
ngx_strncmp                                                                                    比較指定長度的字符串是否相同
ngx_strcmp                                                                                      比較字符串是否相同
ngx_strstr                                                                                         從字符串中找到需要的字符串
ngx_strlen                                                                                         字符串的長度
ngx_strchr                                                                                        在字符串中找到匹配的字符,返回 0為匹配
ngx_strlchr                                                                                      在字符串中找到匹配的字符,返回匹配的指針
ngx_memzero                                                                                  把一片內存區設置為
0
ngx_memset                                                                                     
把一片內存區設置為指定的數
ngx_memcpy                                                                                   復制內存,沒有返回
ngx_cpymem                                                                                   復制內存,返回復制完了dst的最后一個字符的下一個字符的指針
ngx_copy                                                                                         
ngx_cpymem
ngx_memcmp                                                                                 
比較內存中的數據是否相同
ngx_strlow                                                                                       把字符串都轉換成小寫
ngx_cpystrn                                                                                     復制字符串,並且返回字符串的最后一個字符的下一個字符的指針
ngx_pstrdup                                                                                     復制字符串到pool,返回字符串的指針
ngx_sprintf                                                                                       把各種類型的數據格式化輸出到buf,最大的長度為
65536
ngx_snprintf                                                                                     
把各種類型的數據格式化輸出到指定長度的
buf
ngx_strcasecmp                                                                                
不分大小寫比較兩個字符串是否相同
ngx_strncasecmp                                                                             指定長短不分大小寫比較兩個字符串是否相同
ngx_strnstr                                                                                       在指定大小一個字符串中是否有子字符串
ngx_strstrn                                                                                       在一個字符串中是否有子指定大小的字符串
ngx_strcasestrn                                                                                在一個字符串中是否有子指定大小的字符串,不區分大小寫
ngx_rstrncmp                                                                                   從后往前比較兩個字符串是否相同,返回相同的位置
ngx_rstrncasecmp                                                                            從后往前比較兩個字符串是否相同,返回相同的位置,不區分大小寫
ngx_memn2cmp                                                                              比較兩個指定長度的內存是否相同,也比較長的內存是否包含短的內存
ngx_atoi                                                                                           指定長度的字符串轉換成數字
ngx_atosz                                                                                         指定長度的字符串轉換成ssize_t類型數字
ngx_atoof                                                                                         指定長度的字符串轉換成off_t類型數字
ngx_atotm                                                                                        指定長度的字符串轉換成time_t類型數字

ngx_hextoi                                                                                        指定長度的字符串轉換成十六進制數字
ngx_hex_dump                                                                                 把數字轉換成16進制的字符串
ngx_encode_base64                                                                          base64編碼
ngx_decode_base64                                                                          base64解碼
ngx_utf8_decode                                                                              utf8字符解碼成雙字節的 unicode或是單字節字符,但是該函數會移動*p的值,

 

請注意

ngx_utf8_length                           得到utf8編碼的字符占幾個字節
ngx_utf8_cpystrn                         賦值utf8字符串,保證完整的復制
ngx_escape_uri                            uri進行編碼
ngx_unescape_uri                        uri的進行解碼
ngx_escape_html                         html進行編碼
ngx_sort                                       排序,主要是用於數組排序
ngx_qsort                                     快速排序
ngx_value                                     把宏數字轉換成字符串

為了測試,我們可以用以下兩種方式打印出來
1 ngx_str_t str ;
2 printf (
%* s
, str . len , str . data );
3 prinrf (
%V, & str );

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM