langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ArgTokenizer.java
author rfield
Thu, 20 Oct 2016 12:53:11 -0700
changeset 41635 cb3d04878117
parent 38539 71874886920f
child 42827 36468b5fa7f4
permissions -rw-r--r--
8163840: jshell tool: provide way to display configuration settings Reviewed-by: jlahoda
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     1
/*
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     2
 * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     4
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    10
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    15
 * accompanied this code).
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    16
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    20
 *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    23
 * questions.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    24
 */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    25
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    26
package jdk.internal.jshell.tool;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    27
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    28
import java.util.ArrayList;
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    29
import java.util.Arrays;
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    30
import java.util.HashMap;
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    31
import java.util.List;
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    32
import java.util.Map;
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    33
import static java.util.stream.Collectors.toList;
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    34
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    35
/**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    36
 * Parse command arguments, derived from StreamTokenizer by
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    37
 * @author  James Gosling
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    38
 */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    39
class ArgTokenizer {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    40
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    41
    private final String str;
37745
4b6b59f8e327 8150382: JShell API: Allow setting remote JVM arguments
rfield
parents: 36494
diff changeset
    42
    private final String prefix;
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    43
    private final int length;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    44
    private int next = 0;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    45
    private char buf[] = new char[20];
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    46
    private int mark;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    47
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    48
    private final byte ctype[] = new byte[256];
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    49
    private static final byte CT_ALPHA = 0;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    50
    private static final byte CT_WHITESPACE = 1;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    51
    private static final byte CT_QUOTE = 8;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    52
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    53
    private String sval;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    54
    private boolean isQuoted = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    55
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    56
    private final Map<String, Boolean> options = new HashMap<>();
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    57
    private final List<String> badOptions = new ArrayList<>();
37745
4b6b59f8e327 8150382: JShell API: Allow setting remote JVM arguments
rfield
parents: 36494
diff changeset
    58
4b6b59f8e327 8150382: JShell API: Allow setting remote JVM arguments
rfield
parents: 36494
diff changeset
    59
    ArgTokenizer(String prefix, String arg) {
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    60
        this.str = arg;
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    61
        this.prefix = prefix + " ";
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    62
        this.length = arg.length();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    63
        quoteChar('"');
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    64
        quoteChar('\'');
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    65
        whitespaceChars(0x09, 0x0D);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    66
        whitespaceChars(0x1C, 0x20);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    67
        whitespaceChars(0x85, 0x85);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    68
        whitespaceChars(0xA0, 0xA0);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    69
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    70
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    71
    /**
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    72
     * Return the next non-option argument. Encountered options are stored.
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    73
     *
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    74
     * @return the token string, or null if there are no more tokens
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    75
     */
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    76
    String next() {
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    77
        while (true) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    78
            nextToken();
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    79
            if (sval != null && !isQuoted() && sval.startsWith("-")) {
41635
cb3d04878117 8163840: jshell tool: provide way to display configuration settings
rfield
parents: 38539
diff changeset
    80
                // allow POSIX getopt() option format,
cb3d04878117 8163840: jshell tool: provide way to display configuration settings
rfield
parents: 38539
diff changeset
    81
                // to be consistent with command-line
cb3d04878117 8163840: jshell tool: provide way to display configuration settings
rfield
parents: 38539
diff changeset
    82
                String opt = sval.startsWith("--")
cb3d04878117 8163840: jshell tool: provide way to display configuration settings
rfield
parents: 38539
diff changeset
    83
                        ? sval.substring(1)
cb3d04878117 8163840: jshell tool: provide way to display configuration settings
rfield
parents: 38539
diff changeset
    84
                        : sval;
cb3d04878117 8163840: jshell tool: provide way to display configuration settings
rfield
parents: 38539
diff changeset
    85
                foundOption(opt);
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    86
            } else {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    87
                break;
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    88
            }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    89
        }
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    90
        return sval;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    91
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
    92
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    93
    private void foundOption(String opt) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    94
        if (options.containsKey(opt)) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    95
            options.put(opt, true);
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    96
            return;
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    97
        }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    98
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
    99
        List<Map.Entry<String,Boolean>> matches =
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   100
                options.entrySet()
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   101
                       .stream()
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   102
                       .filter(e -> e.getKey().startsWith(opt))
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   103
                       .collect(toList());
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   104
        if (matches.size() == 1) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   105
            matches.get(0).setValue(true);
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   106
        } else {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   107
            badOptions.add(opt);
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   108
        }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   109
    }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   110
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   111
    /**
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   112
     * Set the allowed options. Must be called before any options would be read
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   113
     * and before calling any of the option functionality below.
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   114
     */
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   115
    void allowedOptions(String... opts) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   116
        for (String opt : opts) {
41635
cb3d04878117 8163840: jshell tool: provide way to display configuration settings
rfield
parents: 38539
diff changeset
   117
            options.putIfAbsent(opt, false);
38539
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   118
        }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   119
    }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   120
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   121
    /**
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   122
     * Has the specified option been encountered.
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   123
     *
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   124
     * @param opt the option to check
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   125
     * @return true if the option has been encountered
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   126
     */
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   127
    boolean hasOption(String opt) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   128
        Boolean has = options.get(opt);
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   129
        if (has == null) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   130
            throw new InternalError("hasOption called before allowedOptions or on bad option");
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   131
        }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   132
        return has;
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   133
    }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   134
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   135
    /**
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   136
     * Return the number of encountered options
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   137
     *
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   138
     * @return the option count
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   139
     */
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   140
    int optionCount() {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   141
        return (int) options.entrySet().stream()
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   142
                .filter(e -> e.getValue())
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   143
                .count();
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   144
    }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   145
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   146
    /**
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   147
     * Return the bad options encountered. Bad options are those that were not
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   148
     * listed in the call to allowedOptions().
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   149
     *
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   150
     * @return as space-separated list the bad options encountered, or the empty
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   151
     * string if none.
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   152
     */
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   153
    String badOptions() {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   154
        return String.join(" ", badOptions);
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   155
    }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   156
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   157
    /**
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   158
     * Consume the remainder of the input. This is useful to sure all options
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   159
     * have been encountered and to check to unexpected additional non-option
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   160
     * input.
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   161
     *
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   162
     * @return the string-separated concatenation of all remaining non-option
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   163
     * arguments.
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   164
     */
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   165
    String remainder() {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   166
        List<String> rem = new ArrayList<>();
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   167
        while (next() != null) {
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   168
            rem.add(sval);
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   169
        }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   170
        return String.join(" ", rem);
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   171
    }
71874886920f 8157517: jshell tool: allow undoing operations
rfield
parents: 38531
diff changeset
   172
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   173
    String val() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   174
        return sval;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   175
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   176
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   177
    boolean isQuoted() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   178
        return isQuoted;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   179
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   180
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   181
    String whole() {
37745
4b6b59f8e327 8150382: JShell API: Allow setting remote JVM arguments
rfield
parents: 36494
diff changeset
   182
        return prefix + str;
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   183
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   184
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   185
    void mark() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   186
        mark = next;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   187
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   188
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   189
    void rewind() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   190
        next = mark;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   191
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   192
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   193
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   194
     * Reads a single character.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   195
     *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   196
     * @return The character read, or -1 if the end of the stream has been
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   197
     * reached
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   198
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   199
    private int read() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   200
        if (next >= length) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   201
            return -1;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   202
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   203
        return str.charAt(next++);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   204
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   205
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   206
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   207
     * Specifies that all characters <i>c</i> in the range
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   208
     * <code>low&nbsp;&lt;=&nbsp;<i>c</i>&nbsp;&lt;=&nbsp;high</code>
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   209
     * are white space characters. White space characters serve only to
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   210
     * separate tokens in the input stream.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   211
     *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   212
     * <p>Any other attribute settings for the characters in the specified
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   213
     * range are cleared.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   214
     *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   215
     * @param   low   the low end of the range.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   216
     * @param   hi    the high end of the range.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   217
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   218
    private void whitespaceChars(int low, int hi) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   219
        if (low < 0)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   220
            low = 0;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   221
        if (hi >= ctype.length)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   222
            hi = ctype.length - 1;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   223
        while (low <= hi)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   224
            ctype[low++] = CT_WHITESPACE;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   225
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   226
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   227
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   228
     * Specifies that matching pairs of this character delimit string
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   229
     * constants in this tokenizer.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   230
     * <p>
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   231
     * If a string quote character is encountered, then a string is
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   232
     * recognized, consisting of all characters after (but not including)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   233
     * the string quote character, up to (but not including) the next
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   234
     * occurrence of that same string quote character, or a line
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   235
     * terminator, or end of file. The usual escape sequences such as
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   236
     * {@code "\u005Cn"} and {@code "\u005Ct"} are recognized and
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   237
     * converted to single characters as the string is parsed.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   238
     *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   239
     * <p>Any other attribute settings for the specified character are cleared.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   240
     *
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   241
     * @param   ch   the character.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   242
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   243
    private void quoteChar(int ch) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   244
        if (ch >= 0 && ch < ctype.length)
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   245
            ctype[ch] = CT_QUOTE;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   246
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   247
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   248
    private int unicode2ctype(int c) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   249
        switch (c) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   250
            case 0x1680:
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   251
            case 0x180E:
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   252
            case 0x200A:
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   253
            case 0x202F:
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   254
            case 0x205F:
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   255
            case 0x3000:
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   256
                return CT_WHITESPACE;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   257
            default:
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   258
                return CT_ALPHA;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   259
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   260
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   261
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   262
    /**
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   263
     * Parses the next token of this tokenizer.
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   264
     */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   265
    public void nextToken() {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   266
        byte ct[] = ctype;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   267
        int c;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   268
        int lctype;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   269
        sval = null;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   270
        isQuoted = false;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   271
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   272
        do {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   273
            c = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   274
            if (c < 0) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   275
                return;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   276
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   277
            lctype = (c < 256) ? ct[c] : unicode2ctype(c);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   278
        } while (lctype == CT_WHITESPACE);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   279
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   280
        if (lctype == CT_ALPHA) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   281
            int i = 0;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   282
            do {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   283
                if (i >= buf.length) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   284
                    buf = Arrays.copyOf(buf, buf.length * 2);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   285
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   286
                buf[i++] = (char) c;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   287
                c = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   288
                lctype = c < 0 ? CT_WHITESPACE : (c < 256)? ct[c] : unicode2ctype(c);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   289
            } while (lctype == CT_ALPHA);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   290
            if (c >= 0) --next; // push last back
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   291
            sval = String.copyValueOf(buf, 0, i);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   292
            return;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   293
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   294
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   295
        if (lctype == CT_QUOTE) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   296
            int quote = c;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   297
            int i = 0;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   298
            /* Invariants (because \Octal needs a lookahead):
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   299
             *   (i)  c contains char value
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   300
             *   (ii) d contains the lookahead
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   301
             */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   302
            int d = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   303
            while (d >= 0 && d != quote) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   304
                if (d == '\\') {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   305
                    c = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   306
                    int first = c;   /* To allow \377, but not \477 */
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   307
                    if (c >= '0' && c <= '7') {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   308
                        c = c - '0';
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   309
                        int c2 = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   310
                        if ('0' <= c2 && c2 <= '7') {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   311
                            c = (c << 3) + (c2 - '0');
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   312
                            c2 = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   313
                            if ('0' <= c2 && c2 <= '7' && first <= '3') {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   314
                                c = (c << 3) + (c2 - '0');
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   315
                                d = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   316
                            } else
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   317
                                d = c2;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   318
                        } else
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   319
                          d = c2;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   320
                    } else {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   321
                        switch (c) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   322
                        case 'a':
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   323
                            c = 0x7;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   324
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   325
                        case 'b':
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   326
                            c = '\b';
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   327
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   328
                        case 'f':
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   329
                            c = 0xC;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   330
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   331
                        case 'n':
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   332
                            c = '\n';
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   333
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   334
                        case 'r':
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   335
                            c = '\r';
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   336
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   337
                        case 't':
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   338
                            c = '\t';
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   339
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   340
                        case 'v':
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   341
                            c = 0xB;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   342
                            break;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   343
                        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   344
                        d = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   345
                    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   346
                } else {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   347
                    c = d;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   348
                    d = read();
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   349
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   350
                if (i >= buf.length) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   351
                    buf = Arrays.copyOf(buf, buf.length * 2);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   352
                }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   353
                buf[i++] = (char)c;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   354
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   355
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   356
            if (d == quote) {
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   357
                isQuoted = true;
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   358
            }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   359
            sval = String.copyValueOf(buf, 0, i);
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   360
        }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   361
    }
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents:
diff changeset
   362
}