Commit 00ed5af50216348e170b48d531801f46eac0fbab

Authored by Jay Berkenbilt
1 parent 01d6f04a

remove use of float for version comparison

git-svn-id: svn+q:///qpdf/trunk@984 71b93d88-0707-0410-a8cf-f5a4172ac649
... ... @@ -3,8 +3,6 @@ Next
3 3  
4 4 * Work in contrib/vc6. See email from stronghorse@tom.com
5 5  
6   - * Stop using float for version comparisons.
7   -
8 6 2.2
9 7 ===
10 8  
... ...
include/qpdf/QPDFWriter.hh
... ... @@ -207,7 +207,9 @@ class QPDFWriter
207 207 char const* user_password, char const* owner_password,
208 208 bool allow_accessibility, bool allow_extract,
209 209 qpdf_r3_print_e print, qpdf_r3_modify_e modify);
210   - void disableIncompatbleEncryption(float v);
  210 + void disableIncompatibleEncryption(int major, int minor);
  211 + void parseVersion(std::string const& version, int& major, int& minor) const;
  212 + int compareVersions(int major1, int minor1, int major2, int minor2) const;
211 213 void setEncryptionParameters(
212 214 char const* user_password, char const* owner_password,
213 215 int V, int R, int key_len, std::set<int>& bits_to_clear);
... ...
libqpdf/QPDFWriter.cc
... ... @@ -112,9 +112,13 @@ QPDFWriter::setMinimumPDFVersion(std::string const&amp; version)
112 112 }
113 113 else
114 114 {
115   - float v = atof(version.c_str());
116   - float mv = atof(this->min_pdf_version.c_str());
117   - if (v > mv)
  115 + int old_major = 0;
  116 + int old_minor = 0;
  117 + int min_major = 0;
  118 + int min_minor = 0;
  119 + parseVersion(version, old_major, old_minor);
  120 + parseVersion(this->min_pdf_version, min_major, min_minor);
  121 + if (compareVersions(old_minor, old_minor, min_minor, min_minor) > 0)
118 122 {
119 123 QTC::TC("qpdf", "QPDFWriter increasing minimum version");
120 124 set_version = true;
... ... @@ -354,7 +358,7 @@ QPDFWriter::copyEncryptionParameters()
354 358 }
355 359  
356 360 void
357   -QPDFWriter::disableIncompatbleEncryption(float v)
  361 +QPDFWriter::disableIncompatibleEncryption(int major, int minor)
358 362 {
359 363 if (! this->encrypted)
360 364 {
... ... @@ -362,7 +366,7 @@ QPDFWriter::disableIncompatbleEncryption(float v)
362 366 }
363 367  
364 368 bool disable = false;
365   - if (v < 1.3)
  369 + if (compareVersions(major, minor, 1, 3) < 0)
366 370 {
367 371 disable = true;
368 372 }
... ... @@ -370,21 +374,21 @@ QPDFWriter::disableIncompatbleEncryption(float v)
370 374 {
371 375 int V = atoi(encryption_dictionary["/V"].c_str());
372 376 int R = atoi(encryption_dictionary["/R"].c_str());
373   - if (v < 1.4)
  377 + if (compareVersions(major, minor, 1, 4) < 0)
374 378 {
375 379 if ((V > 1) || (R > 2))
376 380 {
377 381 disable = true;
378 382 }
379 383 }
380   - else if (v < 1.5)
  384 + else if (compareVersions(major, minor, 1, 5) < 0)
381 385 {
382 386 if ((V > 2) || (R > 3))
383 387 {
384 388 disable = true;
385 389 }
386 390 }
387   - else if (v < 1.6)
  391 + else if (compareVersions(major, minor, 1, 6) < 0)
388 392 {
389 393 if (this->encrypt_use_aes)
390 394 {
... ... @@ -400,6 +404,53 @@ QPDFWriter::disableIncompatbleEncryption(float v)
400 404 }
401 405  
402 406 void
  407 +QPDFWriter::parseVersion(std::string const& version,
  408 + int& major, int& minor) const
  409 +{
  410 + major = atoi(version.c_str());
  411 + minor = 0;
  412 + size_t p = version.find('.');
  413 + if ((p != std::string::npos) && (version.length() > p))
  414 + {
  415 + minor = atoi(version.substr(p + 1).c_str());
  416 + }
  417 + std::string tmp = QUtil::int_to_string(major) + "." +
  418 + QUtil::int_to_string(minor);
  419 + if (tmp != version)
  420 + {
  421 + throw std::logic_error(
  422 + "INTERNAL ERROR: QPDFWriter::parseVersion"
  423 + " called with invalid version number " + version);
  424 + }
  425 +}
  426 +
  427 +int
  428 +QPDFWriter::compareVersions(int major1, int minor1,
  429 + int major2, int minor2) const
  430 +{
  431 + if (major1 < major2)
  432 + {
  433 + return -1;
  434 + }
  435 + else if (major1 > major2)
  436 + {
  437 + return 1;
  438 + }
  439 + else if (minor1 < minor2)
  440 + {
  441 + return -1;
  442 + }
  443 + else if (minor1 > minor2)
  444 + {
  445 + return 1;
  446 + }
  447 + else
  448 + {
  449 + return 0;
  450 + }
  451 +}
  452 +
  453 +void
403 454 QPDFWriter::setEncryptionParametersInternal(
404 455 int V, int R, int key_len, long P,
405 456 std::string const& O, std::string const& U,
... ... @@ -1491,9 +1542,11 @@ QPDFWriter::write()
1491 1542  
1492 1543 if (! this->forced_pdf_version.empty())
1493 1544 {
1494   - float v = atof(this->forced_pdf_version.c_str());
1495   - disableIncompatbleEncryption(v);
1496   - if (v < 1.5)
  1545 + int major = 0;
  1546 + int minor = 0;
  1547 + parseVersion(this->forced_pdf_version, major, minor);
  1548 + disableIncompatibleEncryption(major, minor);
  1549 + if (compareVersions(major, minor, 1, 5) < 0)
1497 1550 {
1498 1551 QTC::TC("qpdf", "QPDFWriter forcing object stream disable");
1499 1552 this->object_stream_mode = qpdf_o_disable;
... ...