< prev index next >
src/java.base/share/classes/java/util/jar/Manifest.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 28,37 ****
--- 28,38 ----
import java.io.DataOutputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+ import java.text.BreakIterator;
import java.util.HashMap;
import java.util.Map;
import sun.nio.cs.UTF_8;
import sun.security.util.SecurityProperties;
*** 228,256 ****
length += 3; // + line break ("\r\n") and space
}
}
/**
* Writes {@code line} to {@code out} with line breaks and continuation
! * spaces within the limits of 72 bytes of contents per line followed
! * by a line break.
*/
static void println72(OutputStream out, String line) throws IOException {
! if (!line.isEmpty()) {
! byte[] lineBytes = line.getBytes(UTF_8.INSTANCE);
! int length = lineBytes.length;
! // first line can hold one byte more than subsequent lines which
! // start with a continuation line break space
! out.write(lineBytes[0]);
! int pos = 1;
! while (length - pos > 71) {
! out.write(lineBytes, pos, 71);
! pos += 71;
println(out);
out.write(' ');
}
! out.write(lineBytes, pos, length - pos);
}
println(out);
}
/**
--- 229,306 ----
length += 3; // + line break ("\r\n") and space
}
}
/**
+ * Returns {@code true} if the passed byte as parameter {@code b}
+ * is not the first (or only) byte of a Unicode character encoded in UTF-8
+ * and {@code false} otherwise.
+ *
+ * @see <a href="https://tools.ietf.org/html/rfc3629#section-3">
+ * RFC 3629 - UTF-8, a transformation format of ISO 10646</a>
+ * @see StringCoding#isNotContinuation(int)
+ * @see sun.nio.cs.UTF_8.Decoder#isNotContinuation(int)
+ */
+ private static boolean isContinuation(byte b) {
+ return (b & 0xc0) == 0x80;
+ }
+
+ /**
* Writes {@code line} to {@code out} with line breaks and continuation
! * spaces within the limits of 72 bytes of contents per line
! * keeping byte sequences of characters encoded in UTF-8 together
! * also if the same character is encoded with more than one byte or
! * consists of a character sequence containing combining diacritical marks
! * followed by a line break.
! * <p>
! * Combining diacritical marks may be separated from the associated base
! * character or other combining diacritical marks of that base character
! * by a continuation line break ("{@code \r\n }") if the whole sequence of
! * base character and all the combining diacritical marks belonging to it
! * exceed 71 bytes in their binary form encoded with UTF-8. This limit is
! * only 71 bytes rather than 72 because continuation lines start with a
! * space that uses the first byte of the 72 bytes each line can hold up to
! * and the first line provides even less space for the value because it
! * starts with the name.
*/
static void println72(OutputStream out, String line) throws IOException {
! int linePos = 0; // number of bytes already put out on current line
! BreakIterator boundary = BreakIterator.getCharacterInstance();
! boundary.setText(line);
! int start = boundary.first(), end;
! while ((end = boundary.next()) != BreakIterator.DONE) {
! String character = line.substring(start, end);
! start = end;
! byte[] characterBytes = character.getBytes(UTF_8.INSTANCE);
! int characterLength = characterBytes.length;
! // Put out a break onto a new line if the character does not fit on
! // the current line anymore but fits on a whole new line.
! // In other words, if the current character does not fit on one
! // whole line alone, fill the current line first before breaking
! // inside of the character onto a new line.
! if (linePos + characterLength > 72 && characterLength < 72) {
! println(out);
! out.write(' ');
! linePos = 1;
! }
! int characterPos = 0; // number of bytes of current character
! // already put out
! while (linePos + characterLength - characterPos > 72) {
! int nextBreakPos = 72 - linePos;
! while (isContinuation(
! characterBytes[characterPos + nextBreakPos])) {
! nextBreakPos--;
! }
! out.write(characterBytes, characterPos, nextBreakPos);
! characterPos += nextBreakPos;
println(out);
out.write(' ');
+ linePos = 1;
}
! out.write(characterBytes,
! characterPos, characterLength - characterPos);
! linePos += characterLength - characterPos;
}
println(out);
}
/**
< prev index next >