Generate error data at build time.

This avoids cluttering up the diff and making merge conflicts a pain.  It does,
however, mean we need to generate err_data.c ahead of time in Chromium and
likely other downstream builds. It also adds a build dependency on Go.

Change-Id: I6e0513ed9f50cfb030f7a523ea28519590977104
Reviewed-on: https://boringssl-review.googlesource.com/3790
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/err/err_data_generate.go b/crypto/err/err_data_generate.go
index ca20904..a5b4cb5 100644
--- a/crypto/err/err_data_generate.go
+++ b/crypto/err/err_data_generate.go
@@ -140,13 +140,16 @@
 	list := st.buildList()
 	fmt.Fprintf(os.Stderr, "%s: %d bytes of list and %d bytes of string data.\n", name, 4*len(list), len(st.stringData))
 
-	out.WriteString("static const uint32_t k" + name + "Values[] = {\n")
+	values := "kOpenSSL" + name + "Values"
+	out.WriteString("const uint32_t " + values + "[] = {\n")
 	for _, v := range list {
 		fmt.Fprintf(out, "    0x%x,\n", v)
 	}
 	out.WriteString("};\n\n")
+	out.WriteString("const size_t " + values + "Len = sizeof(" + values + ") / sizeof(" + values + "[0]);\n\n");
 
-	out.WriteString("static const char k" + name + "StringData[] =\n    \"")
+	stringData := "kOpenSSL" + name + "StringData"
+	out.WriteString("const char " + stringData + "[] =\n    \"")
 	for i, c := range st.stringData {
 		if c == 0 {
 			out.WriteString("\\0\"\n    \"")
@@ -267,6 +270,7 @@
  /* This file was generated by err_data_generate.go. */
 
 #include <openssl/base.h>
+#include <openssl/err.h>
 #include <openssl/type_check.h>