FilePattern.cpp

Go to the documentation of this file.
00001 
00002 #include "cafe/FilePattern.hpp"
00003 
00004 #include "TSystem.h"
00005 #include "TUUID.h"
00006 #include "TDatime.h"
00007 
00008 #include <iomanip>
00009 #include <sstream>
00010 
00011 namespace cafe {
00012 
00013 
00014     FilePattern::FilePattern(const std::string& pattern)
00015         : _pattern(pattern),
00016           _counter(0)
00017     {
00018     }
00019 
00020     FilePattern::FilePattern()
00021         : _pattern(""),
00022           _counter(0)
00023     {}
00024 
00025     void FilePattern::set(const std::string& pattern)
00026     {
00027         _pattern = pattern;
00028     }
00029     
00030     std::string FilePattern::replace(const std::string& input)
00031     {
00032         using namespace std;
00033 
00034         std::string new_name = _pattern;
00035         std::string::size_type next = 0;
00036         std::string::size_type pos = 0;
00037         while((pos = new_name.find('%', next)) != std::string::npos) {
00038 
00039             // assert(new_name.size() > pos);
00040 
00041             std::string input_name = input;
00042 
00043             switch(new_name[pos+1]) {
00044             case 'f':
00045                 new_name.replace(pos, 2, gSystem->BaseName((char *)input_name.c_str()));
00046                 break;
00047             case 'd':
00048                 new_name.replace(pos, 2, gSystem->DirName((char *)input_name.c_str()));
00049                 break;
00050             case 'r':
00051                 {
00052                     std::string base = gSystem->BaseName((char *)input_name.c_str());
00053                     base.erase(base.rfind('.'));
00054                     new_name.replace(pos, 2, base);
00055                 }
00056                 break;
00057             case 'n':
00058                 {
00059                     std::ostringstream os;
00060                     os << _counter++;
00061                     new_name.replace(pos, 2, os.str());
00062                 }
00063                 break;
00064             case 'D':
00065                 {
00066                     TDatime date;
00067                     std::ostringstream os;
00068                     os << setw(2) << setfill('0') << date.GetDay()
00069                        << setw(2) << setfill('0') << date.GetMonth()
00070                        << setw(4) << setfill('0') << date.GetYear();
00071                     new_name.replace(pos, 2, os.str());
00072                 }
00073                 break;
00074             case 'T':
00075                 {
00076                     TDatime date;
00077                     std::ostringstream os;
00078                     os << setw(2) << setfill('0') << date.GetHour()
00079                        << setw(2) << setfill('0') << date.GetMinute()
00080                        << setw(2) << setfill('0') << date.GetSecond();
00081                     new_name.replace(pos, 2, os.str());
00082                 }
00083                 break;
00084             case 'j':
00085                 if(const char *pbs = getenv("PBS_JOBID")) {
00086                     new_name.replace(pos, 2, pbs);
00087                     break;
00088                 }
00089                 // fall through
00090             case 'u':
00091                 {
00092                     TUUID uuid;
00093                     new_name.replace(pos, 2, uuid.AsString());
00094                 }
00095                 break;
00096             default:
00097                 pos++;
00098                 break;
00099             }
00100 
00101             next = pos;
00102         }
00103 
00104         return new_name;
00105 
00106     }
00107     
00108 }
00109 

Generated on Thu Apr 3 04:14:23 2008 for CAF by doxygen 1.3.4