OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
List_checksum Class Reference

#include <checksum_list.h>

Public Member Functions

std::list< std::tuple< std::string, std::list< std::string > > > chk_list (std::string input, std::string directory)
std::string get_path (const std::string &filepath)
 List_checksum ()

Private Member Functions

bool is_integer (const std::string s)
void sort_in_lists (std::string file, std::string rootname)
std::string format_as_4_digits (int number)
std::string format_as_3_digits (int number)
void remove_cr (std::string &line)
std::string separator ()
int compare_lists (std::list< std::string > list1, std::list< std::string > list2)
bool is_file_valid (std::string file)
void file_list (std::string directory, std::string rootname)
void parse_output_files (std::string directory, std::string rootname)
void parse_animation_files (std::string directory, std::string rootname)
void parse_th_files (std::string directory, std::string rootname)
void parse_checksum_files (std::string directory, std::string rootname)

Private Attributes

int debug =0
std::list< std::string > deck_file_list
std::list< std::string > out_file_list
std::list< std::string > th_file_list
std::list< std::string > anim_file_list
std::list< std::string > checksum_file_list
std::map< std::string, std::string > file_checksum_list
std::list< std::tuple< std::string, std::list< std::string > > > checksum_list

Detailed Description

Definition at line 53 of file checksum_list.h.

Constructor & Destructor Documentation

◆ List_checksum()

List_checksum::List_checksum ( )

Definition at line 450 of file checksum_list.cpp.

451 {};

Member Function Documentation

◆ chk_list()

list< tuple< string, list< string > > > List_checksum::chk_list ( std::string input,
std::string directory )

Definition at line 485 of file checksum_list.cpp.

485 {
486 // -------------------------------------------------------------------------------
487
488 // Debug prints
489 if (debug){
490 cout << endl;
491 cout << "Directory: " << directory << endl;
492 cout << "Rootname: " << rootname << endl;
493 cout << endl;
494 }
495
496 file_list(directory,rootname); // List all files in the directory
497
498
499 for (const auto& deck_file : deck_file_list){
500
501 // If deck is present:
502 // Compute checksum from input deck
503 MD5Checksum my_checksums;
504 my_checksums.parse(deck_file);
505 list<string> deck_checksum_list=my_checksums.get_checksums(); // Compute checksum from input deck
506
507 // Add Starter computed checksum to the list
508 checksum_list.push_back(make_tuple(deck_file,deck_checksum_list)); // Add the checksum list to the collection
509
510 if (debug){
511 cout << "Commputed Checksum list from deck: " << endl;
512 cout << "===================================" << endl;
513 for (const auto& item : deck_checksum_list){
514 cout << item << endl;
515 }
516 cout << "==============================" << endl;
517 cout << endl;
518 }
519 }
520
521
522 // Parse all .out files in the directory
523 parse_output_files(directory, rootname);
524
525 // parse all animation files in the directory
526 parse_animation_files(directory, rootname);
527
528 // parse all animation files in the directory
529 parse_th_files(directory, rootname);
530
531 // Parse all checksum files in the directory
532 parse_checksum_files(directory, rootname);
533
534 // print the checksum list from all output files
535 if (debug){
536 cout << "Checksum list from output files: " << endl;
537 cout << "==============================" << endl;
538 for (const auto& item : checksum_list){
539 cout << "File: " << get<0>(item) << endl;
540 for (const auto& checksum : get<1>(item)){
541 cout << " "<< checksum << endl;
542 }
543 cout << "==============================" << endl;
544 }
545 }
546
547 return checksum_list ;
548 }
void parse_output_files(std::string directory, std::string rootname)
void parse_th_files(std::string directory, std::string rootname)
void parse_animation_files(std::string directory, std::string rootname)
std::list< std::tuple< std::string, std::list< std::string > > > checksum_list
std::list< std::string > deck_file_list
void file_list(std::string directory, std::string rootname)
void parse_checksum_files(std::string directory, std::string rootname)
void parse(std::string filenam)
std::list< std::string > get_checksums()

◆ compare_lists()

int List_checksum::compare_lists ( std::list< std::string > list1,
std::list< std::string > list2 )
private

Definition at line 102 of file checksum_list.cpp.

102 {
103 // -----------------------------------------------------------------------------------
104 if (list1.size() != list2.size()) {
105 return 0; // Lists are not equal in size
106 }
107 auto it1 = list1.begin();
108 auto it2 = list2.begin();
109 while (it1 != list1.end() && it2 != list2.end()) {
110 if (*it1 != *it2) {
111 return 0; // Lists are not equal
112 }
113 ++it1;
114 ++it2;
115 }
116 return 1; // Lists are equal
117 }

◆ file_list()

void List_checksum::file_list ( std::string directory,
std::string rootname )
private

Definition at line 187 of file checksum_list.cpp.

187 {
188
189 std::vector<std::string> files;
190
191#ifdef _WIN64
192 std::string search_path = directory + rootname + "*";
193 WIN32_FIND_DATAA fd;
194 HANDLE hFind = ::FindFirstFileA(search_path.c_str(), &fd);
195 if (hFind != INVALID_HANDLE_VALUE) {
196 do {
197 if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
198 string fname(fd.cFileName);
199 sort_in_lists(fname,rootname);
200 }
201 } while (::FindNextFileA(hFind, &fd));
202 ::FindClose(hFind);
203 }
204#else
205 string directory_cp = directory;
206 if ( directory_cp.length()==0){
207 directory_cp=".";
208 }
209 DIR* dir = opendir(directory_cp.c_str());
210 if (dir) {
211 struct dirent* entry;
212 while ((entry = readdir(dir)) != nullptr) {
213 std::string fname(entry->d_name);
214 if (fname.find(rootname) == 0) { // starts with rootname
215 sort_in_lists(fname,rootname);
216 }
217 }
218 closedir(dir);
219 }
220#endif
221
222};
void sort_in_lists(std::string file, std::string rootname)

◆ format_as_3_digits()

string List_checksum::format_as_3_digits ( int number)
private

Definition at line 64 of file checksum_list.cpp.

64 {
65 // -----------------------------------------------------------------------------------
66 ostringstream oss;
67 oss << setw(3) << setfill('0') << number;
68 return oss.str();
69 }

◆ format_as_4_digits()

string List_checksum::format_as_4_digits ( int number)
private

Definition at line 50 of file checksum_list.cpp.

50 {
51 // -----------------------------------------------------------------------------------
52 ostringstream oss;
53 oss << setw(4) << setfill('0') << number;
54 return oss.str();
55 }

◆ get_path()

std::string List_checksum::get_path ( const std::string & filepath)

Definition at line 457 of file checksum_list.cpp.

457 {
458 // Find the last occurrence of the path separator
459#ifdef _WIN64
460 size_t pos = filepath.find_last_of("/\\");
461 if (pos == std::string::npos) {
462 pos = filepath.find_last_of("/");
463 }
464#else
465 size_t pos = filepath.find_last_of("/");
466#endif
467 if (pos != std::string::npos) {
468 // Extract the substring up to the last separator
469 return filepath.substr(0, pos);
470 }
471 // If no separator is found, return an empty string
472 return "";
473}

◆ is_file_valid()

bool List_checksum::is_file_valid ( std::string file)
private

Definition at line 229 of file checksum_list.cpp.

229 {
230 return true;
231 }

◆ is_integer()

bool List_checksum::is_integer ( const std::string s)
private

Definition at line 29 of file checksum_list.cpp.

29 {
30 char * p;
31 char * s_cchar = (char*)s.c_str();
32 // strtol will convert the string to a long integer
33 // If the conversion is successful, p will point to the first character after the number
34 // If the conversion fails, p will point to the original string
35 long converted = strtol(s_cchar, &p, 10);
36 if (*p) {
37 return false; // Not a valid integer
38 }
39 return true;
40
41
42}

◆ parse_animation_files()

void List_checksum::parse_animation_files ( std::string directory,
std::string rootname )
private

Definition at line 291 of file checksum_list.cpp.

291 {
292 // -------------------------------------------------------------------------------------------------------------------------------------------------
293 int run_number=1;
294 int found_out_file=1;
295
296 for (const auto& item : anim_file_list){
297
298 string anim_file;
299 if ( directory.length() > 0 ){
300 anim_file = directory + item;
301 }else{
302 anim_file = item;
303 }
304
305 CheckSum_Output_Files out;
306 FILE *new_file;
307 int success=0;
308 success=out.open_binary_file(anim_file);
309
310 if ( success == 0 ) {
311 // cout << "Error: Unable to open file " << anim_file << endl;
312 found_out_file=0; // No more .out files to process
313 }else{
314 if (debug){
315 cout << "Parsing file: " << anim_file << endl;
316 }
317
318
319 list<string> checksum_list_out=out.Animation( );
320 out.close_binary_file();
321 // Compute file checksum
322 checksum file_cs;
323 string file_checksum = file_cs.compute_checksum(anim_file);
324 string formated_out = anim_file + " : " + file_checksum;
325
326 checksum_list.push_back(make_tuple(formated_out,checksum_list_out)); // Add the checksum list to the collection
327 file_checksum_list.insert(pair<string,string>(anim_file, file_checksum)); // Add the file,checksum tuple in specific list
328
329
330 }
331 run_number++;
332 }
333 }
int open_binary_file(std::string filename)
std::list< std::string > Animation()
std::map< std::string, std::string > file_checksum_list
std::list< std::string > anim_file_list
std::string compute_checksum(std::string file)
Definition checksum.cpp:25

◆ parse_checksum_files()

void List_checksum::parse_checksum_files ( std::string directory,
std::string rootname )
private

Definition at line 391 of file checksum_list.cpp.

391 {
392
393 for (const auto& item : checksum_file_list){
394
395 string chkfile;
396 if ( directory.length() > 0 ){
397 chkfile = directory + item;
398 }else{
399 chkfile = item;
400 }
401
402 bool valid_file = is_file_valid(chkfile);
403 string valid_message;
404 if (valid_file) {
405 valid_message = "Valid Fingerprint";
406 }else{
407 valid_message = "Invalid Fingerprint";
408 }
409
410 fstream new_file;
411 new_file.open(chkfile, ios::in);
412
413 if ( !new_file.is_open() ) {
414 // cout << "Error: Unable to open file " << outfile << endl;
415 }else{
416 if (debug){
417 cout << "Parsing file: " << chkfile << endl;
418 }
419 // Grab file checksums
420 CheckSum_Output_Files out;
421 std::list<std::tuple<std::string,std::string>> checksum_list_chk;
422 checksum_list_chk=out.Checksum_File( &new_file );
423 new_file.close();
424
425 string formated_out = chkfile + " : " ;
426 list<string> verify_checksum_list;
427
428 // print the checksum list
429 for (const auto& item2 :checksum_list_chk){
430 string filename = get<0>(item2);
431 string checksum = get<1>(item2);
432
433 string computed_checksum= file_checksum_list[filename];
434
435 if (computed_checksum.length() > 0){
436 if (checksum == computed_checksum){
437 verify_checksum_list.push_back(filename + "_" + "Valid Checksum" );
438 }else{
439 verify_checksum_list.push_back(filename + "_" + "Failed checksum check : File: "+ checksum + " Computed: " + computed_checksum);
440 }
441 }
442 }
443 checksum_list.push_back(make_tuple(formated_out,verify_checksum_list)); // Add the checksum list to the collection
444
445 }
446 }
447 };
std::list< std::tuple< std::string, std::string > > Checksum_File(std::fstream *new_file)
bool is_file_valid(std::string file)
std::list< std::string > checksum_file_list

◆ parse_output_files()

void List_checksum::parse_output_files ( std::string directory,
std::string rootname )
private

Definition at line 244 of file checksum_list.cpp.

244 {
245 // -------------------------------------------------------------------------------------------------------------------------------------------------
246
247 for (const auto& item : out_file_list){
248
249 string outfile;
250 if ( directory.length() > 0 ){
251 outfile = directory + item;
252 }else{
253 outfile = item;
254 }
255
256 fstream new_file;
257 new_file.open(outfile, ios::in);
258
259 if ( !new_file.is_open() ) {
260 // cout << "Error: Unable to open file " << outfile << endl;
261 }else{
262 if (debug){
263 cout << "Parsing file: " << outfile << endl;
264 }
265 // Grab file checksums
266 CheckSum_Output_Files out;
267 list<string> checksum_list_out=out.Out_File( &new_file );
268 new_file.close();
269
270 // Compute file checksum
271 checksum file_cs;
272 string file_checksum = file_cs.compute_checksum(outfile);
273 string formated_out = outfile + " : " + file_checksum;
274
275 checksum_list.push_back(make_tuple(formated_out,checksum_list_out)); // Add the checksum list to the collection
276 file_checksum_list.insert(pair<string,string>(outfile, file_checksum)); // Add the file,checksum tuple in specific list
277 }
278 }
279 }
std::list< std::string > Out_File(std::fstream *new_file)
std::list< std::string > out_file_list
FILE * outfile[100]

◆ parse_th_files()

void List_checksum::parse_th_files ( std::string directory,
std::string rootname )
private

Definition at line 345 of file checksum_list.cpp.

345 {
346 // -------------------------------------------------------------------------------------------------------------------------------------------------
347 int found_out_file=1;
348
349 for (const auto& item : th_file_list){
350
351 string th_file;
352 if ( directory.length() > 0 ){
353 th_file = directory + item;
354 }else{
355 th_file = item;
356 }
357
358 CheckSum_Output_Files out;
359 int success = out.open_binary_file(th_file);
360
361 if ( success == 0 ) {
362 // cout << "Error: Unable to open file " << anim_file << endl;
363 found_out_file=0; // No more .out files to process
364 }else{
365 if (debug){
366 cout << "Parsing file: " << th_file << endl;
367 }
368 list<string> checksum_list_th=out.Time_History();
369 out.close_binary_file();
370
371 checksum file_cs;
372 string file_checksum = file_cs.compute_checksum(th_file);
373 string formated_out = th_file + " : " + file_checksum;
374
375 checksum_list.push_back(make_tuple(formated_out,checksum_list_th)); // Add the checksum list to the collection
376 file_checksum_list.insert(pair<string,string>(th_file, file_checksum)); // Add the file,checksum tuple in specific list
377 }
378 }
379 }
std::list< std::string > Time_History()
std::list< std::string > th_file_list

◆ remove_cr()

void List_checksum::remove_cr ( std::string & line)
private

Definition at line 74 of file checksum_list.cpp.

74 {
75 line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());
76 }

◆ separator()

string List_checksum::separator ( )
private

Definition at line 85 of file checksum_list.cpp.

85 {
86 // -----------------------------------------------------------------------------------
87 #ifdef _WIN64
88 return "\\"; // Windows separator
89 #else
90 return "/"; // Unix separator
91 #endif
92 }

◆ sort_in_lists()

void List_checksum::sort_in_lists ( std::string file,
std::string rootname )
private

Definition at line 127 of file checksum_list.cpp.

127 {
128
129 // Grab the file extension
130 size_t pos = string(fname).find_last_of('.');
131 std::string extension = fname.substr(pos + 1);
132
133 // Input deck
134 string input_deck=rootname+"_0000.rad";
135 if (fname == input_deck){
136 deck_file_list.push_back(fname);
137 }
138
139 if (extension == "out") {
140 out_file_list.push_back(fname);
141 }
142 if (extension == "thy") {
143 th_file_list.push_back(fname);
144 }
145
146 if (extension == "checksum") {
147 int filename_length = rootname.length()+5+extension.length()+1;
148 if (fname.length() == filename_length){
149 std::string str_runnumber=fname.substr(rootname.length()+1,4);
150 if (is_integer(str_runnumber)){
151 checksum_file_list.push_back(fname);
152 }
153 }
154 }
155
156 // Old styled files Axxx, Txxx
157 string rd_run;
158 string file_A;
159 if (extension == "gz"){
160 rd_run = fname.substr(fname.length()-6,3);
161 file_A=fname.substr(0,fname.length()-6);
162 }else{
163 rd_run = fname.substr(fname.length()-3);
164 file_A=fname.substr(0,fname.length()-3);
165 }
166 string anim_pattern=rootname+ "A";
167 if ( is_integer(rd_run) && anim_pattern == file_A){
168 anim_file_list.push_back(fname);
169 }
170 string th_pattern=rootname+ "T";
171 string file_T=fname.substr(0,fname.length()-2);
172 rd_run = fname.substr(fname.length()-2);
173 if ( is_integer(rd_run) && th_pattern == file_T){
174 th_file_list.push_back(fname);
175 }
176
177 }
bool is_integer(const std::string s)

Field Documentation

◆ anim_file_list

std::list<std::string> List_checksum::anim_file_list
private

Definition at line 69 of file checksum_list.h.

◆ checksum_file_list

std::list<std::string> List_checksum::checksum_file_list
private

Definition at line 70 of file checksum_list.h.

◆ checksum_list

std::list<std::tuple<std::string,std::list<std::string> > > List_checksum::checksum_list
private

Definition at line 72 of file checksum_list.h.

◆ debug

int List_checksum::debug =0
private

Definition at line 62 of file checksum_list.h.

◆ deck_file_list

std::list<std::string> List_checksum::deck_file_list
private

Definition at line 66 of file checksum_list.h.

◆ file_checksum_list

std::map<std::string,std::string> List_checksum::file_checksum_list
private

Definition at line 71 of file checksum_list.h.

◆ out_file_list

std::list<std::string> List_checksum::out_file_list
private

Definition at line 67 of file checksum_list.h.

◆ th_file_list

std::list<std::string> List_checksum::th_file_list
private

Definition at line 68 of file checksum_list.h.


The documentation for this class was generated from the following files: