簡單的數(shù)據(jù)類型
在core/ngx_confing.h中定義了基本的數(shù)據(jù)類型的映射,大部分都映射到c語言自身的數(shù)據(jù)類型:
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的定義為:
- /* 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
看到這里大家應(yīng)該理解,基本操作應(yīng)該都是一樣的。
字符串的數(shù)據(jù)類型
nginx對c語言字符串類型進(jìn)行了簡單的封裝,core/ngx_string.h/c里面包含了這些封裝的內(nèi)容。其中定義了
ngx_str_t,
ngx_keyval_t,
ngx_variable_value_t
這幾個基礎(chǔ)類型:
- typedef struct {
- size_t len;
- u_char *data;
- } ngx_str_t;
-
-
- 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;
ngx_str_t 包含兩個屬性:len即長度, data為數(shù)據(jù);初始化使用ngx_string宏進(jìn)行:
#define ngx_string(str) {sizeof(str) -1,(u_chart*)str }
該模塊在ngx_string.h和ngx_string.c中。字符串的操作一般包括:初始化,復(fù)制,格式化輸出,大小寫轉(zhuǎn)換,查找子字符,查找子字符串,字符串轉(zhuǎn)換成數(shù)字,字符串編碼類型相關(guān)函數(shù),字符串比較,trim,split等函數(shù)。在這個類中間沒有調(diào)用其他模塊的函數(shù),作為一個http服務(wù)器,還需要實現(xiàn)URL轉(zhuǎn)換,簡單的html轉(zhuǎn)換等函數(shù)。字符串的結(jié)構(gòu)體非常簡單實用,是非常值得剛?cè)腴T的linux開發(fā)工程師學(xué)習(xí)的。
函數(shù) 說明
ngx_string
初始化函數(shù)
ngx_null_string
初始化空字符串函數(shù)
ngx_tolower 字符轉(zhuǎn)小寫函數(shù)
ngx_toupper
字符轉(zhuǎn)大寫函數(shù)
ngx_strncmp
比較指定長度的字符串是否相同
ngx_strcmp 比較字符串是否相同
ngx_strstr
從字符串中找到需要的字符串
ngx_strlen
字符串的長度
ngx_strchr
在字符串中找到匹配的字符,返回 0為匹配
ngx_strlchr
在字符串中找到匹配的字符,返回匹配的指針
ngx_memzero
把一片內(nèi)存區(qū)設(shè)置為0
ngx_memset 把一片內(nèi)存區(qū)設(shè)置為指定的數(shù)
ngx_memcpy
復(fù)制內(nèi)存,沒有返回
ngx_cpymem
復(fù)制內(nèi)存,返回復(fù)制完了dst的最后一個字符的下一個字符的指針
ngx_copy 同ngx_cpymem
ngx_memcmp
比較內(nèi)存中的數(shù)據(jù)是否相同
ngx_strlow
把字符串都轉(zhuǎn)換成小寫
ngx_cpystrn
復(fù)制字符串,并且返回字符串的最后一個字符的下一個字符的指針
ngx_pstrdup
復(fù)制字符串到pool,返回字符串的指針
ngx_sprintf 把各種類型的數(shù)據(jù)格式化輸出到buf,最大的長度為65536
ngx_snprintf 把各種類型的數(shù)據(jù)格式化輸出到指定長度的buf
ngx_strcasecmp 不分大小寫比較兩個字符串是否相同
ngx_strncasecmp 指定長短不分大小寫比較兩個字符串是否相同
ngx_strnstr
在指定大小一個字符串中是否有子字符串
ngx_strstrn 在一個字符串中是否有子指定大小的字符串
ngx_strcasestrn
在一個字符串中是否有子指定大小的字符串,不區(qū)分大小寫
ngx_rstrncmp
從后往前比較兩個字符串是否相同,返回相同的位置
ngx_rstrncasecmp
從后往前比較兩個字符串是否相同,返回相同的位置,不區(qū)分大小寫
ngx_memn2cmp 比較兩個指定長度的內(nèi)存是否相同,也比較長的內(nèi)存是否包含短的內(nèi)存
ngx_atoi
指定長度的字符串轉(zhuǎn)換成數(shù)字
ngx_atosz 指定長度的字符串轉(zhuǎn)換成ssize_t類型數(shù)字
ngx_atoof
指定長度的字符串轉(zhuǎn)換成off_t類型數(shù)字
ngx_atotm
指定長度的字符串轉(zhuǎn)換成time_t類型數(shù)字
ngx_hextoi 指定長度的字符串轉(zhuǎn)換成十六進(jìn)制數(shù)字
ngx_hex_dump 把數(shù)字轉(zhuǎn)換成16進(jìn)制的字符串
ngx_encode_base64 base64編碼
ngx_decode_base64 base64解碼
ngx_utf8_decode
把 utf8字符解碼成雙字節(jié)的 unicode或是單字節(jié)字符,但是該函數(shù)會移動*p的值,
請注意
ngx_utf8_length
得到utf8編碼的字符占幾個字節(jié)
ngx_utf8_cpystrn 賦值utf8字符串,保證完整的復(fù)制
ngx_escape_uri
對uri進(jìn)行編碼
ngx_unescape_uri 對uri的進(jìn)行解碼
ngx_escape_html
對html進(jìn)行編碼
ngx_sort
排序,主要是用于數(shù)組排序
ngx_qsort
快速排序
ngx_value 把宏數(shù)字轉(zhuǎn)換成字符串
為了測試,我們可以用以下兩種方式打印出來
1 ngx_str_t str ;
2 printf (” %* s” , str . len , str . data );
3 prinrf (”%V”, & str );
|