在hyperscan使用過(guò)程中,調(diào)用流模式或者塊模式進(jìn)行匹配之后勤众,經(jīng)常需要一個(gè)回調(diào)函數(shù)來(lái)告知使用者匹配的結(jié)果,這樣回調(diào)函數(shù)onMatch就應(yīng)運(yùn)而生。
首先我們先來(lái)看一下定義
typedef?int( * match_event_handler)(unsigned int?id, unsigned long long?from, unsigned long long?to, unsigned int?flags, void?*context)
從定義我們可以看出鳞滨,回調(diào)函數(shù)包含的參數(shù)包括:索引,從哪里開(kāi)始蟆淀,到哪里結(jié)束拯啦,標(biāo)志位,用戶提供給匹配函數(shù)的指針熔任。
通過(guò)設(shè)置褒链,用戶可以將指針指向預(yù)先設(shè)置好的結(jié)構(gòu)體,以便將匹配結(jié)果輸出笋敞。
調(diào)用hs_scan()碱蒙,hs_scan_vector()或hs_scan_stream()函數(shù)(或其他可以產(chǎn)生匹配的流調(diào)用)的應(yīng)用程序必須提供與定義類(lèi)型匹配的回調(diào)函數(shù)。 只要在執(zhí)行掃描期間匹配位于目標(biāo)數(shù)據(jù)中夯巷,就會(huì)調(diào)用此回調(diào)函數(shù)赛惩。匹配的詳細(xì)信息作為參數(shù)傳遞給回調(diào)函數(shù),回調(diào)函數(shù)應(yīng)返回一個(gè)值趁餐,指示是否應(yīng)繼續(xù)匹配目標(biāo)數(shù)據(jù)喷兼。如果掃描調(diào)用不需要回調(diào),則可以使用NULL以抑制匹配結(jié)果生成后雷。
?此回調(diào)函數(shù)不應(yīng)嘗試在同一個(gè)流上調(diào)用Hyperscan API函數(shù)季惯,也不應(yīng)嘗試重用為導(dǎo)致觸發(fā)它的API調(diào)用分配的臨時(shí)空間吠各。使用完全獨(dú)立的參數(shù)再次調(diào)用Hyperscan庫(kù)應(yīng)該可以工作(例如,在新流中掃描不同的數(shù)據(jù)庫(kù)并使用新的臨時(shí)空間)勉抓,但重用流狀態(tài)和/或暫存空間等數(shù)據(jù)結(jié)構(gòu)將產(chǎn)生未定義的行為贾漏。?
返回值
如果匹配應(yīng)該停止,則為非零藕筋,否則為零纵散。如果在流模式下執(zhí)行掃描并返回非零值,則對(duì)該流的任何后續(xù)hs_scan_stream()調(diào)用將立即返回HS_SCAN_TERMINATED隐圾。
參數(shù)?
id:匹配的表達(dá)式的ID號(hào)伍掀。如果表達(dá)式是使用hs_compile()編譯的單個(gè)表達(dá)式,則此值將為零暇藏。?
FROM: 如果為當(dāng)前模式啟用了匹配開(kāi)始標(biāo)志蜜笤,則該參數(shù)將設(shè)置為模式的匹配開(kāi)始,假設(shè)匹配值的開(kāi)始位于由SOM_HORIZON模式之一選擇的當(dāng)前“匹配范圍的開(kāi)始”內(nèi)標(biāo)志盐碱。 如果匹配開(kāi)始值位于此范圍之外(僅在SOM_HORIZON值不是HS_MODE_SOM_HORIZON_LARGE時(shí)可能)把兔,則from值將設(shè)置為HS_OFFSET_PAST_HORIZON。 如果未對(duì)給定模式啟用匹配開(kāi)始標(biāo)志甸各,則此參數(shù)將設(shè)置為零垛贤。
?to:與表達(dá)式匹配的最后一個(gè)字節(jié)后的偏移量。
?flags:目前尚未使用趣倾。
?context:用戶提供給hs_scan()聘惦,hs_scan_vector()或hs_scan_stream()函數(shù)的指針。