1 /*
   2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 import java.io.*;
  26 import java.util.*;
  27 
  28 public class MacroDefinitions {
  29     private Vector macros;
  30 
  31     public MacroDefinitions() {
  32         macros = new Vector();
  33     }
  34 
  35     public void addMacro(String name, String contents) {
  36         Macro macro = new Macro();
  37         macro.name = name;
  38         macro.contents = contents;
  39         macros.add(macro);
  40     }
  41 
  42     private boolean lineIsEmpty(String s) {
  43         for (int i = 0; i < s.length(); i++) {
  44             if (!Character.isWhitespace(s.charAt(i))) {
  45                 return false;
  46             }
  47         }
  48         return true;
  49     }
  50 
  51     public void readFrom(String fileName, boolean missingOk)
  52         throws FileNotFoundException, FileFormatException, IOException {
  53         BufferedReader reader = null;
  54         try {
  55             reader = new BufferedReader(new FileReader(fileName));
  56         } catch (FileNotFoundException e) {
  57             if (missingOk) {
  58                 return;
  59             } else {
  60                 throw(e);
  61             }
  62         }
  63         String line;
  64         do {
  65             line = reader.readLine();
  66             if (line != null) {
  67                 // This had to be rewritten (compare to Database.java)
  68                 // because the Solaris platform file has been
  69                 // repurposed and now contains "macros" with spaces in
  70                 // them.
  71 
  72                 if ((!line.startsWith("//")) &&
  73                     (!lineIsEmpty(line))) {
  74                     int nameBegin = -1;
  75                     int nameEnd = -1;
  76                     boolean gotEquals = false;
  77                     int contentsBegin = -1;
  78                     int contentsEnd = -1;
  79 
  80                     int i = 0;
  81                     // Scan forward for beginning of name
  82                     while (i < line.length()) {
  83                         if (!Character.isWhitespace(line.charAt(i))) {
  84                             break;
  85                         }
  86                         i++;
  87                     }
  88                     nameBegin = i;
  89 
  90                     // Scan forward for end of name
  91                     while (i < line.length()) {
  92                         if (Character.isWhitespace(line.charAt(i))) {
  93                             break;
  94                         }
  95                         i++;
  96                     }
  97                     nameEnd = i;
  98 
  99                     // Scan forward for equals sign
 100                     while (i < line.length()) {
 101                         if (line.charAt(i) == '=') {
 102                             gotEquals = true;
 103                             break;
 104                         }
 105                         i++;
 106                     }
 107 
 108                     // Scan forward for start of contents
 109                     i++;
 110                     while (i < line.length()) {
 111                         if (!Character.isWhitespace(line.charAt(i))) {
 112                             break;
 113                         }
 114                         i++;
 115                     }
 116                     contentsBegin = i;
 117 
 118                     // Scan *backward* for end of contents
 119                     i = line.length() - 1;
 120                     while (i >= 0) {
 121                         if (!Character.isWhitespace(line.charAt(i))) {
 122                             break;
 123                         }
 124                     }
 125                     contentsEnd = i+1;
 126 
 127                     // Now do consistency check
 128                     if (!((nameBegin < nameEnd) &&
 129                           (nameEnd < contentsBegin) &&
 130                           (contentsBegin < contentsEnd) &&
 131                           (gotEquals == true))) {
 132                         throw new FileFormatException(
 133                             "Expected \"macroname = value\", " +
 134                             "but found: " + line
 135                         );
 136                     }
 137 
 138                     String name = line.substring(nameBegin, nameEnd);
 139                     String contents = line.substring(contentsBegin,
 140                                                      contentsEnd);
 141                     addMacro(name, contents);
 142                 }
 143             }
 144         } while (line != null);
 145         reader.close();
 146     }
 147 
 148     /** This returns an Iterator of Macros. You should not mutate the
 149         returned Macro objects or use the Iterator to remove
 150         macros. */
 151     public Iterator getMacros() {
 152         return macros.iterator();
 153     }
 154 }