public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Petteri Räty" <betelgeuse@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/libbash:master commit in: scripts/, src/core/, bashast/
Date: Mon,  4 Apr 2011 16:09:43 +0000 (UTC)	[thread overview]
Message-ID: <e399dff749def2cd11ab44cf53896c849f1429a8.betelgeuse@gentoo> (raw)

commit:     e399dff749def2cd11ab44cf53896c849f1429a8
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Mon Apr  4 08:57:46 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Mon Apr  4 15:57:05 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=e399dff7

Implement parameter expansion: ${parameter:-word}

---
 bashast/libbashWalker.g             |   26 ++++++++++++++++++++++++--
 scripts/var_expansion.ebuild        |    2 ++
 scripts/var_expansion.ebuild.result |    2 ++
 src/core/interpreter.h              |    6 ++++++
 4 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index ddfef7a..d0f89bf 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -62,7 +62,8 @@ var_def:
 
 string_expr	returns[std::string libbash_value]:
 	^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; }
-	|^(DOUBLE_QUOTED_STRING (libbash_string=dqstr { $libbash_value += libbash_string; })*);
+	|^(DOUBLE_QUOTED_STRING (libbash_string=dqstr { $libbash_value += libbash_string; })*)
+	|^(STRING libbash_string=dqstr) { $libbash_value = libbash_string; };
 
 //A rule for filenames/strings
 res_word_str returns[std::string libbash_value]
@@ -109,9 +110,30 @@ dqstr returns[std::string libbash_value]:
 	| libbash_string=var_ref { $libbash_value = libbash_string; }
 	| ^(ARITHMETIC_EXPRESSION value=arithmetics) { $libbash_value = boost::lexical_cast<std::string>(value); };
 
+//Allowable variable names in the variable expansion
+var_name returns[std::string libbash_value]
+@after {
+	$libbash_value = walker->get_string($var_name.start);
+}:
+	num|name|TIMES|AT;
+
+var_exp returns[std::string libbash_value]:
+	^(USE_DEFAULT var_name libbash_word=word) {
+		libbash_value = walker->do_default_expansion($var_name.libbash_value, libbash_word);
+	};
+
+word returns[std::string libbash_value]:
+	// Avoid conflict with arithmetics (both have VAR_DEF)
+	(var_ref) => libbash_string=var_ref { $libbash_value = libbash_string; }
+	// Avoid conflict with arithmetics (both have num)
+	|(num) => libbash_string=num { $libbash_value = libbash_string; }
+	|libbash_string=string_expr { $libbash_value = libbash_string; }
+	|value=arithmetics { $libbash_value = boost::lexical_cast<std::string>(value); };
+
 //variable reference
 var_ref returns[std::string libbash_value]:
-	^(VAR_REF libbash_name=name) { $libbash_value=walker->resolve<std::string>(libbash_name); };
+	^(VAR_REF libbash_name=name) { $libbash_value = walker->resolve<std::string>(libbash_name); }
+	|^(VAR_REF libbash_string=var_exp) { $libbash_value = libbash_string; };
 
 // shell arithmetic
 arithmetics returns[int value]

diff --git a/scripts/var_expansion.ebuild b/scripts/var_expansion.ebuild
index a5cadb6..62e95c3 100644
--- a/scripts/var_expansion.ebuild
+++ b/scripts/var_expansion.ebuild
@@ -1,2 +1,4 @@
 EAPI="3"
 EAPI4="$(($EAPI+1))"
+FOO="${EAPI:-hello}"
+FOO2="${EAPI3:-hello}"

diff --git a/scripts/var_expansion.ebuild.result b/scripts/var_expansion.ebuild.result
index cec88e4..f92abe4 100644
--- a/scripts/var_expansion.ebuild.result
+++ b/scripts/var_expansion.ebuild.result
@@ -1,2 +1,4 @@
 EAPI=3
 EAPI4=4
+FOO=3
+FOO2=hello

diff --git a/src/core/interpreter.h b/src/core/interpreter.h
index 1ce1076..2fc8703 100644
--- a/src/core/interpreter.h
+++ b/src/core/interpreter.h
@@ -410,5 +410,11 @@ public:
         new variable(name, value, readonly, is_null));
     members.define(target);
   }
+
+  const std::string do_default_expansion(const std::string& name,
+                                         const std::string& value)
+  {
+    return (is_null(name)? value : resolve<std::string>(name));
+  }
 };
 #endif



             reply	other threads:[~2011-04-04 16:09 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-04 16:09 Petteri Räty [this message]
  -- strict thread matches above, loose matches on Subject: below --
2011-04-06  7:43 [gentoo-commits] proj/libbash:master commit in: scripts/, src/core/, bashast/ Petteri Räty
2011-04-06 15:07 Petteri Räty
2011-04-14  4:50 Petteri Räty
2011-04-20 14:04 Petteri Räty
2011-04-20 14:04 Petteri Räty
2011-04-20 14:04 Petteri Räty
2011-05-07 12:25 Petteri Räty
2011-05-11  7:19 Petteri Räty
2011-05-15 11:19 Petteri Räty
2011-06-03 14:48 Petteri Räty
2011-06-09  8:15 Petteri Räty
2011-08-04 13:53 Petteri Räty
2012-08-19 14:54 Petteri Räty

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e399dff749def2cd11ab44cf53896c849f1429a8.betelgeuse@gentoo \
    --to=betelgeuse@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox