source: CMT/v1r26/source/cmt_cmtpath_pattern.cxx

Last change on this file was 588, checked in by rybkin, 13 years ago

See C.L. 465

  • Property svn:eol-style set to native
File size: 5.9 KB
Line 
1//-----------------------------------------------------------
2// Copyright Christian Arnault LAL-Orsay CNRS
3// arnault@lal.in2p3.fr
4// See the complete license in cmt_license.txt "http://www.cecill.info".
5//-----------------------------------------------------------
6
7#include "cmt_database.h"
8#include "cmt_cmtpath_pattern.h"
9#include "cmt_syntax.h"
10
11//----------------------------------------------------------
12//
13//  Operations on CmtPathPatterns
14//
15//----------------------------------------------------------
16
17void CmtPathPattern::action (const CmtSystem::cmt_string_vector& words, Use* use, bool revert)
18{
19  if (words.size () < 1) return;
20
21  //
22  // expected syntax is:
23  //
24  //  cmtpath_pattern any-cmt-statement
25  //
26  // where any-cmt-statement may contain the "template"
27  //
28  //      <path>
29  //      <project>
30  //
31
32  add (words, use, revert);
33
34  if (Cmt::get_debug ())
35    {
36      cout << "CmtPathPattern::action> add " << endl;
37    }
38}
39
40void CmtPathPattern::add (const CmtSystem::cmt_string_vector& words, Use* use, bool revert)
41{
42  static CmtPathPatternVector& CmtPathPatterns = patterns ();
43
44  CmtPathPattern& p = CmtPathPatterns.add ();
45
46  p.clear ();
47
48  p.use  = use;
49  p.revert  = revert;
50
51  int first_word = 1;
52
53  //
54  // Install the cmt-statement as a vector of words.
55  //
56  for (int i = first_word; i < words.size (); i++)
57    {
58      bool need_quotes = (i > (first_word + 1));
59
60      cmt_string& s = words[i];
61
62      if (i > first_word) p.line += " ";
63
64      if (s == ";") first_word = i+1;
65
66      if ((s == "\n") | (s == ";"))
67        {
68          p.line += "\n  ";
69        }
70      else
71        {
72          cmt_string sep = "\"";
73
74          if (s.find (sep) != cmt_string::npos)
75            {
76              sep = "\'";
77            }
78
79          if (!need_quotes) sep = "";
80
81          p.line += sep;
82          p.line += s;
83          p.line += sep;
84        }
85    }
86}
87
88/**
89 * Get the number of registered patterns
90 */
91int CmtPathPattern::pattern_number ()
92{
93  static CmtPathPatternVector& CmtPathPatterns = patterns ();
94
95  return (CmtPathPatterns.size ());
96}
97
98/**
99 * Get the index'th pattern in the database
100 */
101CmtPathPattern& CmtPathPattern::pattern (int index)
102{
103  static CmtPathPatternVector& CmtPathPatterns = patterns ();
104
105  return (CmtPathPatterns[index]);
106}
107
108void CmtPathPattern::clear_all ()
109{
110  static CmtPathPatternVector& CmtPathPatterns = patterns ();
111
112  for (int i = 0; i < CmtPathPatterns.size (); i++)
113    {
114      CmtPathPattern& p = CmtPathPatterns[i];
115      p.clear ();
116    }
117
118  CmtPathPatterns.clear ();
119}
120
121CmtPathPattern::CmtPathPatternVector& CmtPathPattern::patterns ()
122{
123  static Database& db = Database::instance ();
124  static CmtPathPatternVector& CmtPathPatterns = db.cmtpath_patterns ();
125
126  return (CmtPathPatterns);
127}
128
129/**
130 * Applies all patterns to all CMTPATH item
131 */
132void CmtPathPattern::apply_all ()
133{
134  static CmtPathPatternVector& CmtPathPatterns = patterns ();
135
136  int i;
137
138  for (i = 0; i < CmtPathPatterns.size (); i++)
139    {
140      CmtPathPattern& p = CmtPathPatterns[i];
141
142      p.apply ();
143    }
144}
145
146/**
147 * this is the cmt show cmtpath_patterns command
148 * It just shows the cmtpath_pattern declarations.
149 */
150void CmtPathPattern::show_all ()
151{
152  static CmtPathPatternVector& CmtPathPatterns = patterns ();
153
154  int i;
155
156  for (i = 0; i < CmtPathPatterns.size (); i++)
157    {
158      CmtPathPattern& p = CmtPathPatterns[i];
159
160      cout << "# " << p.use->get_package_name () << " " << p.use->version
161           << " adds a cmtpath_pattern as " << endl;
162      cout << "  " << p.line << endl;
163    }
164}
165
166//----------------------------------------------------------
167CmtPathPattern::CmtPathPattern ()
168{
169}
170
171//----------------------------------------------------------
172CmtPathPattern::~CmtPathPattern ()
173
174{
175}
176
177//----------------------------------------------------------
178void CmtPathPattern::clear ()
179{
180  use = 0;
181  line = "";
182}
183
184class CmtPathPatternProjectAction : public IProjectAction
185{
186public:
187  CmtPathPatternProjectAction (const CmtPathPattern& pattern, Use& use) : 
188    m_pattern (pattern), 
189    m_current (use)
190  {
191  }
192
193  bool run (const Project& project)
194  {
195    const cmt_string& pname = project.get_name ();
196    const cmt_string& p = project.get_cmtpath ();
197    const cmt_string& s = project.get_cmtpath_source ();
198
199    if (s == "default path") return (true);
200
201    m_pattern.expand (m_buffer, p, pname);
202
203    if (Cmt::get_debug ())
204      {
205        cout << "CmtPathPattern::apply> text=[" << m_buffer << "]" << endl;
206      }
207
208    SyntaxParser::parse_requirements_text (m_buffer, "", &m_current);
209    m_buffer = "";
210
211    return (true);
212  }
213
214private:
215
216  const CmtPathPattern& m_pattern;
217  Use& m_current;
218  cmt_string m_buffer;
219};
220
221
222/**
223 *   Applies a pattern to all CMTPATH entries.
224 */
225void CmtPathPattern::apply () const
226{
227  if (Cmt::get_debug ())
228    {
229      cout << "CmtPathPattern::apply> cmtpath_pattern defined in " << use->get_package_name () << endl;
230    }
231
232  Use& current_use = Use::current ();
233
234  bool is_constant = ((line.find ("<path>") == cmt_string::npos) &&
235                      (line.find ("<project>") == cmt_string::npos));
236
237  if (is_constant)
238    {
239      cmt_string buffer;
240
241      expand (buffer, "", "");
242
243      if (Cmt::get_debug ())
244        {
245          cout << "CmtPathPattern::apply> text=[" << buffer << "]" << endl;
246        }
247
248      SyntaxParser::parse_requirements_text (buffer, "", &current_use);
249      buffer = "";
250    }
251  else
252    {
253      CmtPathPatternProjectAction pa (*this, current_use);
254
255      if (revert)
256        {
257          Project::broadcast (pa);
258        }
259      else
260        {
261          Project::reverse_broadcast (pa);
262        }
263    }
264}
265
266void CmtPathPattern::expand (cmt_string& replacement, 
267                             const cmt_string& path, 
268                             const cmt_string& project) const
269{
270  replacement = line;
271
272  if (replacement != "")
273    {
274      // Substitute <path> template from the cmt statement
275      replacement.replace_all ("<path>", path.c_str ());
276      replacement.replace_all ("<project>", project.c_str ());
277    }
278}
279
280bool CmtPathPattern::is_constant () const
281{
282  return ((line.find ("<path>") == cmt_string::npos) &&
283          (line.find ("<project>") == cmt_string::npos));
284}
Note: See TracBrowser for help on using the repository browser.