2021-10-11 19:38:01 -03:00

149 lines
3.0 KiB
Awk
Executable File

#pragma ident "@(#)error.c.awk 1.6 92/07/21 SMI"
# /* SVr4.0 1.2 */
# Convert error description file to C.
# Input has the following form (fields separated by tabs):
#
# 12345678901234567890...
# # comment
# #ident "string"
#
# MAJOR_ENUM MAJOR_DATA Error prefix
# MINOR_ENUM message text
#
# Example
#
#
# BUG bug Internal error
# BUG1 Goofed up data structure
# BUG2 Messed up pointer
#
# FMT fmt Format error
# ...
BEGIN {
ident = ""
major = "_0"
FS = "\t"
MAJOR_ENUM = "_0"
MAJOR_DATA = "_1"
MAJOR_NUMB = "_2"
MAJOR_PREF = "_3"
MAJOR_MINOR = "_4"
MINOR_ENUM = "_0"
MINOR_TEXT = "_1"
}
/^#/ {} # do nothing
/^$/ {} # do nothing
/^#ident/ {
ident = $0
}
/^[A-Za-z]/ {
++major
info[major MAJOR_ENUM] = $1
info[major MAJOR_DATA] = $2
info[major MAJOR_PREF] = $3
info[major MAJOR_NUMB] = 0
}
/^ [A-Za-z]/ {
j = ++info[major MAJOR_NUMB];
info[major MAJOR_MINOR j MINOR_ENUM] = $2
info[major MAJOR_MINOR j MINOR_TEXT] = $3
}
END {
if (ident != "")
print ident, "\n\n"
print "/*LINTLIBRARY*/\n"
print "#ifdef __STDC__"
print " #pragma weak elf_errmsg = _elf_errmsg"
print " #pragma weak elf_errno = _elf_errno"
print "#endif\n\n"
print "#include \"syn.h\""
print "#include \"error.h\"\n\n"
print "#ifndef __STDC__"
print "# define const"
print "#endif\n\n"
print "extern int _elf_err;"
for (j = 1; j <= major; ++j)
{
print
print
printf "static const char *%s[] =\t/* E%s_... */\n",\
info[j MAJOR_DATA],\
info[j MAJOR_ENUM]
print "{"
x = j MAJOR_PREF
printf "\t/* 0 */\t\t\"%s: reason unknown\",\n", info[x]
for (k = 1; k <= info[j MAJOR_NUMB]; ++k)
{
printf "\t/* %s */\t\"%s: %s\",\n",\
info[j MAJOR_MINOR k MINOR_ENUM],\
info[j MAJOR_PREF],\
info[j MAJOR_MINOR k MINOR_TEXT]
}
print "};"
}
print
print
print "static struct\tMsg"
print "{"
print " const char **m_list;\t/* message list */"
print " int m_num;\t\t/* # entries */"
print "} msg[] =\n{"
for (j = 1; j <= major; ++j)
{
printf "\t/* E%s */\t{ %s, sizeof(%s) / sizeof(%s[0]) },\n",\
info[j MAJOR_ENUM],\
info[j MAJOR_DATA],\
info[j MAJOR_DATA],\
info[j MAJOR_DATA]
}
print "};"
print
print
print "const char *"
print "elf_errmsg(err)"
print " int err;"
print "{"
print " int major, minor;"
print
print " if (err == 0)"
print " {"
print " if ((err = _elf_err) == 0)"
print " return 0;"
print " }"
print " else if (err == -1)"
print " {"
print " if ((err = _elf_err) == 0)"
print " return \"ELF error 0\";"
print " }"
print " major = errmaj(err);"
print " minor = errmin(err);"
print " if (major < sizeof(msg) / sizeof(msg[0]))"
print " {"
print " if (minor >= msg[major].m_num)"
print " minor = 0;"
print " return msg[major].m_list[minor];"
print " }"
print " return \"Unknown ELF error\";"
print "}"
print
print
print "int"
print "elf_errno()"
print "{"
print " int temp;"
print
print " temp =_elf_err;"
print " _elf_err = 0;"
print " return temp;"
print "}"
}