git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2389 ec53bebd-3082-4978-b11e-865c3cabbd6b
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
# Copyright (c) 1997 Kungliga Tekniska Högskolan
 | 
						|
# (Royal Institute of Technology, Stockholm, Sweden). 
 | 
						|
# All rights reserved. 
 | 
						|
#
 | 
						|
# $Id$
 | 
						|
#
 | 
						|
 | 
						|
$1 == "error_table" || $1 == "et" {
 | 
						|
	name = $2
 | 
						|
	base = 0
 | 
						|
	for(i = 1; i <= 4; i++){
 | 
						|
		base = base * 64 + index("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_", substr(name, i, 1))
 | 
						|
	}
 | 
						|
	base *= 256
 | 
						|
	if(base >= 2147483648){ # 0x80000000
 | 
						|
		base = -(4294967295 - base + 1) # 0xffffffff
 | 
						|
	}
 | 
						|
	split(name, x, "\\.")
 | 
						|
	name=x[1]
 | 
						|
# for normal awk:
 | 
						|
#	split(name, foo, "\\.")
 | 
						|
#	name = foo[1]
 | 
						|
	c_file = name "_err.c"
 | 
						|
	h_file = name "_err.h"
 | 
						|
	h = ""
 | 
						|
#	gsub("[^a-zA-Z0-9]", "_", H_FILE)
 | 
						|
	for(i = 1; i <= length(h_file); i++){
 | 
						|
		c = substr(h_file, i, 1)
 | 
						|
		if(c ~ /[^a-zA-Z0-9]/)
 | 
						|
			c = "_"
 | 
						|
		h = h c
 | 
						|
	}
 | 
						|
	H_FILE= "__" h "__"
 | 
						|
	number = 0
 | 
						|
	print "/* Generated from " FILENAME " */" > c_file
 | 
						|
	print "#include <stddef.h>" > c_file # NULL
 | 
						|
	print "#include <stdlib.h>" > c_file # malloc
 | 
						|
	print "#include <error.h>" > c_file
 | 
						|
	print "#include <" h_file ">" > c_file
 | 
						|
	print "" > c_file
 | 
						|
	print "static const char *text[] = {" > c_file
 | 
						|
 | 
						|
	print "/* Generated from " FILENAME " */" > h_file
 | 
						|
	print "" > h_file
 | 
						|
	print "#ifndef " H_FILE > h_file
 | 
						|
	print "#define " H_FILE > h_file
 | 
						|
	print "" > h_file
 | 
						|
	print "#include <error.h>" > h_file
 | 
						|
	print "" > h_file
 | 
						|
	print "void initialize_" name "_error_table(struct error_table**);" > h_file
 | 
						|
	print "void destroy_" name "_error_table (struct error_table *);" > h_file
 | 
						|
	print "" > h_file
 | 
						|
	print "typedef enum " name "_error_number{" > h_file
 | 
						|
	print "\tERROR_TABLE_BASE_" name " = " base "," > h_file
 | 
						|
	next
 | 
						|
}
 | 
						|
 | 
						|
$1 == "index" {
 | 
						|
	newnumber = $2
 | 
						|
	for(; number < newnumber; number++) {
 | 
						|
#		printf("\t%s = %d,\n", toupper(name) "_ERROR_" number, base+ number) > h_file
 | 
						|
		printf("\t/* %3d */ %s,\n", number, "\"Reserved error number " number "\"") > c_file
 | 
						|
	}
 | 
						|
	next
 | 
						|
}
 | 
						|
$1 == "prefix" {
 | 
						|
	prefix = $2
 | 
						|
	if(prefix != "")
 | 
						|
		prefix = prefix "_"
 | 
						|
	next
 | 
						|
}
 | 
						|
 | 
						|
$1 == "error_code" {
 | 
						|
	code = $2
 | 
						|
	split(code, x, ",")
 | 
						|
	code = prefix x[1]
 | 
						|
	split($0, x, "\"")
 | 
						|
	string = x[2]
 | 
						|
	printf("\t%s = %d,\n", code, number + base) > h_file
 | 
						|
	printf("\t/* %3d */ \"%s\",\n", number, string) > c_file
 | 
						|
	number++;
 | 
						|
	next
 | 
						|
}
 | 
						|
END {
 | 
						|
	print "\tNULL" > c_file
 | 
						|
	print "};" > c_file
 | 
						|
	print "" > c_file
 | 
						|
	print "void initialize_" name "_error_table (struct error_table **list)" > c_file
 | 
						|
	print "{" > c_file
 | 
						|
	print "    struct error_table *et = malloc(sizeof(*et));" > c_file
 | 
						|
	print "    if (et == NULL)" > c_file
 | 
						|
	print "        return;" > c_file
 | 
						|
	print "    et->msgs = text;" > c_file
 | 
						|
	print "    et->n_msgs = " name "_num_errors;" > c_file
 | 
						|
	print "    et->base = ERROR_TABLE_BASE_" name ";" > c_file
 | 
						|
	print "    et->next = *list;" > c_file
 | 
						|
	print "    *list = et;" > c_file
 | 
						|
	print "}" > c_file
 | 
						|
	print "" > c_file
 | 
						|
	print "void destroy_" name "_error_table (struct error_table *list)" > c_file
 | 
						|
	print "{" > c_file
 | 
						|
	print "     struct error_table *next;" > c_file
 | 
						|
	print "" > c_file
 | 
						|
	print "     while(list) {" > c_file
 | 
						|
	print "         next = list->next;" > c_file
 | 
						|
	print "         free(list);" > c_file
 | 
						|
        print "         list = next;" > c_file
 | 
						|
	print "     }" > c_file
 | 
						|
	print "}" > c_file
 | 
						|
	close(c_file)
 | 
						|
 | 
						|
	print "\t" name "_num_errors = " number > h_file
 | 
						|
	print "} " name "_error_number;" > h_file
 | 
						|
	print "" > h_file
 | 
						|
	print "#endif /* " H_FILE " */" > h_file
 | 
						|
	close(h_file)
 | 
						|
}
 |