Mercurial > hg > truffle
diff src/share/tools/MakeDeps/MacroDefinitions.java @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/tools/MakeDeps/MacroDefinitions.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,256 @@ +/* + * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +import java.io.*; +import java.util.*; + +public class MacroDefinitions { + private Vector macros; + + public MacroDefinitions() { + macros = new Vector(); + } + + private String lookup(String name) throws NoSuchElementException { + for (Iterator iter = macros.iterator(); iter.hasNext(); ) { + Macro macro = (Macro) iter.next(); + if (macro.name.equals(name)) { + return macro.contents; + } + } + throw new NoSuchElementException(name); + } + + public void addMacro(String name, String contents) { + Macro macro = new Macro(); + macro.name = name; + macro.contents = contents; + macros.add(macro); + } + + private boolean lineIsEmpty(String s) { + for (int i = 0; i < s.length(); i++) { + if (!Character.isWhitespace(s.charAt(i))) { + return false; + } + } + return true; + } + + public void readFrom(String fileName, boolean missingOk) + throws FileNotFoundException, FileFormatException, IOException { + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(fileName)); + } catch (FileNotFoundException e) { + if (missingOk) { + return; + } else { + throw(e); + } + } + String line; + do { + line = reader.readLine(); + if (line != null) { + // This had to be rewritten (compare to Database.java) + // because the Solaris platform file has been + // repurposed and now contains "macros" with spaces in + // them. + + if ((!line.startsWith("//")) && + (!lineIsEmpty(line))) { + int nameBegin = -1; + int nameEnd = -1; + boolean gotEquals = false; + int contentsBegin = -1; + int contentsEnd = -1; + + int i = 0; + // Scan forward for beginning of name + while (i < line.length()) { + if (!Character.isWhitespace(line.charAt(i))) { + break; + } + i++; + } + nameBegin = i; + + // Scan forward for end of name + while (i < line.length()) { + if (Character.isWhitespace(line.charAt(i))) { + break; + } + i++; + } + nameEnd = i; + + // Scan forward for equals sign + while (i < line.length()) { + if (line.charAt(i) == '=') { + gotEquals = true; + break; + } + i++; + } + + // Scan forward for start of contents + i++; + while (i < line.length()) { + if (!Character.isWhitespace(line.charAt(i))) { + break; + } + i++; + } + contentsBegin = i; + + // Scan *backward* for end of contents + i = line.length() - 1; + while (i >= 0) { + if (!Character.isWhitespace(line.charAt(i))) { + break; + } + } + contentsEnd = i+1; + + // Now do consistency check + if (!((nameBegin < nameEnd) && + (nameEnd < contentsBegin) && + (contentsBegin < contentsEnd) && + (gotEquals == true))) { + throw new FileFormatException( + "Expected \"macroname = value\", " + + "but found: " + line + ); + } + + String name = line.substring(nameBegin, nameEnd); + String contents = line.substring(contentsBegin, + contentsEnd); + addMacro(name, contents); + } + } + } while (line != null); + reader.close(); + } + + /** Throws IllegalArgumentException if passed token is illegally + formatted */ + public String expand(String token) + throws IllegalArgumentException { + // the token may contain one or more <macroName>'s + + String out = ""; + + // emacs lingo + int mark = 0; + int point = 0; + + int len = token.length(); + + if (len == 0) + return out; + + do { + // Scan "point" forward until hitting either the end of + // the string or the beginning of a macro + if (token.charAt(point) == '<') { + // Append (point - mark) to out + if ((point - mark) != 0) { + out += token.substring(mark, point); + } + mark = point + 1; + // Scan forward from point for right bracket + point++; + while ((point < len) && + (token.charAt(point) != '>')) { + point++; + } + if (point == len) { + throw new IllegalArgumentException( + "Could not find right angle-bracket in token " + token + ); + } + String name = token.substring(mark, point); + if (name == null) { + throw new IllegalArgumentException( + "Empty macro in token " + token + ); + } + try { + String contents = lookup(name); + out += contents; + point++; + mark = point; + } catch (NoSuchElementException e) { + throw new IllegalArgumentException( + "Unknown macro " + name + " in token " + token + ); + } + } else { + point++; + } + } while (point != len); + + if (mark != point) { + out += token.substring(mark, point); + } + + return out; + } + + public MacroDefinitions copy() { + MacroDefinitions ret = new MacroDefinitions(); + for (Iterator iter = macros.iterator(); + iter.hasNext(); ) { + Macro orig = (Macro) iter.next(); + Macro macro = new Macro(); + macro.name = orig.name; + macro.contents = orig.contents; + ret.macros.add(macro); + } + return ret; + } + + public void setAllMacroBodiesTo(String s) { + for (Iterator iter = macros.iterator(); + iter.hasNext(); ) { + Macro macro = (Macro) iter.next(); + macro.contents = s; + } + } + + /** This returns an Iterator of Macros. You should not mutate the + returned Macro objects or use the Iterator to remove + macros. */ + public Iterator getMacros() { + return macros.iterator(); + } + + private void error(String text) throws FileFormatException { + throw new FileFormatException( + "Expected \"macroname = value\", but found: " + text + ); + } +}