-
Notifications
You must be signed in to change notification settings - Fork 0
/
chconf.h
185 lines (183 loc) · 6.39 KB
/
chconf.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <string>
#include <vector>
#include <string>
#include <fstream>
typedef struct sub_ch_conf{
string name;
string extra;
vector<string> value;
}CHConfigType;
class ch_conf{
public:
std::vector<std::string> split(const std::string& s, char delimiter){
std::vector<std::string> tokens;
std::string token;
std::istringstream tokenStream(s);
while(std::getline(tokenStream, token, delimiter))tokens.push_back(token);
return tokens;
}
void replace(std::string& str, const std::string& before, const std::string& after){
for (std::string::size_type pos(0); pos != std::string::npos; pos += after.length()){
pos = str.find(before, pos);
if (pos != std::string::npos)str.replace(pos, before.length(), after);else break;
}
}
vector<string> operator[](string key){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key)return all_conf[i].value;
vector<string> null;
return null;
}
CHConfigType operator[](int index){
return all_conf[index];
}
CHConfigType at(int i){
return all_conf[i];
}
int size(){
return all_conf.size();
}
vector<string> getExtraArrSplitedBySpace(string key){
vector<string> result;
int k=all_conf.size();
for(int i=0;i<k;i++)if(all_conf[i].name==key)
return split(all_conf[i].extra,' ');
return result;
}
CHConfigType* get(string key){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key)return &all_conf[i];
return NULL;
}
CHConfigType read(string key){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key)return all_conf[i];
CHConfigType tmp;
return tmp;
}
bool isKey(string key){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key)return true;
return false;
}
bool verifyKeyValue(string key){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key){
int s=all_conf[i].value.size();
for(int j=0;j<s;j++){
string str=all_conf[i].value[j];
unsigned int index=str.find("=");
if(index==str.npos)return false;
if(index==0)return false;//第一个字符不能是等于,后面可以有等于
}
return true;
}
return true;//空的,kv语法正确
}
string getExtra(string key){//获取额外数据
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key)return all_conf[i].extra;
return "";
}
vector<string>* getValue(string key){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key)return &all_conf[i].value;
return NULL;
}
vector<string> readValue(string key){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key)return all_conf[i].value;
vector<string> tmp;
return tmp;
}
string getKeyValue(string key,string key2,string defaule_value=""){
int k=all_conf.size();//开始处理
for(int i=0;i<k;i++)if(all_conf[i].name==key){
int s=all_conf[i].value.size();
for(int j=0;j<s;j++){
string str=all_conf[i].value[j];
unsigned int index=str.find("=");
if(index==str.npos)continue;
if(index==0)continue;//第一个字符不能是等于,后面可以有等于
if(str.substr(0,index)==key2)return str.substr(index+1);
}
return defaule_value;
}
return defaule_value;//空的也算kv吗
}
ch_conf(string path){
vector<string> str=read_file(path);//读取文件
int k=str.size();
bool is_recv=false;
//string text1;
//string text2;
CHConfigType conf;
for(row=0;row<k;row++){//开始处理
string line;
line=str[row];
int s=line.size();
bool is_start=false;
int lineType=0;
for(column=0;column<s;column++){//开始处理
char c=line[column];
if(!is_start){
if(isspace(c))continue;//空白字符跳过
if(c==';')break;//这一行是注释,跳过这一整行
is_start=true;
if(c!='['){
if(!is_recv){
print_stack("格式错误!缺少左中括号。");
return;
}else{
lineType=2;//这一行的类型是整行行
}
}else{
lineType=1;//这一行的类型是中括号型
if(conf.name.size()>0)all_conf.push_back(conf);
CHConfigType conf_new;
conf=conf_new;
if(line.find("]")==line.npos){
print_stack("格式错误!未关闭的中括号!");
return;
}
conf.name=line.substr(line.find("[")+1,line.find("]")-1);
conf.extra=line.substr(line.find("]")+1);
if(conf.name.size()==0){
print_stack("格式错误!中括号内不能为空!");
return;
}
is_recv=true;
// cout<<"[]:::"<<text1<<endl<<text2<<endl;
break;
}
}
if(lineType==2){
conf.value.push_back(line);
break;
}else{
print_stack("格式错误!未知字符。");
return;
}
}
}
if(conf.name.size()>0)all_conf.push_back(conf);
//全部处理完成
}
vector<string> read_file(string path){
vector<string> str;
fstream fin;
fin.open(path, ios::in);
string tmp;
while(getline(fin, tmp))str.push_back(tmp);
fin.close();
return str;
}
private:
vector<CHConfigType> all_conf;
int row=0;
int column=0;
void print_stack(string text){
//cout<<row<<":"<<column<<" "<<text<<endl;
printf("%d:%d %s\n",row+1,column+1,text.c_str());
}
};