source: CMT/v1r19/source/cmt_fragment.cxx @ 1

Last change on this file since 1 was 1, checked in by arnault, 19 years ago

Import all tags

File size: 28.8 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 <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include <ctype.h>
11
12#include "cmt_fragment.h"
13#include "cmt_use.h"
14#include "cmt_symbol.h"
15#include "cmt_system.h"
16#include "cmt_database.h"
17
18/*----------------------------------------------------------*/
19/*                                                          */
20/*  Operations on Variables                                 */
21/*                                                          */
22/*----------------------------------------------------------*/
23
24//----------------------------------------------------------
25Variable* Variable::find (VariableVector& vector, 
26                          const cmt_string& name)
27{
28  for (int i = 0; i < vector.size (); i++)
29    {
30      Variable& v = vector[i];
31
32      if (v.name == name) return (&v);
33    }
34
35  return (0);
36}
37
38//----------------------------------------------------------
39Variable::Variable ()
40{
41}
42
43//----------------------------------------------------------
44Variable::Variable (const cmt_string& n) : name (n)
45{
46  m_macro_braces = "${";
47  m_macro_braces += name;
48  m_macro_braces += "}";
49
50  m_macro_pars = "$(";
51  m_macro_pars += name;
52  m_macro_pars += ")";
53}
54
55//----------------------------------------------------------
56const cmt_string& Variable::macro_braces () const
57{
58  return (m_macro_braces);
59}
60
61//----------------------------------------------------------
62const cmt_string& Variable::macro_pars () const
63{
64  return (m_macro_pars);
65}
66
67//----------------------------------------------------------
68void Variable::set (const cmt_string& new_name,
69                    const cmt_string& new_value)
70{
71  name = new_name;
72  value = new_value;
73
74  m_macro_braces = "${";
75  m_macro_braces += name;
76  m_macro_braces += "}";
77
78  m_macro_pars = "$(";
79  m_macro_pars += name;
80  m_macro_pars += ")";
81}
82
83//----------------------------------------------------------
84Variable& Variable::operator = (const Variable& other)
85{
86  value = other.value;
87  return (*this);
88}
89
90//----------------------------------------------------------
91Variable& Variable::operator = (const cmt_string& v)
92{
93  value = v;
94  return (*this);
95}
96
97//----------------------------------------------------------
98void Variable::operator += (const cmt_string& v)
99{
100  value += v;
101}
102
103//----------------------------------------------------------
104cmt_string Variable::operator + (const cmt_string& v) const
105{
106  return (value + v);
107}
108
109//----------------------------------------------------------
110Variable::operator const cmt_string& () const
111{
112  return (value);
113}
114
115//----------------------------------------------------------
116bool Variable::operator == (const cmt_string& v) const
117{
118  return ((value == v));
119}
120
121//----------------------------------------------------------
122bool Variable::operator != (const cmt_string& v) const
123{
124  return ((value != v));
125}
126
127/*----------------------------------------------------------*/
128/*                                                          */
129/*  Operations on Fragments                                 */
130/*                                                          */
131/*----------------------------------------------------------*/
132
133/*----------------------------------------------------------*/
134void Fragment::show (const cmt_string& name)
135{
136  Fragment* fragment = Fragment::find (name);
137  if (fragment == 0)
138    {
139      cout << "Fragment " << name << " not found" << endl;
140    }
141  else
142    {
143      fragment->print ();
144    }
145}
146
147/*----------------------------------------------------------*/
148void Fragment::show_all ()
149{
150  static FragmentVector& Fragments = fragments ();
151
152  int number;
153
154  for (number = 0; number < Fragments.size (); number++)
155    {
156      Fragment& fragment = Fragments[number];
157
158      fragment.print ();
159    }
160}
161
162class fragment_action_iterator
163{
164public:
165
166  fragment_action_iterator (Use* use) :
167    m_need_dependencies (false),
168    m_state (need_name),
169    m_use (use)
170  {
171  }
172
173  void add_word (const cmt_string& w)
174  {
175    switch (m_state)
176      {
177      case need_name:
178        m_name = w;
179        m_state = need_options;
180        break;
181      case need_options:
182        if (w.find ("-suffix=") != cmt_string::npos)
183          {
184            m_suffix = w;
185            m_suffix.replace ("-suffix=", "");
186          }
187        else if (w.find ("-dependencies") != cmt_string::npos)
188          {
189            m_need_dependencies = true;
190          }
191        else if (w.find ("-header=") != cmt_string::npos)
192          {
193            m_header = w;
194            m_header.replace ("-header=", "");
195
196            if (Fragment::find (m_header) == 0)
197              {
198                Fragment::add (m_header, "", "", "", false, m_use);
199              }
200          }
201        else if (w.find ("-trailer=") != cmt_string::npos)
202          {
203            m_trailer = w;
204            m_trailer.replace ("-trailer=", "");
205           
206            if (Fragment::find (m_trailer) == 0)
207              {
208                Fragment::add (m_trailer, "", "", "", false, m_use);
209              }
210          }
211        break;
212      }
213  }
214
215  void commit ()
216  {
217    Fragment::add (m_name, m_suffix, m_header, m_trailer, m_need_dependencies, m_use);
218  }
219
220private:
221
222  enum
223    {
224      need_name,
225      need_options
226    } m_state;
227
228  cmt_string m_name;
229  cmt_string m_suffix;
230  cmt_string m_header;
231  cmt_string m_trailer;
232  bool m_need_dependencies;
233  Use* m_use;
234};
235
236
237/*----------------------------------------------------------*/
238void Fragment::action (const CmtSystem::cmt_string_vector& words,
239                       Use* use)
240{
241  if ((Cmt::get_current_access () == UserMode) &&
242      (use->get_current_scope () == ScopePrivate)) return;
243
244  if (words.size () <= 1) return;
245
246  fragment_action_iterator it (use);
247
248  for (int i = 1; i < words.size (); i++)
249    {
250      const cmt_string& w = words[i];
251      cmt_string ew = w;
252
253      Symbol::expand (ew);
254      if (ew != w)
255        {
256          CmtSystem::cmt_string_vector ws;
257
258          CmtSystem::split (ew, " ", ws);
259
260          for (int j = 0; j < ws.size (); ++j)
261            {
262              const cmt_string& ww = ws[j];
263              it.add_word (ww);
264            }
265        }
266      else
267        {
268          it.add_word (ew);
269        }
270    }
271
272  it.commit ();
273}
274
275/*----------------------------------------------------------*/
276Fragment* Fragment::find (const cmt_string& name)
277{
278  static FragmentVector& Fragments = fragments ();
279
280  int fragment_index;
281
282  if (Fragments.size () == 0) return (0);
283
284  for (fragment_index = 0;
285       fragment_index < Fragments.size ();
286       fragment_index++)
287    {
288      Fragment& fragment = Fragments[fragment_index];
289
290      if (fragment.name == name)
291        {
292          return (&fragment);
293        }
294    }
295
296  return (0);
297}
298
299/*----------------------------------------------------------*/
300void Fragment::add (const cmt_string& name,
301                    const cmt_string& suffix,
302                    const cmt_string& header,
303                    const cmt_string& trailer,
304                    bool need_dependencies,
305                    Use* use)
306{
307  static FragmentVector& Fragments = fragments ();
308
309  {
310    Fragment* fragment;
311
312    if (name == "") return;
313
314    fragment = find (name);
315    if (fragment != 0)
316      {
317        if (suffix != "")
318          {
319            fragment->suffix = suffix;
320          }
321
322        if (header != "")
323          {
324            fragment->header = header;
325          }
326
327        if (trailer != "")
328          {
329            fragment->trailer = trailer;
330          }
331
332        fragment->need_dependencies = need_dependencies;
333
334        fragment->use = use;
335        return;
336      }
337  }
338
339  Fragment& fragment = Fragments.add ();
340
341  fragment.name              = name;
342  fragment.suffix            = suffix;
343  fragment.header            = header;
344  fragment.trailer           = trailer;
345  fragment.need_dependencies = need_dependencies;
346  fragment.use               = use;
347}
348
349/*----------------------------------------------------------*/
350void Fragment::clear_all ()
351{
352  static FragmentVector& Fragments = fragments ();
353
354  for (int i = 0; i < Fragments.size (); i++)
355    {
356      Fragment& f = Fragments[i];
357      f.clear ();
358    }
359
360  Fragments.clear ();
361}
362
363/*----------------------------------------------------------*/
364Fragment::FragmentVector& Fragment::fragments ()
365{
366  static Database& db = Database::instance ();
367  static FragmentVector& Fragments = db.fragments ();
368
369  return (Fragments);
370}
371
372/*----------------------------------------------------------*/
373Fragment::Fragment ()
374{
375  use = 0;
376}
377
378/*----------------------------------------------------------*/
379Fragment::Fragment (const cmt_string& fragment_name)
380{
381  name = fragment_name;
382  use = 0;
383  path = "";
384}
385
386/*----------------------------------------------------------*/
387Fragment::~Fragment ()
388{
389  use = 0;
390}
391
392/*----------------------------------------------------------*/
393void Fragment::clear ()
394{
395  name    = "";
396  suffix  = "";
397  header  = "";
398  trailer = "";
399  need_dependencies = false;
400  path = "";
401  use  = 0;
402}
403
404/*----------------------------------------------------------*/
405int Fragment::print ()
406{
407  int result = 1;
408
409  if (name == "") return (0);
410 
411  locate ();
412
413  if (use == 0)
414    {
415      Use& u = Use::current();
416      use = &u;
417    }
418 
419  cmt_string the_path = path;
420
421  use->reduce_path (the_path);
422
423  cout << the_path;
424
425  if (suffix != "")
426    {
427      cout << "->" << suffix;
428    }
429
430  cout << endl;
431
432  return (result);
433}
434
435/*----------------------------------------------------------*/
436bool Fragment::locate ()
437{
438  cmt_string root_path;
439
440  if (use == 0)
441    {
442      // Assume CMT
443      use = Use::find ("CMT");
444    }
445
446  use->get_full_path (root_path);
447
448  if (path != "") return (true);
449
450  // First try <root>/fragments/<name> or <root>/fragments/nmake/<name>
451
452  path = root_path;
453  path += CmtSystem::file_separator ();
454  path += "fragments";
455  path += CmtSystem::file_separator ();
456 
457  if (Cmt::build_nmake ())
458    {
459      path += "nmake";
460      path += CmtSystem::file_separator ();
461    }
462 
463  path += name;
464
465  if (CmtSystem::test_file (path)) return (true);
466
467  // Then try <root>/fragments/<name> for both Win and Unix
468
469  path = root_path;
470  path += CmtSystem::file_separator ();
471  path += "fragments";
472  path += CmtSystem::file_separator ();
473  path += name;
474
475  if (CmtSystem::test_file (path)) return (true);
476
477  // Then try <root>/cmt/fragments/<name> or <root>/cmt/fragments/nmake/<name>
478
479  root_path += CmtSystem::file_separator ();
480
481  if (use->style == mgr_style) root_path += "mgr";
482  else root_path += "cmt";
483 
484  root_path += CmtSystem::file_separator ();
485  root_path += "fragments";
486  root_path += CmtSystem::file_separator ();
487 
488  path = root_path;
489 
490  if (Cmt::build_nmake ())
491    {
492      path += "nmake";
493      path += CmtSystem::file_separator ();
494    }
495 
496  path += name;
497 
498  if (CmtSystem::test_file (path)) return (true);
499
500  // Then try <root>/cmt/fragments/<name> for both Win and Unix
501
502  path = root_path;
503 
504  path += name;
505
506  if (CmtSystem::test_file (path)) return (true);
507
508  return (false);
509}
510
511//--------------------------------------------------
512bool Fragment::copy (FILE* out,
513                     const cmt_string& name,
514                     int variables, ...)
515{
516  va_list ids;
517
518  Fragment* fragment = Fragment::find (name);
519  if (fragment == 0) return (false);
520
521  va_start (ids, variables);
522  bool result = fragment->copy (out, variables, ids);
523  va_end (ids);
524
525  return (result);
526}
527
528//--------------------------------------------------
529bool Fragment::copy (cmt_string& out,
530                     const cmt_string& name,
531                     int variables, ...)
532{
533  va_list ids;
534
535  Fragment* fragment = Fragment::find (name);
536  if (fragment == 0) return (false);
537
538  va_start (ids, variables);
539  bool result = fragment->copy (out, variables, ids);
540  va_end (ids);
541
542  return (result);
543}
544
545//--------------------------------------------------
546bool Fragment::copy (FILE* out, int variables, ...)
547{
548  va_list ids;
549
550  va_start (ids, variables);
551  bool result = copy (out, variables, ids);
552  va_end (ids);
553
554  return (result);
555}
556
557//--------------------------------------------------
558bool Fragment::copy (cmt_string& out, int variables, ...)
559{
560  va_list ids;
561
562  va_start (ids, variables);
563  bool result = copy (out, variables, ids);
564  va_end (ids);
565
566  return (result);
567}
568
569//--------------------------------------------------
570bool Fragment::copy (FILE* out, int variables, va_list ids)
571{
572  static cmt_string cline;
573
574  bool result = copy (cline, variables, ids);
575  if (result)
576    {
577      cline.write (out);
578      return (true);
579    }
580  else
581    {
582      return (false);
583    }
584}
585
586//--------------------------------------------------
587bool Fragment::copy (cmt_string& out, int variables, va_list ids)
588{
589  int i;
590
591  if (!locate ()) return (false);
592
593  out.read (path);
594
595  Variable* var = 0;
596  for (i = 0; i < variables; i++)
597    {
598      var = va_arg (ids, Variable*);
599      out.replace_all (var->macro_braces (), var->value);
600      out.replace_all (var->macro_pars (), var->value);
601    }
602
603  return (true);
604}
605
606//--------------------------------------------------
607bool Fragment::wincopy (FILE* out, int variables, va_list ids)
608{
609  static cmt_string cline;
610
611  bool result = wincopy (cline, variables, ids);
612
613  if (result)
614    {
615      cline.write (out);
616      return (true);
617    }
618  else
619    {
620      return (false);
621    }
622}
623
624//--------------------------------------------------
625bool Fragment::wincopy (cmt_string& out, int variables, va_list ids)
626{
627  int i;
628
629  if (!locate ()) return (false);
630
631  out.read (path);
632
633  Variable* var = 0;
634  for (i = 0; i < variables; i++)
635    {
636      var = va_arg (ids, Variable*);
637      out.replace_all (var->macro_braces (), var->value);
638      out.replace_all (var->macro_pars (), var->value);
639    }
640
641  cmt_string pattern;
642  cmt_string macro_name;
643  char end_pattern;
644
645  int start = 0;
646
647  for (;;)
648    {
649      //
650      // Try and substitute all ${xxx} or $(xxx) patterns
651      // using symbol values.
652      //
653      int par;
654      int brace;
655      int begin;
656
657      par = out.find (start, "$(");
658      brace = out.find (start, "${");
659
660      if (par == cmt_string::npos)
661        {
662          // No parentheses. Look for brace
663          if (brace == cmt_string::npos)
664            {
665              // No pattern, finish the scan.
666              break;
667            }
668
669          // Brace found
670          end_pattern = '}';
671          begin = brace;
672        }
673      else
674        {
675          // Parenthese found. Look for closest from {par, brace}
676          if ((brace == cmt_string::npos) ||
677              (brace > par))
678            {
679              end_pattern = ')';
680              begin = par;
681            }
682          else
683            {
684              end_pattern = '}';
685              begin = brace;
686            }
687        }
688
689      // Skip the pattern intro.
690      start = begin + 2;
691
692      int end;
693      end = out.find (start, end_pattern);
694      if (end == cmt_string::npos)
695        {
696          // The pattern is a fake one (no ending!)
697          break;
698        }
699
700      // This should never happen...
701      if (end < begin) break;
702
703      // Extract the complete pattern
704      out.substr (begin, end - begin + 1, pattern);
705
706      // Then only the macro name
707      out.substr (begin + 2, end - begin - 2, macro_name);
708
709      if (macro_name == "CFG")
710        {
711          // This is a Windows reserved keyword...
712          start = end + 1;
713        }
714      else
715        {
716          Symbol* macro = Symbol::find (macro_name);
717          if (macro != 0)
718            {
719              // Macro found
720              cmt_string value = macro->resolve_macro_value ();
721              //cout << "resolve_macro_value2> value=" << value << endl;
722              out.replace_all (pattern, value);
723
724              // The substitution will restart from the same place
725              // allowing for recursive replacements
726              start = begin;
727            }
728          else
729            {
730              // Macro not found. Look for env. variable
731              cmt_string value = CmtSystem::getenv (macro_name);
732              //cout << "resolve_macro_value3> " << macro_name << "=" << value << endl;
733              out.replace_all (pattern, value);
734
735              // The substitution will restart from the same place
736              // allowing for recursive replacements
737              start = begin;
738            }
739        }
740    }
741
742  // Uniformly install CR-LF doublets.
743
744  out.replace_all ("\r\n", "\n");
745  out.replace_all ("\n", "\r\n");
746
747  return (true);
748}
749
750
751
752
753
754
755
756
757//--------------------------------------------------
758bool Fragment::copy (FILE* out,
759                     const cmt_string& name,
760                     const Variable::VariableVector& vector, 
761                     int variables, ...)
762{
763  va_list ids;
764
765  Fragment* fragment = Fragment::find (name);
766  if (fragment == 0) return (false);
767
768  va_start (ids, variables);
769  bool result = fragment->copy (out, vector, variables, ids);
770  va_end (ids);
771
772  return (result);
773}
774
775//--------------------------------------------------
776bool Fragment::copy (cmt_string& out,
777                     const cmt_string& name,
778                     const Variable::VariableVector& vector, 
779                     int variables, ...)
780{
781  va_list ids;
782
783  Fragment* fragment = Fragment::find (name);
784  if (fragment == 0) return (false);
785
786  va_start (ids, variables);
787  bool result = fragment->copy (out, vector, variables, ids);
788  va_end (ids);
789
790  return (result);
791}
792
793//--------------------------------------------------
794bool Fragment::copy (FILE* out, const Variable::VariableVector& vector, int variables, ...)
795{
796  va_list ids;
797
798  va_start (ids, variables);
799  bool result = copy (out, vector, variables, ids);
800  va_end (ids);
801
802  return (result);
803}
804
805//--------------------------------------------------
806bool Fragment::copy (cmt_string& out, const Variable::VariableVector& vector, int variables, ...)
807{
808  va_list ids;
809
810  va_start (ids, variables);
811  bool result = copy (out, vector, variables, ids);
812  va_end (ids);
813
814  return (result);
815}
816
817//--------------------------------------------------
818bool Fragment::copy (FILE* out, const Variable::VariableVector& vector, int variables, va_list ids)
819{
820  static cmt_string cline;
821
822  bool result = copy (cline, vector, variables, ids);
823  if (result)
824    {
825      cline.write (out);
826      return (true);
827    }
828  else
829    {
830      return (false);
831    }
832}
833
834//--------------------------------------------------
835bool Fragment::copy (cmt_string& out, const Variable::VariableVector& vector, int variables, va_list ids)
836{
837  int i;
838
839  if (!locate ()) return (false);
840
841  out.read (path);
842
843  Variable* var = 0;
844
845  for (i = 0; i < vector.size (); i++)
846    {
847      var = &(vector[i]);
848      out.replace_all (var->macro_braces (), var->value);
849      out.replace_all (var->macro_pars (), var->value);
850    }
851
852  for (i = 0; i < variables; i++)
853    {
854      var = va_arg (ids, Variable*);
855      out.replace_all (var->macro_braces (), var->value);
856      out.replace_all (var->macro_pars (), var->value);
857    }
858
859  return (true);
860}
861
862//--------------------------------------------------
863bool Fragment::wincopy (FILE* out, const Variable::VariableVector& vector, int variables, va_list ids)
864{
865  static cmt_string cline;
866
867  bool result = wincopy (cline, vector, variables, ids);
868  if (result)
869    {
870      cline.write (out);
871      return (true);
872    }
873  else
874    {
875      return (false);
876    }
877}
878
879//--------------------------------------------------
880bool Fragment::wincopy (cmt_string& out, const Variable::VariableVector& vector, 
881                        int variables, va_list ids)
882{
883  int i;
884
885  if (!locate ()) return (false);
886
887  out.read (path);
888
889  Variable* var = 0;
890
891  for (i = 0; i < vector.size (); i++)
892    {
893      var = &(vector[i]);
894      out.replace_all (var->macro_braces (), var->value);
895      out.replace_all (var->macro_pars (), var->value);
896    }
897
898  for (i = 0; i < variables; i++)
899    {
900      var = va_arg (ids, Variable*);
901      out.replace_all (var->macro_braces (), var->value);
902      out.replace_all (var->macro_pars (), var->value);
903    }
904
905  cmt_string pattern;
906  cmt_string macro_name;
907  char end_pattern;
908
909  int start = 0;
910
911  for (;;)
912    {
913      //
914      // Try and substitute all ${xxx} or $(xxx) patterns
915      // using symbol values.
916      //
917      int par;
918      int brace;
919      int begin;
920
921      par = out.find (start, "$(");
922      brace = out.find (start, "${");
923
924      if (par == cmt_string::npos)
925        {
926          // No parentheses. Look for brace
927          if (brace == cmt_string::npos)
928            {
929              // No pattern, finish the scan.
930              break;
931            }
932
933          // Brace found
934          end_pattern = '}';
935          begin = brace;
936        }
937      else
938        {
939          // Parenthese found. Look for closest from {par, brace}
940          if ((brace == cmt_string::npos) ||
941              (brace > par))
942            {
943              end_pattern = ')';
944              begin = par;
945            }
946          else
947            {
948              end_pattern = '}';
949              begin = brace;
950            }
951        }
952
953      // Skip the pattern intro.
954      start = begin + 2;
955
956      int end;
957      end = out.find (start, end_pattern);
958      if (end == cmt_string::npos)
959        {
960          // The pattern is a fake one (no ending!)
961          break;
962        }
963
964      // This should never happen...
965      if (end < begin) break;
966
967      // Extract the complete pattern
968      out.substr (begin, end - begin + 1, pattern);
969
970      // Then only the macro name
971      out.substr (begin + 2, end - begin - 2, macro_name);
972
973      if (macro_name == "CFG")
974        {
975          // This is a Windows reserved keyword...
976          start = end + 1;
977        }
978      else
979        {
980          Symbol* macro = Symbol::find (macro_name);
981          if (macro != 0)
982            {
983              // Macro found
984              cmt_string value = macro->resolve_macro_value ();
985              //cout << "resolve_macro_value2> value=" << value << endl;
986              out.replace_all (pattern, value);
987
988              // The substitution will restart from the same place
989              // allowing for recursive replacements
990              start = begin;
991            }
992          else
993            {
994              // Macro not found. Look for env. variable
995              cmt_string value = CmtSystem::getenv (macro_name);
996              //cout << "resolve_macro_value3> " << macro_name << "=" << value << endl;
997              out.replace_all (pattern, value);
998
999              // The substitution will restart from the same place
1000              // allowing for recursive replacements
1001              start = begin;
1002            }
1003        }
1004    }
1005
1006  // Uniformly install CR-LF doublets.
1007
1008  out.replace_all ("\r\n", "\n");
1009  out.replace_all ("\n", "\r\n");
1010
1011  return (true);
1012}
1013
1014//--------------------------------------------------
1015FragmentHandle::FragmentHandle ()
1016{
1017  _fragment = 0;
1018  _initialized = false;
1019}
1020
1021//--------------------------------------------------
1022FragmentHandle::FragmentHandle (const cmt_string name) : _name(name)
1023{
1024  _fragment = 0;
1025  _initialized = false;
1026}
1027
1028//--------------------------------------------------
1029FragmentHandle& FragmentHandle::operator = (const FragmentHandle& other)
1030{
1031  _name = other._name;
1032  _fragment = 0;
1033  _initialized = false;
1034
1035  return (*this);
1036}
1037
1038//--------------------------------------------------
1039void FragmentHandle::reset ()
1040{
1041  _fragment = 0;
1042  _initialized = false;
1043}
1044
1045//--------------------------------------------------
1046void FragmentHandle::set (const cmt_string name)
1047{
1048  _name = name;
1049  _fragment = 0;
1050  _initialized = false;
1051}
1052
1053//--------------------------------------------------
1054cmt_string& FragmentHandle::name ()
1055{
1056  static cmt_string null_string;
1057
1058  if (!setup ()) return (null_string);
1059
1060  return (_fragment->name);
1061}
1062
1063//--------------------------------------------------
1064cmt_string& FragmentHandle::suffix ()
1065{
1066  static cmt_string null_string;
1067
1068  if (!setup ()) return (null_string);
1069
1070  return (_fragment->suffix);
1071}
1072
1073//--------------------------------------------------
1074cmt_string& FragmentHandle::header ()
1075{
1076  static cmt_string null_string;
1077
1078  if (!setup ()) return (null_string);
1079
1080  return (_fragment->header);
1081}
1082
1083//--------------------------------------------------
1084cmt_string& FragmentHandle::trailer ()
1085{
1086  static cmt_string null_string;
1087
1088  if (!setup ()) return (null_string);
1089
1090  return (_fragment->trailer);
1091}
1092
1093//--------------------------------------------------
1094bool FragmentHandle::need_dependencies ()
1095{
1096  if (!setup ()) return (false);
1097
1098  return (_fragment->need_dependencies);
1099}
1100
1101//--------------------------------------------------
1102bool FragmentHandle::copy (FILE* out, int variables, ...)
1103{
1104  if (!setup ()) return (false);
1105
1106  va_list ids;
1107
1108  va_start (ids, variables);
1109  bool result = _fragment->copy (out, variables, ids);
1110  va_end (ids);
1111
1112  if (!result)
1113    {
1114      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1115      _fragment = 0;
1116    }
1117
1118  return (result);
1119}
1120
1121//--------------------------------------------------
1122bool FragmentHandle::copy (cmt_string& out, int variables, ...)
1123{
1124  if (!setup ()) return (false);
1125
1126  va_list ids;
1127
1128  va_start (ids, variables);
1129  bool result = _fragment->copy (out, variables, ids);
1130  va_end (ids);
1131
1132  if (!result)
1133    {
1134      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1135      _fragment = 0;
1136    }
1137
1138  return (result);
1139}
1140
1141//--------------------------------------------------
1142bool FragmentHandle::wincopy (FILE* out, int variables, ...)
1143{
1144  if (!setup ()) return (false);
1145
1146  va_list ids;
1147
1148  va_start (ids, variables);
1149  bool result = _fragment->wincopy (out, variables, ids);
1150  va_end (ids);
1151
1152  if (!result)
1153    {
1154      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1155      _fragment = 0;
1156    }
1157
1158  return (result);
1159}
1160
1161//--------------------------------------------------
1162bool FragmentHandle::wincopy (cmt_string& out, int variables, ...)
1163{
1164  if (!setup ()) return (false);
1165
1166  va_list ids;
1167
1168  va_start (ids, variables);
1169  bool result = _fragment->wincopy (out, variables, ids);
1170  va_end (ids);
1171
1172  if (!result)
1173    {
1174      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1175      _fragment = 0;
1176    }
1177
1178  return (result);
1179}
1180
1181
1182
1183
1184//--------------------------------------------------
1185bool FragmentHandle::copy (FILE* out, const Variable::VariableVector& vector, int variables, ...)
1186{
1187  if (!setup ()) return (false);
1188
1189  va_list ids;
1190
1191  va_start (ids, variables);
1192  bool result = _fragment->copy (out, vector, variables, ids);
1193  va_end (ids);
1194
1195  if (!result)
1196    {
1197      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1198      _fragment = 0;
1199    }
1200
1201  return (result);
1202}
1203
1204//--------------------------------------------------
1205bool FragmentHandle::copy (cmt_string& out, const Variable::VariableVector& vector, int variables, ...)
1206{
1207  if (!setup ()) return (false);
1208
1209  va_list ids;
1210
1211  va_start (ids, variables);
1212  bool result = _fragment->copy (out, vector, variables, ids);
1213  va_end (ids);
1214
1215  if (!result)
1216    {
1217      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1218      _fragment = 0;
1219    }
1220
1221  return (result);
1222}
1223
1224//--------------------------------------------------
1225bool FragmentHandle::wincopy (FILE* out, const Variable::VariableVector& vector, int variables, ...)
1226{
1227  if (!setup ()) return (false);
1228
1229  va_list ids;
1230
1231  va_start (ids, variables);
1232  bool result = _fragment->wincopy (out, vector, variables, ids);
1233  va_end (ids);
1234
1235  if (!result)
1236    {
1237      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1238      _fragment = 0;
1239    }
1240
1241  return (result);
1242}
1243
1244//--------------------------------------------------
1245bool FragmentHandle::wincopy (cmt_string& out, 
1246                              const Variable::VariableVector& vector, 
1247                              int variables, ...)
1248{
1249  if (!setup ()) return (false);
1250
1251  va_list ids;
1252
1253  va_start (ids, variables);
1254  bool result = _fragment->wincopy (out, vector, variables, ids);
1255  va_end (ids);
1256
1257  if (!result)
1258    {
1259      cerr << "#CMT> Fragment " << _name << " not found" << endl;
1260      _fragment = 0;
1261    }
1262
1263  return (result);
1264}
1265
1266//--------------------------------------------------
1267bool FragmentHandle::setup ()
1268{
1269  if (!_initialized)
1270    {
1271      _initialized = true;
1272
1273      _fragment = Fragment::find (_name);
1274      if (_fragment == 0)
1275        {
1276          cerr << "#CMT> Fragment " << _name << " not found" << endl;
1277        }
1278    }
1279
1280  if (_fragment == 0)
1281    {
1282      return (false);
1283    }
1284  else
1285    {
1286      return (true);
1287    }
1288}
Note: See TracBrowser for help on using the repository browser.