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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
// file : libbuild2/functions-project-name.cxx -*- C++ -*-
// license : MIT; see accompanying LICENSE file
#include <libbuild2/function.hxx>
#include <libbuild2/variable.hxx>
using namespace std;
namespace build2
{
void
project_name_functions (function_map& m)
{
function_family f (m, "project_name");
// $string(<project-name>)
//
// Return the string representation of a project name. See also the
// `$variable()` function below.
//
// Note that we must handle NULL values (relied upon by the parser
// to provide conversion semantics consistent with untyped values).
//
f["string"] += [](project_name* p)
{
return p != nullptr ? move (*p).string () : string ();
};
// $base(<project-name>[, <extension>])
//
// Return the base part (without the extension) of a project name.
//
// If <extension> is specified, then only remove that extension. Note that
// <extension> should not include the dot and the comparison is always
// case-insensitive.
//
f["base"] += [](project_name p, optional<string> ext)
{
return ext ? p.base (ext->c_str ()) : p.base ();
};
f["base"] += [](project_name p, names ext)
{
return p.base (convert<string> (move (ext)).c_str ());
};
// $extension(<project-name>)
//
// Return the extension part (without the dot) of a project name or empty
// string if there is no extension.
//
f["extension"] += &project_name::extension;
// $variable(<project-name>)
//
// Return the string representation of a project name that is sanitized to
// be usable as a variable name. Specifically, `.`, `-`, and `+` are
// replaced with `_`.
//
f["variable"] += &project_name::variable;
// Project name-specific overloads from builtins.
//
function_family b (m, "builtin");
// Note that while we should normally handle NULL values (relied upon by
// the parser to provide concatenation semantics consistent with untyped
// values), the result will unlikely be what the user expected. So for now
// we keep it a bit tighter.
//
b[".concat"] += [](project_name n, string s)
{
string r (move (n).string ());
r += s;
return r;
};
b[".concat"] += [](string s, project_name n)
{
s += n.string ();
return s;
};
b[".concat"] += [](project_name n, names ns)
{
string r (move (n).string ());
r += convert<string> (move (ns));
return r;
};
b[".concat"] += [](names ns, project_name n)
{
string r (convert<string> (move (ns)));
r += n.string ();
return r;
};
}
}
|