⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config_file.c

📁 很少见的linux下的红外口的工具
💻 C
📖 第 1 页 / 共 2 页
字号:
			rem->pzero=s_strtolirc_t(val);			rem->szero=s_strtolirc_t(val2);			return(2);		}		else if (strcasecmp("foot",key)==0){			rem->pfoot=s_strtolirc_t(val);			rem->sfoot=s_strtolirc_t(val2);			return(2);		}		else if (strcasecmp("repeat",key)==0){			rem->prepeat=s_strtolirc_t(val);			rem->srepeat=s_strtolirc_t(val2);			return(2);		}		else if (strcasecmp("pre",key)==0){			rem->pre_p=s_strtolirc_t(val);			rem->pre_s=s_strtolirc_t(val2);			return(2);		}		else if (strcasecmp("post",key)==0){			rem->post_p=s_strtolirc_t(val);			rem->post_s=s_strtolirc_t(val2);			return(2);		}	}	if(val2){		logprintf(LOG_ERR,"error in configfile line %d:",line);		logprintf(LOG_ERR,"unknown definiton: \"%s %s %s\"",			  key, val, val2);	}else{		logprintf(LOG_ERR,"error in configfile line %d:",line);		logprintf(LOG_ERR,"unknown definiton or too few arguments: "			  "\"%s %s\"",key, val);	}	parse_error=1;	return(0);}    struct ir_remote * read_config(FILE *f){	char buf[LINE_LEN+1], *key, *val, *val2;        int len,argc;	struct ir_remote *top_rem=NULL,*rem=NULL;        struct void_array codes_list,raw_codes,signals;	struct ir_ncode raw_code={NULL,0,0,NULL};	struct ir_ncode name_code={NULL,0,0,NULL};	int mode=ID_none;	line=0;	parse_error=0;	while(fgets(buf,LINE_LEN,f)!=NULL)	{		line++;		len=strlen(buf);		if(len==LINE_LEN && buf[len-1]!='\n')		{			logprintf(LOG_ERR,"line %d too long in config file",				  line);			parse_error=1;			break;		}		if(len>0)		{			len--;			if(buf[len]=='\n') buf[len]=0;		}		if(len>0)		{			len--;			if(buf[len]=='\r') buf[len]=0;		}                /* ignore comments */                if(buf[0]=='#'){			continue;                }		key=strtok(buf," \t");		/* ignore empty lines */		if(key==NULL) continue;		val=strtok(NULL, " \t");		if(val!=NULL){			val2=strtok(NULL, " \t");			LOGPRINTF(3,"\"%s\" \"%s\"",key,val);                        if (strcasecmp("begin",key)==0){				if (strcasecmp("codes", val)==0){                                        /* init codes mode */					LOGPRINTF(2,"    begin codes");					if (!checkMode(mode, ID_remote,						       "begin codes")) break;					if (rem->codes){						logprintf(LOG_ERR,"error in configfile line %d:",line);						logprintf(LOG_ERR,"codes are already defined");						parse_error=1;						break;					}					                                        init_void_array(&codes_list,30, sizeof(struct ir_ncode));                                        mode=ID_codes;                                }else if(strcasecmp("raw_codes",val)==0){                                        /* init raw_codes mode */					LOGPRINTF(2,"    begin raw_codes");					if(!checkMode(mode, ID_remote,						  "begin raw_codes")) break;					if (rem->codes){						logprintf(LOG_ERR,"error in configfile line %d:",line);						logprintf(LOG_ERR,"codes are already defined");						parse_error=1;						break;					}					rem->flags|=RAW_CODES;					raw_code.code=0;                                        init_void_array(&raw_codes,30, sizeof(struct ir_ncode));                                        mode=ID_raw_codes;                                }else if(strcasecmp("remote",val)==0){					/* create new remote */					LOGPRINTF(1,"parsing remote");					if(!checkMode(mode, ID_none,						  "begin remote")) break;                                        mode=ID_remote;                                        if (!top_rem){                                                /* create first remote */						LOGPRINTF(2,"creating first remote");                                                rem=top_rem=s_malloc(sizeof(struct ir_remote));                                        }else{                                                /* create new remote */						LOGPRINTF(2,"creating next remote");                                                rem->next=s_malloc(sizeof(struct ir_remote));;                                                rem=rem->next;                                        }				}else if(mode==ID_codes){					add_void_array(&codes_list, defineCode(key, val, &name_code));					if(!parse_error && val2!=NULL)					{						logprintf(LOG_WARNING,"garbage after '%s'"							  " code in line %d ignored",							  key,line);					}                                }else{                                        logprintf(LOG_ERR,"error in configfile line %d:",line);					logprintf(LOG_ERR,"unknown section \"%s\"",val);                                        parse_error=1;                                }				if(!parse_error && val2!=NULL)				{					logprintf(LOG_WARNING,"garbage after "						  "'%s' token in line %d ignored",						  val,line);				}                        }else if (strcasecmp("end",key)==0){				if (strcasecmp("codes", val)==0){					/* end Codes mode */					LOGPRINTF(2,"    end codes");                                        if (!checkMode(mode, ID_codes,						       "end codes")) break;                                        rem->codes=get_void_array(&codes_list);                                        mode=ID_remote;     /* switch back */                                }else if(strcasecmp("raw_codes",val)==0){                                        /* end raw codes mode */					LOGPRINTF(2,"    end raw_codes");										if(mode==ID_raw_name){						raw_code.signals=get_void_array(&signals);						raw_code.length=signals.nr_items;						if(raw_code.length%2==0)						{							logprintf(LOG_ERR,"error in configfile line %d:",line);							logprintf(LOG_ERR,"bad signal length",val);							parse_error=1;						}						if(!add_void_array(&raw_codes, &raw_code))							break;						mode=ID_raw_codes;					}                                        if(!checkMode(mode,ID_raw_codes,						      "end raw_codes")) break;					rem->codes=get_void_array(&raw_codes);					mode=ID_remote;     /* switch back */                                }else if(strcasecmp("remote",val)==0){                                        /* end remote mode */					LOGPRINTF(2,"end remote");					/* print_remote(rem); */                                        if (!checkMode(mode,ID_remote,                                                  "end remote")) break;                                        if (!rem->name){                                                logprintf(LOG_ERR,"you must specify a remote name");                                                parse_error=1;                                                break;                                        }					/* not really necessary because we					   clear the alloced memory */                                        rem->next=NULL;					rem->last_code=NULL;                                        mode=ID_none;     /* switch back */					if(has_repeat_gap(rem) && 					   is_const(rem))					{						logprintf(LOG_WARNING,"repeat_gap will be ignored if CONST_LENGTH flag is set");					}				}else if(mode==ID_codes){					add_void_array(&codes_list, defineCode(key, val, &name_code));					if(!parse_error && val2!=NULL)					{						logprintf(LOG_WARNING,"garbage after '%s'"							  " code in line %d ignored",							  key,line);					}                                }else{                                        logprintf(LOG_ERR,"error in configfile line %d:",line);					logprintf(LOG_ERR,"unknown section %s",val);                                        parse_error=1;                                }				if(!parse_error && val2!=NULL)				{					logprintf(LOG_WARNING,"garbage after '%s'"						  " token in line %d ignored",						  val,line);				}                        } else {				switch (mode){				case ID_remote:					argc=defineRemote(key, val, val2, rem);					if(!parse_error && ((argc==1 && val2!=NULL) || 					   (argc==2 && val2!=NULL && strtok(NULL," \t")!=NULL)))					{						logprintf(LOG_WARNING,"garbage after '%s'"							  " token in line %d ignored",							  key,line);					}					break;				case ID_codes:					add_void_array(&codes_list, defineCode(key, val, &name_code));					if(!parse_error && val2!=NULL)					{						logprintf(LOG_WARNING,"garbage after '%s'"							  " code in line %d ignored",							  key,line);					}					break;				case ID_raw_codes:				case ID_raw_name:					if(strcasecmp("name",key)==0){						LOGPRINTF(3,"Button: \"%s\"",val);						if(mode==ID_raw_name)						{                                                        raw_code.signals=get_void_array(&signals);							raw_code.length=signals.nr_items;							if(raw_code.length%2==0)							{								logprintf(LOG_ERR,"error in configfile line %d:",line);								logprintf(LOG_ERR,"bad signal length",val);								parse_error=1;							}							if(!add_void_array(&raw_codes, &raw_code))								break;						}						if(!(raw_code.name=s_strdup(val))){							break;						}						raw_code.code++;						init_void_array(&signals,50,sizeof(lirc_t));						mode=ID_raw_name;						if(!parse_error && val2!=NULL)						{							logprintf(LOG_WARNING,"garbage after '%s'"								  " token in line %d ignored",								  key,line);						}					}else{						if(mode==ID_raw_codes)						{							logprintf(LOG_ERR,"no name for signal defined at line %d",line);							parse_error=1;							break;						}						if(!addSignal(&signals, key)) break;						if(!addSignal(&signals, val)) break;						if (val2){							if (!addSignal(&signals, val2)){								break;							}						}						while ((val=strtok(NULL," \t"))){							if (!addSignal(&signals, val)) break;						}					}					break;				}			}		}else if(mode==ID_raw_name){                        if(!addSignal(&signals, key)){				break;			}		}else{                        logprintf(LOG_ERR,"error in configfile line %d", line);			parse_error=1;			break;                }                if (parse_error){                        break;                }        }	if(mode!=ID_none)	{		switch(mode)		{		case ID_raw_name:			if(raw_code.name!=NULL)			{				free(raw_code.name);				if(get_void_array(&signals)!=NULL)					free(get_void_array(&signals));			}		case ID_raw_codes:			rem->codes=get_void_array(&raw_codes);			break;		case ID_codes:			rem->codes=get_void_array(&codes_list);			break;		}		if(!parse_error)		{			logprintf(LOG_ERR,"unexpected end of file");			parse_error=1;		}	}        if (parse_error){		free_config(top_rem);                return((void *) -1);        }	/* kick reverse flag */	rem=top_rem;	while(rem!=NULL)	{		if((!is_raw(rem)) && rem->flags&REVERSE)		{			struct ir_ncode *codes;						if(has_pre(rem))			{				rem->pre_data=reverse(rem->pre_data,						      rem->pre_data_bits);			}			if(has_post(rem))			{				rem->post_data=reverse(rem->post_data,						       rem->post_data_bits);			}			codes=rem->codes;			while(codes->name!=NULL)			{				codes->code=reverse(codes->code,rem->bits);				codes++;			}			/* rem->flags=rem->flags&(~REVERSE); */			/* don't delete the flag because we still need			   it to remain compatible with older versions			*/		}		rem=rem->next;	}#       if defined(DEBUG) && !defined(DAEMONIZE)        /*fprint_remotes(stderr, top_rem);*/#       endif        return (top_rem);}void free_config(struct ir_remote *remotes){	struct ir_remote *next;	struct ir_ncode *codes;		while(remotes!=NULL)	{		next=remotes->next;		if(remotes->name!=NULL) free(remotes->name);		if(remotes->codes!=NULL)		{			codes=remotes->codes;			while(codes->name!=NULL)			{				free(codes->name);				if(codes->signals!=NULL)					free(codes->signals);				codes++;			}			free(remotes->codes);		}		free(remotes);		remotes=next;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -