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. |