Hi,
the following patch adds @file support to gjavah and gjar by enhancing
ClasspathToolParser with a few methods and making both tools use those.

The other tools are not affected by this change nor does this modify the
core getopt functionality (except that I made the 'programName' field
protected - was private).

I originally wanted to use StreamTokenizer or StringTokenizer but I
think those are to complex for the task.

2008-06-03  Robert Schuster  <[EMAIL PROTECTED]>

  * tools/gnu/classpath/tools/jar/Main.java:
  (run): Call different ClasspathToolParser.parse() variant.
  (getParser): Changed return type to ClasspathToolParser.
  * tools/gnu/classpath/tools/javah/GcjhMain.java:
  (getParser): Changed return type to ClasspathToolParser.
  * tools/gnu/classpath/tools/javah/Main.java:
  (getParser): Changed return type to ClasspathToolParser.
  * tools/gnu/classpath/tools/getopt/Parser.java: Make 'programName'
  protected.
  * tools/gnu/classpath/tools/common/ClasspathToolParser.java:
  (parse(String[], FileArgumentCallback,boolean): New method.
  (parse(String[], boolean): New method.
  (parseFileList): New method.
  (parseLine): New method.
  (AtFileArgumentCallback): New inner class.

Regards
Robert
? tools/generated
Index: tools/gnu/classpath/tools/common/ClasspathToolParser.java
===================================================================
RCS file: /sources/classpath/classpath/tools/gnu/classpath/tools/common/ClasspathToolParser.java,v
retrieving revision 1.1
diff -u -r1.1 ClasspathToolParser.java
--- tools/gnu/classpath/tools/common/ClasspathToolParser.java	22 Sep 2006 01:01:26 -0000	1.1
+++ tools/gnu/classpath/tools/common/ClasspathToolParser.java	3 Jun 2008 16:34:45 -0000
@@ -38,9 +38,16 @@
 
 package gnu.classpath.tools.common;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.Reader;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 
 import gnu.classpath.Configuration;
+import gnu.classpath.tools.getopt.FileArgumentCallback;
 import gnu.classpath.tools.getopt.Option;
 import gnu.classpath.tools.getopt.OptionException;
 import gnu.classpath.tools.getopt.Parser;
@@ -84,4 +91,137 @@
                }
              });
   }
+
+	public void parse(String[] inArgs, FileArgumentCallback files,
+									  boolean handleFileLists)
+	{
+		FileArgumentCallback cb;
+
+		if (handleFileLists)
+			cb = new AtFileArgumentCallback(files);
+		else
+			cb = files;
+
+		parse(inArgs, cb);
+	}
+
+  public String[] parse(String[] inArgs, boolean handleFileLists)
+  {
+    final ArrayList fileResult = new ArrayList();
+
+		final FileArgumentCallback cb = new FileArgumentCallback()
+  	{
+    	public void notifyFile(String fileArgument)
+    	{
+    	  fileResult.add(fileArgument);
+    	}
+    };
+
+		if (handleFileLists)
+			parse(inArgs, new AtFileArgumentCallback(cb));
+		else
+			parse(inArgs, cb);
+
+    return (String[]) fileResult.toArray(new String[0]);
+  }
+
+
+  /** Simple function that takes the given [EMAIL PROTECTED] Reader}, treats it like
+   * a textfile and reads all the whitespace separated entries from it
+   * and adds them to the @{link FileArgumentCallback} instance.
+   */
+  public void parseFileList(Reader reader, FileArgumentCallback cb)
+	throws OptionException
+  {
+    BufferedReader breader = new BufferedReader(reader);
+    String line = null;
+
+    try
+      {
+        while ((line = breader.readLine()) != null)
+          parseLine(line, cb);
+          
+        reader.close();
+      }
+    catch (IOException ioe)
+      {
+        System.err.println(programName + ": IO error while reading from inputstream");
+        System.exit(1);
+      }
+      
+  }
+  
+  /** Parses whitespace separated file entries.
+   *
+   * Note: This is not coping with whitespace in files or quoting.
+   */
+  private void parseLine(String line, FileArgumentCallback cb)
+    throws IOException, OptionException
+  {
+    final int length = line.length();
+    int start = 0;
+    int end = 0;
+
+		// While not reached end of line ...
+    while (start < length)
+      {
+				// Search for first non-whitespace character for the start of a word.
+        while (Character.isWhitespace(line.codePointAt(start)))
+          {
+            start++;
+        
+            if (start == length)
+              return;
+          }
+    
+        end = start + 1;
+	
+				// Search for first whitespace character for the end of a word.
+        while (end < length && !Character.isWhitespace(line.codePointAt(end)))
+          end++;
+      
+        cb.notifyFile(line.substring(start, end));
+    
+        start = end + 1;
+      }
+  }
+
+	/** Implementation of [EMAIL PROTECTED] FileArgumentCallback} that handles
+ 		* file arguments in [EMAIL PROTECTED] #notifyFile} starting with a <code>@</code>
+		* through [EMAIL PROTECTED] ClasspathToolParser#parseFileList}.
+		*/
+	class AtFileArgumentCallback extends FileArgumentCallback
+	{
+		FileArgumentCallback cb;
+	
+		AtFileArgumentCallback(FileArgumentCallback cb)
+		{
+			this.cb = cb;
+		}
+
+  	public void notifyFile(String fileArgument)
+		throws OptionException
+  	{
+			if (fileArgument.codePointAt(0) == '@')
+			{
+				FileReader fr = null;
+
+				try
+					{
+						fr = new FileReader(fileArgument.substring(1));
+					}
+				catch (FileNotFoundException fnfe)
+					{
+						System.err.println(programName + ": file not found " + fileArgument.substring(1));
+						System.exit(1);
+					}
+
+				ClasspathToolParser.this.parseFileList(fr, cb);
+			}
+			else
+  	  	cb.notifyFile(fileArgument);
+  	}
+
+  }
+
 }
Index: tools/gnu/classpath/tools/getopt/Parser.java
===================================================================
RCS file: /sources/classpath/classpath/tools/gnu/classpath/tools/getopt/Parser.java,v
retrieving revision 1.10
diff -u -r1.10 Parser.java
--- tools/gnu/classpath/tools/getopt/Parser.java	20 Mar 2008 18:04:44 -0000	1.10
+++ tools/gnu/classpath/tools/getopt/Parser.java	3 Jun 2008 16:34:45 -0000
@@ -58,7 +58,7 @@
   /** The maximum right column position. */
   public static final int MAX_LINE_LENGTH = 80;
 
-  private String programName;
+  protected String programName;
 
   private String headerText;
 
Index: tools/gnu/classpath/tools/jar/Main.java
===================================================================
RCS file: /sources/classpath/classpath/tools/gnu/classpath/tools/jar/Main.java,v
retrieving revision 1.11
diff -u -r1.11 Main.java
--- tools/gnu/classpath/tools/jar/Main.java	3 Jun 2008 14:02:13 -0000	1.11
+++ tools/gnu/classpath/tools/jar/Main.java	3 Jun 2008 16:34:45 -0000
@@ -172,9 +172,9 @@
     }
   }
 
-  private Parser initializeParser()
+  private ClasspathToolParser initializeParser()
   {
-    Parser p = new JarParser("jar"); //$NON-NLS-1$
+    ClasspathToolParser p = new JarParser("jar"); //$NON-NLS-1$
     p.setHeader(Messages.getString("Main.Usage")); //$NON-NLS-1$
 
     OptionGroup grp = new OptionGroup(Messages.getString("Main.OpMode")); //$NON-NLS-1$
@@ -265,11 +265,11 @@
   private void run(String[] args)
       throws InstantiationException, IllegalAccessException, IOException
   {
-    Parser p = initializeParser();
+    ClasspathToolParser p = initializeParser();
     // Special hack to emulate old tar-style commands.
     if (args.length > 0 && args[0].charAt(0) != '-')
       args[0] = '-' + args[0];
-    p.parse(args, new HandleFile());
+    p.parse(args, new HandleFile(), true);
     if (readNamesFromStdin)
       readNames();
     Action t = (Action) operationMode.newInstance();
Index: tools/gnu/classpath/tools/javah/GcjhMain.java
===================================================================
RCS file: /sources/classpath/classpath/tools/gnu/classpath/tools/javah/GcjhMain.java,v
retrieving revision 1.1
diff -u -r1.1 GcjhMain.java
--- tools/gnu/classpath/tools/javah/GcjhMain.java	6 Mar 2007 18:52:34 -0000	1.1
+++ tools/gnu/classpath/tools/javah/GcjhMain.java	3 Jun 2008 16:34:46 -0000
@@ -38,10 +38,11 @@
 
 package gnu.classpath.tools.javah;
 
+import gnu.classpath.tools.common.ClasspathToolParser;
+
 import gnu.classpath.tools.getopt.Option;
 import gnu.classpath.tools.getopt.OptionException;
 import gnu.classpath.tools.getopt.OptionGroup;
-import gnu.classpath.tools.getopt.Parser;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -60,9 +61,9 @@
     return "gcjh";
   }
 
-  protected Parser getParser()
+  protected ClasspathToolParser getParser()
   {
-    Parser result = super.getParser();
+    ClasspathToolParser result = super.getParser();
 
     result.setHeader("usage: gcjh [OPTION]... CLASS...");
 
Index: tools/gnu/classpath/tools/javah/Main.java
===================================================================
RCS file: /sources/classpath/classpath/tools/gnu/classpath/tools/javah/Main.java,v
retrieving revision 1.10
diff -u -r1.10 Main.java
--- tools/gnu/classpath/tools/javah/Main.java	31 Jul 2007 16:15:53 -0000	1.10
+++ tools/gnu/classpath/tools/javah/Main.java	3 Jun 2008 16:34:46 -0000
@@ -188,7 +188,7 @@
     return "javah";
   }
 
-  protected Parser getParser()
+  protected ClasspathToolParser getParser()
   {
     ClasspathToolParser result = new ClasspathToolParser(getName(), true);
     result.setHeader("usage: javah [OPTIONS] CLASS...");
@@ -339,8 +339,8 @@
 
   protected void run(String[] args) throws IOException
   {
-    Parser p = getParser();
-    String[] classNames = p.parse(args);
+    ClasspathToolParser p = getParser();
+    String[] classNames = p.parse(args, true);
     postParse(classNames);
     loader = classpath.getLoader();
 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to