BEGIN {
	print "/* Machine generated. Do not edit. */"
	print ""
	lines = 0
}
{ 
	split($0, array, FS)

	if (NF > 0 && length(array[1]) > 0) {
		lines++

		# save the first word (or '&' separated list of words) in the names array
		if (array[2] == "&") {
			if (array[4] == "&") {
				names[lines] = array[1] " " array[2] " " array[3] " " array[4] " " array[5]
				start =  6
			} else {
				names[lines] = array[1] " " array[2] " " array[3]
				start = 4 
			}
		} else {
			names[lines] = array[1] 
			start = 2
		}

		# create the WCHAR version of the name
		printf "static const WCHAR name%dW[] = { ", lines
		i = 1
		len = length(names[lines]) + 1
		while (i < len) {
			printf "'%s',", substr(names[lines],i,1)
			i++
		}
		print  "0 };"
	
		# create the CHAR version of the description
		printf "static const CHAR description%dA[] = \"", lines
		word = start 
		while (word < (NF + 1)) {
			printf "%s", array[word]
			if (word < NF )
				printf " "
			word++
		}
		print  "\";"
	
		# create the WCHAR version of the description
		printf "static const WCHAR description%dW[] = { ", lines
		word = start
		while (word < (NF + 1)) {
			i = 1
			len = length(array[word]) + 1
			while (i < len) {
				if (substr(array[word],i,1) == "'")
					printf "'\\'',"
				else
					printf "'%s',", substr(array[word],i,1)
				i++
			}
			if (word < NF )
				printf "' ',"
			word++
		}
		print  "0 };"
	}
}
END {
	print ""
	print "static const error_info info[] = {"

	i = 1 
	while ( i <= lines) { 
		split(names[i], words, FS)
		printf "    { %s, \"%s\", name%dW, description%dA, description%dW },\n", 
			words[1], names[i], i, i,i 
		i++
	}

	print "};"
}