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

commit:     a7194ce05fd8c216847ec9a34b741eb07839c14d
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Tue Mar 29 09:35:10 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Mar 29 10:18:48 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=a7194ce0

Implement arithmetic assignment

---
 bashast/bashwalker.g |    1 +
 test/walker_test.cpp |   13 +++++++++++++
 2 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/bashast/bashwalker.g b/bashast/bashwalker.g
index d91e739..16d1216 100644
--- a/bashast/bashwalker.g
+++ b/bashast/bashwalker.g
@@ -79,6 +79,7 @@ arithmetics returns[int value]
 	|^(PRE_DECR libbash_name=name){ $value = walker->pre_decr(libbash_name); }
 	|^(POST_INCR libbash_name=name){ $value = walker->post_incr(libbash_name); }
 	|^(POST_DECR libbash_name=name){ $value = walker->post_decr(libbash_name); }
+	|^(EQUALS libbash_name=name l=arithmetics) { walker->set_value(libbash_name, l); }
 	| NUMBER { $value = walker->parse_int($NUMBER);}
 	| DIGIT { $value = walker->parse_int($DIGIT);}
 	;

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index c6ad4a9..0a74b10 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -65,6 +65,12 @@ public:
     init_walker(script);
     return treePsr->arithmetics(treePsr);
   }
+
+  int get_arithmetic_variable(const char* script, const string& name)
+  {
+    run_arithmetic(script);
+    return walker->resolve<int>(name);
+  }
 };
 
 
@@ -155,3 +161,10 @@ TEST_BINARY_ARITHMETIC(complex_incr_decr2,  "++value+value++", 202)
 TEST_BINARY_ARITHMETIC(complex_cal,         "10*(2+5)<<3%2**5", 560)
 TEST_BINARY_ARITHMETIC(complex_cal2,        "10*${value}<<3%2**5", 8000)
 TEST_BINARY_ARITHMETIC(complex_cal3,        "(20&5|3||1*100-20&5*10)+~(2*5)", -10)
+
+#define TEST_INT_VARIABLE_VALUE(name, script, var_name, exp_value)\
+  TEST_F(walker_test, name) \
+  { EXPECT_EQ(exp_value, get_arithmetic_variable(script, var_name)); }
+
+TEST_INT_VARIABLE_VALUE(assignment,             "new_var=10",   "new_var",      10)
+TEST_INT_VARIABLE_VALUE(assignment2,            "value=10+5/2", "value",        12)



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

* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-03-30 12:48 Petteri Räty
  0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-03-30 12:48 UTC (permalink / raw
  To: gentoo-commits

commit:     9d9afb2e878d6104f76e958958eec6168923181f
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 28 14:57:56 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Tue Mar 29 12:19:26 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=9d9afb2e

Implement arithmetic assignment

All the arithmetic assignment operations are supported.

---
 bashast/bashwalker.g |   40 ++++++++++++++++++++++++++++++++++++++++
 test/walker_test.cpp |   10 ++++++++++
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/bashast/bashwalker.g b/bashast/bashwalker.g
index 16d1216..d2c2438 100644
--- a/bashast/bashwalker.g
+++ b/bashast/bashwalker.g
@@ -80,6 +80,46 @@ arithmetics returns[int value]
 	|^(POST_INCR libbash_name=name){ $value = walker->post_incr(libbash_name); }
 	|^(POST_DECR libbash_name=name){ $value = walker->post_decr(libbash_name); }
 	|^(EQUALS libbash_name=name l=arithmetics) { walker->set_value(libbash_name, l); }
+	|^(MUL_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->multiply(walker->resolve<int>(libbash_name), l));
+	}
+	|^(DIVIDE_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->divide(walker->resolve<int>(libbash_name), l));
+	}
+	|^(MOD_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->mod(walker->resolve<int>(libbash_name), l));
+	}
+	|^(PLUS_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->plus(walker->resolve<int>(libbash_name), l));
+	}
+	|^(MINUS_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->minus(walker->resolve<int>(libbash_name), l));
+	}
+	|^(LSHIFT_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->left_shift(walker->resolve<int>(libbash_name), l));
+	}
+	|^(RSHIFT_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->right_shift(walker->resolve<int>(libbash_name), l));
+	}
+	|^(AND_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->bitwiseand(walker->resolve<int>(libbash_name), l));
+	}
+	|^(XOR_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->bitwisexor(walker->resolve<int>(libbash_name), l));
+	}
+	|^(OR_ASSIGN libbash_name=name l=arithmetics) {
+		walker->set_value(libbash_name,
+						  walker->bitwiseor(walker->resolve<int>(libbash_name), l));
+	}
 	| NUMBER { $value = walker->parse_int($NUMBER);}
 	| DIGIT { $value = walker->parse_int($DIGIT);}
 	;

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 0a74b10..98672aa 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -168,3 +168,13 @@ TEST_BINARY_ARITHMETIC(complex_cal3,        "(20&5|3||1*100-20&5*10)+~(2*5)", -1
 
 TEST_INT_VARIABLE_VALUE(assignment,             "new_var=10",   "new_var",      10)
 TEST_INT_VARIABLE_VALUE(assignment2,            "value=10+5/2", "value",        12)
+TEST_INT_VARIABLE_VALUE(mul_assignment,         "value*=10",    "value",        1000)
+TEST_INT_VARIABLE_VALUE(divide_assignment,      "value/=10",    "value",        10)
+TEST_INT_VARIABLE_VALUE(mod_assignment,         "value%=9",     "value",        1)
+TEST_INT_VARIABLE_VALUE(plus_assignment,        "value+=10",    "value",        110)
+TEST_INT_VARIABLE_VALUE(minus_assignment,       "value-=10",    "value",        90)
+TEST_INT_VARIABLE_VALUE(left_shift_assignment,  "value<<=2",    "value",        400)
+TEST_INT_VARIABLE_VALUE(right_shift_assignment, "value>>=2",    "value",        25)
+TEST_INT_VARIABLE_VALUE(and_assignment,         "value&=10",    "value",        0)
+TEST_INT_VARIABLE_VALUE(xor_assignment,         "value^=5",     "value",        97)
+TEST_INT_VARIABLE_VALUE(or_assignment,          "value|=10",    "value",        110)



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

* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-03-31 12:32 Petteri Räty
  0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-03-31 12:32 UTC (permalink / raw
  To: gentoo-commits

commit:     acead44b7a8896b85478be3eb18df0655b16cf57
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 31 08:25:18 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Mar 31 12:14:57 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=acead44b

Implement double quoted string literal

This includes preserved words, special characters, numbers, etc.
Expansions are not implemented yet.

---
 bashast/libbashWalker.g |   48 ++++++++++++++++++++++++++++++++++++++++++++++-
 test/walker_test.cpp    |   13 ++++++++++++
 2 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 19cb511..c8e690e 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -27,6 +27,7 @@ options
 
 @includes{
 #include <memory>
+#include <string>
 
 class interpreter;
 void set_interpreter(std::shared_ptr<interpreter> w);
@@ -45,6 +46,11 @@ name	returns[std::string libbash_value]:
 	|	LETTER {$libbash_value = walker->get_string($LETTER);}
 	|	'_' {$libbash_value="_";};
 
+num returns[std::string libbash_value]
+options{ k=1; }:
+	DIGIT { $libbash_value = walker->get_string($DIGIT); }
+	|NUMBER { $libbash_value = walker->get_string($NUMBER); };
+
 var_def:
 	^(EQUALS libbash_name=name libbash_value=string_expr){
 		walker->define(libbash_name, libbash_value);
@@ -52,10 +58,50 @@ var_def:
 
 string_expr	returns[std::string libbash_value]:
 	^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; }
-	|^(DOUBLE_QUOTED_STRING (libbash_tmp=name { libbash_string += libbash_tmp; })+) {
+	|^(DOUBLE_QUOTED_STRING (dq_str_part { libbash_string += $dq_str_part.libbash_value; })+) {
 		$libbash_value = libbash_string;
 	};
 
+//A rule for filenames/strings
+res_word_str returns[std::string libbash_value]
+@after {
+	$libbash_value = walker->get_string($res_word_str.start);
+}:
+	CASE|DO|DONE|ELIF|ELSE|ESAC|FI|FOR|FUNCTION|IF|IN|SELECT|THEN|UNTIL|WHILE|TIME;
+
+//Parts of strings, no slashes, no reserved words
+ns_str_part_no_res returns[std::string libbash_value]
+options{ backtrack=true; }
+@after {
+	$libbash_value = walker->get_string($ns_str_part_no_res.start);
+}:
+	num|name|EQUALS|PCT|PCTPCT|MINUS|DOT|DOTDOT|COLON|BOP|UOP|TEST_EXPR|'_'|TILDE|INC|DEC|MUL_ASSIGN|DIVIDE_ASSIGN|MOD_ASSIGN|PLUS_ASSIGN|MINUS_ASSIGN|LSHIFT_ASSIGN|RSHIFT_ASSIGN|AND_ASSIGN|XOR_ASSIGN|OR_ASSIGN|ESC_CHAR|CARET|OTHER;
+
+//Parts of strings, no slashes
+ns_str_part returns[std::string libbash_value]:
+	ns_str_part_no_res { $libbash_value = $ns_str_part_no_res.libbash_value; }
+	|res_word_str {$libbash_value = $res_word_str.libbash_value; };
+
+//Any allowable part of a string, including slashes, no pounds
+str_part returns[std::string libbash_value]:
+	libbash_string=ns_str_part { $libbash_value = libbash_string; }
+	|SLASH { $libbash_value = "/"; };
+
+//Any allowable part of a string, with pounds
+str_part_with_pound returns[std::string libbash_value]
+@after {
+	$libbash_value = walker->get_string($str_part_with_pound.start);
+}:
+	str_part|POUND|POUNDPOUND;
+
+//Allowable parts of double quoted strings
+dq_str_part returns[std::string libbash_value]
+@after {
+	$libbash_value = walker->get_string($dq_str_part.start);
+}:
+	BLANK|EOL|AMP|LOGICAND|LOGICOR|LESS_THAN|GREATER_THAN|PIPE|SQUOTE|SEMIC|COMMA|LPAREN|RPAREN|LLPAREN|RRPAREN|DOUBLE_SEMIC|LBRACE|RBRACE|TICK|LEQ|GEQ|str_part_with_pound;
+
+
 // shell arithmetic
 arithmetics returns[int value]
 :

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 251e0aa..dc593d5 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -220,3 +220,16 @@ TEST_ARITHMETIC_ASSIGNMENT(or_assignment,          "value|=10",    "value",
 
 TEST_STRING_ASSIGNMENT(str_assignment,          "str=\"abc\"",          "str",    "abc")
 TEST_STRING_ASSIGNMENT(str_assignment2,         "str=\"abc_def\"",      "str",    "abc_def")
+TEST_STRING_ASSIGNMENT(str_assignment3,         "str=\"abc def\"",      "str",    "abc def")
+TEST_STRING_ASSIGNMENT(str_assignment4,
+                       "str=\"case esac do done elif else fi if for function in select then until while time\"",
+                       "str",
+                       "case esac do done elif else fi if for function in select then until while time")
+TEST_STRING_ASSIGNMENT(str_assignment5,
+                       "str=\"123 abc = % %% - . .. :  -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä\"",
+                       "str",
+                       "123 abc = % %% - . .. :  -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä")
+TEST_STRING_ASSIGNMENT(str_assignment6,
+                       "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;;  { } ` >= <=\"",
+                       "str",
+                       "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;;  { } ` >= <=")



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

* [gentoo-commits] proj/libbash:master commit in: bashast/, test/
@ 2011-03-31 12:32 Petteri Räty
  0 siblings, 0 replies; 6+ messages in thread
From: Petteri Räty @ 2011-03-31 12:32 UTC (permalink / raw
  To: gentoo-commits

commit:     165e60662fcc7cd2c81ad1cb39ce9a9f2005cc50
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 31 03:16:21 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Mar 31 08:35:49 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=165e6066

Implement simple variable definition

Allow to define a string with a simple value.

---
 bashast/libbashWalker.g |   11 +++++++++++
 test/walker_test.cpp    |   31 +++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 9231d63..19cb511 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -45,6 +45,17 @@ name	returns[std::string libbash_value]:
 	|	LETTER {$libbash_value = walker->get_string($LETTER);}
 	|	'_' {$libbash_value="_";};
 
+var_def:
+	^(EQUALS libbash_name=name libbash_value=string_expr){
+		walker->define(libbash_name, libbash_value);
+	};
+
+string_expr	returns[std::string libbash_value]:
+	^(STRING libbash_string=string_expr) { $libbash_value = libbash_string; }
+	|^(DOUBLE_QUOTED_STRING (libbash_tmp=name { libbash_string += libbash_tmp; })+) {
+		$libbash_value = libbash_string;
+	};
+
 // shell arithmetic
 arithmetics returns[int value]
 :

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index c026605..251e0aa 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -131,6 +131,30 @@ protected:
   }
 };
 
+class string_assignment_walker: public walker_test
+{
+  libbashParser_var_def_return langAST;
+protected:
+  void init_walker(const char* script)
+  {
+    init_parser(script);
+    langAST = psr->var_def(psr);
+    nodes   = antlr3CommonTreeNodeStreamNewTree(langAST.tree,
+                                                ANTLR3_SIZE_HINT);
+    treePsr = libbashWalkerNew(nodes);
+    set_interpreter(walker);
+  }
+
+  void check_string_assignment(const char* script,
+                               const string& name,
+                               const char* exp_value)
+  {
+    init_walker(script);
+    treePsr->var_def(treePsr);
+    EXPECT_STREQ(exp_value, walker->resolve<string>(name).c_str());
+  }
+};
+
 #define TEST_BINARY_ARITHMETIC(name, script, exp_value)\
   TEST_F(arithmetic_walker, name)\
   {EXPECT_EQ(exp_value, run_arithmetic(script));}
@@ -189,3 +213,10 @@ TEST_ARITHMETIC_ASSIGNMENT(right_shift_assignment, "value>>=2",    "value",
 TEST_ARITHMETIC_ASSIGNMENT(and_assignment,         "value&=10",    "value",        0)
 TEST_ARITHMETIC_ASSIGNMENT(xor_assignment,         "value^=5",     "value",        97)
 TEST_ARITHMETIC_ASSIGNMENT(or_assignment,          "value|=10",    "value",        110)
+
+#define TEST_STRING_ASSIGNMENT(name, script, var_name, exp_value)\
+  TEST_F(string_assignment_walker, name) \
+  { check_string_assignment(script, var_name, exp_value); }
+
+TEST_STRING_ASSIGNMENT(str_assignment,          "str=\"abc\"",          "str",    "abc")
+TEST_STRING_ASSIGNMENT(str_assignment2,         "str=\"abc_def\"",      "str",    "abc_def")



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

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

commit:     57038643622fa72931d2a5e9f0d0696f4cbbd6cd
Author:     Petteri Räty <petsku <AT> petteriraty <DOT> eu>
AuthorDate: Thu Apr  7 11:22:59 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Apr  7 16:39:28 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=57038643

Simplify double quoted string with negation

Using the same trick with negation as previously for single quotes make
the double quote rules simpler. The test str_assignment6 was faulty as
it was starting a command expansion that was never completed.

---
 bashast/bashast.g    |   16 ++++------------
 test/walker_test.cpp |    4 ++--
 2 files changed, 6 insertions(+), 14 deletions(-)

diff --git a/bashast/bashast.g b/bashast/bashast.g
index 3d52c27..2c72c44 100644
--- a/bashast/bashast.g
+++ b/bashast/bashast.g
@@ -368,10 +368,6 @@ ns_str_part_no_res
 	|	name|OTHER|EQUALS|PCT|PCTPCT|MINUS|DOT|DOTDOT|COLON|BOP|UOP|TEST_EXPR|'_'|TILDE|INC|DEC|MUL_ASSIGN|DIVIDE_ASSIGN|MOD_ASSIGN|PLUS_ASSIGN|MINUS_ASSIGN|LSHIFT_ASSIGN|RSHIFT_ASSIGN|AND_ASSIGN|XOR_ASSIGN|OR_ASSIGN|ESC_CHAR|CARET;
 //strings with no slashes, used in certain variable expansions
 ns_str	:	ns_str_part* -> ^(STRING ns_str_part*);
-//Allowable parts of double quoted strings
-dq_str_part
-	:	BLANK|EOL|AMP|LOGICAND|LOGICOR|LESS_THAN|GREATER_THAN|PIPE|SQUOTE|SEMIC|COMMA|LPAREN|RPAREN|LLPAREN|RRPAREN|DOUBLE_SEMIC|LBRACE|RBRACE|TICK|LEQ|GEQ
-	|	str_part_with_pound;
 //Generic strings/filenames.
 fname	:	nqstr -> ^(STRING nqstr);
 //A string that is NOT a bash reserved word
@@ -398,14 +394,10 @@ nqstr	:	(bracket_pattern_match|extended_pattern_match|var_ref|command_sub|arithm
 //double quoted string rule, allows expansions
 dqstr	:	QUOTE dqstr_part* QUOTE -> ^(DOUBLE_QUOTED_STRING dqstr_part*);
 dqstr_part
-	:	bracket_pattern_match
-	|	extended_pattern_match
-	|	var_ref
-	|	command_sub
-	|	arithmetic_expansion
-	|	dq_str_part
-	|	pattern_match_trigger
-	|	BANG;
+	: var_ref
+	| command_sub
+	| arithmetic_expansion
+	| ~(DOLLAR|TICK|QUOTE);
 //single quoted string rule, no expansions
 sqstr_part
 	: ~SQUOTE*;

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 6081254..8185710 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -56,6 +56,6 @@ TEST_STRING_ASSIGNMENT(str_assignment5,
                        "str",
                        "123 abc = % %% - . .. :  -a -aa test _ ~ ++ -- *= /= %= += -= <<= >>= &= ^= |= \\a ^ aä")
 TEST_STRING_ASSIGNMENT(str_assignment6,
-                       "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;;  { } ` >= <=\"",
+                       "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=\"",
                        "str",
-                       "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;;  { } ` >= <=")
+                       "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=")



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

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

commit:     5be695e3dd1739ff776e57a6ccb425777979d3c0
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Thu Apr 14 01:09:28 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Thu Apr 14 01:09:28 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=5be695e3

Raise exception if array index is less than 0

An interpreter_exception will be thrown if index is less than 0.

---
 bashast/libbashWalker.g |   20 +++++++++++++++++---
 test/walker_test.cpp    |   13 +++++++++++++
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 43304f1..b5e9974 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -34,6 +34,7 @@ void set_interpreter(std::shared_ptr<interpreter> w);
 }
 @postinclude{
 #include "core/interpreter.h"
+#include <boost/format.hpp>
 static std::shared_ptr<interpreter> walker;
 void set_interpreter(std::shared_ptr<interpreter> w)
 {
@@ -41,6 +42,17 @@ void set_interpreter(std::shared_ptr<interpreter> w)
 }
 }
 
+@members{
+
+inline void set_index(const std::string& name, unsigned& index, int value)
+{
+	if(value < 0)
+		throw interpreter_exception((boost::format("Array index is less than 0: \%s[\%d]") \% name \% value).str());
+	index = value;
+}
+
+}
+
 start: list|EOF;
 
 list: ^(LIST var_def+);
@@ -55,7 +67,7 @@ name	returns[std::string libbash_value, unsigned index]
 	$index = 0;
 }:
 	^(libbash_name=name_base value=arithmetics){
-		$index = value;
+		set_index(libbash_name, $index, value);
 		$libbash_value = libbash_name;
 	}
 	|libbash_name=name_base{
@@ -70,7 +82,7 @@ options{ k=1; }:
 var_def
 @declarations {
 	std::map<int, std::string> values;
-	int index = 0;
+	unsigned index = 0;
 	bool is_null = true;
 }:
 	^(EQUALS name (libbash_string=string_expr { is_null = false; })?){
@@ -78,7 +90,9 @@ var_def
 	}
 	|^(EQUALS libbash_name=name_base ^(ARRAY (
 										(libbash_string=string_expr
-										|^(EQUALS value=arithmetics { index = value; } libbash_string=string_expr))
+										|^(EQUALS value=arithmetics {
+												set_index(libbash_name, index, value);
+											} libbash_string=string_expr))
 										{ values[index++] = libbash_string; })*
 									 )){
 		walker->define(libbash_name, values);

diff --git a/test/walker_test.cpp b/test/walker_test.cpp
index 8185710..6f13176 100644
--- a/test/walker_test.cpp
+++ b/test/walker_test.cpp
@@ -59,3 +59,16 @@ TEST_STRING_ASSIGNMENT(str_assignment6,
                        "str=\"/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=\"",
                        "str",
                        "/ \n \r\n & && ||| || > < ' : ; , ( (( ) )) ;; { } >= <=")
+
+TEST(array_index, out_of_bound)
+{
+  std::string script = "a[-1]=\"1\"";
+  std::istringstream input(script);
+  parser_builder pbuilder(input);
+  EXPECT_THROW(pbuilder.create_walker_builder(), interpreter_exception);
+
+  std::string script2 = "a=(1 2 [-5]=1)";
+  std::istringstream input2(script2);
+  parser_builder pbuilder2(input2);
+  EXPECT_THROW(pbuilder2.create_walker_builder(), interpreter_exception);
+}



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

end of thread, other threads:[~2011-04-14  4:51 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-07 16:44 [gentoo-commits] proj/libbash:master commit in: bashast/, test/ Petteri Räty
  -- strict thread matches above, loose matches on Subject: below --
2011-04-14  4:50 Petteri Räty
2011-03-31 12:32 Petteri Räty
2011-03-31 12:32 Petteri Räty
2011-03-30 12:48 Petteri Räty
2011-03-30 12:48 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