Ignore:
Timestamp:
Dec 9, 2007, 8:58:54 AM (14 years ago)
Author:
Peter Johansson
Message:

adding filename translations in Configuration class. Before checking what type parsing to use, filename is translated according to rules set in config file. Default rule (as before) is to remove trailing .in from filenames. To solve the parsing I added a simple regexp function - see utility.h

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Configuration.cc

    r515 r516  
    6565  Configuration::codon(std::string file_name) const
    6666  {
     67    if (const std::pair<std::string,std::string>* dict=dictionary(file_name))
     68      try {
     69        file_name = translate(file_name, *dict);
     70      }
     71      catch (std::runtime_error& e) {
     72        std::stringstream mess;
     73        mess << "svndigest: invalid config file: "
     74             << "expression " << dict->second << " is invalid";
     75        if (e.what()[0])
     76          mess << "because " << e.what() << " is a too large.";
     77        else
     78          mess << ".";
     79        throw std::runtime_error(mess.str());
     80      }
    6781    for (String2Codons::const_iterator i(string2codons_.begin());
    6882         i!=string2codons_.end(); ++i) {
     
    8296
    8397
     98  const std::pair<std::string,std::string>*
     99  Configuration::dictionary(std::string lhs) const
     100  {
     101    for (size_t i=0; i<dictionary_.size(); ++i)
     102      if (svndigest::equal(lhs.begin(), lhs.end(),
     103                           dictionary_[i].first.begin(),
     104                           dictionary_[i].first.end()))
     105        return &dictionary_[i];
     106    return NULL;
     107  }
     108
     109
    84110  bool Configuration::equal_false(const std::string& str) const
    85111  {
     
    108134
    109135    bool parsing_found=false;
     136    bool dictionary_found=false;
    110137    std::string line;
    111138    std::string section;
     
    178205          mess << "svndigest: invalid config file\n"
    179206               << "line: `" << line << "' is invalid.\n"
    180                << "clashes with previous given file-name-pattern: ";
     207               << "clashes with previous given file name pattern: ";
    181208          // find previous file-name-pattern
    182209          for (String2Codons::const_iterator i(string2codons_.begin());
     
    210237        }
    211238      }
     239      else if (section == "file-name-dictionary") {
     240        if (!dictionary_found) {
     241          dictionary_found=true;
     242          // clearing the default setting
     243          dictionary_.clear();
     244        }
     245       
     246        if (const std::pair<std::string, std::string>* entry=dictionary(lhs)) {
     247          std::stringstream mess;
     248          mess << "svndigest: invalid config file\n"
     249               << "line: `" << line << "' is invalid.\n"
     250               << "clashes with previous given file name pattern: "
     251               << "`" << entry->first << "'";
     252          throw std::runtime_error(mess.str());
     253        }
     254        lhs = trim(lhs);
     255        rhs = trim(rhs);
     256        if (!lhs.empty() && !rhs.empty())
     257          dictionary_.push_back(std::make_pair(lhs, rhs));
     258        else if (!lhs.empty() || !rhs.empty()) {
     259            std::stringstream mess;
     260            mess << "svndigest: invalid config file\n"
     261                 << "line: `" << line << "' is invalid.\n";
     262            throw std::runtime_error(mess.str());
     263        }
     264      }
    212265    }
    213266  }
     
    225278  {
    226279    return missing_copyright_warning_;
     280  }
     281
     282
     283  std::string
     284  Configuration::translate(const std::string& str,
     285                           const std::pair<std::string, std::string>& dic) const
     286  {
     287    assert(svndigest::equal(str.begin(), str.end(),
     288                            dic.first.begin(), dic.first.end()));
     289    std::string res;
     290    std::vector<std::string> vec;
     291    regexp(str.begin(), str.end(), dic.first.begin(), dic.first.end(), vec);
     292    for (std::string::const_iterator i(dic.second.begin());
     293         i!=dic.second.end(); ++i) {
     294      if (*i == '$') {
     295        std::stringstream ss(std::string(i, dic.second.end()));
     296        size_t n = 0;
     297        ss >> n;
     298        if (n>vec.size()){
     299          std::stringstream mess;
     300          mess << n;
     301          throw std::runtime_error(mess.str());
     302        }
     303        if (n) {
     304          res += vec[n-1];
     305          ++i;
     306          if (n>9){
     307            ++i;
     308            if (n>99)
     309              ++i;
     310          }
     311        }
     312        else
     313          throw std::runtime_error("");
     314      }
     315      else
     316        res += *i;
     317    }
     318
     319    return res;
    227320  }
    228321
Note: See TracChangeset for help on using the changeset viewer.