public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/
@ 2011-05-25 19:42 Petteri Räty
  0 siblings, 0 replies; 3+ messages in thread
From: Petteri Räty @ 2011-05-25 19:42 UTC (permalink / raw
  To: gentoo-commits

commit:     4c2a0e76310000777d9da7feb4309a2b0565e0fe
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Wed May 25 08:46:10 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Wed May 25 13:41:12 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=4c2a0e76

Walker: throw exception if extglob used when disabled

---
 bashast/libbashWalker.g    |    9 +++++++++
 scripts/var_expansion.bash |    1 +
 test/walker_test.cpp       |   17 +++++++++++++++++
 3 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index cd25da3..378d5e5 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -210,21 +210,28 @@ bash_pattern[boost::xpressive::sregex& pattern, bool greedy]
 	using namespace boost::xpressive;
 	bool do_append = false;
 	sregex pattern_list;
+	auto check_extglob = [&]() {
+		if(!walker->get_option("extglob"))
+			throw interpreter_exception("Entered extended pattern matching with extglob disabled");
+	};
 }
 	:^(STRING (
 		(EXTENDED_MATCH_AT_MOST_ONE) => ^(EXTENDED_MATCH_AT_MOST_ONE composite_pattern[pattern_list, $greedy]) {
+			check_extglob();
 			if($greedy)
 				append($pattern, !sregex(pattern_list), do_append);
 			else
 				append($pattern, -!sregex(pattern_list), do_append);
 		}
 		|(EXTENDED_MATCH_ANY) => ^(EXTENDED_MATCH_ANY composite_pattern[pattern_list, $greedy]) {
+			check_extglob();
 			if($greedy)
 				append($pattern, *sregex(pattern_list), do_append);
 			else
 				append($pattern, -*sregex(pattern_list), do_append);
 		}
 		|(EXTENDED_MATCH_AT_LEAST_ONE) => ^(EXTENDED_MATCH_AT_LEAST_ONE composite_pattern[pattern_list, $greedy]) {
+			check_extglob();
 			if($greedy)
 				append($pattern, +sregex(pattern_list), do_append);
 			else
@@ -232,9 +239,11 @@ bash_pattern[boost::xpressive::sregex& pattern, bool greedy]
 		}
 		// We don't have to do anything for the following rule
 		|(EXTENDED_MATCH_EXACTLY_ONE) => ^(EXTENDED_MATCH_EXACTLY_ONE composite_pattern[pattern_list, $greedy]) {
+			check_extglob();
 			append($pattern, pattern_list, do_append);
 		}
 		|(EXTENDED_MATCH_NONE) => ^(EXTENDED_MATCH_NONE composite_pattern[pattern_list, $greedy]) {
+			check_extglob();
 			throw interpreter_exception("!(blah) is not supported for now");
 		}
 		|basic_pattern[$pattern, $greedy, do_append])+);

diff --git a/scripts/var_expansion.bash b/scripts/var_expansion.bash
index 8fcb943..0a84737 100644
--- a/scripts/var_expansion.bash
+++ b/scripts/var_expansion.bash
@@ -1,3 +1,4 @@
+shopt -s extglob
 ARRAY=(hi hello 1 2 3)
 EAPI="3"
 EAPI4="$((EAPI+1))"

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index c3aacbb..41a4fc4 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -74,3 +74,20 @@ TEST(array_index, out_of_bound)
   bash_ast ast2(input2);
   EXPECT_THROW(ast2.interpret_with(walker), interpreter_exception);
 }
+
+TEST(extglob, used_when_disabled)
+{
+  interpreter walker;
+
+  std::string script = "echo ${abc/?([a-z])}";
+  std::istringstream input(script);
+  bash_ast ast(input);
+  try
+  {
+    ast.interpret_with(walker);
+  }
+  catch(interpreter_exception& e)
+  {
+    EXPECT_STREQ(e.what(), "Entered extended pattern matching with extglob disabled");
+  }
+}



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/
@ 2011-06-21 13:26 Petteri Räty
  0 siblings, 0 replies; 3+ messages in thread
From: Petteri Räty @ 2011-06-21 13:26 UTC (permalink / raw
  To: gentoo-commits

commit:     602e860e3ef44afbd8af4b5aafff993a1a0d8aed
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 15 07:12:14 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Jun 21 13:23:34 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=602e860e

Walker: first support for brace expansion

We only support brace expansion in raw string for now. Other cases
will cause an interpreter_exception.

---
 bashast/libbashWalker.g           |   38 +++++++++++++++++++++++++++++++++++-
 scripts/var_expansion.bash        |    3 ++
 scripts/var_expansion.bash.result |    3 ++
 test/walker_test.cpp              |   10 +++++++++
 4 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index fda4ef6..320e69a 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -45,6 +45,7 @@ options
 	#include <sstream>
 
 	#include <boost/format.hpp>
+	#include <boost/algorithm/string/join.hpp>
 
 	#include "builtins/builtin_exceptions.h"
 	#include "core/bash_condition.h"
@@ -210,17 +211,47 @@ var_def[bool local]
 string_expr returns[std::string libbash_value, bool quoted]
 @init {
 	$quoted = true;
+	bool is_raw_string = true;
+	std::vector<std::string> brace_expansion_base{""};
+	std::vector<std::string> brace_expansion_elements;
+}
+@after {
+	if(!is_raw_string && brace_expansion_base.size() > 1)
+		throw libbash::interpreter_exception("We only support brace expansion in raw string for now");
+	$libbash_value = boost::algorithm::join(brace_expansion_base, " ");
 }
 	:^(STRING (
 		string_part {
-			$libbash_value += $string_part.libbash_value;
+			for(auto iter = brace_expansion_base.begin(); iter != brace_expansion_base.end(); ++iter)
+				*iter += $string_part.libbash_value;
 			$quoted = $string_part.quoted;
+			if(is_raw_string)
+				is_raw_string = $string_part.is_raw_string;
+		}
+		|(BRACE_EXP) => ^(BRACE_EXP brace_expansion[brace_expansion_elements]) {
+			auto group_number = brace_expansion_elements.size();
+			auto group_size = brace_expansion_base.size();
+			std::vector<std::string> expanded_values;
+
+			expanded_values.reserve(group_number * group_size);
+			for(auto iter = brace_expansion_base.begin(); iter != brace_expansion_base.end(); ++iter)
+				for(std::vector<std::string>::size_type i = 0u; i != group_number; ++i)
+					expanded_values.push_back(*iter + brace_expansion_elements[i \% group_number]);
+
+			brace_expansion_base.swap(expanded_values);
+			brace_expansion_elements.clear();
 		}
 	)*);
 
-string_part returns[std::string libbash_value, bool quoted]
+brace_expansion[std::vector<std::string>& elements]
+	:(string_expr{
+		$elements.push_back($string_expr.libbash_value);
+	})+;
+
+string_part returns[std::string libbash_value, bool quoted, bool is_raw_string]
 @init {
 	$quoted = false;
+	$is_raw_string = true;
 }
 	:(DOUBLE_QUOTED_STRING) =>
 		^(DOUBLE_QUOTED_STRING (libbash_string=double_quoted_string {
@@ -235,12 +266,15 @@ string_part returns[std::string libbash_value, bool quoted]
 	|(ARITHMETIC_EXPRESSION) =>
 		^(ARITHMETIC_EXPRESSION value=arithmetics {
 			$libbash_value = boost::lexical_cast<std::string>(value);
+			$is_raw_string = false;
 		})
 	|(var_ref[false]) => libbash_string=var_ref[false] {
 		$libbash_value = libbash_string;
+		$is_raw_string = false;
 	}
 	|libbash_string=command_substitution {
 		$libbash_value = libbash_string;
+		$is_raw_string = false;
 	}
 	|(libbash_string=any_string {
 		$libbash_value = libbash_string;

diff --git a/scripts/var_expansion.bash b/scripts/var_expansion.bash
index 9f42f19..16573a9 100644
--- a/scripts/var_expansion.bash
+++ b/scripts/var_expansion.bash
@@ -110,3 +110,6 @@ ARRAY=(1 2 3 4 5)
 echo ${ARRAY[@]:1}
 echo ${ARRAY[@]:1:3}
 echo $#
+echo a{b,c}d
+echo a{a,bc}d{e,}f
+echo a{ab,cd}d{ef,gh}

diff --git a/scripts/var_expansion.bash.result b/scripts/var_expansion.bash.result
index bd83c62..52c87c0 100644
--- a/scripts/var_expansion.bash.result
+++ b/scripts/var_expansion.bash.result
@@ -5,6 +5,9 @@ abcabc
 2 3 4 5
 2 3 4
 0
+abd acd
+aadef aadf abcdef abcdf
+aabdef aabdgh acddef acddgh
 ARRAY=1 2 3 4 5
 ARRAY2=hello
 EAPI=3

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 5a64b04..20cb00d 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -90,3 +90,13 @@ TEST(extglob, used_when_disabled)
     EXPECT_STREQ(e.what(), "Entered extended pattern matching with extglob disabled");
   }
 }
+
+TEST(brace_expansion, not_in_raw_string)
+{
+  interpreter walker;
+
+  std::string script = "echo $ab{c,d}e";
+  std::istringstream input(script);
+  bash_ast ast(input);
+  EXPECT_THROW(ast.interpret_with(walker), libbash::interpreter_exception);
+}



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/
@ 2011-08-04 13:53 Petteri Räty
  0 siblings, 0 replies; 3+ messages in thread
From: Petteri Räty @ 2011-08-04 13:53 UTC (permalink / raw
  To: gentoo-commits

commit:     9042ed3ac8b75202e71e5de49376e0b1c68e847f
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 27 08:55:46 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Aug  2 07:52:18 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=9042ed3a

Parser: support empty command with redirection

Now only '>' is supported because there would be a lot of conflicts if
we want to fully support this. Also the operator other than '>' doesn't
make sense.

---
 bashast/bashast.g                |   34 ++++++++++++++++++++++++----------
 bashast/libbashWalker.g          |    6 +++++-
 scripts/command_execution.bash   |    1 +
 test/verify_error_output_test.sh |    2 +-
 4 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/bashast/bashast.g b/bashast/bashast.g
index 55a499d..dc0ff1b 100644
--- a/bashast/bashast.g
+++ b/bashast/bashast.g
@@ -226,6 +226,9 @@ tokens{
 		||token == LESS_THAN
 		||token == GREATER_THAN
 		||token == RSHIFT
+		||token == AMP_LESS_THAN
+		||token == AMP_GREATER_THAN
+		||token == AMP_RSHIFT
 		// for end of command
 		||token == SEMIC
 		||token == EOL
@@ -325,7 +328,7 @@ here_document_operator
 
 here_document_begin
 	:	(
-			token=~(EOL|BLANK|LESS_THAN|HERE_STRING_OP|AMP|GREATER_THAN|RSHIFT)
+			token=~(EOL|BLANK|LESS_THAN|HERE_STRING_OP|GREATER_THAN|RSHIFT|AMP_LESS_THAN|AMP_GREATER_THAN|AMP_RSHIFT)
 			{
 				if(LA(-1) != DQUOTE && LA(-1) != ESC)
 				{
@@ -347,13 +350,13 @@ redirection_operator
 	:	BLANK! DIGIT redirection_operator
 	|	BLANK?
 		(
-			AMP LESS_THAN -> OP["&<"]
+			AMP_LESS_THAN -> OP["&<"]
 			|	GREATER_THAN AMP -> OP[">&"]
 			|	LESS_THAN AMP -> OP["<&"]
 			|	LESS_THAN GREATER_THAN -> OP["<>"]
 			|	RSHIFT -> OP[">>"]
-			|	AMP GREATER_THAN -> OP["&>"]
-			|	AMP RSHIFT -> OP ["&>>"]
+			|	AMP_GREATER_THAN -> OP["&>"]
+			|	AMP_RSHIFT -> OP ["&>>"]
 			|	LESS_THAN -> LESS_THAN
 			|	GREATER_THAN -> GREATER_THAN
 		);
@@ -376,21 +379,29 @@ command_atom
 				|	-> ^(VARIABLE_DEFINITIONS variable_definitions)
 			)
 	|	(EXPORT) => EXPORT BLANK export_item -> ^(STRING EXPORT) ^(STRING ^(DOUBLE_QUOTED_STRING export_item))
-	|	string_expr_no_reserved_word
+	|	command_name
 		(
 			(BLANK? parens) => BLANK? parens wspace? compound_command
-				-> ^(FUNCTION["function"] string_expr_no_reserved_word compound_command)
+				-> ^(FUNCTION["function"] command_name compound_command)
 			|	(
 					{LA(1) == BLANK &&
 					(
 						!is_special_token(LA(2))
 						// redirection
-						&&(LA(2) != DIGIT || (LA(3) != AMP && LA(3) != LESS_THAN
-											  && LA(3) != GREATER_THAN && LA(3) != RSHIFT))
+						&&(LA(2) != DIGIT || (LA(3) != AMP_LESS_THAN &&
+											  LA(3) != AMP_GREATER_THAN &&
+											  LA(3) != AMP_RSHIFT &&
+											  LA(3) != GREATER_THAN &&
+											  LA(3) != LESS_THAN &&
+											  LA(3) != RSHIFT))
 					)}? => BLANK bash_command_arguments
-				)* -> string_expr_no_reserved_word bash_command_arguments*
+				)* -> command_name bash_command_arguments*
 		);
 
+command_name
+	:	string_expr_no_reserved_word
+	|	{LA(1) == GREATER_THAN}? => redirection_atom -> ^(STRING NAME) redirection_atom;
+
 variable_definitions
 	:	(
 			variable_definition_atom ((BLANK name (LSQUARE|EQUALS|PLUS EQUALS)) => BLANK! variable_definition_atom)*
@@ -765,7 +776,7 @@ pattern_char
 	:	LETTER|DIGIT|OTHER|QMARK|COLON|AT|SEMIC|POUND|SLASH
 		|BANG|TIMES|COMMA|PIPE|AMP|MINUS|PLUS|PCT|LSQUARE|RSQUARE
 		|RPAREN|LPAREN|RBRACE|LBRACE|DOLLAR|TICK|DOT|LESS_THAN
-		|GREATER_THAN|SQUOTE|DQUOTE;
+		|GREATER_THAN|SQUOTE|DQUOTE|AMP_LESS_THAN|AMP_GREATER_THAN|AMP_RSHIFT;
 
 variable_reference
 	:	DOLLAR LBRACE parameter_expansion RBRACE -> ^(VAR_REF parameter_expansion)
@@ -1041,6 +1052,9 @@ LESS_THAN	:	'<';
 GREATER_THAN	:	'>';
 LSHIFT	:	'<<';
 RSHIFT	:	'>>';
+AMP_LESS_THAN	:	'&<';
+AMP_GREATER_THAN	:	'&>';
+AMP_RSHIFT	:	'&>>';
 
 SEMIC	:	';';
 DOUBLE_SEMIC	:	';;';

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index d1bbe93..7deb461 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -579,7 +579,7 @@ simple_command
 }
 	:string_expr (argument[libbash_args])* execute_command[$string_expr.libbash_value, libbash_args];
 
-execute_command[const std::string& name, std::vector<std::string>& libbash_args]
+execute_command[std::string& name, std::vector<std::string>& libbash_args]
 @declarations {
 	interpreter::local_scope current_scope(*walker);
 	std::unique_ptr<std::ostream> out;
@@ -588,6 +588,10 @@ execute_command[const std::string& name, std::vector<std::string>& libbash_args]
 	bool redirection = false;
 }
 	:var_def[true]* (redirect[out, err, in]{ redirection = true; })* {
+		// Empty command, still need to run bash redirection
+		if(name.empty())
+			name = ":";
+
 		if(walker->has_function(name))
 		{
 			if(redirection)

diff --git a/scripts/command_execution.bash b/scripts/command_execution.bash
index 05e2177..132d72d 100644
--- a/scripts/command_execution.bash
+++ b/scripts/command_execution.bash
@@ -74,3 +74,4 @@ o Hello\
  world
 echo \`\(\)\$\>\<\`
 export SRC_URI="${SRC_URI} http://www.oracle.com/technology/products/berkeley-db/db/update/${MY_PV}/patch.${MY_PV}.${i}"
+> /dev/null

diff --git a/test/verify_error_output_test.sh b/test/verify_error_output_test.sh
index 48e972b..cbf6cf2 100755
--- a/test/verify_error_output_test.sh
+++ b/test/verify_error_output_test.sh
@@ -2,4 +2,4 @@
 
 illegal="${srcdir}/scripts/illegal_script.sh"
 output=$(./variable_printer "$illegal" 2>&1)
-[[ $output == "${illegal}(1)  : error 10 : Missing token, at offset 3"* ]]
+[[ $output == "${illegal}(1)  : error 1 : Unexpected token, at offset 3"* ]]



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-08-04 13:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-21 13:26 [gentoo-commits] proj/libbash:master commit in: scripts/, bashast/, test/ Petteri Räty
  -- strict thread matches above, loose matches on Subject: below --
2011-08-04 13:53 Petteri Räty
2011-05-25 19:42 Petteri Räty

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox