Revision: 5571
          http://jnode.svn.sourceforge.net/jnode/?rev=5571&view=rev
Author:   crawley
Date:     2009-06-13 11:49:13 +0000 (Sat, 13 Jun 2009)

Log Message:
-----------
Implement 'unset' builtin 

Modified Paths:
--------------
    trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java
    trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java
    trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-builtin-tests.xml

Added Paths:
-----------
    trunk/shell/src/shell/org/jnode/shell/bjorne/UnsetBuiltin.java
    trunk/shell/src/shell/org/jnode/shell/bjorne/VariableNameArgument.java

Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java     
2009-06-13 05:09:38 UTC (rev 5570)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java     
2009-06-13 11:49:13 UTC (rev 5571)
@@ -275,7 +275,7 @@
     }
 
     /**
-     * Test if the variable is currently set here in this context.
+     * Test if the variable is set in this context.
      * 
      * @param name the name of the variable to be tested
      * @return <code>true</code> if the variable is set.
@@ -285,6 +285,17 @@
     }
 
     /**
+     * Test if the variable is readonly in this context.
+     * 
+     * @param name the name of the variable to be tested
+     * @return <code>true</code> if the variable is set.
+     */
+    boolean isVariableReadonly(String name) {
+        VariableSlot var = variables.get(name);
+        return var != null && var.isReadOnly();
+    }
+
+    /**
      * This method implements 'unset NAME'
      * 
      * @param name the name of the variable to be unset

Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java 
2009-06-13 05:09:38 UTC (rev 5570)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java 
2009-06-13 11:49:13 UTC (rev 5571)
@@ -149,6 +149,7 @@
         BUILTINS.put("shift", ShiftBuiltin.FACTORY);
         BUILTINS.put("source", SourceBuiltin.FACTORY);
         BUILTINS.put("unalias", UnaliasBuiltin.FACTORY);
+        BUILTINS.put("unset", UnsetBuiltin.FACTORY);
         BUILTINS.put(".", SourceBuiltin.FACTORY);
         BUILTINS.put(":", ColonBuiltin.FACTORY);
     }

Added: trunk/shell/src/shell/org/jnode/shell/bjorne/UnsetBuiltin.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/UnsetBuiltin.java              
                (rev 0)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/UnsetBuiltin.java      
2009-06-13 11:49:13 UTC (rev 5571)
@@ -0,0 +1,71 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2003-2009 JNode.org
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; If not, write to the Free Software Foundation, 
Inc., 
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+ 
+package org.jnode.shell.bjorne;
+
+import org.jnode.shell.syntax.Argument;
+import org.jnode.shell.syntax.ArgumentSyntax;
+import org.jnode.shell.syntax.RepeatSyntax;
+import org.jnode.shell.syntax.SyntaxBundle;
+
+/**
+ * This class implements the 'unset' built-in.
+ * 
+ * @author craw...@jnode.org
+ */
+final class UnsetBuiltin extends BjorneBuiltin {
+    private static final SyntaxBundle SYNTAX = 
+        new SyntaxBundle("unset", new RepeatSyntax(new 
ArgumentSyntax("unset")));
+    
+    static final Factory FACTORY = new Factory() {
+        public BjorneBuiltinCommandInfo buildCommandInfo(BjorneContext 
context) {
+            return new BjorneBuiltinCommandInfo("unset", SYNTAX, new 
UnsetBuiltin(context), context);
+        }
+    };
+    
+    private final VariableNameArgument argVariables; 
+    
+    
+    UnsetBuiltin(BjorneContext context) {
+        super("Export shell variables to the environment");
+        argVariables = new VariableNameArgument(
+                "unset", context, Argument.MANDATORY, "variables to be unset");
+        registerArguments(argVariables);
+    }
+
+    public void execute() throws Exception {
+        int errorCount = 0;
+        if (!argVariables.isSet()) {
+            // FIXME - implement this?
+        } else {
+            BjorneContext pc = getParentContext();
+            for (String var : argVariables.getValues()) {
+                if (pc.isVariableReadonly(var)) {
+                    errorCount++;
+                } else {
+                    pc.unsetVariable(var);
+                }
+            }
+        }
+        if (errorCount > 0) {
+            exit(1);
+        }
+    }
+}

Added: trunk/shell/src/shell/org/jnode/shell/bjorne/VariableNameArgument.java
===================================================================
--- trunk/shell/src/shell/org/jnode/shell/bjorne/VariableNameArgument.java      
                        (rev 0)
+++ trunk/shell/src/shell/org/jnode/shell/bjorne/VariableNameArgument.java      
2009-06-13 11:49:13 UTC (rev 5571)
@@ -0,0 +1,65 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2003-2009 JNode.org
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; If not, write to the Free Software Foundation, 
Inc., 
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+package org.jnode.shell.bjorne;
+
+import org.jnode.driver.console.CompletionInfo;
+import org.jnode.shell.CommandLine.Token;
+import org.jnode.shell.syntax.Argument;
+import org.jnode.shell.syntax.CommandSyntaxException;
+
+/**
+ * The VariableNameArgument understands 'arguments' of the form &lt;name&gt; 
where
+ * the name is a Bjorne shell variable name.
+ * It will perform completion of the &lt;name&gt; component against the 
variable names
+ * defined in a supplied BjorneContext.
+ * 
+ * @author craw...@jnode.org
+ */
+public class VariableNameArgument extends Argument<String> {
+    private final BjorneContext context;
+    
+    public VariableNameArgument(String label, BjorneContext context, int 
flags, String description) {
+        super(label, flags, new String[0], description);
+        this.context = context;
+    }
+
+    @Override
+    protected String argumentKind() {
+        return "bjorne variable name";
+    }
+
+    @Override
+    protected String doAccept(Token value, int flags) throws 
CommandSyntaxException {
+        String name = value.text;
+        if (!BjorneToken.isName(name)) {
+            throw new CommandSyntaxException("invalid name ('" + name + "')");
+        }
+        return name;
+    }
+
+    @Override
+    public void doComplete(CompletionInfo completions, String partial, int 
flags) {
+        for (String varName : context.getVariableNames()) {
+            if (varName.startsWith(partial)) {
+                completions.addCompletion(varName, true);
+            }
+        }
+    }
+}

Modified: 
trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-builtin-tests.xml
===================================================================
--- trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-builtin-tests.xml   
2009-06-13 05:09:38 UTC (rev 5570)
+++ trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-builtin-tests.xml   
2009-06-13 11:49:13 UTC (rev 5571)
@@ -115,7 +115,17 @@
 B -1-
 B -1-
 B -1-
-B -1-
 </output>
     </testSpec>
+    <testSpec title="unset" runMode="AS_SCRIPT" rc="0">
+        <script>#!bjorne
+                A=1
+                echo A -${A}-
+                unset A
+                echo A -${A}-
+        </script>
+        <output>A -1-
+A --
+</output>
+    </testSpec>
 </testSet>
\ No newline at end of file


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables unlimited
royalty-free distribution of the report engine for externally facing 
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Jnode-svn-commits mailing list
Jnode-svn-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits

Reply via email to