[SCM] master: List extends ParameterizedCommand

cagney@sourceware.org cagney@sourceware.org
Sat Nov 10 03:36:00 GMT 2007


The branch, master has been updated
       via  17a8d02379e74546d0fe49a54839248d92e66ad7 (commit)
      from  e069b59bb15ed2140a0d39e1806f4e5d1e16d347 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 17a8d02379e74546d0fe49a54839248d92e66ad7
Author: Andrew Cagney <cagney@redhat.com>
Date:   Fri Nov 9 22:30:00 2007 -0500

    List extends ParameterizedCommand
    
    2007-11-09  Andrew Cagney  <cagney@redhat.com>
    
    	* TestParameterizedCommand.java (testOptionWithDashArg()): New.
    	(testUnknownOpt()): New.
    	(testTooManyArgs(), testExtraArg(), testMissingOption()): Delete.
    	* CommandOption.java (Magnitude): New.
    	* ListCommand.java: Extend ParameterizedCommand.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/hpd/ChangeLog                     |    7 ++-
 frysk-core/frysk/hpd/CommandOption.java            |   20 +++++
 frysk-core/frysk/hpd/ListCommand.java              |   75 ++++++++++-------
 frysk-core/frysk/hpd/ParameterizedCommand.java     |   91 ++++++++++----------
 frysk-core/frysk/hpd/TestParameterizedCommand.java |   18 ++--
 5 files changed, 122 insertions(+), 89 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog
index 7661c97..2d484f3 100644
--- a/frysk-core/frysk/hpd/ChangeLog
+++ b/frysk-core/frysk/hpd/ChangeLog
@@ -1,5 +1,11 @@
 2007-11-09  Andrew Cagney  <cagney@redhat.com>
 
+	* TestParameterizedCommand.java (testOptionWithDashArg()): New.
+	(testUnknownOpt()): New.
+	(testTooManyArgs(), testExtraArg(), testMissingOption()): Delete.
+	* CommandOption.java (Magnitude): New.
+	* ListCommand.java: Extend ParameterizedCommand.
+
 	* ActionPointCommands.java: New.
 	* DeleteCommand.java: Delete.
 	* EnableCommand.java: Delete.
@@ -12,7 +18,6 @@
 	* UndefsetCommand.java: Extend ParameterizedCommand.
 
 	* DbgVariables.java (complete(String,int,List)): New.
-	* TestDbgVariables.java: New.
 	* DbgVariableCommands: New.
 	* SetCommand.java: Delete.
 	* UnsetCommand.java: Delete.
diff --git a/frysk-core/frysk/hpd/CommandOption.java b/frysk-core/frysk/hpd/CommandOption.java
index 5f795a1..5672fbd 100644
--- a/frysk-core/frysk/hpd/CommandOption.java
+++ b/frysk-core/frysk/hpd/CommandOption.java
@@ -85,6 +85,26 @@ abstract class CommandOption {
     }
 
     /**
+     * Parse sign/magnitude integer.
+     */
+    static class Magnitude {
+	final int sign;
+	final int magnitude;
+	Magnitude(String argument) {
+	    if (argument.charAt(0) == '+') {
+		sign = 1;
+		magnitude = Integer.parseInt(argument.substring(1));
+	    } else if (argument.charAt(0) == '-') {
+		sign = -1;
+		magnitude = Integer.parseInt(argument.substring(1));
+	    } else {
+		sign = 0;
+		magnitude = Integer.parseInt(argument);
+	    }
+	}
+    }
+
+    /**
      * Template option; parse a format.
      */
     static abstract class FormatOption extends CommandOption {
diff --git a/frysk-core/frysk/hpd/ListCommand.java b/frysk-core/frysk/hpd/ListCommand.java
index 373195c..da46304 100644
--- a/frysk-core/frysk/hpd/ListCommand.java
+++ b/frysk-core/frysk/hpd/ListCommand.java
@@ -40,6 +40,7 @@
 package frysk.hpd;
 
 import java.io.File;
+import java.util.List;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.LineNumberReader;
@@ -53,38 +54,50 @@ import frysk.proc.Task;
  * Implement the "list" source command.
  */
 
-class ListCommand
-   extends Command
-{
+class ListCommand extends ParameterizedCommand {
     ListCommand () {
 	super("list", "Display source code lines.",
-		"list source-loc [-length [-]num-lines]", "The list command displays lines of source code. The user can control\n" +
-"both the location in the source code and the number of lines\n" +
-"displayed. Successive list commands without location arguments result in\n" +
-"the display of consecutive sequences of source lines.");
+	      "list source-loc [-length [-]num-lines]",
+	      ("The list command displays lines of source code.  The"
+	       + " user can control both the location in the source"
+	       + " code and the number of lines displayed.  Successive"
+	       + " list commands without location arguments result in"
+	       + " the display of consecutive sequences of source lines."));
+	add(new CommandOption("length", "number of lines to display",
+			      "[+-]num-lines") {
+		void parse(String args, Object options) {
+		    ((Options)options).length = new Magnitude(args);
+		}
+	    });
     }
+    private static class Options {
+	CommandOption.Magnitude length;
+    }
+    Object options() {
+	return new Options();
+    }
+
     private File file = null;
     private int line;
     private int exec_line = 0;
-    public void interpret(CLI cli, Input cmd) {
+    void interpret(CLI cli, Input cmd, Object o) {
+	Options options = (Options)o;
         PTSet ptset = cli.getCommandPTSet(cmd);
 	int windowSize = 20;
         Iterator taskIter = ptset.getTaskData();
         while (taskIter.hasNext()) {
             TaskData taskData = (TaskData)taskIter.next();
             Task task = taskData.getTask();
+            cli.outWriter.print("[");
+	    cli.outWriter.print(taskData.getParentID());
+	    cli.outWriter.print(".");
+	    cli.outWriter.print(taskData.getID());
+	    cli.outWriter.println("]");
             DebugInfoFrame frame = cli.getTaskFrame(task);
-            if (cmd.size() == 1 && cmd.parameter(0).equals("-help")) {
-                cli.printUsage(cmd);
-                return;
-            }
             if (frame.getLines().length == 0) {
-                cli.addMessage("No symbol table is available.",
-                               Message.TYPE_NORMAL);
-                return;
+		cli.outWriter.println("No symbol table is available.");
+		continue;
             }
-            cli.outWriter.println("[" + taskData.getParentID() + "."
-                                  + taskData.getID() + "]");
             if (cmd.size() == 1) {
                 // list N
                 try {
@@ -104,20 +117,15 @@ class ListCommand
                     }
                 }
             }
-            else if (cmd.size() == 2) {
-                // list -length {-}N
-                if ((cmd.parameter(0)).equals("-length"))		    {
-                    try 			    {
-                        windowSize = Integer.parseInt(cmd.parameter(1));
-                        if (windowSize < 0)				    {
-                            line += windowSize;
-                        }
-                    }
-                    catch (NumberFormatException ignore)			    {
-                        // XXX: Ignored?
-                    }
-                }
-            }
+	    else if (options.length != null) {
+		windowSize = options.length.magnitude;
+		if (options.length.sign < 0)
+		    line -= windowSize;
+		else if (options.length.sign > 0)
+		    line += windowSize;
+		else
+		    line -= windowSize / 2;
+	    }
             else if (frame.getLines()[0].getLine() != exec_line) {
                 // list around pc.
                 exec_line = frame.getLines()[0].getLine();
@@ -174,4 +182,9 @@ class ListCommand
         }
 
     }
+
+    int complete(CLI cli, PTSet ptset, String incomplete, int base,
+		 List candidates) {
+	return -1;
+    }
 }
diff --git a/frysk-core/frysk/hpd/ParameterizedCommand.java b/frysk-core/frysk/hpd/ParameterizedCommand.java
index 558e367..12fe094 100644
--- a/frysk-core/frysk/hpd/ParameterizedCommand.java
+++ b/frysk-core/frysk/hpd/ParameterizedCommand.java
@@ -67,46 +67,20 @@ abstract class ParameterizedCommand extends Command {
 	    shortOptions.put("" + option.shortName, option);
     }
 
-    private void handleOption(Input input, String option, int index,
-			      Object options) {
-	// Strip any leading "-"'s
-	String name = option.substring(1);
-	while (name.length() > 0 && name.charAt(0) == '-')
-	    name = name.substring(1);
-	// Strip off =... in -option=...
-	int eq = name.indexOf('=');
-	if (eq != -1)
-	    name = option.substring(0, eq);
+    private CommandOption lookupOption(String name) {
 	CommandOption commandOption = (CommandOption)longOptions.get(name);
 	if (commandOption == null)
 	    commandOption = (CommandOption)shortOptions.get(name);
-	if (commandOption == null) {
-	    throw new InvalidCommandException("unrecognized option '-"
-					      + name + "'");
-	}
-	String argument = null;
-	if (commandOption.parameter != null) {
-	    // Require a single parameter.
-	    if ((eq >= 0 && index != input.size())
-		|| (eq == -1 && index != input.size() - 1))
-		throw new InvalidCommandException
-		    ("option -" + commandOption.longName
-		     + " expects a single parameter "
-		     + commandOption.parameter);
-	    if (eq == -1) {
-		argument = input.parameter(index);
-		input.removeLast();
-	    } else {
-		argument = option.substring(eq + 1);
-	    }
-	} else {
-	    // Reject a parameter.
-	    if (eq != -1 || index != input.size())
-		throw new InvalidCommandException
-		    ("option -" + commandOption.longName
-		     + " doesn't allow an argument");
-	}
-	commandOption.parse(argument, options);
+	return commandOption;
+    }
+
+    private String optionName(String name) {
+	if (name.charAt(0) != '-')
+	    return null;
+	do {
+	    name = name.substring(1);
+	} while (name.length() > 0 && name.charAt(0) == '-');
+	return name;
     }
 
     /**
@@ -115,24 +89,47 @@ abstract class ParameterizedCommand extends Command {
      */
     public final void interpret(CLI cli, Input input) {
 	Object options = options();
-	for (int currentIndex = input.size() - 1; currentIndex > -1;
-	     --currentIndex) {
-	    String string = input.parameter(currentIndex);
+	while (input.size() > 0) {
+	    int index = input.size() - 1;
+	    String string = input.parameter(index);
 	    if (string.equals("--")) {
-		if (currentIndex != input.size() - 1)
-		    throw new InvalidCommandException
-			("Invalid option "
-			 + input.parameter(currentIndex + 1));
 		input.removeLast();
 		break;
 	    }
+	    // Check for <<-option ARG>>; so that <<-option -1>> is
+	    // prefered over <<-1>> (which isn't valid).
+	    if (input.size() > 1) {
+		String name = optionName(input.parameter(index - 1));
+		if (name != null) {
+		    CommandOption option = lookupOption(name);
+		    if (option != null && option.parameter != null) {
+			option.parse(string, options);
+			input.removeLast(); // arg
+			input.removeLast(); // -opt
+			continue;
+		    }
+		}
+	    }
 	    if (string.equals("-help")) {
 		help(cli, input);
 		return;
 	    }
-	    if (string.charAt(0) != '-')
-		continue;
-	    handleOption(input, string, currentIndex + 1, options);
+	    // Check for <<-option>>; if nothing going give up.
+	    String name = optionName(string);
+	    if (name == null)
+		break;
+	    CommandOption commandOption = lookupOption(name);
+	    if (commandOption == null) {
+		throw new InvalidCommandException("unrecognized option '-"
+						  + name + "'");
+	    }
+	    if (commandOption.parameter != null) {
+		throw new InvalidCommandException
+		    ("option -" + commandOption.longName
+		     + " expects a single parameter "
+		     + commandOption.parameter);
+	    }
+	    commandOption.parse(null, options);
 	    input.removeLast();
 	}
 	interpret(cli, input, options);
diff --git a/frysk-core/frysk/hpd/TestParameterizedCommand.java b/frysk-core/frysk/hpd/TestParameterizedCommand.java
index f625adb..359b0c7 100644
--- a/frysk-core/frysk/hpd/TestParameterizedCommand.java
+++ b/frysk-core/frysk/hpd/TestParameterizedCommand.java
@@ -152,6 +152,12 @@ public class TestParameterizedCommand extends TestLib {
 	      false, null);
     }
 
+    public void testOptionWithDashArg() {
+	check("parser -arg -1", "",
+	      new String[0],
+	      true, "-1");
+    }
+
     private void checkInvalid(String string) {
 	RuntimeException thrown = null;
 	try {
@@ -166,16 +172,8 @@ public class TestParameterizedCommand extends TestLib {
 	checkInvalid("parser -arg");
     }
 
-    public void testTooManyArgs() {
-	checkInvalid("parser -arg arg1 arg2");
-    }
-
-    public void testExtraArg() {
-	checkInvalid("parser -opt arg");
-    }
-
-    public void testMissingOption() {
-	checkInvalid("parser -- arg");
+    public void testUnknownOpt() {
+	checkInvalid("parser -unknown");
     }
 
     public void testHelp() {


hooks/post-receive
--
frysk system monitor/debugger



More information about the Frysk-cvs mailing list