00001 #ifndef BIN_WORD_SEARCH_CC
00002 #define BIN_WORD_SEARCH_CC
00003
00004 #include "bin_word_search.hh"
00005
00006 bin_word_search::bin_word_search(){
00007
00008 _continue_mode = false;
00009 _target = PMT::INVALID_WORD;
00010 _nwords=20;
00011 _bytes = SHORT;
00012 }
00013
00014 bool bin_word_search::run(){
00015
00016 _fin.set_verbosity(MSG::ERROR);
00017 _fin.open();
00018
00019 if(!_fin.is_open()) return false;
00020
00021 PMT::word_t word1,word2;
00022
00023 const size_t max_nwords = _nwords*2+1;
00024
00025 std::deque<PMT::word_t> words(max_nwords);
00026
00027 size_t total_word_counter = 0;
00028 size_t after_word_counter = 0;
00029
00030 while(1){
00031
00032 word1 = _fin.read_word();
00033
00034 if(_fin.eof()) break;
00035
00036 if(total_word_counter >= max_nwords)
00037 words.pop_front();
00038
00039 if(_bytes == INT){
00040
00041 words.push_back(word1);
00042
00043 total_word_counter++;
00044
00045 if(word1 == _target || after_word_counter>0)
00046 after_word_counter++;
00047
00048 if(after_word_counter == (_nwords+1)) {
00049 if(!_continue_mode) break;
00050 else{
00051 print_words(&words);
00052 after_word_counter = 0;
00053 }
00054 }
00055 }
00056 else {
00057
00058 word2 = (word1>>16);
00059 word1 = (word1 & 0xffff);
00060
00061 words.push_back(word1);
00062 total_word_counter++;
00063
00064 if(word1 == _target || after_word_counter>0)
00065 after_word_counter++;
00066
00067 if(after_word_counter == (_nwords+1)) {
00068 if(!_continue_mode) break;
00069 else{
00070 print_words(&words);
00071 after_word_counter = 0;
00072 }
00073 }
00074
00075 words.push_back(word2);
00076 total_word_counter++;
00077 if(word2 == _target || after_word_counter>0)
00078 after_word_counter++;
00079
00080 if(after_word_counter == (_nwords+1)) {
00081 if(!_continue_mode) break;
00082 else{
00083 print_words(&words);
00084 after_word_counter = 0;
00085 }
00086 }
00087 }
00088
00089 }
00090
00091 if(after_word_counter) print_words(&words);
00092
00093 return true;
00094 }
00095
00096 void bin_word_search::print_words(std::deque<PMT::word_t> *words){
00097
00098 int output_word_counter = 0;
00099 std::string msg;
00100 for(std::deque<PMT::word_t>::const_iterator iter(words->begin());
00101 iter != words->end();
00102 ++iter){
00103
00104 if((*iter) == _target)
00105 msg += "\033[95m";
00106
00107 if(_bytes == INT) msg += Form("%08x ",(*iter));
00108 else msg += Form("%04x ",(*iter));
00109
00110 if((*iter) == _target)
00111 msg += "\033[0m";
00112
00113 output_word_counter++;
00114
00115 if(output_word_counter%8 == 0)
00116 msg+="\n";
00117 }
00118
00119 std::cout<<msg.c_str()<<std::endl<<std::endl;
00120
00121 }
00122
00123 #endif