Commit 0e9fab21 by Andrew Haley Committed by Andrew Haley

Main.java (Fileset): New class.

2005-04-05  Andrew Haley  <aph@redhat.com>

        * gnu/gcj/tools/gcj_dbtool/Main.java (Fileset): New class.
        (Tokenizer): New class.
        (getFiles): New method.
        (main): Add "-" argument.
        Add "-0" argument.
        Read list of files from stdin when merging map databases.
        (usage):  Add "-" argument.
        Add "-0" argument.
        Minor corrections.

From-SVN: r97719
parent f1b259d5
2005-04-05 Andrew Haley <aph@redhat.com>
* gnu/gcj/tools/gcj_dbtool/Main.java (Fileset): New class.
(Tokenizer): New class.
(getFiles): New method.
(main): Add "-" argument.
Add "-0" argument.
Read list of files from stdin when merging map databases.
(usage): Add "-" argument.
Add "-0" argument.
Minor corrections.
2005-04-05 Thomas Fitzsimmons <fitzsim@redhat.com> 2005-04-05 Thomas Fitzsimmons <fitzsim@redhat.com>
PR libgcj/20750 PR libgcj/20750
......
...@@ -22,7 +22,22 @@ public class Main ...@@ -22,7 +22,22 @@ public class Main
public static void main (String[] s) public static void main (String[] s)
{ {
boolean fileListFromStdin = false;
char filenameSeparator = ' ';
insist (s.length >= 1); insist (s.length >= 1);
if (s[0].equals("-") ||
s[0].equals("-0"))
{
if (s[0].equals("-0"))
filenameSeparator = (char)0;
fileListFromStdin = true;
String[] newArgs = new String[s.length - 1];
System.arraycopy(s, 1, newArgs, 0, s.length - 1);
s = newArgs;
}
if (s[0].equals("-v") || s[0].equals("--version")) if (s[0].equals("-v") || s[0].equals("--version"))
{ {
insist (s.length == 1); insist (s.length == 1);
...@@ -145,7 +160,8 @@ public class Main ...@@ -145,7 +160,8 @@ public class Main
if (s[0].equals("-m")) if (s[0].equals("-m"))
{ {
// Merge databases. // Merge databases.
insist (s.length >= 3); insist (s.length >= 3
|| fileListFromStdin && s.length == 2);
try try
{ {
File database = new File(s[1]); File database = new File(s[1]);
...@@ -155,24 +171,32 @@ public class Main ...@@ -155,24 +171,32 @@ public class Main
int newSize = 0; int newSize = 0;
int newStringTableSize = 0; int newStringTableSize = 0;
PersistentByteMap[] sourceMaps = new PersistentByteMap[s.length - 2]; Fileset files = getFiles(s, 2, fileListFromStdin,
filenameSeparator);
PersistentByteMap[] sourceMaps
= new PersistentByteMap[files.size()];
// Scan all the input files, calculating worst case string // Scan all the input files, calculating worst case string
// table and hash table use. // table and hash table use.
for (int i = 2; i < s.length; i++) {
{ Iterator it = files.iterator();
PersistentByteMap b int i = 0;
= new PersistentByteMap(new File(s[i]), while (it.hasNext())
PersistentByteMap.AccessMode.READ_ONLY); {
newSize += b.size(); PersistentByteMap b
newStringTableSize += b.stringTableSize(); = new PersistentByteMap((File)it.next(),
sourceMaps[i - 2] = b; PersistentByteMap.AccessMode.READ_ONLY);
} newSize += b.size();
newStringTableSize += b.stringTableSize();
sourceMaps[i++] = b;
}
}
newSize *= 1.5; // Scaling the new size by 1.5 results in newSize *= 1.5; // Scaling the new size by 1.5 results in
// fewer collisions. // fewer collisions.
PersistentByteMap map PersistentByteMap map
= PersistentByteMap.emptyPersistentByteMap = PersistentByteMap.emptyPersistentByteMap
(temp, newSize, newStringTableSize); (temp, newSize, newStringTableSize);
for (int i = 0; i < sourceMaps.length; i++) for (int i = 0; i < sourceMaps.length; i++)
{ {
...@@ -296,16 +320,19 @@ public class Main ...@@ -296,16 +320,19 @@ public class Main
+ " Usage: \n" + " Usage: \n"
+ " gcj-dbtool -n file.gcjdb [size] - Create a new gcj map database\n" + " gcj-dbtool -n file.gcjdb [size] - Create a new gcj map database\n"
+ " gcj-dbtool -a file.gcjdb file.jar file.so\n" + " gcj-dbtool -a file.gcjdb file.jar file.so\n"
+ " - Add the contents of file.jar to a new gcj map database\n" + " - Add the contents of file.jar to a gcj map database\n"
+ " gcj-dbtool -f file.gcjdb file.jar file.so\n" + " gcj-dbtool -f file.gcjdb file.jar file.so\n"
+ " - Add the contents of file.jar to a new gcj map database\n" + " - Add the contents of file.jar to a gcj map database\n"
+ " gcj-dbtool -t file.gcjdb - Test a gcj map database\n" + " gcj-dbtool -t file.gcjdb - Test a gcj map database\n"
+ " gcj-dbtool -l file.gcjdb - List a gcj map database\n" + " gcj-dbtool -l file.gcjdb - List a gcj map database\n"
+ " gcj-dbtool -m dest.gcjdb [source.gcjdb]...\n" + " gcj-dbtool [-][-0] -m dest.gcjdb [source.gcjdb]...\n"
+ " - Merge gcj map databases into dest\n" + " - Merge gcj map databases into dest\n"
+ " Replaces dest\n" + " Replaces dest\n"
+ " To add to dest, include dest in the list of sources\n" + " To add to dest, include dest in the list of sources\n"
+ " gcj-dbtool -p [LIBDIR] - Print default database name"); + " If the first arg is -, read the list from stdin\n"
+ " If the first arg is -0, filenames separated by nul\n"
+ " gcj-dbtool -p [LIBDIR] - Print default database name"
);
} }
// Add a jar to a map. This copies the map first and returns a // Add a jar to a map. This copies the map first and returns a
...@@ -405,5 +432,104 @@ public class Main ...@@ -405,5 +432,104 @@ public class Main
hexBytes.append(Integer.toHexString(b[i] & 0xff)); hexBytes.append(Integer.toHexString(b[i] & 0xff));
return hexBytes.toString(); return hexBytes.toString();
} }
// Return a Fileset, either from a String array or from System.in,
// depending on fileListFromStdin.
private static final Fileset getFiles(String[] s, int startPos,
boolean fileListFromStdin,
char separator)
{
if (fileListFromStdin)
return new Fileset(System.in, separator);
else
return new Fileset(s, startPos, s.length);
}
}
// Parse a stream into tokens. The separator can be any char, and
// space is equivalent to any whitepace character.
class Tokenizer
{
final Reader r;
final char separator;
Tokenizer(Reader r, char separator)
{
this.r = r;
this.separator = separator;
}
boolean isSeparator(int c)
{
if (Character.isWhitespace(separator))
return Character.isWhitespace((char)c);
else
return c == separator;
}
// Parse a token from the input stream. Return the empty string
// when the stream is exhausted.
String nextToken ()
{
StringBuffer buf = new StringBuffer();
int c;
try
{
while ((c = r.read()) != -1)
{
if (! isSeparator(c))
{
buf.append((char)c);
break;
}
}
while ((c = r.read()) != -1)
{
if (isSeparator(c))
break;
else
buf.append((char)c);
}
}
catch (java.io.IOException e)
{
}
return buf.toString();
}
}
// A Fileset is a container for a set of files; it can be created
// either from a string array or from an input stream, given a
// separator character.
class Fileset
{
LinkedHashSet files = new LinkedHashSet();
Fileset (String[] s, int start, int end)
{
for (int i = start; i < end; i++)
{
files.add(new File(s[i]));
}
}
Fileset (InputStream is, char separator)
{
Reader r = new BufferedReader(new InputStreamReader(is));
Tokenizer st = new Tokenizer(r, separator);
String name;
while (! "".equals(name = st.nextToken()))
files.add(new File(name));
}
Iterator iterator()
{
return files.iterator();
}
int size()
{
return files.size();
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment