plistutil: Check return values from plist API to print proper error messages

and return a meaningful exit code.
diff --git a/tools/plistutil.c b/tools/plistutil.c
index bd83e92..28848fa 100644
--- a/tools/plistutil.c
+++ b/tools/plistutil.c
@@ -148,6 +148,8 @@
 int main(int argc, char *argv[])
 {
     int ret = 0;
+    int input_res = PLIST_ERR_UNKNOWN;
+    int output_res = PLIST_ERR_UNKNOWN;
     FILE *iplist = NULL;
     plist_t root_node = NULL;
     char *plist_out = NULL;
@@ -251,24 +253,30 @@
         // convert from binary to xml or vice-versa
         if (plist_is_binary(plist_entire, read_size))
         {
-            plist_from_bin(plist_entire, read_size, &root_node);
-            plist_to_xml(root_node, &plist_out, &size);
+            input_res = plist_from_bin(plist_entire, read_size, &root_node);
+            if (input_res == PLIST_ERR_SUCCESS) {
+                output_res = plist_to_xml(root_node, &plist_out, &size);
+            }
         }
         else
         {
-            plist_from_xml(plist_entire, read_size, &root_node);
-            plist_to_bin(root_node, &plist_out, &size);
+            input_res = plist_from_xml(plist_entire, read_size, &root_node);
+            if (input_res == PLIST_ERR_SUCCESS) {
+                output_res = plist_to_bin(root_node, &plist_out, &size);
+            }
         }
     }
     else
     {
-        plist_from_memory(plist_entire, read_size, &root_node);
-        if (options->out_fmt == 1) {
-            plist_to_bin(root_node, &plist_out, &size);
-        } else if (options->out_fmt == 2) {
-            plist_to_xml(root_node, &plist_out, &size);
-        } else if (options->out_fmt == 3) {
-            plist_to_json(root_node, &plist_out, &size, 0);
+        input_res = plist_from_memory(plist_entire, read_size, &root_node);
+        if (input_res == PLIST_ERR_SUCCESS) {
+            if (options->out_fmt == 1) {
+                output_res = plist_to_bin(root_node, &plist_out, &size);
+            } else if (options->out_fmt == 2) {
+                output_res = plist_to_xml(root_node, &plist_out, &size);
+            } else if (options->out_fmt == 3) {
+                output_res = plist_to_json(root_node, &plist_out, &size, 0);
+            }
         }
     }
     plist_free(root_node);
@@ -293,9 +301,22 @@
 
         free(plist_out);
     }
-    else {
-        fprintf(stderr, "ERROR: Failed to convert input file.\n");
-        ret = 2;
+
+    if (input_res == PLIST_ERR_SUCCESS) {
+        switch (output_res) {
+            case PLIST_ERR_SUCCESS:
+                break;
+            case PLIST_ERR_FORMAT:
+                fprintf(stderr, "ERROR: Input plist data is not compatible with output format.\n");
+                ret = 2;
+                break;
+            default:
+                fprintf(stderr, "ERROR: Failed to convert plist data (%d)\n", output_res);
+                ret = 1;
+        }
+    } else {
+        fprintf(stderr, "ERROR: Could not parse plist data (%d)\n", input_res);
+        ret = 1;
     }
 
     free(options);