All pastes #1659278 Raw Edit

Miscellany

public cpp v1 · immutable
#1659278 ·published 2009-11-06 09:14 UTC
rendered paste body
#include <iostream>#include <string>#include <cstring>#include <vector>#include <set>#include <map>#include <dirent.h>#include <sys/time.h>#include "RegEx.h"using namespace std;typedef vector<string> VECSTRING;int main(int argc, char* argv[]){  int total = 0, hit = 0, miss = 0, stacks = 0, i;  vector<CRegEx>  re;  vector<CRegEx>::iterator at;  set<string> fileList;  map<string, vector<string> > stacked;  set<string> missList;  DIR* dir;  struct timeval start = {}, end = {};  // Define our REs  //  //re.push_back(CRegEx("(.*?)([ ._-]done[ ._-]?0?[1-3])()(\\.[^.]+)$"));  re.push_back(CRegEx("(.*?)([ ._-]?(?:cd|p(?:ar)t)[ ._-]?0?[1-3])(.*?)(\\.[^.]+)$"));  //re.push_back(CRegEx("(.*?)([ ._-]?p(?:ar)t[ ._-]?0?[1-3])(.*?)(\\.[^.]+)$"));  //re.push_back(CRegEx("(.*?)([ ._-]?[a-c])()(\\.[^.]+)$"));  re.push_back(CRegEx("(.*?)([ ._-]?[a-c])([ ._-]?.*?)(\\.[^.]+)$"));  //re.push_back(CRegEx("(.*?)([ ._-]?[1-3])()(\\.[^.]+)$"));//  re.push_back(CRegEx(".*([1-3])[.-]"));  // Compile REs  for (at = re.begin(); at != re.end(); at++)  {    at->SetOptions(PCRE_CASELESS);    at->Compile();  }  // Load + sort filelist  if (NULL != (dir = opendir(".")))  {    struct dirent* file;    while (NULL != (file = readdir(dir)))      if (file->d_type & DT_REG)        fileList.insert(file->d_name);    closedir(dir);  }  gettimeofday(&start, NULL);  set<string>::iterator file1 = fileList.begin();  // The magic...  while (file1 != fileList.end())  {    string          stackName;    vector<string>  filesInStack;    vector<CRegEx>::iterator expr = re.begin();    size_t offset = 0;//    cout << "file1: " << *file1 << endl;    while (expr != re.end())    {//      cout << "expr: " << expr->GetPattern() << endl;      if (expr->Match(*file1, offset) && expr->GetSubstringCount() == 4)      {        string Title1     = expr->GetSubstring(0),               Volume1    = expr->GetSubstring(1),               Ignore1    = expr->GetSubstring(2),               Extension1 = expr->GetSubstring(3);        if (offset)        {          int subStart = expr->GetSubstringStart(1);//          cout << "offset1: " << offset << endl;//          cout << "subStringStart1: " << subStart << endl;          Title1 = file1->substr(0,subStart);//          cout << "Reconstructed Title1: " << Title1 << endl;        }//        else//          cout << "Title1: " << Title1 << endl;//        cout << "Volume1: " << Volume1 << endl;//        cout << "Ignore1: " << Ignore1 << endl;//        cout << "Extension1: " << Extension1 << endl;        set<string>::iterator file2 = file1;        file2++;        while (file2 != fileList.end())        {//          cout << "file2: " << *file2 << endl;          if (expr->Match(*file2, offset) && expr->GetSubstringCount() == 4)          {            string Title2     = expr->GetSubstring(0),                   Volume2    = expr->GetSubstring(1),                   Ignore2    = expr->GetSubstring(2),                   Extension2 = expr->GetSubstring(3);            if (offset)            {              int subStart = expr->GetSubstringStart(1);//              cout << "offset2: " << offset << endl;//              cout << "subStringStart2: " << subStart << endl;              Title2 = file2->substr(0, subStart);//              cout << "Reconstructed Title2: " << Title2 << endl;            }//            else//              cout << "Title2: " << Title2 << endl;//            cout << "Volume2: " << Volume2 << endl;//            cout << "Ignore2: " << Ignore2 << endl;//            cout << "Extension2: " << Extension2 << endl;            if (Title1 == Title2)            {              if (Volume1 != Volume2)              {                if (Ignore1 == Ignore2 && Extension1 == Extension2)                {//                  cout << "stack!\n" << endl;                  if (filesInStack.size() == 0)                  {                    stackName = Title1+Extension1;                    filesInStack.push_back(*file1);                  }                  filesInStack.push_back(*file2);                  file1++;                }                else // Eh...sequel?                {                  // get out to the mainloop somehow...                  expr = re.end();                  break;                }              }              else if (Ignore1 != Ignore2) // Early match try again with offset              {                offset = expr->GetSubstringStart(2);                break;              }              else // sequel, bail              {                expr = re.end();                break;              }            }            else // On to next file            {              expr = re.end();              break;            }          }          else  // No match          {            expr++;            break;          }          file2++;        }        if (file2 == fileList.end())          expr = re.end();      }      else // No match      {        offset = 0;        expr++;      }    }    if (filesInStack.size() > 1) // we have a stack      stacked.insert(make_pair(stackName, filesInStack));    else      stacked.insert(make_pair(*file1, vector<string>()));    file1++;  }  gettimeofday(&end, NULL);  // Print our results  map<string, vector<string> >::iterator it = stacked.begin();  while (it != stacked.end())  {    cout << it->first << "\n\t\t";    if (it->second.size())    {      cout << "( ";      vector<string>::iterator it2 = it->second.begin();      while (it2 != it->second.end())      {        hit++;        cout << *it2++ << ", ";      }      cout << ")\n";    }    else      cout << "( FAIL )\n";    it++;  }  // Fun stats  total = fileList.size();  miss = total-hit;  cout  <<  "----------------------------------------------\n"            "Stats:\n\ntotal: " << fileList.size() <<            " hit: " << hit <<            " (" << hit/(float)total*100 << "%)" <<            " miss: " << miss <<            " (" << miss/(float)total*100 << "%)" <<            " stacked: " << stacked.size() << endl;  cout  <<  "time: " << (float)(end.tv_sec - start.tv_sec) + ((end.tv_usec - start.tv_usec) / 1000000.f) << endl;  cout  << "Expressions:\n";  for (at = re.begin(); at != re.end(); at++)    cout << "\t" << at->GetPattern() << endl;   return 0;}