aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/qpdf/JSON.hh28
-rw-r--r--include/qpdf/QIntC.hh132
-rw-r--r--include/qpdf/QUtil.hh6
3 files changed, 116 insertions, 50 deletions
diff --git a/include/qpdf/JSON.hh b/include/qpdf/JSON.hh
index 4b829017..2906d85a 100644
--- a/include/qpdf/JSON.hh
+++ b/include/qpdf/JSON.hh
@@ -340,13 +340,33 @@ class JSON
static void
writeClose(Pipeline* p, bool first, size_t depth, char const* delimeter);
+ enum value_type_e {
+ vt_none,
+ vt_dictionary,
+ vt_array,
+ vt_string,
+ vt_number,
+ vt_bool,
+ vt_null,
+ vt_blob,
+ };
+
struct JSON_value
{
+ JSON_value(value_type_e type_code) :
+ type_code(type_code)
+ {
+ }
virtual ~JSON_value() = default;
virtual void write(Pipeline*, size_t depth) const = 0;
+ const value_type_e type_code{vt_none};
};
struct JSON_dictionary: public JSON_value
{
+ JSON_dictionary() :
+ JSON_value(vt_dictionary)
+ {
+ }
virtual ~JSON_dictionary() = default;
virtual void write(Pipeline*, size_t depth) const;
std::map<std::string, std::shared_ptr<JSON_value>> members;
@@ -354,6 +374,10 @@ class JSON
};
struct JSON_array: public JSON_value
{
+ JSON_array() :
+ JSON_value(vt_array)
+ {
+ }
virtual ~JSON_array() = default;
virtual void write(Pipeline*, size_t depth) const;
std::vector<std::shared_ptr<JSON_value>> elements;
@@ -384,6 +408,10 @@ class JSON
};
struct JSON_null: public JSON_value
{
+ JSON_null() :
+ JSON_value(vt_null)
+ {
+ }
virtual ~JSON_null() = default;
virtual void write(Pipeline*, size_t depth) const;
};
diff --git a/include/qpdf/QIntC.hh b/include/qpdf/QIntC.hh
index dadc7582..b896a026 100644
--- a/include/qpdf/QIntC.hh
+++ b/include/qpdf/QIntC.hh
@@ -63,48 +63,60 @@ namespace QIntC // QIntC = qpdf Integer Conversion
class IntConverter<From, To, false, false>
{
public:
- static To
+ inline static To
convert(From const& i)
{
// From and To are both unsigned.
if (i > std::numeric_limits<To>::max()) {
- std::ostringstream msg;
- msg.imbue(std::locale::classic());
- msg << "integer out of range converting " << i << " from a "
- << sizeof(From) << "-byte unsigned type to a " << sizeof(To)
- << "-byte unsigned type";
- throw std::range_error(msg.str());
+ error(i);
}
return static_cast<To>(i);
}
+
+ static void
+ error(From i)
+ {
+ std::ostringstream msg;
+ msg.imbue(std::locale::classic());
+ msg << "integer out of range converting " << i << " from a "
+ << sizeof(From) << "-byte unsigned type to a " << sizeof(To)
+ << "-byte unsigned type";
+ throw std::range_error(msg.str());
+ }
};
template <typename From, typename To>
class IntConverter<From, To, true, true>
{
public:
- static To
+ inline static To
convert(From const& i)
{
// From and To are both signed.
if ((i < std::numeric_limits<To>::min()) ||
(i > std::numeric_limits<To>::max())) {
- std::ostringstream msg;
- msg.imbue(std::locale::classic());
- msg << "integer out of range converting " << i << " from a "
- << sizeof(From) << "-byte signed type to a " << sizeof(To)
- << "-byte signed type";
- throw std::range_error(msg.str());
+ error(i);
}
return static_cast<To>(i);
}
+
+ static void
+ error(From i)
+ {
+ std::ostringstream msg;
+ msg.imbue(std::locale::classic());
+ msg << "integer out of range converting " << i << " from a "
+ << sizeof(From) << "-byte signed type to a " << sizeof(To)
+ << "-byte signed type";
+ throw std::range_error(msg.str());
+ }
};
template <typename From, typename To>
class IntConverter<From, To, true, false>
{
public:
- static To
+ inline static To
convert(From const& i)
{
// From is signed, and To is unsigned. If i > 0, it's safe to
@@ -112,22 +124,28 @@ namespace QIntC // QIntC = qpdf Integer Conversion
// compare with To's max.
auto ii = static_cast<typename to_u<From>::type>(i);
if ((i < 0) || (ii > std::numeric_limits<To>::max())) {
- std::ostringstream msg;
- msg.imbue(std::locale::classic());
- msg << "integer out of range converting " << i << " from a "
- << sizeof(From) << "-byte signed type to a " << sizeof(To)
- << "-byte unsigned type";
- throw std::range_error(msg.str());
+ error(i);
}
return static_cast<To>(i);
}
+
+ static void
+ error(From i)
+ {
+ std::ostringstream msg;
+ msg.imbue(std::locale::classic());
+ msg << "integer out of range converting " << i << " from a "
+ << sizeof(From) << "-byte signed type to a " << sizeof(To)
+ << "-byte unsigned type";
+ throw std::range_error(msg.str());
+ }
};
template <typename From, typename To>
class IntConverter<From, To, false, true>
{
public:
- static To
+ inline static To
convert(From const& i)
{
// From is unsigned, and to is signed. Convert To's max to the
@@ -135,98 +153,104 @@ namespace QIntC // QIntC = qpdf Integer Conversion
auto maxval = static_cast<typename to_u<To>::type>(
std::numeric_limits<To>::max());
if (i > maxval) {
- std::ostringstream msg;
- msg.imbue(std::locale::classic());
- msg << "integer out of range converting " << i << " from a "
- << sizeof(From) << "-byte unsigned type to a " << sizeof(To)
- << "-byte signed type";
- throw std::range_error(msg.str());
+ error(i);
}
return static_cast<To>(i);
}
+
+ static void
+ error(From i)
+ {
+ std::ostringstream msg;
+ msg.imbue(std::locale::classic());
+ msg << "integer out of range converting " << i << " from a "
+ << sizeof(From) << "-byte unsigned type to a " << sizeof(To)
+ << "-byte signed type";
+ throw std::range_error(msg.str());
+ }
};
// Specific converters. The return type of each function must match
// the second template parameter to IntConverter.
template <typename T>
- char
+ inline char
to_char(T const& i)
{
return IntConverter<T, char>::convert(i);
}
template <typename T>
- unsigned char
+ inline unsigned char
to_uchar(T const& i)
{
return IntConverter<T, unsigned char>::convert(i);
}
template <typename T>
- short
+ inline short
to_short(T const& i)
{
return IntConverter<T, short>::convert(i);
}
template <typename T>
- unsigned short
+ inline unsigned short
to_ushort(T const& i)
{
return IntConverter<T, unsigned short>::convert(i);
}
template <typename T>
- int
+ inline int
to_int(T const& i)
{
return IntConverter<T, int>::convert(i);
}
template <typename T>
- unsigned int
+ inline unsigned int
to_uint(T const& i)
{
return IntConverter<T, unsigned int>::convert(i);
}
template <typename T>
- size_t
+ inline size_t
to_size(T const& i)
{
return IntConverter<T, size_t>::convert(i);
}
template <typename T>
- qpdf_offset_t
+ inline qpdf_offset_t
to_offset(T const& i)
{
return IntConverter<T, qpdf_offset_t>::convert(i);
}
template <typename T>
- long
+ inline long
to_long(T const& i)
{
return IntConverter<T, long>::convert(i);
}
template <typename T>
- unsigned long
+ inline unsigned long
to_ulong(T const& i)
{
return IntConverter<T, unsigned long>::convert(i);
}
template <typename T>
- long long
+ inline long long
to_longlong(T const& i)
{
return IntConverter<T, long long>::convert(i);
}
template <typename T>
- unsigned long long
+ inline unsigned long long
to_ulonglong(T const& i)
{
return IntConverter<T, unsigned long long>::convert(i);
@@ -234,12 +258,8 @@ namespace QIntC // QIntC = qpdf Integer Conversion
template <typename T>
void
- range_check(T const& cur, T const& delta)
+ range_check_error(T const& cur, T const& delta)
{
- if ((delta > 0) != (cur > 0)) {
- return;
- }
-
if ((delta > 0) && ((std::numeric_limits<T>::max() - cur) < delta)) {
std::ostringstream msg;
msg.imbue(std::locale::classic());
@@ -257,13 +277,19 @@ namespace QIntC // QIntC = qpdf Integer Conversion
}
template <typename T>
- void
- range_check_substract(T const& cur, T const& delta)
+ inline void
+ range_check(T const& cur, T const& delta)
{
- if ((delta >= 0) == (cur >= 0)) {
+ if ((delta > 0) != (cur > 0)) {
return;
}
+ QIntC::range_check_error<T>(cur, delta);
+ }
+ template <typename T>
+ void
+ range_check_substract_error(T const& cur, T const& delta)
+ {
if ((delta > 0) && ((std::numeric_limits<T>::min() + delta) > cur)) {
std::ostringstream msg;
msg.imbue(std::locale::classic());
@@ -279,6 +305,16 @@ namespace QIntC // QIntC = qpdf Integer Conversion
throw std::range_error(msg.str());
}
}
+
+ template <typename T>
+ inline void
+ range_check_substract(T const& cur, T const& delta)
+ {
+ if ((delta >= 0) == (cur >= 0)) {
+ return;
+ }
+ QIntC::range_check_substract_error<T>(cur, delta);
+ }
}; // namespace QIntC
#endif // QINTC_HH
diff --git a/include/qpdf/QUtil.hh b/include/qpdf/QUtil.hh
index 27521a70..dd452026 100644
--- a/include/qpdf/QUtil.hh
+++ b/include/qpdf/QUtil.hh
@@ -545,13 +545,15 @@ namespace QUtil
inline bool
QUtil::is_hex_digit(char ch)
{
- return (ch && (strchr("0123456789abcdefABCDEF", ch) != nullptr));
+ return ('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'f') ||
+ ('A' <= ch && ch <= 'F');
}
inline bool
QUtil::is_space(char ch)
{
- return (ch && (strchr(" \f\n\r\t\v", ch) != nullptr));
+ return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t' || ch == '\f' ||
+ ch == '\v';
}
inline bool