more work on datasets
[pspp] / utilities / pspp-convert.c
index 264ec7a705f7c89b1426eee7e4e3acb09d9d2962..b7dd30b6c9c9e7325fec3b9f2a2458d787c24877 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2013, 2014, 2015 Free Software Foundation, Inc.
+   Copyright (C) 2013, 2014, 2015, 2016 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@
 #include "data/casereader.h"
 #include "data/casewriter.h"
 #include "data/csv-file-writer.h"
+#include "data/dictionary.h"
 #include "data/encrypted-file.h"
 #include "data/file-name.h"
 #include "data/por-file-writer.h"
@@ -46,9 +47,9 @@
 
 static void usage (void);
 
-static void decrypt_file (struct encrypted_file *enc,
-                          const char *input_filename,
-                          const char *output_filename,
+static bool decrypt_file (struct encrypted_file *enc,
+                          const struct file_handle *input_filename,
+                          const struct file_handle *output_filename,
                           const char *password);
 
 int
@@ -58,14 +59,14 @@ main (int argc, char *argv[])
   const char *output_filename;
 
   long long int max_cases = LLONG_MAX;
-  struct dictionary *dict;
+  struct dictionary *dict = NULL;
   struct casereader *reader;
-  struct file_handle *input_fh;
+  struct file_handle *input_fh = NULL;
   const char *encoding = NULL;
   struct encrypted_file *enc;
 
   const char *output_format = NULL;
-  struct file_handle *output_fh;
+  struct file_handle *output_fh = NULL;
   struct casewriter *writer;
   const char *password = NULL;
 
@@ -125,7 +126,7 @@ main (int argc, char *argv[])
           exit (EXIT_SUCCESS);
 
         default:
-          exit (EXIT_FAILURE);
+          goto error;
         }
     }
 
@@ -135,6 +136,8 @@ main (int argc, char *argv[])
 
   input_filename = argv[optind];
   output_filename = argv[optind + 1];
+  input_fh = fh_create_file (NULL, input_filename, NULL, fh_default_properties ());
+
   if (output_format == NULL)
     {
       const char *dot = strrchr (output_filename, '.');
@@ -145,7 +148,8 @@ main (int argc, char *argv[])
       output_format = dot + 1;
     }
 
-  if (encrypted_file_open (&enc, input_filename) > 0)
+  output_fh = fh_create_file (NULL, output_filename, NULL, fh_default_properties ());
+  if (encrypted_file_open (&enc, input_fh) > 0)
     {
       if (encrypted_file_is_sav (enc))
         {
@@ -160,16 +164,17 @@ main (int argc, char *argv[])
                            "format"));
         }
 
-      decrypt_file (enc, input_filename, output_filename, password);
+      if (! decrypt_file (enc, input_fh, output_fh, password))
+       goto error;
+         
       goto exit;
     }
 
-  input_fh = fh_create_file (NULL, input_filename, fh_default_properties ());
+
   reader = any_reader_open_and_decode (input_fh, encoding, &dict, NULL);
   if (reader == NULL)
-    exit (1);
+    goto error;
 
-  output_fh = fh_create_file (NULL, output_filename, fh_default_properties ());
   if (!strcmp (output_format, "csv") || !strcmp (output_format, "txt"))
     {
       struct csv_writer_options options;
@@ -216,32 +221,46 @@ main (int argc, char *argv[])
     error (1, 0, _("%s: error writing output file"), output_filename);
 
 exit:
+  dict_destroy (dict);
+  fh_unref (output_fh);
+  fh_unref (input_fh);
   fh_done ();
   i18n_done ();
 
   return 0;
+
+error:
+  dict_destroy (dict);
+  fh_unref (output_fh);
+  fh_unref (input_fh);
+  fh_done ();
+  i18n_done ();
+
+  return 1;
 }
 
-static void
+static bool
 decrypt_file (struct encrypted_file *enc,
-              const char *input_filename,
-              const char *output_filename,
+             const struct file_handle *ifh,
+             const struct file_handle *ofh,
               const char *password)
 {
   FILE *out;
   int err;
+  const char *input_filename = fh_get_file_name (ifh);
+  const char *output_filename = fh_get_file_name (ofh);
 
   if (password == NULL)
     {
       password = getpass ("password: ");
       if (password == NULL)
-        exit (1);
+       return false;
     }
 
   if (!encrypted_file_unlock (enc, password))
     error (1, 0, _("sorry, wrong password"));
 
-  out = fn_open (output_filename, "wb");
+  out = fn_open (ofh, "wb");
   if (out == NULL)
     error (1, errno, ("%s: error opening output file"), output_filename);
 
@@ -264,7 +283,9 @@ decrypt_file (struct encrypted_file *enc,
 
   if (fflush (out) == EOF)
     error (1, errno, ("%s: write error"), output_filename);
-  fn_close (output_filename, out);
+  fn_close (ofh, out);
+
+  return true;
 }
 
 static void