/* Error table.
- Copyright (C) 2019 Free Software Foundation, Inc.
+ Copyright (C) 2019-2021 Free Software Foundation, Inc.
This file is part of libctf.
<http://www.gnu.org/licenses/>. */
#include <ctf-impl.h>
+#include <stddef.h>
+#include <string.h>
-static const char *const _ctf_errlist[] = {
- "File is not in CTF or ELF format", /* ECTF_FMT */
- "BFD error", /* ECTF_BFDERR */
- "File uses more recent CTF version than libctf", /* ECTF_CTFVERS */
- "Ambiguous BFD target", /* ECTF_BFD_AMBIGUOUS */
- "Symbol table uses invalid entry size", /* ECTF_SYMTAB */
- "Symbol table data buffer is not valid", /* ECTF_SYMBAD */
- "String table data buffer is not valid", /* ECTF_STRBAD */
- "File data structure corruption detected", /* ECTF_CORRUPT */
- "File does not contain CTF data", /* ECTF_NOCTFDATA */
- "Buffer does not contain CTF data", /* ECTF_NOCTFBUF */
- "Symbol table information is not available", /* ECTF_NOSYMTAB */
- "Type information is in parent and unavailable", /* ECTF_NOPARENT */
- "Cannot import types with different data model", /* ECTF_DMODEL */
- "File added to link too late", /* ECTF_LINKADDEDLATE */
- "Failed to allocate (de)compression buffer", /* ECTF_ZALLOC */
- "Failed to decompress CTF data", /* ECTF_DECOMPRESS */
- "External string table is not available", /* ECTF_STRTAB */
- "String name offset is corrupt", /* ECTF_BADNAME */
- "Invalid type identifier", /* ECTF_BADID */
- "Type is not a struct or union", /* ECTF_NOTSOU */
- "Type is not an enum", /* ECTF_NOTENUM */
- "Type is not a struct, union, or enum", /* ECTF_NOTSUE */
- "Type is not an integer, float, or enum", /* ECTF_NOTINTFP */
- "Type is not an array", /* ECTF_NOTARRAY */
- "Type does not reference another type", /* ECTF_NOTREF */
- "Input buffer is too small for type name", /* ECTF_NAMELEN */
- "No type information available for that name", /* ECTF_NOTYPE */
- "Syntax error in type name", /* ECTF_SYNTAX */
- "Symbol table entry or type is not a function", /* ECTF_NOTFUNC */
- "No function information available for symbol", /* ECTF_NOFUNCDAT */
- "Symbol table entry is not a data object", /* ECTF_NOTDATA */
- "No type information available for symbol", /* ECTF_NOTYPEDAT */
- "No label information available for that name", /* ECTF_NOLABEL */
- "File does not contain any labels", /* ECTF_NOLABELDATA */
- "Feature not supported", /* ECTF_NOTSUP */
- "Invalid enum element name", /* ECTF_NOENUMNAM */
- "Invalid member name", /* ECTF_NOMEMBNAM */
- "CTF container is read-only", /* ECTF_RDONLY */
- "Limit on number of dynamic type members reached", /* ECTF_DTFULL */
- "Limit on number of dynamic types reached", /* ECTF_FULL */
- "Duplicate member or variable name", /* ECTF_DUPLICATE */
- "Conflicting type is already defined", /* ECTF_CONFLICT */
- "Attempt to roll back past a ctf_update", /* ECTF_OVERROLLBACK */
- "Failed to compress CTF data", /* ECTF_COMPRESS */
- "Failed to create CTF archive", /* ECTF_ARCREATE */
- "Name not found in CTF archive", /* ECTF_ARNNAME */
- "Overflow of type bitness or offset in slice", /* ECTF_SLICEOVERFLOW */
- "Unknown section number in dump", /* ECTF_DUMPSECTUNKNOWN */
- "Section changed in middle of dump", /* ECTF_DUMPSECTCHANGED */
- "Feature not yet implemented" /* ECTF_NOTYET */
-};
-
-static const int _ctf_nerr = sizeof (_ctf_errlist) / sizeof (_ctf_errlist[0]);
+/* This construct is due to Bruno Haible: much thanks. */
+
+/* Give each structure member a unique name. The name does not matter, so we
+ use the enum constant to uniquify them. */
+
+#define ERRSTRFIELD(N) ctf_errstr##N
+
+/* In this file, we want to treat the first item of the ctf error
+ macro like subsequent items. */
+#define _CTF_FIRST(NAME, VALUE) _CTF_ITEM(NAME, VALUE)
+
+/* The error message strings, each in a unique structure member precisely big
+ enough for that error, plus a str member to access them all as a string
+ table. */
+
+static const union _ctf_errlist_t
+{
+ __extension__ struct
+ {
+#define _CTF_ITEM(n, s) char ERRSTRFIELD (n) [sizeof (s)];
+_CTF_ERRORS
+#undef _CTF_ITEM
+ };
+ char str[1];
+} _ctf_errlist =
+ {
+ {
+#define _CTF_ITEM(n, s) N_(s),
+_CTF_ERRORS
+#undef _CTF_ITEM
+ }
+ };
+
+/* Offsets to each member in the string table, computed using offsetof. */
+
+static const unsigned int _ctf_erridx[] =
+ {
+#define _CTF_ITEM(n, s) [n - ECTF_BASE] = offsetof (union _ctf_errlist_t, ERRSTRFIELD (n)),
+_CTF_ERRORS
+#undef _CTF_ITEM
+ };
const char *
ctf_errmsg (int error)
{
const char *str;
- if (error >= ECTF_BASE && (error - ECTF_BASE) < _ctf_nerr)
- str = _ctf_errlist[error - ECTF_BASE];
+ if (error >= ECTF_BASE && (error - ECTF_BASE) < ECTF_NERR)
+ str = _ctf_errlist.str + _ctf_erridx[error - ECTF_BASE];
else
- str = ctf_strerror (error);
+ str = (const char *) strerror (error);
- return (str ? str : "Unknown error");
+ return (str ? gettext (str) : _("Unknown error"));
}
int
-ctf_errno (ctf_file_t * fp)
+ctf_errno (ctf_dict_t * fp)
{
return fp->ctf_errno;
}