// Copyright (c) 1999 Brian Wellington (bwelling@xbill.org)
// Portions Copyright (c) 1999 Network Associates, Inc.

package org.xbill.DNS;

/**
 * Routines for parsing BIND-style TTL values.  These values consist of
 * numbers followed by 1 letter units of time (W - week, D - day, H - hour,
 * M - minute, S - second).
 *
 * @author Brian Wellington
 */

public final class TTL {

private
TTL() {}

static void
check(long i) {
	if (i < 0 || i > 0xFFFFFFFFL)
		throw new InvalidTTLException(i);
}

/**
 * Parses a BIND-stype TTL
 * @return The TTL as a number of seconds
 * @throws NumberFormatException The TTL was not a valid number
 */
public static long
parseTTL(String s) {
	if (s == null || !Character.isDigit(s.charAt(0)))
		throw new NumberFormatException();
	int value = 0;
	long ttl = 0;
	for (int i = 0; i < s.length(); i++) {
		char c = s.charAt(i);
		if (Character.isDigit(c))
			value = (value * 10) + Character.getNumericValue(c);
		else {
			switch (Character.toUpperCase(c)) {
				case 'W': value *= 7;
				case 'D': value *= 24;
				case 'H': value *= 60;
				case 'M': value *= 60;
				case 'S': break;
				default:  throw new NumberFormatException();
			}
			ttl += value;
			value = 0;
		}
	}
	if (ttl == 0)
		ttl = value;
	return ttl;
}

public static String
format(long ttl) {
	TTL.check(ttl);
	StringBuffer sb = new StringBuffer();
	long secs, mins, hours, days, weeks;
	secs = ttl % 60;
	ttl /= 60;
	mins = ttl % 60;
	ttl /= 60;
	hours = ttl % 24;
	ttl /= 24;
	days = ttl % 7;
	ttl /= 7;
	weeks = ttl;
	if (weeks > 0)
		sb.append(weeks + "W");
	if (days > 0)
		sb.append(days + "D");
	if (hours > 0)
		sb.append(hours + "H");
	if (mins > 0)
		sb.append(mins + "M");
	if (secs > 0 || (weeks == 0 && days == 0 && hours == 0 && mins == 0))
		sb.append(secs + "S");
	return sb.toString();
}

}

@@ -622,22 +622,20 @@
 a valid 
-number
+TTL.
 %0A */%0Apub
@@ -760,19 +760,20 @@
 ion();%0A%09
-int
+long
  value =
@@ -855,16 +855,41 @@
 rAt(i);%0A
+%09%09long oldvalue = value;%0A
 %09%09if (Ch
@@ -964,16 +964,78 @@
 lue(c);%0A
+%09%09if (value %3C oldvalue)%0A%09%09%09throw new NumberFormatException();%0A
 %09%09else %7B
@@ -1287,16 +1287,81 @@
 ue = 0;%0A
+%09%09%09if (ttl %3E 0xFFFFFFFFL)%0A%09%09%09%09throw new NumberFormatException();%0A
 %09%09%7D%0A%09%7D%0A%09
@@ -1373,16 +1373,18 @@
 tl == 0)
+ %7B
 %0A%09%09ttl =
@@ -1391,16 +1391,82 @@
  value;%0A
+%09%09if (ttl %3E 0xFFFFFFFFL)%0A%09%09%09throw new NumberFormatException();%0A%09%7D%0A
 %09return 

Improve checks for out of range values.