hyperscan:
編譯和安裝:http://www.cnblogs.com/zzqcn/p/4900643.html
簡單介紹:http://www.cnblogs.com/zzqcn/p/4898620.html
使用:正則編譯-》匹配
1.編譯
本次使用
hs_error_t hs_compile_ext_multi(const char * const *expressions, // 正則表達式數組
const unsigned *flags, // 每個正則的flag選項,本次使用HS_FLAG_SINGLEMATCH ,可用 | 相加
const unsigned *ids, // 每個正則表達式的唯一編號,匹配正則后會返回這個id
const hs_expr_ext * const *ext, // 不知道干啥的
unsigned elements, // 個數
unsigned mode, // 模式,按上面第二個鏈接介紹,本次使用HS_MODE_BLOCK
const hs_platform_info_t *platform, // NULL 也不知道干啥的
hs_database_t **db, // 編譯后輸出 hs_dababase_t
hs_compile_error_t **error); // 錯誤信息
hs_error_t hs_alloc_scratch(const hs_database_t *db, hs_scratch_t **scratch) ;
生成scratch臨時數據,編譯的時候好像沒用到。根據db生成。
2.序列化和反序列化
可以把db生成文件供外部使用
API:
1)序列化:
hs_error_t hs_serialize_database(const hs_database_t *db, //db數據
char **bytes, // 序列化后的數據(輸出)
size_t *serialized_length) // 序列化后的長度(輸出)
2)反序列化
hs_error_t hs_deserialize_database(const char *bytes, //從文件中讀到的序列化數據
const size_t length, //長度
hs_database_t **db) // 反序列化得到的db數據(輸出)
3.匹配
生成臨時數據
hs_scratch_t* g_scratch = NULL;
hs_error_t hs_err = hs_alloc_scratch(hs_db, &g_scratch); //hs_db是反序列化得到的db數據
匹配配API:
hs_error_t hs_scan(const hs_database_t *db, //db數據
const char *data, //匹配母串
unsigned length, //長度
unsigned flags, // 0
hs_scratch_t *scratch, // 臨時數據
match_event_handler onEvent, // 回調函數,匹配到會進入此函數
void *userCtx) // 傳給回調函數的變量
回調函數:
typedef int (*match_event_handler)(unsigned int id, // 匹配到的id,由編譯的時候控制,用到此id。
unsigned long long from, //
unsigned long long to, // from和to可能是匹配到的位置信息
unsigned int flags, // 傳入的flag吧?
void *context); // 參數
如果匹配到了,會得到正則的id,后邊在進行操作。