Hi Andrew, I am not so happy with that patch. :) I was trying to get Classpath to build PhoneME today and that requires our javah to support @-style arguments as well. From my work for MIDPath I know that we also lack that functionality in gjar that is why I tried an implementation that can be used in all getopt using classpath tools.
What I am also unhappy is that a simple BufferedReader.readLine() is used to get the filelist entries. The filelist the phoneme build generates looks like this: "Bla Foo Baz". So a simple parser is needed that splits at whitespace bounds. My suggested implementation does exactly that. What my implementation does not handle is whitespace inside filenames and quoting. However I am not sure whether this is supported in filelist anyway. It may be possible that some tools need @file support and some not (Does anyone know more about this?). And such a case I would change the getopt API to explicitly request @file support in parse(). Please have a look at the attached patch. :) Regards Robert Andrew John Hughes schrieb: > This adds support in gjar for the @file argument > as used by the OpenJDK build. > > ChangeLog: > > 2008-06-02 Andrew John Hughes <[EMAIL PROTECTED]> > > * tools/gnu/classpath/tools/getopt/OptionException.java: > (OptionException(String,Throwable)): New constructor. > * tools/gnu/classpath/tools/jar/Main.java: > (fileLists): New queue for streams containing lists of files. > (HandleFile.NotifyFile(String)): Check for '@' arguments > and add to stream queue. > (parsed(String)): Add stdin to queue instead of setting flag. > (readNames()): Work with the queue rather than just stdin. > (run(String[])): Always execute readNames(). > >
? sun/security ? tools/generated Index: ChangeLog =================================================================== RCS file: /sources/classpath/classpath/ChangeLog,v retrieving revision 1.9623 diff -u -r1.9623 ChangeLog --- ChangeLog 1 Jun 2008 12:01:11 -0000 1.9623 +++ ChangeLog 2 Jun 2008 22:40:10 -0000 @@ -1,3 +1,10 @@ +2008-06-03 Robert Schuster <[EMAIL PROTECTED]> + + * tools/gnu/classpath/tools/getopt/Parser.java: + (parse): Added twos checks for '@' character and calls to parseFileList. + (parseFileList): New method. + (parseLine): New method. + 2008-06-01 Mark Wielaard <[EMAIL PROTECTED]> * gnu/java/awt/java2d/AbstractGraphics2D.java: Removed XDialogPeer 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 2 Jun 2008 22:40:11 -0000 @@ -38,6 +38,10 @@ package gnu.classpath.tools.getopt; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; import java.io.PrintStream; import java.text.BreakIterator; import java.text.MessageFormat; @@ -442,7 +446,12 @@ || args[currentIndex].charAt(0) != '-' || "-".equals(args[currentIndex])) //$NON-NLS-1$ { - files.notifyFile(args[currentIndex]); + // Treat file names starting with @ like a file containing a file list. + if (args[currentIndex].codePointAt(0) == '@') + parseFileList(args[currentIndex].substring(1), files); + else + files.notifyFile(args[currentIndex]); + continue; } if ("--".equals(args[currentIndex])) //$NON-NLS-1$ @@ -456,7 +465,13 @@ } // Add remaining arguments to leftovers. for (++currentIndex; currentIndex < args.length; ++currentIndex) - files.notifyFile(args[currentIndex]); + { + // Treat file names starting with @ like a file containing a file list. + if (args[currentIndex].codePointAt(0) == '@') + parseFileList(args[currentIndex].substring(1), files); + else + files.notifyFile(args[currentIndex]); + } // See if something went wrong. validate(); } @@ -492,4 +507,71 @@ }); return (String[]) fileResult.toArray(new String[0]); } + + /** Simple function that takes the given file, treats it as a textfile + * and reads all the whitespace separated entries from it notifying + * [EMAIL PROTECTED] FileArgumentCallback} instance each time. + */ + private void parseFileList(String fileName, FileArgumentCallback files) + throws OptionException + { + BufferedReader reader = null; + String line = null; + + try + { + reader = new BufferedReader(new FileReader(fileName)); + } + catch (FileNotFoundException fnfe) + { + System.err.println(programName + ": file not found " + fileName); + System.exit(1); + } + + try + { + while ((line = reader.readLine()) != null) + parseLine(line, files); + + reader.close(); + } + catch (IOException ioe) + { + System.err.println(programName + ": IO error while accessing " + fileName); + 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 files) + throws OptionException, IOException + { + final int length = line.length(); + int start = 0; + int end = 0; + while (start < length) + { + while (Character.isWhitespace(line.codePointAt(start))) + { + start++; + + if (start == length) + return; + } + + end = start + 1; + + while (end < length && !Character.isWhitespace(line.codePointAt(end))) + end++; + + files.notifyFile(line.substring(start, end)); + + start = end + 1; + } + } + }
signature.asc
Description: OpenPGP digital signature