|
From: <cr...@us...> - 2009-02-12 12:22:28
|
Revision: 5017
http://jnode.svn.sourceforge.net/jnode/?rev=5017&view=rev
Author: crawley
Date: 2009-02-12 11:36:46 +0000 (Thu, 12 Feb 2009)
Log Message:
-----------
Implement 'case' compound statements.
Modified Paths:
--------------
trunk/shell/src/shell/org/jnode/shell/PathnamePattern.java
trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java
trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneParser.java
trunk/shell/src/shell/org/jnode/shell/bjorne/CaseCommandNode.java
trunk/shell/src/shell/org/jnode/shell/bjorne/CaseItemNode.java
trunk/shell/src/test/org/jnode/test/shell/bjorne/BjorneParserTests.java
trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml
Modified: trunk/shell/src/shell/org/jnode/shell/PathnamePattern.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/PathnamePattern.java 2009-02-10 14:23:53 UTC (rev 5016)
+++ trunk/shell/src/shell/org/jnode/shell/PathnamePattern.java 2009-02-12 11:36:46 UTC (rev 5017)
@@ -378,7 +378,7 @@
* @param pattern the pattern in shell syntax.
* @return the corresponding regex as a {@link Pattern}.
*/
- public static Pattern compilePosixShellPattern(String pattern, int flags) {
+ public static Pattern compilePosixShellPattern(CharSequence pattern, int flags) {
// This method needs to be really careful to avoid 'ordinary' characters
// in the source pattern being accidentally mapped to Java regex
// meta-characters.
Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java 2009-02-10 14:23:53 UTC (rev 5016)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java 2009-02-12 11:36:46 UTC (rev 5017)
@@ -1086,9 +1086,10 @@
return interpreter.fork(command, ios);
}
- public boolean patternMatch(CharSequence expandedWord, CharSequence pat) {
- // TODO Auto-generated method stub
- return false;
+ public boolean patternMatch(CharSequence text, CharSequence pat) {
+ int flags = PathnamePattern.EAGER | PathnamePattern.DEFAULT_FLAGS;
+ Pattern regex = PathnamePattern.compilePosixShellPattern(pat, flags);
+ return regex.matcher(text).matches();
}
public String[] getArgs() {
Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneParser.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneParser.java 2009-02-10 14:23:53 UTC (rev 5016)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneParser.java 2009-02-12 11:36:46 UTC (rev 5017)
@@ -579,10 +579,12 @@
private BjorneToken[] parsePattern() throws ShellSyntaxException {
List<BjorneToken> pattern = new LinkedList<BjorneToken>();
while (true) {
- int tt = tokens.next().getTokenType();
+ BjorneToken token = tokens.next();
+ int tt = token.getTokenType();
if (tt != TOK_WORD) {
syntaxError("expected WORD in pattern", tt);
}
+ pattern.add(token);
if (tokens.peek().getTokenType() != TOK_BAR) {
break;
}
Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/CaseCommandNode.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/CaseCommandNode.java 2009-02-10 14:23:53 UTC (rev 5016)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/CaseCommandNode.java 2009-02-12 11:36:46 UTC (rev 5017)
@@ -56,14 +56,15 @@
@Override
public int execute(BjorneContext context) throws ShellException {
- int rc = -1;
+ int rc = 0;
CharSequence expandedWord = context.expand(word.text);
- for (CaseItemNode caseItem : caseItems) {
+ LOOP: for (CaseItemNode caseItem : caseItems) {
for (BjorneToken pattern : caseItem.getPattern()) {
CharSequence pat = context.expand(pattern.text);
if (context.patternMatch(expandedWord, pat)) {
- throw new ShellException("not implemented yet");
+ rc = caseItem.getBody().execute(context);
+ break LOOP;
}
}
}
Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/CaseItemNode.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/CaseItemNode.java 2009-02-10 14:23:53 UTC (rev 5016)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/CaseItemNode.java 2009-02-12 11:36:46 UTC (rev 5017)
@@ -42,11 +42,14 @@
StringBuffer sb = new StringBuffer();
sb.append("CaseItem{");
if (pattern != null) {
- sb.append(",pattern=");
+ sb.append("pattern=");
CommandNode.appendArray(sb, pattern);
}
if (body != null) {
- sb.append(",body=").append(body);
+ if (pattern != null) {
+ sb.append(",");
+ }
+ sb.append("body=").append(body);
}
sb.append("}");
return sb.toString();
Modified: trunk/shell/src/test/org/jnode/test/shell/bjorne/BjorneParserTests.java
===================================================================
--- trunk/shell/src/test/org/jnode/test/shell/bjorne/BjorneParserTests.java 2009-02-10 14:23:53 UTC (rev 5016)
+++ trunk/shell/src/test/org/jnode/test/shell/bjorne/BjorneParserTests.java 2009-02-12 11:36:46 UTC (rev 5017)
@@ -122,9 +122,9 @@
public void test10() throws ShellException {
assertEquals(
"CaseCommand{nodeType=9,word=WORD{$1},caseItems=["
- + "CaseItem{,pattern=[],body="
+ + "CaseItem{pattern=[WORD{a}],body="
+ "SimpleCommand{nodeType=1,words=[WORD{ls},WORD{-l}]}},"
- + "CaseItem{,pattern=[],body="
+ + "CaseItem{pattern=[WORD{b}],body="
+ "SimpleCommand{nodeType=1,words=[WORD{ls},WORD{-a}]}}]}",
doTest("case $1 in ( a ) ls -l ;; b ) ls -a ; esac"));
}
Modified: trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml
===================================================================
--- trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml 2009-02-10 14:23:53 UTC (rev 5016)
+++ trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml 2009-02-12 11:36:46 UTC (rev 5017)
@@ -234,6 +234,49 @@
1
</output>
</testSpec>
+ <testSpec title="case ... esac" command="test" runMode="AS_SCRIPT" rc="0">
+ <script>#!bjorne
+ case 1 in ( 1 ) echo hi mum ;; 2 ) echo bye mum ; esac
+ case 1 in 1 ) echo hi mum ;; 2 ) echo bye mum ; esac
+ case 2 in ( 1 ) echo hi mum ;; 2 ) echo bye mum ; esac
+ case 2 in ( 1 | 2 ) echo hi mum ;; 3 ) echo bye mum ; esac
+ case 2 in ( 1 | 2 ) echo hi mum ;; 3 ) echo bye mum ;; esac
+ case 3 in ( 1 | 2 ) echo hi mum ;; 3 ) echo bye ; echo mum ; esac
+ </script>
+ <output>hi mum
+hi mum
+bye mum
+hi mum
+hi mum
+bye
+mum
+</output>
+ </testSpec>
+ <testSpec title="case ... esac multi-line" command="test" runMode="AS_SCRIPT" rc="0">
+ <script>#!bjorne
+ case 1 in
+ ( 1 ) echo hi mum ;;
+ 2 ) echo bye mum
+ esac
+ case 1 in
+ 1 ) echo hi mum ;;
+ 2 ) echo bye mum ; esac
+ case 2 in ( 1 ) echo hi mum ;;
+ 2 ) echo bye mum
+ esac
+ case 2 in ( 1 | 2 ) echo hi mum ;;
+ 3 ) echo bye mum ;; esac
+ case 2 in ( 1 | 2 ) echo hi mum ;;
+ 3 ) echo bye mum ;;
+ esac
+ </script>
+ <output>hi mum
+hi mum
+bye mum
+hi mum
+hi mum
+</output>
+ </testSpec>
<testSpec title="${...} expansions" command="test" runMode="AS_SCRIPT" rc="0">
<script>#!bjorne
A=cat
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|