aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/script/token.cxx
blob: 1c612a5406c09f7c3d38aec7a38881b86ba4c63c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// file      : libbuild2/script/token.cxx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

#include <libbuild2/script/token.hxx>

using namespace std;

namespace build2
{
  namespace script
  {
    void
    token_printer (ostream& os, const token& t, print_mode m)
    {
      const string& v (t.value);

      // Only quote non-name tokens for diagnostics.
      //
      const char* q (m == print_mode::diagnostics ? "'" : "");

      switch (t.type)
      {
      case token_type::clean:        os << q << '&'    << v << q; break;
      case token_type::pipe:         os << q << '|'         << q; break;

      case token_type::in_pass:      os << q << "<|"        << q; break;
      case token_type::in_null:      os << q << "<-"        << q; break;
      case token_type::in_file:      os << q << "<="        << q; break;
      case token_type::in_doc:       os << q << "<<="  << v << q; break;
      case token_type::in_str:       os << q << "<<<=" << v << q; break;

      case token_type::out_pass:     os << q << ">|"        << q; break;
      case token_type::out_null:     os << q << ">-"        << q; break;
      case token_type::out_trace:    os << q << ">!"        << q; break;
      case token_type::out_merge:    os << q << ">&"        << q; break;
      case token_type::out_file_ovr: os << q << ">="        << q; break;
      case token_type::out_file_app: os << q << ">+"        << q; break;
      case token_type::out_file_cmp: os << q << ">?"        << q; break;
      case token_type::out_doc:      os << q << ">>?"  << v << q; break;
      case token_type::out_str:      os << q << ">>>?" << v << q; break;

      case token_type::in_l:         os << q << '<'    << v << q; break;
      case token_type::in_ll:        os << q << "<<"   << v << q; break;
      case token_type::in_lll:       os << q << "<<<"  << v << q; break;
      case token_type::out_g:        os << q << '>'    << v << q; break;
      case token_type::out_gg:       os << q << ">>"   << v << q; break;
      case token_type::out_ggg:      os << q << ">>>"  << v << q; break;

      default: build2::token_printer (os, t, m);
      }
    }
  }
}