diff options
Diffstat (limited to 'src/main/java/org/yaml/snakeyaml/error/Mark.java')
-rw-r--r-- | src/main/java/org/yaml/snakeyaml/error/Mark.java | 245 |
1 files changed, 137 insertions, 108 deletions
diff --git a/src/main/java/org/yaml/snakeyaml/error/Mark.java b/src/main/java/org/yaml/snakeyaml/error/Mark.java index 7e1d546e..367ee6bb 100644 --- a/src/main/java/org/yaml/snakeyaml/error/Mark.java +++ b/src/main/java/org/yaml/snakeyaml/error/Mark.java @@ -1,132 +1,161 @@ /** - * Copyright (c) 2008, http://www.snakeyaml.org + * Copyright (c) 2008, SnakeYAML * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. */ package org.yaml.snakeyaml.error; +import java.io.Serializable; import org.yaml.snakeyaml.scanner.Constant; /** - * It's just a record and its only use is producing nice error messages. Parser - * does not use it for any other purposes. + * It's just a record and its only use is producing nice error messages. Parser does not use it for + * any other purposes. */ -public final class Mark { - private String name; - private int index; - private int line; - private int column; - private String buffer; - private int pointer; - - public Mark(String name, int index, int line, int column, String buffer, int pointer) { - super(); - this.name = name; - this.index = index; - this.line = line; - this.column = column; - this.buffer = buffer; - this.pointer = pointer; - } +public final class Mark implements Serializable { - private boolean isLineBreak(char ch) { - return Constant.NULL_OR_LINEBR.has(ch); - } + private final String name; + private final int index; + private final int line; + private final int column; + private final int[] buffer; + private final int pointer; - public String get_snippet(int indent, int max_length) { - if (buffer == null) { - return null; - } - float half = max_length / 2 - 1; - int start = pointer; - String head = ""; - while ((start > 0) && !isLineBreak(buffer.charAt(start - 1))) { - start -= 1; - if (pointer - start > half) { - head = " ... "; - start += 5; - break; - } - } - String tail = ""; - int end = pointer; - while ((end < buffer.length()) && !isLineBreak(buffer.charAt(end))) { - end += 1; - if (end - pointer > half) { - tail = " ... "; - end -= 5; - break; - } - } - String snippet = buffer.substring(start, end); - StringBuilder result = new StringBuilder(); - for (int i = 0; i < indent; i++) { - result.append(" "); - } - result.append(head); - result.append(snippet); - result.append(tail); - result.append("\n"); - for (int i = 0; i < indent + pointer - start + head.length(); i++) { - result.append(" "); - } - result.append("^"); - return result.toString(); + private static int[] toCodePoints(char[] str) { + int[] codePoints = new int[Character.codePointCount(str, 0, str.length)]; + for (int i = 0, c = 0; i < str.length; c++) { + int cp = Character.codePointAt(str, i); + codePoints[c] = cp; + i += Character.charCount(cp); } + return codePoints; + } - public String get_snippet() { - return get_snippet(4, 75); - } + public Mark(String name, int index, int line, int column, char[] str, int pointer) { + this(name, index, line, column, toCodePoints(str), pointer); + } - @Override - public String toString() { - String snippet = get_snippet(); - StringBuilder where = new StringBuilder(" in "); - where.append(name); - where.append(", line "); - where.append(line + 1); - where.append(", column "); - where.append(column + 1); - if (snippet != null) { - where.append(":\n"); - where.append(snippet); - } - return where.toString(); - } + /* + * Existed in older versions but replaced with {@code char[]}-based constructor. Restored in v1.22 + * for backwards compatibility. + * + * @deprecated Since restored in v1.22. Use {@link Mark#Mark(String, int, int, int, char[], int)}. + */ + @Deprecated + public Mark(String name, int index, int line, int column, String buffer, int pointer) { + this(name, index, line, column, buffer.toCharArray(), pointer); + } - public String getName() { - return name; - } + public Mark(String name, int index, int line, int column, int[] buffer, int pointer) { + super(); + this.name = name; + this.index = index; + this.line = line; + this.column = column; + this.buffer = buffer; + this.pointer = pointer; + } - /** - * starts with 0 - */ - public int getLine() { - return line; - } + private boolean isLineBreak(int c) { + return Constant.NULL_OR_LINEBR.has(c); + } - /** - * starts with 0 - */ - public int getColumn() { - return column; + public String get_snippet(int indent, int max_length) { + float half = max_length / 2f - 1f; + int start = pointer; + String head = ""; + while ((start > 0) && !isLineBreak(buffer[start - 1])) { + start -= 1; + if (pointer - start > half) { + head = " ... "; + start += 5; + break; + } + } + String tail = ""; + int end = pointer; + while ((end < buffer.length) && !isLineBreak(buffer[end])) { + end += 1; + if (end - pointer > half) { + tail = " ... "; + end -= 5; + break; + } } - /** - * starts with 0 - */ - public int getIndex() { - return index; + StringBuilder result = new StringBuilder(); + for (int i = 0; i < indent; i++) { + result.append(" "); + } + result.append(head); + for (int i = start; i < end; i++) { + result.appendCodePoint(buffer[i]); } + result.append(tail); + result.append("\n"); + for (int i = 0; i < indent + pointer - start + head.length(); i++) { + result.append(" "); + } + result.append("^"); + return result.toString(); + } + + public String get_snippet() { + return get_snippet(4, 75); + } + + @Override + public String toString() { + String snippet = get_snippet(); + String builder = + " in " + name + ", line " + (line + 1) + ", column " + (column + 1) + ":\n" + snippet; + return builder; + } + + public String getName() { + return name; + } + + /** + * starts with 0 + * + * @return line number + */ + public int getLine() { + return line; + } + + /** + * starts with 0 + * + * @return column number + */ + public int getColumn() { + return column; + } + + /** + * starts with 0 + * + * @return character number + */ + public int getIndex() { + return index; + } + + public int[] getBuffer() { + return buffer; + } + public int getPointer() { + return pointer; + } } |