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

📄 paramreaderutil.cpp

📁 2002年
💻 CPP
字号:
/*********************************
Author:	Yaojinyi
Date:	2002-2-10 10:30:47
Description:
	Read Param from configure file
Last modifier:	Yaojinyi
Last modification date:	2002-2-10 10:30:47
Note:
*********************************/
#include "paramreaderutil.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define NULLCHAR	'\0'

//class ParamReader paramreader;

ParamReader::ParamReader(){
}

void ParamReader::AddItem(option_t& item){
	opt.push_back(item);
}

void ParamReader::ResetItem(){
	opt.clear();
}

void ParamReader::GetOptions(int argc, char** argv){	
	/* skip command name */
	argv++ ; argc-- ;
	
	/* first, search option '-file' */
	int i ;
	for(i = 0 ; i < argc-1 ; i++) {
		if (!strcmp(*(argv + i),"-file")) {
			GetOptions(*(argv+i+1));
		}
	}
	
	/* next, analyze command line option */
	while (argc > 0) {
		if (!strcmp(*argv, "-file")) {
			argv += 2 ;
			argc -= 2 ;
			continue ;
		}
		std::vector<option_t>::iterator iter;
		for(iter = opt.begin(); iter != opt.end(); iter ++)
		{
			if (strcmp(*argv + 1, iter->optname))
				continue ;
			
			/* match */
			argv++ ;
			argc-- ;
			
			switch(iter->vsize) {
			case V_INT:
				*((int *)iter->vptr) = atoi(*argv) ;
				break ;
			case V_STRING:
				strcpy((char *)iter->vptr, *argv) ;
				break ;
				
			case V_FLOAT:
				*((float *)iter->vptr) = float(atof(*argv)) ;
				break ;
				
			case V_BOOL:
				*((bool *)iter->vptr) = true ;
				argv-- ;
				argc++ ;
				break ;
				
			case V_ONOFF:
				if (argc > 0 && (*argv)[0] != '-') {	
					*((bool *)iter->vptr) = (!strcmp(*argv, "on")) ? true : false ;
				} else {
					/* if there's nothing specified, then we set it to true */
					*((bool *)iter->vptr) = true;
					argv-- ;
					argc++ ;
				}
				break ;
			}
			break ;
		}		
		
		argv++ ;
		argc-- ;
	}
}
void ParamReader::ParseOptions(const char *Info){
	for(;Info[0] !=NULL;Info++)
	{
		if (Info[0] == '('){
			ParseItem(Info+1);
		}
	}
};

void ParamReader::GetOptions(const char* filename){	
	FILE *fp ;
	if ((fp = fopen(filename,"r")) == NULL) {
		return ;    
	}
	
	char buf[100] ;
	while(fgets(buf,100,fp) != NULL) {
		/* ignore remark line */
		if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r') continue ;
		
		/* replace from ':' to ' ' */
		char *t = buf ;
		while(*t != NULLCHAR) {
			if (*t == ':') *t = ' ' ;
			t++ ;
		}
		ParseItem(buf);		
	}
	
	fclose(fp) ;
}

void ParamReader::ReadString(const char** src, char* value){
	while((*src)[0] == ' ' || (*src)[0] == '"' 
		|| (*src)[0] == '\t' || (*src)[0] == '\n' ||
		(*src)[0] == '\r')
	{
		(*src) ++;
	}

	while((*src)[0] != ')' && (*src)[0] != 0 && (*src)[0] != '"' 
		&& (*src)[0] != ' ' && (*src)[0] != '\t' && (*src)[0] != '\n'
		&& (*src)[0] != '\r')
	{
		*value= *(*src) ;
		value++;
		(*src)++;
	}
	*value = '\0';
}

void ParamReader::ParseItem(const char *buf)
{
		int n;
		char com[256] ;
		char onoff[16] ;
		n = sscanf(buf,"%s", com);
		if (n < 1) {
			return ;
		}
		buf += strlen(com);

		std::vector<option_t>::iterator iter;
		for(iter = opt.begin(); iter != opt.end(); iter ++)
		{
			if (strcmp(com, iter->optname))
				continue ;
			/* match */
			switch(iter->vsize) {
			case V_INT:
				n = sscanf(buf, "%d", (int *)iter->vptr) ;
				break ;
				
			case V_STRING:
				ReadString(&buf, (char*)iter->vptr);
				break ;
				
			case V_FLOAT:
				n = sscanf(buf, "%f", (float *)iter->vptr) ;
				break ;
				
			case V_BOOL:				
			case V_ONOFF:
				ReadString(&buf, onoff);
				if(!strncmp(onoff, "1", 1) || !strncmp(onoff, "on", 2) || !strncmp(onoff, "yes", 3)){
					*((bool *)iter->vptr) = true;
				}else{
					*((bool *)iter->vptr) = false;
				}
				break ;
			default:
				break;
			}
			
			break ;
		}
}

⌨️ 快捷键说明

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