source: trunk/lib/Configuration.cc @ 509

Last change on this file since 509 was 509, checked in by Peter Johansson, 14 years ago

changed format of codons in config file. Also changed corresponding access function to return a pointer, allowing to return NULL when key is not found.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.9 KB
Line 
1// $Id: Configuration.cc 509 2007-12-08 21:42:07Z peter $
2
3/*
4  Copyright (C) 2007 Peter Johansson
5
6  This file is part of svndigest, http://trac.thep.lu.se/trac/svndigest
7
8  svndigest is free software; you can redistribute it and/or modify it
9  under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12
13  svndigest is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21  02111-1307, USA.
22*/
23
24#include "Configuration.h"
25
26#include "Functor.h"
27
28#include <cassert>
29#include <fstream>
30#include <map>
31#include <string>
32#include <sstream>
33#include <stdexcept>
34#include <utility>
35
36namespace theplu{
37namespace svndigest{
38
39  Configuration* Configuration::instance_=NULL;
40
41
42  Configuration::Configuration(void)
43  {
44  }
45
46
47  void Configuration::add_codon(std::string key, std::string start, 
48                                std::string end)
49  {
50    std::pair<std::string, std::string> p(start,end);
51    String2Codons::iterator iter = string2codons_.end();
52    for (String2Codons::iterator i=string2codons_.begin();
53         i!=string2codons_.end(); ++i)
54      if (i->first == key)
55        iter = i;
56   
57    if (iter==string2codons_.end())
58      string2codons_.push_back(std::make_pair(key, codons(1,p)));
59    else
60      iter->second.push_back(p);
61  }
62
63
64  const std::map<std::string,Alias>& Configuration::copyright_alias(void) const
65  {
66    return copyright_alias_;
67  }
68
69
70  bool Configuration::equal_false(const std::string& str) const
71  {
72    return str=="false" || str=="False" || str=="FALSE" ||
73      str=="no" || str=="No" || str=="NO";
74  }
75
76
77  bool Configuration::equal_true(const std::string& str) const
78  {
79    return str=="true" || str=="True" || str=="TRUE" ||
80      str=="yes" || str=="Yes" || str=="YES";
81  }
82
83
84  void Configuration::load(void)
85  {
86    set_default();
87  }
88
89
90  void Configuration::load(std::istream& is)
91  {
92    assert(is.good());
93    set_default();
94
95    //bool parsing_found=false;
96    std::string line;
97    std::string section;
98    std::string tmp;
99    while (getline(is, line)) {
100      line = ltrim(line);
101      if (line.empty() || line[0]=='#')
102        continue;
103      std::stringstream ss(line);
104      if (line[0] == '[') {
105        getline(ss, tmp, '[');
106        getline(ss, section, ']');
107        continue;
108      }
109      getline(ss, tmp, '=');
110      std::string lhs = trim(tmp);
111      getline(ss, tmp);
112      std::string rhs = trim(tmp);
113      if (rhs.empty()){
114        std::stringstream mess;
115        mess << "svndigest: invalid config file: "
116             << "line: `" << line << "' is invalid.";
117        throw std::runtime_error(mess.str());
118      }
119      if (section == "copyright-alias"){
120        std::map<std::string,Alias>::iterator iter = 
121          copyright_alias_.lower_bound(lhs);
122        if (iter!=copyright_alias_.end() && iter->first==lhs){
123          std::stringstream mess;
124          mess << "svndigest: invalid config file: "
125               << "in copright-alias section " << lhs << " defined twice.";
126          throw std::runtime_error(mess.str());
127        }
128       
129        // insert alias
130        copyright_alias_.insert(iter,std::make_pair(lhs, Alias(rhs,copyright_alias_.size())));
131      }
132      else if (section == "trac"){
133        if (lhs=="trac-root")
134          trac_root_=rhs;
135        else {
136          std::stringstream mess;
137          mess << "svndigest: invalid config file: "
138               << "in trac section" << lhs + " is invalid option.";
139          throw std::runtime_error(mess.str());
140        }
141      }
142      else if (section == "copyright")
143        if (lhs=="missing-copyright-warning")
144          if (equal_false(rhs))
145            missing_copyright_warning_ = false;
146          else if (equal_true(rhs))
147            missing_copyright_warning_ = true;
148          else {
149            std::stringstream mess;
150            mess << "svndigest: invalid config file: "
151                 << "line: `" << line << "' is invalid.";
152            throw std::runtime_error(mess.str());
153          }
154    }
155  }
156
157
158  Configuration& Configuration::instance(void)
159  {
160    if (!instance_)
161      instance_ = new Configuration;
162    return *instance_;
163  }
164
165
166  bool Configuration::missing_copyright_warning(void) const
167  {
168    return missing_copyright_warning_;
169  }
170
171
172  const std::vector<std::pair<std::string, std::string> >* 
173  Configuration::parse_codon(std::string file_name) const 
174  {
175    for (String2Codons::const_iterator i(string2codons_.begin());
176         i!=string2codons_.end(); ++i) {
177      if (svndigest::equal(file_name.begin(), file_name.end(), 
178                           i->first.begin(), i->first.end()) ) {
179        return &i->second;
180      }
181    }
182    return NULL;
183  }
184
185
186  std::string trans_end_code(std::string str)
187  {
188    if (str.size()>0 && str[str.size()-1]=='\n')
189      return str.substr(0, str.size()-1) + std::string("<NEWLINE>");
190    return str;
191  }
192
193
194  std::string trans_beg_code(std::string str)
195  {
196    if (str.size()>0 && str[0]=='\n')
197      return std::string("<NEWLINE>") + str.substr(1); 
198    return str;
199  }
200
201
202  void Configuration::set_default(void)
203  {
204    copyright_alias_.clear();
205    missing_copyright_warning_=false;
206    trac_root_ = "";
207
208    add_codon("*.ac", "#", "\n");
209    add_codon("*.ac", "dnl", "\n");
210    add_codon("*.am", "#", "\n");
211    add_codon("*.am", "dnl", "\n");
212    add_codon("*.m4", "#", "\n");
213    add_codon("*.m4", "dnl", "\n");
214    add_codon("*.c", "//", "\n");
215    add_codon("*.c", "/*", "*/");
216    add_codon("*.cc", "//", "\n");
217    add_codon("*.cc", "/*", "*/");
218    add_codon("*.cpp", "//", "\n");
219    add_codon("*.cpp", "/*", "*/");
220    add_codon("*.cxx", "//", "\n");
221    add_codon("*.cxx", "/*", "*/");
222    add_codon("*.h", "//", "\n");
223    add_codon("*.h", "/*", "*/");
224    add_codon("*.hh", "//", "\n");
225    add_codon("*.hh", "/*", "*/");
226    add_codon("*.hpp", "//", "\n");
227    add_codon("*.hpp", "/*", "*/");
228    add_codon("*.java", "//", "\n");
229    add_codon("*.java", "/*", "*/");
230    add_codon("*.pl", "#", "\n");
231    add_codon("*.pm", "#", "\n");
232    add_codon("*.sh", "#", "\n");
233    add_codon("*config", "#", "\n");
234    add_codon("bootstrap", "#", "\n");
235    add_codon("Makefile", "#", "\n");
236    add_codon("*.tex", "%", "\n");
237    add_codon("*.m", "%", "\n");
238    add_codon("*.jsp", "<!--", "-->");
239    add_codon("*.html", "<%--", "--%>");
240    add_codon("*.xml", "<!--", "-->");
241    add_codon("*.xsl", "<!--", "-->");
242    add_codon("*.xsd", "<!--", "-->");
243    add_codon("*.xhtml", "<!--", "-->");
244    add_codon("*.shtml", "<!--", "-->");
245    add_codon("*.xml", "<!--", "-->");
246    add_codon("*.css", "<!--", "-->");
247    add_codon("*.rss", "<!--", "-->");
248    add_codon("*.sgml", "<!--", "-->");
249    add_codon("*.bat", "\nREM", "\n");
250  }
251
252
253  std::string Configuration::trac_root(void) const
254  {
255    return trac_root_;
256  }
257
258
259  std::ostream& operator<<(std::ostream& os, const Configuration& conf)
260  {
261    os << "### This file configures various behaviors for svndigest\n"
262       << "### The commented-out below are intended to demonstrate how to use\n"
263       << "### this file.\n"
264       << "\n"
265       << "### Section for setting behaviour of copyright update\n"
266       << "[copyright]\n"
267       << "# if true svndigest will warn if file has no copyright statement.\n"
268       << "missing-copyright-warning = ";
269   
270    if (conf.missing_copyright_warning())
271      os << "yes\n";
272    else
273      os << "no\n";
274
275    os << "\n"
276       << "### Section for setting aliases used in copyright update\n"
277       << "[copyright-alias]\n"
278       << "# jdoe = John Doe\n";
279
280    typedef std::vector<std::pair<std::string, Alias> > vector;
281    vector vec;
282    std::back_insert_iterator<vector> back_insert_iterator(vec);
283    vec.reserve(conf.copyright_alias().size());
284    std::copy(conf.copyright_alias().begin(), conf.copyright_alias().end(),
285              back_insert_iterator);
286    // sort with respect to Alias.id
287    IdCompare id;
288    PairSecondCompare<const std::string, Alias, IdCompare> comp(id);
289    std::sort(vec.begin(),vec.end(), comp);
290             
291
292    for (vector::const_iterator i(vec.begin()); i!=vec.end(); ++i) {
293      os << i->first << " = " << i->second.name() << " \n";
294    }
295
296    os << "\n"
297       << "### Section for setting trac environment\n"
298       << "[trac]\n"
299       << "# If trac-root is set, svndigest will create anchors to "
300       << "the Trac page.\n"
301       << "# trac-root = http://trac.thep.lu.se/trac/svndigest/\n";
302    if (!conf.trac_root().empty())
303      os << "trac-root = " << conf.trac_root() << "\n";
304
305    if (!conf.string2codons_.empty()) {
306      os << "\n"
307         << "### Section for setting parsing modes\n"
308         << "### The format of the entries is:\n"
309         << "###   file-name-pattern = start-code : end-code\n"
310         << "### The file-name-pattern may contain wildcards (such as '*' "
311         << "and '?').\n"
312         << "### String \"<NEWLINE>\" can be used for codons containing newline"
313         << "\n### character: '\\n'\n"
314         << "[parsing-codons]\n";
315      for (size_t i=0; i<conf.string2codons_.size(); ++i) {
316        os << conf.string2codons_[i].first << " = "; 
317        for (size_t j=0; j<conf.string2codons_[i].second.size(); ++j) {
318          if (j)
319            os << "  ;  ";
320          os << trans_beg_code(conf.string2codons_[i].second[j].first) 
321             << " : " 
322             << trans_end_code(conf.string2codons_[i].second[j].second); 
323        }
324        os << "\n";
325      }
326    }
327    return os;
328  }
329
330
331}} // end of namespace svndigest and namespace theplu
Note: See TracBrowser for help on using the repository browser.