duke@1: /* duke@1: * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. Sun designates this duke@1: * particular file as subject to the "Classpath" exception as provided duke@1: * by Sun in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * duke@1: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: * CA 95054 USA or visit www.sun.com if you need additional information or duke@1: * have any questions. duke@1: */ duke@1: duke@1: duke@1: package com.sun.tools.javah; duke@1: duke@1: import com.sun.javadoc.*; duke@1: import java.io.*; duke@1: duke@1: /** duke@1: * A doclet to parse and execute commandline options. duke@1: * duke@1: * @author Sucheta Dambalkar(using code from old javap) duke@1: */ duke@1: public class MainDoclet{ duke@1: duke@1: public static String odir = null; duke@1: public static String ofile = null; duke@1: public static boolean stubs = false; duke@1: public static boolean jni = false; duke@1: public static boolean llni = false; duke@1: public static boolean doubleAlign = false; duke@1: public static boolean force = false; duke@1: public static String genclass = null; duke@1: duke@1: duke@1: /** duke@1: * Entry point. duke@1: */ duke@1: public static boolean start(RootDoc root) { duke@1: duke@1: int j = 0; duke@1: int k = 0; duke@1: /** duke@1: * Command line options. duke@1: */ duke@1: String [][] cmdoptions = root.options(); duke@1: /** duke@1: * Classes specified on command line. duke@1: */ duke@1: ClassDoc[] classes = root.classes(); duke@1: /** duke@1: * Generator used by javah. Default is JNI. duke@1: */ duke@1: Gen g = new JNI(root); duke@1: duke@1: validateOptions(cmdoptions); duke@1: duke@1: /* duke@1: * Select native interface. duke@1: */ duke@1: if (jni && llni) Util.error("jni.llni.mixed"); duke@1: duke@1: if (llni) duke@1: g = new LLNI(doubleAlign, root); duke@1: duke@1: if (g instanceof JNI && stubs) Util.error("jni.no.stubs"); duke@1: duke@1: /* duke@1: * Arrange for output destination. duke@1: */ duke@1: if (odir != null && ofile != null) duke@1: Util.error("dir.file.mixed"); duke@1: duke@1: if (odir != null) duke@1: g.setOutDir(odir); duke@1: duke@1: if (ofile != null) duke@1: g.setOutFile(ofile); duke@1: duke@1: /* duke@1: * Force set to false will turn off smarts about checking file duke@1: * content before writing. duke@1: */ duke@1: g.setForce(force); duke@1: duke@1: /* duke@1: * Grab the rest of argv[] ... this must be the classes. duke@1: */ duke@1: if (classes.length == 0){ duke@1: Util.error("no.classes.specified"); duke@1: } duke@1: /* duke@1: * Set classes. duke@1: */ duke@1: g.setClasses(classes); duke@1: duke@1: try { duke@1: g.run(); duke@1: } catch (ClassNotFoundException cnfe) { duke@1: Util.error("class.not.found", cnfe.getMessage()); duke@1: } catch (IOException ioe) { duke@1: Util.error("io.exception", ioe.getMessage()); duke@1: } duke@1: duke@1: return true; duke@1: } duke@1: duke@1: /** duke@1: * Required doclet method. duke@1: */ duke@1: public static int optionLength(String option) { duke@1: if (option.equals("-o")) { duke@1: return 2; duke@1: } else if(option.equals("-d")){ duke@1: return 2; duke@1: } else if (option.equals("-td")) { duke@1: return 1; duke@1: } else if (option.equals("-stubs")) { duke@1: return 1; duke@1: } else if(option.equals("-help")){ duke@1: return 1; duke@1: } else if(option.equals("--help")){ duke@1: return 1; duke@1: } else if(option.equals("-?")){ duke@1: return 1; duke@1: } else if(option.equals("-h")){ duke@1: return 1; duke@1: } else if(option.equals("-trace")){ duke@1: return 1; duke@1: } else if(option.equals("-version")) { duke@1: return 1; duke@1: } else if(option.equals("-jni")){ duke@1: return 1; duke@1: } else if(option.equals("-force")){ duke@1: return 1; duke@1: } else if(option.equals("-Xllni")){ duke@1: return 1; duke@1: } else if(option.equals("-llni")){ duke@1: return 1; duke@1: } else if(option.equals("-llniDouble")){ duke@1: return 1; duke@1: } else return 0; duke@1: } duke@1: duke@1: /** duke@1: * Parse the command line options. duke@1: */ duke@1: public static void validateOptions(String cmdoptions[][]) { duke@1: /* Default values for options, overridden by user options. */ duke@1: String bootcp = System.getProperty("sun.boot.class.path"); duke@1: String usercp = System.getProperty("env.class.path"); duke@1: duke@1: for(int p = 0; p < cmdoptions.length; p++){ duke@1: duke@1: if (cmdoptions[p][0].equals("-o")) { duke@1: ofile = cmdoptions[p][1]; duke@1: } else if(cmdoptions[p][0].equals("-d")){ duke@1: odir = cmdoptions[p][1]; duke@1: } else if (cmdoptions[p][0].equals("-td")) { duke@1: if (p ==cmdoptions.length) duke@1: Util.usage(1); duke@1: } else if (cmdoptions[p][0].equals("-stubs")) { duke@1: stubs = true; duke@1: } else if (cmdoptions[p][0].equals("-verbose")) { duke@1: Util.verbose = true; duke@1: } else if((cmdoptions[p][0].equals("-help")) duke@1: || (cmdoptions[p][0].equals("--help")) duke@1: || (cmdoptions[p][0].equals("-?")) duke@1: || (cmdoptions[p][0].equals("-h"))) { duke@1: Util.usage(0); duke@1: } else if (cmdoptions[p][0].equals("-trace")) { duke@1: System.err.println(Util.getText("tracing.not.supported")); duke@1: } else if (cmdoptions[p][0].equals("-version")) { duke@1: Util.version(); duke@1: } else if (cmdoptions[p][0].equals("-jni")) { duke@1: jni = true; duke@1: } else if (cmdoptions[p][0].equals("-force")) { duke@1: force = true; duke@1: } else if (cmdoptions[p][0].equals("-Xllni")) { duke@1: llni = true; duke@1: } else if (cmdoptions[p][0].equals("-llni")) { duke@1: llni = true; duke@1: } else if (cmdoptions[p][0].equals("-llniDouble")) { duke@1: llni = true; doubleAlign = true; duke@1: } else if (cmdoptions[p][0].equals("-classpath")) { duke@1: usercp = cmdoptions[p][1]; duke@1: } else if (cmdoptions[p][0].equals("-bootclasspath")) { duke@1: bootcp = cmdoptions[p][1]; duke@1: } else if((cmdoptions[p][0].charAt(0) == '-') duke@1: && (!cmdoptions[p][0].equals("-private"))){ duke@1: Util.error("unknown.option", cmdoptions[p][0], null, true); duke@1: } else { duke@1: break; /* The rest must be classes. */ duke@1: } duke@1: } duke@1: duke@1: duke@1: if (Util.verbose) { duke@1: System.err.println("[ Search Path: " duke@1: + bootcp duke@1: + System.getProperty("file.separator") duke@1: + usercp + " ]"); duke@1: } duke@1: } duke@1: }