7 bool find_var(
const string &str,
const vector<string>var_type_list,
8 vector<string>&var_type,vector<string>&var_name);
9 bool find_endvar(
const string &str,
const string vtype);
10 bool find_chunk(
const string &str);
12 int main (
int argc,
char** argv)
16 cout<<
"Please provide the dmrpp file name to be checked and the output name."<<endl;
20 string fname(argv[1]);
21 ifstream dmrpp_fstream;
22 dmrpp_fstream.open(fname.c_str(),ifstream::in);
26 vector<string> var_type_list;
27 var_type_list.push_back(
"Float32");
28 var_type_list.push_back(
"Int32");
29 var_type_list.push_back(
"Float64");
30 var_type_list.push_back(
"Byte");
31 var_type_list.push_back(
"Int16");
32 var_type_list.push_back(
"UInt16");
33 var_type_list.push_back(
"String");
34 var_type_list.push_back(
"UInt32");
35 var_type_list.push_back(
"Int8");
36 var_type_list.push_back(
"Int64");
37 var_type_list.push_back(
"UInt64");
38 var_type_list.push_back(
"UInt8");
39 var_type_list.push_back(
"Char");
42 vector<string>var_type;
43 vector<string>var_name;
46 vector<bool>chunk_exist;
54 bool fin_vb_start =
false;
55 bool fin_vb_end =
false;
56 bool chunk_found =
false;
59 while(getline(dmrpp_fstream,dmrpp_line)) {
62 if(
true == fin_vb_start) {
65 if(var_type.empty()) {
66 cout<<
"Doesn't have the variable datatype, abort for dmrpp file "<<fname << endl;
70 if(
false == fin_vb_end)
71 fin_vb_end = find_endvar(dmrpp_line, var_type[var_type.size()-1]);
74 if(
true == fin_vb_end) {
75 if(
false == chunk_found)
76 chunk_exist.push_back(
false);
85 if(
false == chunk_found) {
86 chunk_found = find_chunk(dmrpp_line);
88 if(
true == chunk_found)
89 chunk_exist.push_back(
true);
94 fin_vb_start = find_var(dmrpp_line,var_type_list,var_type,var_name);
100 if(chunk_exist.size()!=var_type.size()) {
101 cout<<
"Number of chunk check is not consistent with the number of var check."<<endl;
102 cout<<
"The dmrpp file is "<<fname<<endl;
107 for(
size_t i = 0; i<var_type.size(); i++)
108 cout<<
"var_type["<<i<<
"]= "<<var_type[i]<<endl;
109 for(
size_t i = 0; i<var_name.size(); i++) {
110 cout<<
"var_name["<<i<<
"]= "<<var_name[i]<<endl;
111 cout<<
"chunk_exist["<<i<<
"]= "<<chunk_exist[i]<<endl;
115 bool has_missing_info =
false;
116 size_t last_missing_chunk_index = -1;
120 for (
size_t i =var_type.size()-1;i>=0;i--) {
121 if(
false == chunk_exist[i]){
122 has_missing_info =
true;
123 last_missing_chunk_index = i;
130 for (
size_t i =0;i<var_type.size();i++) {
131 if(
false == chunk_exist[i]){
134 cout<<
"The following variables don't have data value information(datatype + data name): "<<endl;
135 cout<< var_type[i] <<
" "<<var_name[i] <<endl;
141 if(
true == has_missing_info) {
143 ofstream dmrpp_ofstream;
144 string fname2(argv[2]);
145 dmrpp_ofstream.open(fname2.c_str(),ofstream::out);
147 for (
size_t i =0;i<var_type.size();i++) {
148 if(
false == chunk_exist[i]) {
149 if (i!=last_missing_chunk_index)
150 dmrpp_ofstream<<var_name[i] <<
",";
152 dmrpp_ofstream<<var_name[i];
156 dmrpp_ofstream.close();
165 bool find_var(
const string &str,
const vector<string>var_type_list,
166 vector<string>&var_type,vector<string>&var_name) {
176 size_t non_space_char_pos = str.find_first_not_of(
' ');
177 if(non_space_char_pos == string::npos){
182 if(str[non_space_char_pos]!=
'<') {
187 if(str.size() <= (non_space_char_pos+1)){
193 if(str[str.size()-1]!=
'>' ) {
198 char char_2 = str[non_space_char_pos+1];
203 string v_1char_list =
"FIUBSC";
206 if(v_1char_list.find_first_of(char_2)==string::npos) {
211 string sep=
" name=\"";
212 size_t sep_pos = str.find(sep,non_space_char_pos+2);
215 if(sep_pos == string::npos){
220 size_t var_index = -1;
222 for (
size_t i = 0; i<var_type_list.size() && !found ;i++) {
223 if(str.compare(non_space_char_pos+1,sep_pos-non_space_char_pos-1,var_type_list[i]) == 0) {
236 size_t end_name_pos = str.find(end_quote,sep_pos+sep.size()+1);
237 if(end_name_pos == string::npos)
241 string var_name_line = str.substr(sep_pos+sep.size(),end_name_pos-sep_pos-sep.size());
242 var_type.push_back(var_type_list[var_index]);
243 var_name.push_back(var_name_line);
252 bool find_chunk(
const string &str) {
254 string chunk_mark =
"<dmrpp:chunk ";
255 string offset_mark =
"offset";
256 size_t chunk_mark_pos = str.find(chunk_mark);
257 if(chunk_mark_pos !=string::npos) {
258 if(string::npos != str.find(offset_mark, chunk_mark_pos+chunk_mark.size()))
266 bool find_endvar(
const string &str,
const string vtype) {
268 string end_var =
"</" + vtype +
'>';
269 size_t vb_end_pos = str.find(end_var);
270 if(vb_end_pos !=string::npos) {
271 if((vb_end_pos + end_var.size())==str.size())