#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 "}" }