Gentoo Archives: gentoo-commits

From: "Petteri Räty" <betelgeuse@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/libbash:master commit in: scripts/, src/core/, bashast/
Date: Mon, 04 Apr 2011 16:09:52
Message-Id: e399dff749def2cd11ab44cf53896c849f1429a8.betelgeuse@gentoo
1 commit: e399dff749def2cd11ab44cf53896c849f1429a8
2 Author: Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
3 AuthorDate: Mon Apr 4 08:57:46 2011 +0000
4 Commit: Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
5 CommitDate: Mon Apr 4 15:57:05 2011 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=e399dff7
7
8 Implement parameter expansion: ${parameter:-word}
9
10 ---
11 bashast/libbashWalker.g | 26 ++++++++++++++++++++++++--
12 scripts/var_expansion.ebuild | 2 ++
13 scripts/var_expansion.ebuild.result | 2 ++
14 src/core/interpreter.h | 6 ++++++
15 4 files changed, 34 insertions(+), 2 deletions(-)
16
17 diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
18 index ddfef7a..d0f89bf 100644
19 --- a/bashast/libbashWalker.g
20 +++ b/bashast/libbashWalker.g
21 @@ -62,7 +62,8 @@ var_def:
22
23 string_expr returns[std::string libbash_value]:
24 ^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; }
25 - |^(DOUBLE_QUOTED_STRING (libbash_string=dqstr { $libbash_value += libbash_string; })*);
26 + |^(DOUBLE_QUOTED_STRING (libbash_string=dqstr { $libbash_value += libbash_string; })*)
27 + |^(STRING libbash_string=dqstr) { $libbash_value = libbash_string; };
28
29 //A rule for filenames/strings
30 res_word_str returns[std::string libbash_value]
31 @@ -109,9 +110,30 @@ dqstr returns[std::string libbash_value]:
32 | libbash_string=var_ref { $libbash_value = libbash_string; }
33 | ^(ARITHMETIC_EXPRESSION value=arithmetics) { $libbash_value = boost::lexical_cast<std::string>(value); };
34
35 +//Allowable variable names in the variable expansion
36 +var_name returns[std::string libbash_value]
37 +@after {
38 + $libbash_value = walker->get_string($var_name.start);
39 +}:
40 + num|name|TIMES|AT;
41 +
42 +var_exp returns[std::string libbash_value]:
43 + ^(USE_DEFAULT var_name libbash_word=word) {
44 + libbash_value = walker->do_default_expansion($var_name.libbash_value, libbash_word);
45 + };
46 +
47 +word returns[std::string libbash_value]:
48 + // Avoid conflict with arithmetics (both have VAR_DEF)
49 + (var_ref) => libbash_string=var_ref { $libbash_value = libbash_string; }
50 + // Avoid conflict with arithmetics (both have num)
51 + |(num) => libbash_string=num { $libbash_value = libbash_string; }
52 + |libbash_string=string_expr { $libbash_value = libbash_string; }
53 + |value=arithmetics { $libbash_value = boost::lexical_cast<std::string>(value); };
54 +
55 //variable reference
56 var_ref returns[std::string libbash_value]:
57 - ^(VAR_REF libbash_name=name) { $libbash_value=walker->resolve<std::string>(libbash_name); };
58 + ^(VAR_REF libbash_name=name) { $libbash_value = walker->resolve<std::string>(libbash_name); }
59 + |^(VAR_REF libbash_string=var_exp) { $libbash_value = libbash_string; };
60
61 // shell arithmetic
62 arithmetics returns[int value]
63
64 diff --git a/scripts/var_expansion.ebuild b/scripts/var_expansion.ebuild
65 index a5cadb6..62e95c3 100644
66 --- a/scripts/var_expansion.ebuild
67 +++ b/scripts/var_expansion.ebuild
68 @@ -1,2 +1,4 @@
69 EAPI="3"
70 EAPI4="$(($EAPI+1))"
71 +FOO="${EAPI:-hello}"
72 +FOO2="${EAPI3:-hello}"
73
74 diff --git a/scripts/var_expansion.ebuild.result b/scripts/var_expansion.ebuild.result
75 index cec88e4..f92abe4 100644
76 --- a/scripts/var_expansion.ebuild.result
77 +++ b/scripts/var_expansion.ebuild.result
78 @@ -1,2 +1,4 @@
79 EAPI=3
80 EAPI4=4
81 +FOO=3
82 +FOO2=hello
83
84 diff --git a/src/core/interpreter.h b/src/core/interpreter.h
85 index 1ce1076..2fc8703 100644
86 --- a/src/core/interpreter.h
87 +++ b/src/core/interpreter.h
88 @@ -410,5 +410,11 @@ public:
89 new variable(name, value, readonly, is_null));
90 members.define(target);
91 }
92 +
93 + const std::string do_default_expansion(const std::string& name,
94 + const std::string& value)
95 + {
96 + return (is_null(name)? value : resolve<std::string>(name));
97 + }
98 };
99 #endif