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

📄 global_config.cpp

📁 C++ web POSIX framewark
💻 CPP
字号:
#include "global_config.h"#include <stdio.h>#include <ctype.h>#include <stdlib.h>#include <string.h>namespace cppcms {bool cppcms_config::get_tocken(FILE *f,tocken_t &T){	int c;	while((c=fgetc(f))!=EOF) {		if(c=='.') {			T.first='.';			return true;		}		else if(c=='{') {			T.first='{';			return true;		}		else if(c=='}') {			T.first='}';			return true;		}		else if(c=='=') {			T.first='=';			return true;		}		else if(c=='\n') {			line_counter++;			continue;		}		else if(c==' ' || c=='\r' || c=='\t') {			continue;		}		else if(isalpha(c)) {			T.second="";			T.second.reserve(32);			T.second+=(char)c;			while((c=fgetc(f))!=EOF && (isalnum(c) || c=='_')) {				T.second+=(char)c;			}			if(c!=EOF){				ungetc(c,f);			}			T.first=WORD;			return true;		}		else if(isdigit(c) || c=='-') {			T.second="";			T.second.reserve(32);			T.second+=(char)c;			T.first=INT;			while((c=fgetc(f))!=EOF && isdigit(c)) {				T.second+=(char)c;			}			if(c=='.') {				T.second+='.';				T.first=DOUBLE;				while((c=fgetc(f))!=EOF && isdigit(c)) {					T.second+=(char)c;				}			}			if(T.second=="-" || T.second=="." || T.second=="-.") {				throw cppcms_error("Illegal charrecters");			}			if(c!=EOF) {				ungetc(c,f);			}			return true;		}		else if(c=='\"') {			T.first=STR;			T.second="";			T.second.reserve(128);			for(;;){				c=fgetc(f);				if(c=='\\'){					if((c=fgetc(f))=='\"' ) {						T.second+='"';						continue;					}					else {						T.second+='\\';					}				}				if(c==EOF){					throw cppcms_error("Unexpected EOF ");				}				if(c=='\n') line_counter++;				if(c=='\"') {					return true;				}				T.second+=(char)c;			}		}		else if(c=='#' || c==';'){			while((c=fgetc(f))!=EOF) {				if(c=='\n'){					line_counter++;					break;				}			}			if(c==EOF) {				return false;			}		}		else {			throw cppcms_error(string("Unexpected charrecter")+(char)c);		}	}	return false;}void cppcms_config::load(char const *fname){	if(loaded){		return;	}	FILE *f=fopen(fname,"r");	line_counter=1;	if(!f) {		throw cppcms_error(string("Failed to open file:")+fname);	}	tocken_t T;	string key;	int state=0;	try{		while(get_tocken(f,T) && state != -1) {			switch(state) {			case 0: if(T.first != WORD) {					state=-1;				}else{					key=T.second;					state=1;				}				break;			case 1: if(T.first != '.')					state=-1;				else					state=2;				break;			case 2: if(T.first!=WORD){					state=-1;				}else{					state=3;					key+='.';					key+=T.second;				}				break;			case 3: if(T.first!= '=')					state=-1;				else					state=4;				break;			case 4: if(T.first=='{') {					state=5;					break;				}				if(T.first==INT) {					int val=atol(T.second.c_str());					data[key]=val;				}				else if(T.first==DOUBLE) {					double val=atof(T.second.c_str());					data[key]=val;				}				else if(T.first==STR){					data[key]=T.second;				}				else {					state=-1;					break;				}				state=0;				break;			case 5:				if(T.first==INT || T.first==DOUBLE || T.first==STR) {					int fp=T.first;					vector<int> vl;					vector<double> vd;					vector<string> vs;					do {						if(T.first=='}') {							state=0;						}						else if(T.first==fp){							switch(T.first) { 							case INT: vl.push_back(atol(T.second.c_str())); break;							case DOUBLE: vd.push_back(atof(T.second.c_str())); break;							case STR: vs.push_back(T.second); break;							}						}						else {							state=-1;						}					}while(state==5 && get_tocken(f,T));					if(state==0) {						switch(fp) {						case INT: data[key]=vl; break;						case DOUBLE: data[key]=vd; break;						case STR: data[key]=vs; break;						};					}				}				else 					state=-1;				break;			}		}		if(state!=0) {			throw cppcms_error("Parsing error");		}	}	catch (cppcms_error &err){		fclose(f);		char stmp[32];		snprintf(stmp,32," at line %d",line_counter);		throw cppcms_error(string(err.what())+stmp);	}	fclose(f);	loaded=true;}void cppcms_config::load(int argc,char *argv[],char const *def){	if(loaded) {		return;	}	char const *def_file=def;	int i;	for(i=1;i<argc;i++) {		if(strncmp(argv[i],"--config=",9)==0) {			def_file=argv[i]+9;			break;		}		else if(strcmp(argv[i],"-c")==0 && i+1<argc) {			def_file=argv[i+1];			break;		}	}	if(def_file==NULL) {		def_file=getenv("CPPCMS_CONFIG");	}	if(def_file==NULL) {		throw cppcms_error("Configuration file not defined");	}	load(def_file);}}

⌨️ 快捷键说明

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