分析文档下载地址:http://download.csdn.net/source/3449024
1、首先利用acsmNew 初始化结构体ACSM_PATTERN,ACSM_STATETABLE,ACSM_STRUCT,其中ACSM_PATTERN保存每个字符串,在函数acsmAddPattern中采用倒插法将3个字符串做成一个链表
typedef struct _acsm_pattern {
struct _acsm_pattern *next;
unsigned char *patrn;
unsigned char *casepatrn;
int n;
int nocase;
void * id;
int nmatch;
} ACSM_PATTERN;
typedef struct {
/* Next state - based on input character */
int NextState[ ALPHABET_SIZE ];
/* Failure state - used while building NFA & DFA */
int FailState;
/* List of patterns that end here, if any */
ACSM_PATTERN *MatchList;
}ACSM_STATETABLE;
/*
* State machine Struct
*/
typedef struct {
int acsmMaxStates;
int acsmNumStates;
ACSM_PATTERN * acsmPatterns;
ACSM_STATETABLE * acsmStateTable;
}ACSM_STRUCT;
2、利用acsmCompile 函数生成状态表同时将NFA转换为DFA,生成状态表信息中包含,每个状态在256个字符路径上的下一个状态跳转,没有跳转的值为-1,同时将pattern中的字符串链表拷贝到状态表的Matchlist中;由NFA生成DFA主要是将所有路径上无下一个状态值-1替换为0,将每个状态的失效状态记录到Failstate默认是0,同时将失效状态的字符串拷贝到Matchlist链表中。
3、调用acsmSearch 搜索所有文本文件中的内容,如果状态的Matchlist不为空则输出相应状态值,直到字符串匹配完成,输出匹配结果。
例如{“he”,"she","his"}模式生成状态机过程举例请参考PPT文档