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 = 0;
119 if (!var_type.empty()) {
120 auto ritr = var_type.rbegin();
121 size_t i = var_type.size() - 1;
122 while(ritr != var_type.rend()) {
123 if (!chunk_exist[i]) {
124 has_missing_info =
true;
125 last_missing_chunk_index = i;
135 for (
size_t i =0;i<var_type.size();i++) {
136 if(
false == chunk_exist[i]){
139 cout<<
"The following variables don't have data value information(datatype + data name): "<<endl;
140 cout<< var_type[i] <<
" "<<var_name[i] <<endl;
146 if(
true == has_missing_info) {
148 ofstream dmrpp_ofstream;
149 string fname2(argv[2]);
150 dmrpp_ofstream.open(fname2.c_str(),ofstream::out);
153 for (
auto vt:var_type) {
154 if(!chunk_exist[i]) {
155 if (i!=last_missing_chunk_index)
156 dmrpp_ofstream<<var_name[i] <<
",";
158 dmrpp_ofstream<<var_name[i];
163 dmrpp_ofstream.close();
172 bool find_var(
const string &str,
const vector<string>var_type_list,
173 vector<string>&var_type,vector<string>&var_name) {
183 size_t non_space_char_pos = str.find_first_not_of(
' ');
184 if(non_space_char_pos == string::npos){
189 if(str[non_space_char_pos]!=
'<') {
194 if(str.size() <= (non_space_char_pos+1)){
200 if(str[str.size()-1]!=
'>' ) {
205 char char_2 = str[non_space_char_pos+1];
210 string v_1char_list =
"FIUBSC";
213 if(v_1char_list.find_first_of(char_2)==string::npos) {
218 string sep=
" name=\"";
219 size_t sep_pos = str.find(sep,non_space_char_pos+2);
222 if(sep_pos == string::npos){
227 size_t var_index = -1;
229 for (
size_t i = 0; i<var_type_list.size() && !found ;i++) {
230 if(str.compare(non_space_char_pos+1,sep_pos-non_space_char_pos-1,var_type_list[i]) == 0) {
243 size_t end_name_pos = str.find(end_quote,sep_pos+sep.size()+1);
244 if(end_name_pos == string::npos)
248 string var_name_line = str.substr(sep_pos+sep.size(),end_name_pos-sep_pos-sep.size());
249 var_type.push_back(var_type_list[var_index]);
250 var_name.push_back(var_name_line);
259 bool find_chunk(
const string &str) {
261 string chunk_mark =
"<dmrpp:chunk ";
262 string offset_mark =
"offset";
263 size_t chunk_mark_pos = str.find(chunk_mark);
264 if(chunk_mark_pos !=string::npos) {
265 if(string::npos != str.find(offset_mark, chunk_mark_pos+chunk_mark.size()))
273 bool find_endvar(
const string &str,
const string vtype) {
275 string end_var =
"</" + vtype +
'>';
276 size_t vb_end_pos = str.find(end_var);
277 if(vb_end_pos !=string::npos) {
278 if((vb_end_pos + end_var.size())==str.size())