go.net/publicsuffix: print how much wiggle room we have when encoding
the Public Suffix List as a compact sequence of uint32s.

Currently:
max children 366 (capacity 511)
max text offset 22351 (capacity 32767)
max text length 36 (capacity 63)
max hi 6406 (capacity 16383)
max lo 6399 (capacity 16383)

LGTM=dr.volker.dobler
R=dr.volker.dobler
CC=golang-codereviews
https://golang.org/cl/62000046
diff --git a/publicsuffix/gen.go b/publicsuffix/gen.go
index 596c6a1..c4263c6 100644
--- a/publicsuffix/gen.go
+++ b/publicsuffix/gen.go
@@ -47,6 +47,28 @@
 	childrenBitsLo       = 14
 )
 
+var (
+	maxChildren   int
+	maxTextOffset int
+	maxTextLength int
+	maxHi         uint32
+	maxLo         uint32
+)
+
+func max(a, b int) int {
+	if a < b {
+		return b
+	}
+	return a
+}
+
+func u32max(a, b uint32) uint32 {
+	if a < b {
+		return b
+	}
+	return a
+}
+
 const (
 	nodeTypeNormal     = 0
 	nodeTypeException  = 1
@@ -212,6 +234,14 @@
 		return err
 	}
 
+	if *v {
+		fmt.Fprintf(os.Stderr, "max children %d (capacity %d)\n", maxChildren, 1<<nodesBitsChildren-1)
+		fmt.Fprintf(os.Stderr, "max text offset %d (capacity %d)\n", maxTextOffset, 1<<nodesBitsTextOffset-1)
+		fmt.Fprintf(os.Stderr, "max text length %d (capacity %d)\n", maxTextLength, 1<<nodesBitsTextLength-1)
+		fmt.Fprintf(os.Stderr, "max hi %d (capacity %d)\n", maxHi, 1<<childrenBitsHi-1)
+		fmt.Fprintf(os.Stderr, "max lo %d (capacity %d)\n", maxLo, 1<<childrenBitsLo-1)
+	}
+
 	b, err := format.Source(buf.Bytes())
 	if err != nil {
 		return err
@@ -277,6 +307,7 @@
 		if offset < 0 {
 			return fmt.Errorf("internal error: could not find %q in text %q", label, text)
 		}
+		maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length)
 		if offset >= 1<<nodesBitsTextOffset || length >= 1<<nodesBitsTextLength {
 			return fmt.Errorf("text offset/length is too large: %d/%d", offset, length)
 		}
@@ -433,12 +464,14 @@
 		}
 
 		// Assign childrenIndex.
+		maxChildren = max(maxChildren, len(childrenEncoding))
 		if len(childrenEncoding) >= 1<<nodesBitsChildren {
 			return fmt.Errorf("children table is too large")
 		}
 		n.childrenIndex = len(childrenEncoding)
 		lo := uint32(n.firstChild)
 		hi := lo + uint32(len(n.children))
+		maxLo, maxHi = u32max(maxLo, lo), u32max(maxHi, hi)
 		if lo >= 1<<childrenBitsLo || hi >= 1<<childrenBitsHi {
 			return fmt.Errorf("children lo/hi is too large: %d/%d", lo, hi)
 		}