in modules/luni/src/main/java/java/util/Date.java [379:565]
public static long parse(String string) {
if (string == null) {
// luni.06=The string argument is null
throw new IllegalArgumentException(Messages.getString("luni.06")); //$NON-NLS-1$
}
char sign = 0;
int commentLevel = 0;
int offset = 0, length = string.length(), state = 0;
int year = -1, month = -1, date = -1;
int hour = -1, minute = -1, second = -1, zoneOffset = 0, minutesOffset = 0;
boolean zone = false;
final int PAD = 0, LETTERS = 1, NUMBERS = 2;
StringBuilder buffer = new StringBuilder();
while (offset <= length) {
char next = offset < length ? string.charAt(offset) : '\r';
offset++;
if (next == '(') {
commentLevel++;
}
if (commentLevel > 0) {
if (next == ')') {
commentLevel--;
}
if (commentLevel == 0) {
next = ' ';
} else {
continue;
}
}
int nextState = PAD;
if ('a' <= next && next <= 'z' || 'A' <= next && next <= 'Z') {
nextState = LETTERS;
} else if ('0' <= next && next <= '9') {
nextState = NUMBERS;
} else if (!Character.isSpace(next) && ",+-:/".indexOf(next) == -1) { //$NON-NLS-1$
throw new IllegalArgumentException();
}
if (state == NUMBERS && nextState != NUMBERS) {
int digit = Integer.parseInt(buffer.toString());
buffer.setLength(0);
if (sign == '+' || sign == '-') {
if (zoneOffset == 0) {
zone = true;
if (next == ':') {
minutesOffset = sign == '-' ? -Integer
.parseInt(string.substring(offset,
offset + 2)) : Integer
.parseInt(string.substring(offset,
offset + 2));
offset += 2;
}
zoneOffset = sign == '-' ? -digit : digit;
sign = 0;
} else {
throw new IllegalArgumentException();
}
} else if (digit >= 70) {
if (year == -1
&& (Character.isSpace(next) || next == ','
|| next == '/' || next == '\r')) {
year = digit;
} else {
throw new IllegalArgumentException();
}
} else if (next == ':') {
if (hour == -1) {
hour = digit;
} else if (minute == -1) {
minute = digit;
} else {
throw new IllegalArgumentException();
}
} else if (next == '/') {
if (month == -1) {
month = digit - 1;
} else if (date == -1) {
date = digit;
} else {
throw new IllegalArgumentException();
}
} else if (Character.isSpace(next) || next == ','
|| next == '-' || next == '\r') {
if (hour != -1 && minute == -1) {
minute = digit;
} else if (minute != -1 && second == -1) {
second = digit;
} else if (date == -1) {
date = digit;
} else if (year == -1) {
year = digit;
} else {
throw new IllegalArgumentException();
}
} else if (year == -1 && month != -1 && date != -1) {
year = digit;
} else {
throw new IllegalArgumentException();
}
} else if (state == LETTERS && nextState != LETTERS) {
String text = buffer.toString().toUpperCase();
buffer.setLength(0);
if (text.length() == 1) {
throw new IllegalArgumentException();
}
if (text.equals("AM")) { //$NON-NLS-1$
if (hour == 12) {
hour = 0;
} else if (hour < 1 || hour > 12) {
throw new IllegalArgumentException();
}
} else if (text.equals("PM")) { //$NON-NLS-1$
if (hour == 12) {
hour = 0;
} else if (hour < 1 || hour > 12) {
throw new IllegalArgumentException();
}
hour += 12;
} else {
DateFormatSymbols symbols = new DateFormatSymbols(Locale.US);
String[] weekdays = symbols.getWeekdays(), months = symbols
.getMonths();
int value;
if (parse(text, weekdays) != -1) {/* empty */
} else if (month == -1
&& (month = parse(text, months)) != -1) {/* empty */
} else if (text.equals("GMT") || text.equals("UT") //$NON-NLS-1$ //$NON-NLS-2$
|| text.equals("UTC")) { //$NON-NLS-1$
zone = true;
zoneOffset = 0;
} else if ((value = zone(text)) != 0) {
zone = true;
zoneOffset = value;
} else {
throw new IllegalArgumentException();
}
}
}
if (next == '+' || (year != -1 && next == '-')) {
sign = next;
} else if (!Character.isSpace(next) && next != ','
&& nextState != NUMBERS) {
sign = 0;
}
if (nextState == LETTERS || nextState == NUMBERS) {
buffer.append(next);
}
state = nextState;
}
if (year != -1 && month != -1 && date != -1) {
if (hour == -1) {
hour = 0;
}
if (minute == -1) {
minute = 0;
}
if (second == -1) {
second = 0;
}
if (year < (creationYear - 80)) {
year += 2000;
} else if (year < 100) {
year += 1900;
}
minute -= minutesOffset;
if (zone) {
if (zoneOffset >= 24 || zoneOffset <= -24) {
hour -= zoneOffset / 100;
minute -= zoneOffset % 100;
} else {
hour -= zoneOffset;
}
return UTC(year - 1900, month, date, hour, minute, second);
}
return new Date(year - 1900, month, date, hour, minute, second)
.getTime();
}
throw new IllegalArgumentException();
}