source: trunk/lib/Configuration.cc @ 508

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

default parse codons in Configuration and implemented writing of variable

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.9 KB
Line 
1// $Id: Configuration.cc 508 2007-12-08 07:08:33Z 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    add_codon("*", "", "");
156  }
157
158
159  Configuration& Configuration::instance(void)
160  {
161    if (!instance_)
162      instance_ = new Configuration;
163    return *instance_;
164  }
165
166
167  bool Configuration::missing_copyright_warning(void) const
168  {
169    return missing_copyright_warning_;
170  }
171
172
173  const std::vector<std::pair<std::string, std::string> >& 
174  Configuration::parse_codon(std::string file_name) const 
175  {
176    for (String2Codons::const_iterator i(string2codons_.begin());
177         i!=string2codons_.end(); ++i) {
178      if (svndigest::equal(file_name.begin(), file_name.end(), 
179                           i->first.begin(), i->first.end()) ) {
180        return i->second;
181      }
182    }
183    return string2codons_.back().second;
184  }
185
186
187  std::string trans_end_code(std::string str)
188  {
189    if (str.size()>0 && str[str.size()-1]=='\n')
190      return str.substr(0, str.size()-1) + std::string("<NEWLINE>");
191    return str;
192  }
193
194
195  std::string trans_beg_code(std::string str)
196  {
197    if (str.size()>0 && str[0]=='\n')
198      return std::string("<NEWLINE>") + str.substr(1); 
199    return str;
200  }
201
202
203  void Configuration::set_default(void)
204  {
205    copyright_alias_.clear();
206    missing_copyright_warning_=false;
207    trac_root_ = "";
208
209    add_codon("*.ac", "#", "\n");
210    add_codon("*.ac", "dnl", "\n");
211    add_codon("*.am", "#", "\n");
212    add_codon("*.am", "dnl", "\n");
213    add_codon("*.m4", "#", "\n");
214    add_codon("*.m4", "dnl", "\n");
215    add_codon("*.c", "//", "\n");
216    add_codon("*.c", "/*", "*/");
217    add_codon("*.cc", "//", "\n");
218    add_codon("*.cc", "/*", "*/");
219    add_codon("*.cpp", "//", "\n");
220    add_codon("*.cpp", "/*", "*/");
221    add_codon("*.cxx", "//", "\n");
222    add_codon("*.cxx", "/*", "*/");
223    add_codon("*.h", "//", "\n");
224    add_codon("*.h", "/*", "*/");
225    add_codon("*.hh", "//", "\n");
226    add_codon("*.hh", "/*", "*/");
227    add_codon("*.hpp", "//", "\n");
228    add_codon("*.hpp", "/*", "*/");
229    add_codon("*.java", "//", "\n");
230    add_codon("*.java", "/*", "*/");
231    add_codon("*.pl", "#", "\n");
232    add_codon("*.pm", "#", "\n");
233    add_codon("*.sh", "#", "\n");
234    add_codon("*config", "#", "\n");
235    add_codon("bootstrap", "#", "\n");
236    add_codon("Makefile", "#", "\n");
237    add_codon("*.tex", "%", "\n");
238    add_codon("*.m", "%", "\n");
239    add_codon("*.jsp", "<!--", "-->");
240    add_codon("*.html", "<%--", "--%>");
241    add_codon("*.xml", "<!--", "-->");
242    add_codon("*.xsl", "<!--", "-->");
243    add_codon("*.xsd", "<!--", "-->");
244    add_codon("*.xhtml", "<!--", "-->");
245    add_codon("*.shtml", "<!--", "-->");
246    add_codon("*.xml", "<!--", "-->");
247    add_codon("*.css", "<!--", "-->");
248    add_codon("*.rss", "<!--", "-->");
249    add_codon("*.sgml", "<!--", "-->");
250    add_codon("*.bat", "\nREM", "\n");
251  }
252
253
254  std::string Configuration::trac_root(void) const
255  {
256    return trac_root_;
257  }
258
259
260  std::ostream& operator<<(std::ostream& os, const Configuration& conf)
261  {
262    os << "### This file configures various behaviors for svndigest\n"
263       << "### The commented-out below are intended to demonstrate how to use\n"
264       << "### this file.\n"
265       << "\n"
266       << "### Section for setting behaviour of copyright update\n"
267       << "[copyright]\n"
268       << "# if true svndigest will warn if file has no copyright statement.\n"
269       << "missing-copyright-warning = ";
270   
271    if (conf.missing_copyright_warning())
272      os << "yes\n";
273    else
274      os << "no\n";
275
276    os << "\n"
277       << "### Section for setting aliases used in copyright update\n"
278       << "[copyright-alias]\n"
279       << "# jdoe = John Doe\n";
280
281    typedef std::vector<std::pair<std::string, Alias> > vector;
282    vector vec;
283    std::back_insert_iterator<vector> back_insert_iterator(vec);
284    vec.reserve(conf.copyright_alias().size());
285    std::copy(conf.copyright_alias().begin(), conf.copyright_alias().end(),
286              back_insert_iterator);
287    // sort with respect to Alias.id
288    IdCompare id;
289    PairSecondCompare<const std::string, Alias, IdCompare> comp(id);
290    std::sort(vec.begin(),vec.end(), comp);
291             
292
293    for (vector::const_iterator i(vec.begin()); i!=vec.end(); ++i) {
294      os << i->first << " = " << i->second.name() << " \n";
295    }
296
297    os << "\n"
298       << "### Section for setting trac environment\n"
299       << "[trac]\n"
300       << "# If trac-root is set, svndigest will create anchors to "
301       << "the Trac page.\n"
302       << "# trac-root = http://trac.thep.lu.se/trac/svndigest/\n";
303    if (!conf.trac_root().empty())
304      os << "trac-root = " << conf.trac_root() << "\n";
305
306    if (conf.string2codons_.size()>1) {
307      os << "\n"
308         << "### Section for setting parsing modes\n"
309         << "### The format of the entries is:\n"
310         << "###   file-name-pattern = start-code : end-code\n"
311         << "### The file-name-pattern may contain wildcards (such as '*' "
312         << "and '?').\n"
313         << "### String \"<NEWLINE>\" can be used for codons containing newline"
314         << "\n### character: '\\n'\n"
315         << "[parsing]\n";
316      for (size_t i=0; i<conf.string2codons_.size()-1; ++i)
317        for (size_t j=0; j<conf.string2codons_[i].second.size(); ++j)
318          os << conf.string2codons_[i].first << " = " 
319             << trans_beg_code(conf.string2codons_[i].second[j].first) 
320             << " : " 
321             << trans_end_code(conf.string2codons_[i].second[j].second) 
322             << "\n";
323    }
324
325    return os;
326  }
327
328
329}} // end of namespace svndigest and namespace theplu
Note: See TracBrowser for help on using the repository browser.