BEGIN { 
if ( length(outfn) == 0) {
	outfn = outfile
}
char_shift=64
## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
c2n["A"]=1
c2n["B"]=2
c2n["C"]=3
c2n["D"]=4
c2n["E"]=5
c2n["F"]=6
c2n["G"]=7
c2n["H"]=8
c2n["I"]=9
c2n["J"]=10
c2n["K"]=11
c2n["L"]=12
c2n["M"]=13
c2n["N"]=14
c2n["O"]=15
c2n["P"]=16
c2n["Q"]=17
c2n["R"]=18
c2n["S"]=19
c2n["T"]=20
c2n["U"]=21
c2n["V"]=22
c2n["W"]=23
c2n["X"]=24
c2n["Y"]=25
c2n["Z"]=26
c2n["a"]=27
c2n["b"]=28
c2n["c"]=29
c2n["d"]=30
c2n["e"]=31
c2n["f"]=32
c2n["g"]=33
c2n["h"]=34
c2n["i"]=35
c2n["j"]=36
c2n["k"]=37
c2n["l"]=38
c2n["m"]=39
c2n["n"]=40
c2n["o"]=41
c2n["p"]=42
c2n["q"]=43
c2n["r"]=44
c2n["s"]=45
c2n["t"]=46
c2n["u"]=47
c2n["v"]=48
c2n["w"]=49
c2n["x"]=50
c2n["y"]=51
c2n["z"]=52
c2n["0"]=53
c2n["1"]=54
c2n["2"]=55
c2n["3"]=56
c2n["4"]=57
c2n["5"]=58
c2n["6"]=59
c2n["7"]=60
c2n["8"]=61
c2n["9"]=62
c2n["_"]=63
}
/^#/ { next }
/^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ {
	table_number = 0
	mod_base = 1000000
	if (NF > 2) {
	    table_name = $3
	    base_name = $2
	} else {
	    table_name = $2
	    base_name = table_name
	}
	for(i=1; i<=length(base_name); i++) {
	    table_number=(table_number*char_shift)+c2n[substr(base_name,i,1)]
	}

	# We start playing *_high, *low games here because the some
	# awk programs do not have the necessary precision (sigh)
	tab_base_low = table_number % mod_base
	if (tab_base_low < 0) {
		# Work around stupid bug in the ARM libm
		tab_base_low = tab_base_low + mod_base
	}
	tab_base_high = int(table_number / mod_base)
	tab_base_sign = 1;

	# figure out: table_number_base=table_number*256
	tab_base_low = tab_base_low * 256
	tab_base_high = (tab_base_high * 256) + \
			int(tab_base_low / mod_base)
	tab_base_low = tab_base_low % mod_base
	if (tab_base_low < 0) {
		# Work around stupid bug in the ARM libm
		tab_base_low = tab_base_low + mod_base
	}

	if (table_number > 128*256*256) {
		# figure out:  table_number_base -= 256*256*256*256
		# sub_high, sub_low is 256*256*256*256
		sub_low = 256*256*256 % mod_base
		sub_high = int(256*256*256 / mod_base)

		sub_low = sub_low * 256
		sub_high = (sub_high * 256) + int(sub_low / mod_base)
		sub_low = sub_low % mod_base

		tab_base_low = sub_low - tab_base_low;
		tab_base_high = sub_high - tab_base_high;
		tab_base_sign = -1;
		if (tab_base_low < 0) {
			tab_base_low = tab_base_low + mod_base
			tab_base_high--
		}
	}
	print "/*" > outfile
	print " * " outfn ":" > outfile
	print " * This file is automatically generated; please do not edit it." > outfile
	print " */" > outfile

	print "" > outfile
	print "#include <stdlib.h>" > outfile
	print "" > outfile
	print "static const char * const text[] = {" > outfile
	table_item_count = 0
}

(continuation == 1) && ($0 ~ /\\[ \t]*$/) {
	text=substr($0,1,length($0)-1);
#	printf "\t\t\"%s\"\n", text > outfile
	cont_buf=cont_buf text;
}

(continuation == 1) && ($0 ~ /"[ \t]*$/) {
#	printf "\t\t\"%s,\n", $0 > outfile
	printf "\t%s,\n", cont_buf $0 > outfile
	continuation = 0;
}

/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[^ \t]/ {
	# Be tolerant to missing whitespace after `,' ...
	sub(/,/, ", ")
}

/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*$/ {
	table_item_count++
	skipone=1
	next
}

/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*"[ \t]*$/ {
	text=""
	for (i=3; i<=NF; i++) { 
	    text = text FS $i
	}
	text=substr(text,2,length(text)-1);
	printf "\t%s,\n", text > outfile
	table_item_count++
}

/^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*\\[ \t]*$/ {
	text=""
	for (i=3; i<=NF; i++) { 
	    text = text FS $i
	}
	text=substr(text,2,length(text)-2);
#	printf "\t%s\"\n", text > outfile
	cont_buf=text
	table_item_count++
	continuation++;
}

/^[ \t]*".*\\[ \t]*$/ {
	if (skipone) {
	    text=substr($0,1,length($0)-1);
#	    printf "\t%s\"\n", text > outfile
	    cont_buf=text
	    continuation++;
	}
	skipone=0
}

{ 
	if (skipone) {
	    printf "\t%s,\n", $0 > outfile
	}
	skipone=0
}

/^[ \t]*(prefix)$/ {
	prefix_str = ""
}

/^[ \t]*(prefix)[ \t]+[A-Z_0-9]+/ {
	prefix_str = $2 "_"
}

/^[ \t]*(index)[ \t]+[A-Z_0-9]+/ {
	new_idx = $2
	for (i = table_item_count ; i < new_idx; i++) {
		printf "\t\"Reserved %s error (%d)\",\n", \
			table_name, table_item_count++ > outfile
	}
}

END {
	print "    0" > outfile
	print "};" > outfile
	print "" > outfile
	print "struct error_table {" > outfile
	print "    char const * const * msgs;" > outfile
	print "    long base;" > outfile
	print "    int n_msgs;" > outfile
	print "};" > outfile
	print "struct et_list {" > outfile
	print "    struct et_list *next;" > outfile
	print "    const struct error_table * table;" > outfile
	print "};" > outfile
	print "extern struct et_list *_et_list;" > outfile
	print "" > outfile
	if (tab_base_high == 0) {
		print "const struct error_table et_" table_name "_error_table = { text, " \
		sprintf("%dL, %d };", tab_base_sign*tab_base_low, \
		table_item_count) > outfile
	} else {
		print "const struct error_table et_" table_name "_error_table = { text, " \
		sprintf("%d%06dL, %d };", tab_base_sign*tab_base_high, \
		tab_base_low, table_item_count) > outfile
	}
	print "" > outfile
	print "static struct et_list link = { 0, 0 };" > outfile
	print "" > outfile
	print "void initialize_" table_name "_error_table_r(struct et_list **list);" > outfile
	print "void initialize_" table_name "_error_table(void);" > outfile
	print "" > outfile
	print "void initialize_" table_name "_error_table(void) {" > outfile
	print "    initialize_" table_name "_error_table_r(&_et_list);" > outfile
	print "}" > outfile
	print "" > outfile
	print "/* For Heimdal compatibility */" > outfile
	print "void initialize_" table_name "_error_table_r(struct et_list **list)" > outfile
	print "{" > outfile
	print "    struct et_list *et, **end;" > outfile
	print "" > outfile
	print "    for (end = list, et = *list; et; end = &et->next, et = et->next)" > outfile
	print "        if (et->table->msgs == text)" > outfile
	print "            return;" > outfile
	print "    et = malloc(sizeof(struct et_list));" > outfile
	print "    if (et == 0) {" > outfile
	print "        if (!link.table)" > outfile
	print "            et = &link;" > outfile
	print "        else" > outfile
	print "            return;" > outfile
	print "    }" > outfile
	print "    et->table = &et_" table_name "_error_table;" > outfile
	print "    et->next = 0;" > outfile
	print "    *end = et;" > outfile
	print "}" > outfile
}
