一種hyperscan API使用(1)


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,后邊在進行操作。

 


免責聲明!

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



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