7bool find_var(
const string &str,
const vector<string>var_type_list,
8 vector<string>&var_type,vector<string>&var_name);
9bool find_endvar(
const string &str,
const string vtype);
10bool find_chunk(
const string &str);
12int 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;
106 bool has_missing_info =
false;
107 size_t last_missing_chunk_index = 0;
110 if (!var_type.empty()) {
111 auto ritr = var_type.rbegin();
112 size_t i = var_type.size() - 1;
113 while(ritr != var_type.rend()) {
114 if (!chunk_exist[i]) {
115 has_missing_info =
true;
116 last_missing_chunk_index = i;
125 if(
true == has_missing_info) {
127 ofstream dmrpp_ofstream;
128 string fname2(argv[2]);
129 dmrpp_ofstream.open(fname2.c_str(),ofstream::out);
132 for (
auto vt:var_type) {
133 if(!chunk_exist[i]) {
134 if (i!=last_missing_chunk_index)
135 dmrpp_ofstream<<var_name[i] <<
",";
137 dmrpp_ofstream<<var_name[i];
142 dmrpp_ofstream.close();
151bool find_var(
const string &str,
const vector<string>var_type_list,
152 vector<string>&var_type,vector<string>&var_name) {
162 size_t non_space_char_pos = str.find_first_not_of(
' ');
163 if(non_space_char_pos == string::npos){
168 if(str[non_space_char_pos]!=
'<') {
173 if(str.size() <= (non_space_char_pos+1)){
179 if(str[str.size()-1]!=
'>' ) {
184 char char_2 = str[non_space_char_pos+1];
189 string v_1char_list =
"FIUBSC";
192 if(v_1char_list.find_first_of(char_2)==string::npos) {
197 string sep=
" name=\"";
198 size_t sep_pos = str.find(sep,non_space_char_pos+2);
201 if(sep_pos == string::npos){
206 size_t var_index = -1;
208 for (
size_t i = 0; i<var_type_list.size() && !found ;i++) {
209 if(str.compare(non_space_char_pos+1,sep_pos-non_space_char_pos-1,var_type_list[i]) == 0) {
222 size_t end_name_pos = str.find(end_quote,sep_pos+sep.size()+1);
223 if(end_name_pos == string::npos)
227 string var_name_line = str.substr(sep_pos+sep.size(),end_name_pos-sep_pos-sep.size());
228 var_type.push_back(var_type_list[var_index]);
229 var_name.push_back(var_name_line);
238bool find_chunk(
const string &str) {
240 string chunk_mark =
"<dmrpp:chunk ";
241 string offset_mark =
"offset";
242 size_t chunk_mark_pos = str.find(chunk_mark);
243 if(chunk_mark_pos !=string::npos) {
244 if(string::npos != str.find(offset_mark, chunk_mark_pos+chunk_mark.size()))
252bool find_endvar(
const string &str,
const string vtype) {
254 string end_var =
"</" + vtype +
'>';
255 size_t vb_end_pos = str.find(end_var);
256 if(vb_end_pos !=string::npos) {
257 if((vb_end_pos + end_var.size())==str.size())