1 // This file is part of the interchange file format library.
3 // Copyright (C) 2003-2006 by Mike Sharov <msharov@users.sourceforge.net>
4 // This file is free software, distributed under the MIT License.
13 //----------------------------------------------------------------------
15 /// Wrong format error for \p typeName at \p offset; \p expected format does not match \p actual format.
16 XFormatMismatch::XFormatMismatch (const char* typeName
, uoff_t offset
, fmt_t expected
, fmt_t actual
) throw()
18 m_TypeName (typeName
),
20 m_Expected (expected
),
25 /// Writes error description to \p msgbuf. Default fmt is "iff chunk %s at 0x%zX has format %08X (%c%c%c%c), expected %08X (%c%c%c%c)"
26 void XFormatMismatch::info (string
& msgbuf
, const char* fmt
) const throw()
28 if (!fmt
) fmt
= "iff chunk %s at 0x%zX has format %08X (%c%c%c%c), expected %08X (%c%c%c%c)";
29 char expstr
[sizeof(fmt_t
)]; *(fmt_t
*)(expstr
) = m_Expected
;
30 char actstr
[sizeof(fmt_t
)]; *(fmt_t
*)(actstr
) = m_Actual
;
31 for (size_t i
= 0; i
< sizeof(fmt_t
); ++ i
) {
32 if (!isprint(expstr
[i
]))
34 if (!isprint(actstr
[i
]))
38 strncpy (dmname
, m_TypeName
, VectorSize(dmname
));
39 dmname
[VectorSize(dmname
)-1] = 0;
40 demangle_type_name (VectorBlock (dmname
));
42 msgbuf
.format (fmt
, dmname
, m_Offset
,
43 m_Actual
, actstr
[0], actstr
[1], actstr
[2], actstr
[3],
44 m_Expected
, expstr
[0], expstr
[1], expstr
[2], expstr
[3]);
48 //----------------------------------------------------------------------
50 /// Chunk of \p typeName at \p offset is not of the \p expected size.
51 XChunkSizeMismatch::XChunkSizeMismatch (const char* typeName
, uoff_t offset
, size_t expected
, size_t actual
) throw()
53 m_TypeName (typeName
),
55 m_Expected (expected
),
60 /// Writes error description to \p msgbuf. Default \p fmt is "iff chunk %s at 0x%zX is %zu bytes, expected %zu"
61 void XChunkSizeMismatch::info (string
& msgbuf
, const char* fmt
) const throw()
63 if (!fmt
) fmt
= "iff chunk %s at 0x%zX is %zu bytes, expected %zu";
65 strncpy (dmname
, m_TypeName
, VectorSize(dmname
));
66 dmname
[VectorSize(dmname
)-1] = 0;
67 demangle_type_name (VectorBlock (dmname
));
68 try { msgbuf
.format (fmt
, dmname
, m_Offset
, m_Actual
, m_Expected
); } catch (...) {}
71 //----------------------------------------------------------------------