/* 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
#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"
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
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;
exit (EXIT_SUCCESS);
default:
- exit (EXIT_FAILURE);
+ goto error;
}
}
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, '.');
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))
{
"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;
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);
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