Commit 2ed5f49a795d91faddc723bbbb561e485094e23a

Authored by m-holger
Committed by Jay Berkenbilt
1 parent b3bf0290

C-API expose QPDFObjectHandle::getValueAs... accessors

include/qpdf/qpdf-c.h
... ... @@ -707,26 +707,50 @@ extern "C" {
707 707  
708 708 QPDF_DLL
709 709 QPDF_BOOL qpdf_oh_get_bool_value(qpdf_data qpdf, qpdf_oh oh);
  710 + QPDF_DLL
  711 + QPDF_BOOL qpdf_oh_get_value_as_bool(
  712 + qpdf_data qpdf, qpdf_oh oh, QPDF_BOOL* value);
710 713  
711 714 QPDF_DLL
712 715 long long qpdf_oh_get_int_value(qpdf_data qpdf, qpdf_oh oh);
713 716 QPDF_DLL
  717 + QPDF_BOOL qpdf_oh_get_value_as_longlong(
  718 + qpdf_data qpdf, qpdf_oh oh, long long* value);
  719 + QPDF_DLL
714 720 int qpdf_oh_get_int_value_as_int(qpdf_data qpdf, qpdf_oh oh);
715 721 QPDF_DLL
  722 + QPDF_BOOL qpdf_oh_get_value_as_int(
  723 + qpdf_data qpdf, qpdf_oh oh, int* value);
  724 + QPDF_DLL
716 725 unsigned long long qpdf_oh_get_uint_value(qpdf_data qpdf, qpdf_oh oh);
717 726 QPDF_DLL
  727 + QPDF_BOOL qpdf_oh_get_value_as_ulonglong(
  728 + qpdf_data qpdf, qpdf_oh oh, unsigned long long* value);
  729 + QPDF_DLL
718 730 unsigned int qpdf_oh_get_uint_value_as_uint(qpdf_data qpdf, qpdf_oh oh);
  731 + QPDF_DLL
  732 + QPDF_BOOL qpdf_oh_get_value_as_uint(
  733 + qpdf_data qpdf, qpdf_oh oh, unsigned int* value);
719 734  
720 735 QPDF_DLL
721 736 char const* qpdf_oh_get_real_value(qpdf_data qpdf, qpdf_oh oh);
  737 + QPDF_DLL
  738 + QPDF_BOOL qpdf_oh_get_value_as_real(
  739 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length);
722 740  
723 741 QPDF_DLL
724 742 QPDF_BOOL qpdf_oh_is_number(qpdf_data qpdf, qpdf_oh oh);
725 743 QPDF_DLL
726 744 double qpdf_oh_get_numeric_value(qpdf_data qpdf, qpdf_oh oh);
  745 + QPDF_DLL
  746 + QPDF_BOOL qpdf_oh_get_value_as_number(
  747 + qpdf_data qpdf, qpdf_oh oh, double* value);
727 748  
728 749 QPDF_DLL
729 750 char const* qpdf_oh_get_name(qpdf_data qpdf, qpdf_oh oh);
  751 + QPDF_DLL
  752 + QPDF_BOOL qpdf_oh_get_value_as_name(
  753 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length);
730 754  
731 755 /* Return the length of the last string returned. This enables you
732 756 * to retrieve the entire string for cases in which a char*
... ... @@ -747,8 +771,14 @@ extern "C" {
747 771 QPDF_DLL
748 772 char const* qpdf_oh_get_string_value(qpdf_data qpdf, qpdf_oh oh);
749 773 QPDF_DLL
  774 + QPDF_BOOL qpdf_oh_get_value_as_string(
  775 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length);
  776 + QPDF_DLL
750 777 char const* qpdf_oh_get_utf8_value(qpdf_data qpdf, qpdf_oh oh);
751 778 QPDF_DLL
  779 + QPDF_BOOL qpdf_oh_get_value_as_utf8(
  780 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length);
  781 + QPDF_DLL
752 782 char const* qpdf_oh_get_binary_string_value(
753 783 qpdf_data qpdf, qpdf_oh oh, size_t* length);
754 784 QPDF_DLL
... ...
libqpdf/qpdf-c.cc
... ... @@ -1238,6 +1238,22 @@ QPDF_BOOL qpdf_oh_get_bool_value(qpdf_data qpdf, qpdf_oh oh)
1238 1238 });
1239 1239 }
1240 1240  
  1241 +QPDF_BOOL qpdf_oh_get_value_as_bool(
  1242 + qpdf_data qpdf, qpdf_oh oh, QPDF_BOOL* value)
  1243 +{
  1244 + return do_with_oh<QPDF_BOOL>(
  1245 + qpdf, oh, return_false, [value](QPDFObjectHandle& o) {
  1246 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_bool");
  1247 + bool v = *value;
  1248 + QPDF_BOOL result = o.getValueAsBool(v);
  1249 + if (result)
  1250 + {
  1251 + *value = v;
  1252 + }
  1253 + return result;
  1254 + });
  1255 +}
  1256 +
1241 1257 long long qpdf_oh_get_int_value(qpdf_data qpdf, qpdf_oh oh)
1242 1258 {
1243 1259 return do_with_oh<long long>(
... ... @@ -1247,6 +1263,16 @@ long long qpdf_oh_get_int_value(qpdf_data qpdf, qpdf_oh oh)
1247 1263 });
1248 1264 }
1249 1265  
  1266 +QPDF_BOOL qpdf_oh_get_value_as_longlong(
  1267 + qpdf_data qpdf, qpdf_oh oh, long long* value)
  1268 +{
  1269 + return do_with_oh<QPDF_BOOL>(
  1270 + qpdf, oh, return_false, [value](QPDFObjectHandle& o) {
  1271 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_longlong");
  1272 + return o.getValueAsInt(*value);
  1273 + });
  1274 +}
  1275 +
1250 1276 int qpdf_oh_get_int_value_as_int(qpdf_data qpdf, qpdf_oh oh)
1251 1277 {
1252 1278 return do_with_oh<int>(
... ... @@ -1256,6 +1282,16 @@ int qpdf_oh_get_int_value_as_int(qpdf_data qpdf, qpdf_oh oh)
1256 1282 });
1257 1283 }
1258 1284  
  1285 +QPDF_BOOL qpdf_oh_get_value_as_int(
  1286 + qpdf_data qpdf, qpdf_oh oh, int* value)
  1287 +{
  1288 + return do_with_oh<QPDF_BOOL>(
  1289 + qpdf, oh, return_false, [value](QPDFObjectHandle& o) {
  1290 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_int");
  1291 + return o.getValueAsInt(*value);
  1292 + });
  1293 +}
  1294 +
1259 1295 unsigned long long qpdf_oh_get_uint_value(qpdf_data qpdf, qpdf_oh oh)
1260 1296 {
1261 1297 return do_with_oh<unsigned long long>(
... ... @@ -1265,6 +1301,16 @@ unsigned long long qpdf_oh_get_uint_value(qpdf_data qpdf, qpdf_oh oh)
1265 1301 });
1266 1302 }
1267 1303  
  1304 +QPDF_BOOL qpdf_oh_get_value_as_ulonglong(
  1305 + qpdf_data qpdf, qpdf_oh oh, unsigned long long* value)
  1306 +{
  1307 + return do_with_oh<QPDF_BOOL>(
  1308 + qpdf, oh, return_false, [value](QPDFObjectHandle& o) {
  1309 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_ulonglong");
  1310 + return o.getValueAsUInt(*value);
  1311 + });
  1312 +}
  1313 +
1268 1314 unsigned int qpdf_oh_get_uint_value_as_uint(qpdf_data qpdf, qpdf_oh oh)
1269 1315 {
1270 1316 return do_with_oh<unsigned int>(
... ... @@ -1274,6 +1320,16 @@ unsigned int qpdf_oh_get_uint_value_as_uint(qpdf_data qpdf, qpdf_oh oh)
1274 1320 });
1275 1321 }
1276 1322  
  1323 +QPDF_BOOL qpdf_oh_get_value_as_uint(
  1324 + qpdf_data qpdf, qpdf_oh oh, unsigned int* value)
  1325 +{
  1326 + return do_with_oh<QPDF_BOOL>(
  1327 + qpdf, oh, return_false, [value](QPDFObjectHandle& o) {
  1328 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_uint");
  1329 + return o.getValueAsUInt(*value);
  1330 + });
  1331 +}
  1332 +
1277 1333 char const* qpdf_oh_get_real_value(qpdf_data qpdf, qpdf_oh oh)
1278 1334 {
1279 1335 return do_with_oh<char const*>(
... ... @@ -1284,6 +1340,22 @@ char const* qpdf_oh_get_real_value(qpdf_data qpdf, qpdf_oh oh)
1284 1340 });
1285 1341 }
1286 1342  
  1343 +QPDF_BOOL qpdf_oh_get_value_as_real(
  1344 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length)
  1345 +{
  1346 + return do_with_oh<QPDF_BOOL>(
  1347 + qpdf, oh, return_false, [qpdf, value, length](QPDFObjectHandle& o) {
  1348 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_real");
  1349 + auto result = o.getValueAsReal(qpdf->tmp_string);
  1350 + if (result)
  1351 + {
  1352 + *value = qpdf->tmp_string.c_str();
  1353 + *length = qpdf->tmp_string.length();
  1354 + }
  1355 + return result;
  1356 + });
  1357 +}
  1358 +
1287 1359 double qpdf_oh_get_numeric_value(qpdf_data qpdf, qpdf_oh oh)
1288 1360 {
1289 1361 return do_with_oh<double>(
... ... @@ -1293,6 +1365,16 @@ double qpdf_oh_get_numeric_value(qpdf_data qpdf, qpdf_oh oh)
1293 1365 });
1294 1366 }
1295 1367  
  1368 +QPDF_BOOL qpdf_oh_get_value_as_number(
  1369 + qpdf_data qpdf, qpdf_oh oh, double* value)
  1370 +{
  1371 + return do_with_oh<QPDF_BOOL>(
  1372 + qpdf, oh, return_false, [value](QPDFObjectHandle& o) {
  1373 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_number");
  1374 + return o.getValueAsNumber(*value);
  1375 + });
  1376 +}
  1377 +
1296 1378 char const* qpdf_oh_get_name(qpdf_data qpdf, qpdf_oh oh)
1297 1379 {
1298 1380 return do_with_oh<char const*>(
... ... @@ -1303,6 +1385,22 @@ char const* qpdf_oh_get_name(qpdf_data qpdf, qpdf_oh oh)
1303 1385 });
1304 1386 }
1305 1387  
  1388 +QPDF_BOOL qpdf_oh_get_value_as_name(
  1389 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length)
  1390 +{
  1391 + return do_with_oh<QPDF_BOOL>(
  1392 + qpdf, oh, return_false, [qpdf, value, length](QPDFObjectHandle& o) {
  1393 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_name");
  1394 + auto result = o.getValueAsName(qpdf->tmp_string);
  1395 + if (result)
  1396 + {
  1397 + *value = qpdf->tmp_string.c_str();
  1398 + *length = qpdf->tmp_string.length();
  1399 + }
  1400 + return result;
  1401 + });
  1402 +}
  1403 +
1306 1404 char const* qpdf_oh_get_string_value(qpdf_data qpdf, qpdf_oh oh)
1307 1405 {
1308 1406 return do_with_oh<char const*>(
... ... @@ -1313,6 +1411,22 @@ char const* qpdf_oh_get_string_value(qpdf_data qpdf, qpdf_oh oh)
1313 1411 });
1314 1412 }
1315 1413  
  1414 +QPDF_BOOL qpdf_oh_get_value_as_string(
  1415 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length)
  1416 +{
  1417 + return do_with_oh<QPDF_BOOL>(
  1418 + qpdf, oh, return_false, [qpdf, value, length](QPDFObjectHandle& o) {
  1419 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_string");
  1420 + auto result = o.getValueAsString(qpdf->tmp_string);
  1421 + if (result)
  1422 + {
  1423 + *value = qpdf->tmp_string.c_str();
  1424 + *length = qpdf->tmp_string.length();
  1425 + }
  1426 + return result;
  1427 + });
  1428 +}
  1429 +
1316 1430 char const* qpdf_oh_get_utf8_value(qpdf_data qpdf, qpdf_oh oh)
1317 1431 {
1318 1432 return do_with_oh<char const*>(
... ... @@ -1323,6 +1437,22 @@ char const* qpdf_oh_get_utf8_value(qpdf_data qpdf, qpdf_oh oh)
1323 1437 });
1324 1438 }
1325 1439  
  1440 +QPDF_BOOL qpdf_oh_get_value_as_utf8(
  1441 + qpdf_data qpdf, qpdf_oh oh, char const** value, size_t* length)
  1442 +{
  1443 + return do_with_oh<QPDF_BOOL>(
  1444 + qpdf, oh, return_false, [qpdf, value, length](QPDFObjectHandle& o) {
  1445 + QTC::TC("qpdf", "qpdf-c called qpdf_oh_get_value_as_utf8");
  1446 + auto result = o.getValueAsUTF8(qpdf->tmp_string);
  1447 + if (result)
  1448 + {
  1449 + *value = qpdf->tmp_string.c_str();
  1450 + *length = qpdf->tmp_string.length();
  1451 + }
  1452 + return result;
  1453 + });
  1454 +}
  1455 +
1326 1456 char const* qpdf_oh_get_binary_string_value(
1327 1457 qpdf_data qpdf, qpdf_oh oh, size_t* length)
1328 1458 {
... ...
qpdf/qpdf-ctest.c
... ... @@ -673,26 +673,78 @@ static void test25(char const* infile,
673 673  
674 674 /* Parse objects from a string */
675 675 qpdf_oh parsed = qpdf_oh_parse(
676   - qpdf, "[ 1 2.0 (3\xf7) << /Four [/Five] >> null true ]");
  676 + qpdf, "[ 1 2.0 (3\xf7) << /Four [/Five] >> null true false /Six]");
677 677 qpdf_oh p_int = qpdf_oh_get_array_item(qpdf, parsed, 0);
678 678 qpdf_oh p_real = qpdf_oh_get_array_item(qpdf, parsed, 1);
679 679 qpdf_oh p_string = qpdf_oh_get_array_item(qpdf, parsed, 2);
680 680 qpdf_oh p_dict = qpdf_oh_get_array_item(qpdf, parsed, 3);
681 681 qpdf_oh p_null = qpdf_oh_get_array_item(qpdf, parsed, 4);
682 682 qpdf_oh p_bool = qpdf_oh_get_array_item(qpdf, parsed, 5);
  683 + qpdf_oh p_bool_f = qpdf_oh_get_array_item(qpdf, parsed, 6);
  684 + qpdf_oh p_name = qpdf_oh_get_array_item(qpdf, parsed, 7);
683 685 assert(qpdf_oh_is_integer(qpdf, p_int) &&
684 686 qpdf_oh_get_int_value_as_int(qpdf, p_int) == 1);
  687 + long long l = 0;
  688 + assert(qpdf_oh_get_value_as_longlong(qpdf, p_bool, &l) == QPDF_FALSE);
  689 + assert((qpdf_oh_get_value_as_longlong(qpdf, p_int, &l) == QPDF_TRUE) &&
  690 + (l == 1));
  691 + int i = 0;
  692 + assert(qpdf_oh_get_value_as_int(qpdf, p_bool, &i) == QPDF_FALSE);
  693 + assert((qpdf_oh_get_value_as_int(qpdf, p_int, &i) == QPDF_TRUE) &&
  694 + (i == 1));
  695 + unsigned long long ul = 0u;
  696 + assert(qpdf_oh_get_value_as_ulonglong(qpdf, p_bool, &ul) == QPDF_FALSE);
  697 + assert((qpdf_oh_get_value_as_ulonglong(qpdf, p_int, &ul) == QPDF_TRUE) &&
  698 + (ul == 1u));
  699 + unsigned int u = 0u;
  700 + assert(qpdf_oh_get_value_as_uint(qpdf, p_bool, &u) == QPDF_FALSE);
  701 + assert((qpdf_oh_get_value_as_uint(qpdf, p_int, &u) == QPDF_TRUE) &&
  702 + (u == 1u));
  703 + double d = 0.0;
  704 + assert(qpdf_oh_get_value_as_number(qpdf, p_bool, &d) == QPDF_FALSE);
  705 + assert((qpdf_oh_get_value_as_number(qpdf, p_int, &d) == QPDF_TRUE) &&
  706 + (((d - 1.0) * (d - 1.0)) < 1e-100));
685 707 assert(qpdf_oh_get_type_code(qpdf, p_int) == ot_integer);
686 708 assert(strcmp(qpdf_oh_get_type_name(qpdf, p_int), "integer") == 0);
687 709 assert(qpdf_oh_is_real(qpdf, p_real) &&
688 710 (strcmp(qpdf_oh_get_real_value(qpdf, p_real), "2.0") == 0) &&
689 711 qpdf_oh_get_numeric_value(qpdf, p_real) == 2.0);
  712 + const char* r = "";
  713 + size_t length = 0;
  714 + assert((qpdf_oh_get_value_as_real(qpdf, p_name, &r, &length) ==
  715 + QPDF_FALSE) &&
  716 + (strcmp(r, "") == 0) &&
  717 + (length == 0));
  718 + assert((qpdf_oh_get_value_as_real(qpdf, p_real, &r, &length) ==
  719 + QPDF_TRUE) &&
  720 + (strcmp(r, "2.0") == 0) &&
  721 + (length == 3));
690 722 assert(qpdf_oh_get_type_code(qpdf, p_real) == ot_real);
691 723 assert(strcmp(qpdf_oh_get_type_name(qpdf, p_real), "real") == 0);
692 724 assert(qpdf_oh_is_string(qpdf, p_string) &&
693 725 (strcmp(qpdf_oh_get_string_value(qpdf, p_string), "3\xf7") == 0) &&
694 726 (strcmp(qpdf_oh_get_utf8_value(qpdf, p_string), "3\xc3\xb7") == 0) &&
695 727 (strcmp(qpdf_oh_unparse_binary(qpdf, p_string), "<33f7>") == 0));
  728 + const char* str = "";
  729 + length = 0;
  730 + assert((qpdf_oh_get_value_as_string(qpdf, p_name, &str, &length) ==
  731 + QPDF_FALSE) &&
  732 + (strcmp(str, "") == 0) &&
  733 + (length == 0));
  734 + assert((qpdf_oh_get_value_as_string(qpdf, p_string, &str, &length) ==
  735 + QPDF_TRUE) &&
  736 + (strcmp(str, "3\xf7") == 0) &&
  737 + (length == 2));
  738 + const char* utf8 = "";
  739 + length = 0;
  740 + assert((qpdf_oh_get_value_as_utf8(qpdf, p_name, &utf8, &length) ==
  741 + QPDF_FALSE) &&
  742 + (strcmp(utf8, "") == 0) &&
  743 + (length == 0));
  744 + assert((qpdf_oh_get_value_as_utf8(qpdf, p_string, &utf8, &length) ==
  745 + QPDF_TRUE) &&
  746 + (strcmp(utf8, "3\xc3\xb7") == 0) &&
  747 + (length == 3));
696 748 assert(qpdf_oh_get_type_code(qpdf, p_string) == ot_string);
697 749 assert(! qpdf_oh_is_name_and_equals(qpdf, p_string, "3\xf7"));
698 750 assert(strcmp(qpdf_oh_get_type_name(qpdf, p_string), "string") == 0);
... ... @@ -709,8 +761,25 @@ static void test25(char const* infile,
709 761 assert(strcmp(qpdf_oh_get_type_name(qpdf, p_null), "null") == 0);
710 762 assert(qpdf_oh_is_bool(qpdf, p_bool) &&
711 763 (qpdf_oh_get_bool_value(qpdf, p_bool) == QPDF_TRUE));
  764 + QPDF_BOOL b = QPDF_FALSE;
  765 + assert((qpdf_oh_get_value_as_bool(qpdf, p_int, &b) == QPDF_FALSE) &&
  766 + b == QPDF_FALSE);
  767 + assert((qpdf_oh_get_value_as_bool(qpdf, p_bool, &b) == QPDF_TRUE) &&
  768 + b == QPDF_TRUE);
  769 + assert((qpdf_oh_get_value_as_bool(qpdf, p_bool_f, &b) == QPDF_TRUE) &&
  770 + b == QPDF_FALSE);
712 771 assert(qpdf_oh_get_type_code(qpdf, p_bool) == ot_boolean);
713 772 assert(strcmp(qpdf_oh_get_type_name(qpdf, p_bool), "boolean") == 0);
  773 + const char* n = "";
  774 + length = 0;
  775 + assert((qpdf_oh_get_value_as_name(qpdf, p_string, &n, &length) ==
  776 + QPDF_FALSE) &&
  777 + (strcmp(n, "") == 0) &&
  778 + (length == 0));
  779 + assert((qpdf_oh_get_value_as_name(qpdf, p_name, &n, &length) ==
  780 + QPDF_TRUE) &&
  781 + (strcmp(n, "/Six") == 0) &&
  782 + (length == 4));
714 783 qpdf_oh_erase_item(qpdf, parsed, 4);
715 784 qpdf_oh_insert_item(
716 785 qpdf, parsed, 2,
... ...
qpdf/qpdf.testcov
... ... @@ -477,16 +477,26 @@ qpdf-c array to wrap_in_array 0
477 477 qpdf-c non-array to wrap_in_array 0
478 478 qpdf-c called qpdf_oh_parse 0
479 479 qpdf-c called qpdf_oh_get_bool_value 0
  480 +qpdf-c called qpdf_oh_get_value_as_bool 0
480 481 qpdf-c called qpdf_oh_get_int_value 0
  482 +qpdf-c called qpdf_oh_get_value_as_longlong 0
481 483 qpdf-c called qpdf_oh_get_int_value_as_int 0
  484 +qpdf-c called qpdf_oh_get_value_as_int 0
482 485 qpdf-c called qpdf_oh_get_uint_value 0
  486 +qpdf-c called qpdf_oh_get_value_as_ulonglong 0
483 487 qpdf-c called qpdf_oh_get_uint_value_as_uint 0
  488 +qpdf-c called qpdf_oh_get_value_as_uint 0
484 489 qpdf-c called qpdf_oh_get_real_value 0
  490 +qpdf-c called qpdf_oh_get_value_as_real 0
485 491 qpdf-c called qpdf_oh_is_number 0
  492 +qpdf-c called qpdf_oh_get_value_as_number 0
486 493 qpdf-c called qpdf_oh_get_numeric_value 0
487 494 qpdf-c called qpdf_oh_get_name 0
  495 +qpdf-c called qpdf_oh_get_value_as_name 0
488 496 qpdf-c called qpdf_oh_get_string_value 0
  497 +qpdf-c called qpdf_oh_get_value_as_string 0
489 498 qpdf-c called qpdf_oh_get_utf8_value 0
  499 +qpdf-c called qpdf_oh_get_value_as_utf8 0
490 500 qpdf-c called qpdf_oh_get_array_n_items 0
491 501 qpdf-c called qpdf_oh_get_array_item 0
492 502 qpdf-c called qpdf_oh_begin_dict_key_iter 0
... ...