hotspot/agent/src/share/classes/sun/jvm/hotspot/SAGetopt.java
author dsamersoff
Thu, 23 Jul 2015 18:17:09 +0300
changeset 31978 0f5334c83857
child 35053 cd0fc9dee122
permissions -rw-r--r--
8059038: Create new launcher for SA tools Summary: Proivide jhsdb command to launch sa based tools Reviewed-by: sspitsyn, jbachorik
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31978
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     1
/*
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     4
 *
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     7
 * published by the Free Software Foundation.
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     8
 *
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    13
 * accompanied this code).
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    14
 *
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    18
 *
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    21
 * questions.
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    22
 *
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    23
 */
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    24
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    25
package sun.jvm.hotspot;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    26
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    27
import java.util.Arrays;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    28
import java.util.List;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    29
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    30
public class SAGetopt {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    31
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    32
    private String[] _argv;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    33
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    34
    private int _optind;    // index in arguments array
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    35
    private int _optopt;    // index within an argument
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    36
    private String _optarg; // last option argument
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    37
    private boolean _optreset; // special handling of first call
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    38
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    39
    public SAGetopt(String[] args) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    40
        _argv  = args;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    41
        _optind   = 0;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    42
        _optopt   = 1;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    43
        _optarg   = null;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    44
        _optreset = true;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    45
    }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    46
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    47
    public String getOptarg() {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    48
        return _optarg;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    49
    }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    50
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    51
    public int getOptind() {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    52
        return _optind;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    53
    }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    54
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    55
    private void extractOptarg(String opt) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    56
        // Argument expected
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    57
        if (_optind > _argv.length) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    58
            throw new RuntimeException("Not enough arguments for '" + opt + "'");
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    59
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    60
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    61
        if (! _argv[_optind].isEmpty() && _argv[_optind].charAt(0) == '-') {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    62
            throw new RuntimeException("Argument is expected for '" + opt + "'");
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    63
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    64
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    65
        _optarg = _argv[_optind];
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    66
        _optind += 1;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    67
    }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    68
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    69
    private String processLongOptions(String carg, String[] longOptStr) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    70
        List<String> los = Arrays.asList(longOptStr);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    71
        String[] ca = carg.split("=", 2);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    72
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    73
        if (los.contains(ca[0])) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    74
            if (ca.length > 1) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    75
                throw new RuntimeException("Argument is not expected for '" + ca[0] + "'");
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    76
            }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    77
            return carg;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    78
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    79
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    80
        if (los.contains(ca[0] + "=")) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    81
            if (ca.length > 1) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    82
                // GNU style options --file=name
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    83
                _optarg = ca[1];
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    84
            }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    85
            else {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    86
                // Mixed style options --file name
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    87
                extractOptarg(ca[0]);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    88
            }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    89
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    90
            return ca[0];
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    91
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    92
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    93
        throw new RuntimeException("Invalid option '" + ca[0] + "'");
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    94
    }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    95
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    96
    public String next(String optStr, String[] longOptStr) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    97
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    98
        if (_optind >= _argv.length || _argv[_optind] == null) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
    99
            // All arguments processed
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   100
            return null;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   101
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   102
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   103
        String carg = _argv[_optind];
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   104
        _optarg = null;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   105
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   106
        if (_optreset) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   107
            // End of option batch like '-abc' reached, expect option to start from '-'
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   108
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   109
            if (carg.isEmpty() || carg.charAt(0) != '-' || carg.equals("--")) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   110
                // Stop processing on -- or first non-option argument;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   111
                return null;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   112
            }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   113
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   114
            if (carg.startsWith("--")) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   115
                // Handle long options, it can't be combined so it's simple
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   116
                if (longOptStr == null || longOptStr.length == 0) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   117
                    // No long options expected, stop options processing
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   118
                    return null;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   119
                }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   120
                ++ _optind;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   121
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   122
                // at this point carg contains at least one character besides --
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   123
                carg = carg.substring(2);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   124
                return processLongOptions(carg, longOptStr);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   125
            }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   126
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   127
            if (optStr == null || optStr.length() == 0) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   128
                // No short options
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   129
                return null;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   130
            }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   131
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   132
            // At this point carg[0] contains '-'
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   133
            _optreset = false;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   134
            _optopt = 1;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   135
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   136
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   137
        char ch = carg.charAt(_optopt);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   138
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   139
        // adjust pointer to next character
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   140
        _optopt += 1;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   141
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   142
        // Okay, ready to process options like
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   143
        // -abc -d bla -ef
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   144
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   145
        int chIndex = optStr.indexOf(ch);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   146
        if (chIndex == -1) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   147
            throw new RuntimeException("Invalid option '" + ch + "'");
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   148
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   149
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   150
        if (_optopt >= carg.length()) {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   151
            _optind += 1;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   152
            _optreset = true;
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   153
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   154
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   155
        if (chIndex < optStr.length()-1 && optStr.charAt(chIndex+1) == ':') {
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   156
            // Argument expected
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   157
            extractOptarg(String.valueOf(ch));
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   158
        }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   159
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   160
        return String.valueOf(ch);
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   161
    }
0f5334c83857 8059038: Create new launcher for SA tools
dsamersoff
parents:
diff changeset
   162
}