亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fsm.c

?? linuxFedure4環境下串口編程后臺運行狀態機
?? C
字號:
#include"fsm.h"#include"hash.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<strings.h>#ifndef DEBUG#define ifdbg if(0)#else#define ifdbg if(1)#endif#define STATE_BUCKET_NUM 32#define EVENT_BUCKET_NUM 32#define FUNC_BUCKET_NUM 32struct FSM{	/* current state */	unsigned char state[MAX_SYMBOL_LEN];	/* function table */	struct hash_table *func_table;	/* state transition rule table */	struct hash_table *state_table;};struct func_table_entry{	/* every hash table entry should include this, see hash.h */	struct hash_table_entry hash;	/* callback function pointer */	callback_ptr func;};struct state_table_entry{	/* every hash table entry should include this, see hash.h */	struct hash_table_entry hash;	/* 2nd-level hash table, with the events as key */	struct hash_table *table;};struct event_table_entry{	/* every hash table entry should include this, see hash.h */	struct hash_table_entry hash;	/* next state */	unsigned char next[MAX_SYMBOL_LEN];	/* symbol name of the function */	unsigned char func[MAX_SYMBOL_LEN];	/* symbol id of the resource */	unsigned char res[MAX_SYMBOL_LEN];};static void outofmemory(){	ifdbg printf("out of memory\n");}struct FSM *fsm_create(const struct func_table *funcv, int funcc){	int i;	struct FSM *fsm=malloc(sizeof(struct FSM));	if(fsm==NULL){		outofmemory();		return NULL;	}	if((fsm->state_table=hash_table_create(STATE_BUCKET_NUM))==NULL){		outofmemory();		free(fsm);		return NULL;	}	if((fsm->func_table=hash_table_create(FUNC_BUCKET_NUM))==NULL){		outofmemory();		hash_table_free(fsm->state_table);		free(fsm);		return NULL;	}	/* fill the function table */	for(i=0; i<funcc; ++i){		struct func_table_entry *entry			=malloc(sizeof(struct func_table_entry));		if(entry==NULL){			outofmemory();			fsm_free(fsm);			return NULL;		}		strcpy(entry->hash.key, funcv[i].symbol);		entry->func=funcv[i].func;		hash_table_add(fsm->func_table, &entry->hash);	}	ifdbg printf("fsm with %d defined functions created\n", funcc);	return fsm;}voidfsm_setstate(struct FSM *fsm, const unsigned char *state){	strcpy(fsm->state, state);	ifdbg printf("fsm state switched to %s\n", state);}intfsm_add(struct FSM *fsm, const unsigned char *state,         const unsigned char *event, const unsigned char *next,         const unsigned char *func, const unsigned char *resource){	struct hash_table_entry *entry;	struct state_table_entry *se;	struct event_table_entry *ee;	struct hash_table *event_table;	entry=hash_table_get(fsm->state_table, state);	if(entry!=NULL){		ifdbg printf("state %s appeared earlier\n", state);		se=hash_entry(entry, struct state_table_entry, hash);		event_table=se->table;	}else{		ifdbg printf("state %s first appeared\n", state);		/* allocate entry for the new state */		se=malloc(sizeof(struct state_table_entry));		if(se==NULL){			outofmemory();			return -2;		}		strcpy(se->hash.key, state);		event_table=se->table=hash_table_create(EVENT_BUCKET_NUM);		if(event_table==NULL){			outofmemory();			free(se);			return -2;		}		hash_table_add(fsm->state_table, &se->hash);	}	entry=hash_table_get(event_table, event);	if(entry!=NULL){		ifdbg printf("state transition rule with (%s, %s)"			     "already exists\n", state, event);		return -1;	}	ee=malloc(sizeof(struct event_table_entry));	if(ee==NULL){		outofmemory();		return -2;	}	strcpy(ee->hash.key, event);	strcpy(ee->next, next);	strcpy(ee->func, func);	strcpy(ee->res, resource);	hash_table_add(event_table, &ee->hash);	ifdbg printf("state transition rule (%s, %s, %s, %s, %s) added.\n",			fsm->state, event, next, func, resource);	return 0;}voidfsm_free(struct FSM *fsm){	struct hash_table_entry *pos, *pos2;	struct func_table_entry *fe;	struct state_table_entry *se;	struct event_table_entry *ee;	/* free entries in the function table */	hash_for_each(pos, fsm->func_table){		fe=hash_entry(pos, struct func_table_entry, hash);		free(fe);	}	hash_table_free(fsm->func_table);	/* free entries in the state transition rules table */	hash_for_each(pos, fsm->state_table){		se=hash_entry(pos, struct state_table_entry, hash);		/**		 * every state transition rule entry contains a 2nd		 * level hash table, free it first		 */		hash_for_each(pos2, se->table){			ee=hash_entry(pos2, struct event_table_entry, hash); 			free(ee);		}		hash_table_free(se->table);		free(se);	}	hash_table_free(fsm->state_table);	ifdbg printf("fsm freed\n");	free(fsm);}/** * read a line from given file, skipping empty or comment lines * return -1 on EOF */static int fgetline(FILE *fp, unsigned char *buf, unsigned int size){	while(!feof(fp)){		int i=0;		fgets(buf, size, fp);		while(buf[i]!='\0' && buf[i]!='#' && buf[i]!='\n'			&& (buf[i]==' ' || buf[i]=='\t')) ++i;		if(buf[i]=='\0' || buf[i]=='#' || buf[i]=='\n'){			ifdbg printf("empty line or comment line skipped\n");			continue;		}		else return 0;	}	ifdbg printf("end of file reached\n");	return -1;}/** * split buf into n tokens * return negative on error */static inttokenize(unsigned char *buf, unsigned char *tok[], unsigned int n){	int i=0, j;	/* preprocessing */	while(buf[i]!='\0'){		switch(buf[i]){			/* convert tabs into spaces */			case '\t':				buf[i]=' ';				break;			/* 			 * end-of-line and comment character: 			 * simply treat as end-of-string 			 */			case '\n':			case '#':				buf[i]='\0';				break;		}		++i;	}	i=0;	for(j=0;j<n;++j){		/* skip whitespaces */		while(buf[i]==' ') ++i;		/* end-of-buf before retrieving all required tokens? */		if(buf[i]=='\0'){			ifdbg{			       	printf("not enough fields in line");				for(i=0; i<j; ++i) printf("%s  ", tok[i]);				printf("required %d\n", n);			}			return -1;		}		/* beginning of token */		tok[j]=buf+i;		while(buf[i]!=' ' && buf[i]!='\0') ++i;		/* end of token */		if(buf[i]!='\0') buf[i++]='\0';	}		/* any extra fields? */	while(buf[i]==' ') ++i;	if(buf[i]=='\0') return 0; /* no */	else{		ifdbg{			printf("too many fields in line");			for(i=0; i<n; ++i) printf("%s  ", tok[i]);			printf("...  required %d\n", n);		}	       	return -2;	}}struct FSM *fsm_load(const unsigned char *filename,          const struct func_table *funcv, int funcc){	const unsigned int BUFLEN=(MAX_SYMBOL_LEN*6u);	unsigned char buf[BUFLEN];	unsigned char *token[5];	FILE *fp=fopen(filename, "r");	struct FSM *fsm;	if(fp==NULL){		ifdbg printf("failed to open file %s\n", filename);		return NULL;	}	fsm=fsm_create(funcv, funcc);	if(fsm==NULL){		ifdbg printf("failed to create fsm object\n");		goto err;	}	/* read initial state */	if(fgetline(fp, buf, BUFLEN)!=0){		ifdbg printf("failed to read initial state\n");		goto err;	}	if(tokenize(buf, token, 2)!=0){		ifdbg printf("failed to read initial state\n");		goto err;	}	if(strcasecmp("initstate", token[0])!=0){		ifdbg printf("failed to read initial state\n");		goto err;	}	fsm_setstate(fsm, token[1]);	/* read state transition rules */	while(1){		if(fgetline(fp, buf, BUFLEN)!=0) break;		if(tokenize(buf, token, 5)!=0){			ifdbg printf("failed to read transition rule\n");			goto err;		}		fsm_add(fsm, token[0], token[1], token[2], token[3], token[4]);	}	fclose(fp);		ifdbg printf("fsm configuration file read successfully\n");	return fsm;err:	if(fp!=NULL) fclose(fp);	if(fsm!=NULL) fsm_free(fsm);	return NULL;}int fsm_doevent(struct FSM *fsm, const unsigned char *event){	struct hash_table_entry *entry;	struct state_table_entry *se;	struct event_table_entry *ee;	struct func_table_entry *fe;	entry=hash_table_get(fsm->state_table, fsm->state);	if(entry==NULL){		ifdbg printf("state %s not defined\n", fsm->state);		return -1;	}	se=hash_entry(entry, struct state_table_entry, hash);	entry=hash_table_get(se->table, event);	if(entry==NULL){		ifdbg printf("event %s not defined for state %s\n", 			     event, fsm->state);		return -2;	}	ee=hash_entry(entry, struct event_table_entry, hash);	entry=hash_table_get(fsm->func_table, ee->func);	if(entry==NULL){		ifdbg printf("function %s not defined\n", ee->func);		return -3;	}	fe=hash_entry(entry, struct func_table_entry, hash);	ifdbg printf("calling function %s with resource %s on event %s "		     "at state %s\n", ee->func, ee->res, fsm->state, event);	fe->func(ee->res);	fsm_setstate(fsm, ee->next);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美aaa在线| www国产成人免费观看视频 深夜成人网| 亚洲与欧洲av电影| 国产精品国产三级国产有无不卡 | 精品国产一区久久| 久久婷婷综合激情| 亚洲精品一区二区三区四区高清 | 国产成人av一区二区| 九九在线精品视频| 国产伦理精品不卡| 99久免费精品视频在线观看| 成人免费毛片嘿嘿连载视频| 91视频在线看| 91精品久久久久久久91蜜桃 | 欧美高清你懂得| 粉嫩在线一区二区三区视频| 99国产精品视频免费观看| 国产一区在线观看视频| 不卡在线观看av| 777xxx欧美| 亚洲视频在线观看三级| 天堂av在线一区| 久草在线在线精品观看| 91小视频在线观看| 久久久天堂av| 日韩av网站在线观看| 色综合久久综合网| 国产日韩欧美电影| 国内精品国产三级国产a久久| 成人免费视频网站在线观看| 欧美一区永久视频免费观看| 中文字幕日韩一区| 国内一区二区在线| 日韩视频国产视频| 天天色综合天天| 色999日韩国产欧美一区二区| 久久久久久亚洲综合影院红桃| 亚洲va中文字幕| 91黄色在线观看| 一区二区三区精品视频在线| 丁香婷婷综合激情五月色| 日韩欧美黄色影院| 久99久精品视频免费观看| 亚洲成a人片综合在线| 国产成人综合亚洲网站| 国产欧美1区2区3区| 国产激情视频一区二区在线观看| 欧美一区二区三区在| 亚洲成人精品一区二区| 91精品国产综合久久香蕉的特点| 日日夜夜免费精品| 精品国产亚洲一区二区三区在线观看| 亚洲h精品动漫在线观看| 一区二区中文视频| 美女一区二区三区在线观看| 日韩欧美国产三级| 国产免费成人在线视频| 欧美人牲a欧美精品| 国内成人免费视频| 成人精品国产免费网站| 日韩视频免费观看高清完整版 | 一区二区三区精密机械公司| 欧美日韩一区中文字幕| 激情另类小说区图片区视频区| 欧美国产日产图区| 欧美乱熟臀69xxxxxx| 国产一区二区伦理| 亚洲一区二区av在线| 中文字幕精品在线不卡| 91精品国产色综合久久久蜜香臀| 成人黄色国产精品网站大全在线免费观看| 26uuuu精品一区二区| 色综合天天做天天爱| 国产一本一道久久香蕉| 一区二区三区在线观看视频| 国产亚洲一区字幕| 欧美一区二区国产| 欧美日韩1234| 欧美日韩一级大片网址| 91成人网在线| 色综合久久久久久久| 91浏览器打开| 成人免费观看av| 国产成人av资源| 粉嫩嫩av羞羞动漫久久久| 国产呦精品一区二区三区网站 | 色综合天天综合在线视频| 国产精品资源网| 成人午夜激情影院| 成人avav影音| 欧美在线看片a免费观看| 欧美在线观看一二区| 欧美三级中文字幕在线观看| 在线观看亚洲a| 欧美精品免费视频| 精品国产乱码久久久久久影片| 91黄色激情网站| 视频一区二区国产| 青青青爽久久午夜综合久久午夜| 亚洲成人中文在线| 久久国产福利国产秒拍| 国产高清在线精品| 色综合天天性综合| 91精品蜜臀在线一区尤物| 欧美一级黄色大片| 日本一区二区免费在线观看视频 | 成人一区二区三区在线观看| 不卡的av中国片| 日韩一区二区三区视频在线观看 | 日本视频中文字幕一区二区三区| 麻豆精品视频在线观看视频| 成人aa视频在线观看| 91麻豆精品国产综合久久久久久| 欧美群妇大交群中文字幕| 久久美女艺术照精彩视频福利播放| 亚洲国产精品ⅴa在线观看| 一区二区三区中文字幕精品精品| 免费观看成人av| 欧美在线综合视频| 亚洲欧洲日本在线| 国产精品一区二区黑丝| 欧美三级韩国三级日本三斤| 欧美国产日韩精品免费观看| 久久精品国产99国产精品| 一本到三区不卡视频| 欧美韩国日本综合| 国产精品一区二区三区四区| 欧美精品电影在线播放| 一区二区三区在线高清| 成人免费高清在线观看| 久久久不卡网国产精品二区| 青娱乐精品视频在线| 88在线观看91蜜桃国自产| 亚洲午夜激情网站| 欧美丝袜丝交足nylons图片| 国产精品色噜噜| 午夜国产不卡在线观看视频| 国产精品中文字幕欧美| 久久综合资源网| 成人少妇影院yyyy| 一区免费观看视频| 欧美午夜精品电影| 免费一级欧美片在线观看| 日韩午夜电影在线观看| 轻轻草成人在线| 国产欧美中文在线| 欧美熟乱第一页| 久久aⅴ国产欧美74aaa| 国产精品乱人伦| 欧美日韩成人一区| 大白屁股一区二区视频| 亚洲美女在线国产| 日韩精品资源二区在线| 国产白丝精品91爽爽久久| 亚洲午夜激情av| 国产三区在线成人av| 欧美亚洲另类激情小说| 国产精品1区2区| 丝袜a∨在线一区二区三区不卡| 精品欧美一区二区三区精品久久| av电影天堂一区二区在线| 亚洲成人午夜电影| 亚洲欧美视频一区| 久久综合视频网| 欧美一区二区三区四区在线观看| eeuss鲁一区二区三区| 久久精品免费观看| 裸体健美xxxx欧美裸体表演| 亚洲婷婷综合色高清在线| 久久久久久久久久电影| 欧美成人vr18sexvr| 欧美精品久久99久久在免费线| 色香蕉成人二区免费| 99这里只有精品| av一区二区三区在线| 91一区在线观看| 在线观看免费亚洲| 91浏览器入口在线观看| 91在线视频免费观看| 成人爱爱电影网址| 99re视频精品| 欧美日韩国产综合久久| 色综合久久88色综合天天| 91精品福利视频| 欧美日韩1234| 精品久久久久久久久久久久久久久久久 | 亚洲人成亚洲人成在线观看图片| 日韩亚洲欧美中文三级| 欧美一级二级三级乱码| 欧美精品一区二区三区视频| 2024国产精品| 国产精品白丝在线| 一二三区精品视频| 久久国产综合精品| 成人av在线观| 精品日产卡一卡二卡麻豆| 国产精品免费人成网站| 一区二区三区四区在线播放| 六月婷婷色综合| 在线影院国内精品|