X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fpspp-convert.c;h=f21e5bdb8b907cb51a25a331d9311f436fc743e5;hb=000f6ce901178858530c3877d66976973b6a434c;hp=264ec7a705f7c89b1426eee7e4e3acb09d9d2962;hpb=2ea422dcad13f121dfb5a2f390c3e456f5bcec83;p=pspp diff --git a/utilities/pspp-convert.c b/utilities/pspp-convert.c index 264ec7a705..f21e5bdb8b 100644 --- a/utilities/pspp-convert.c +++ b/utilities/pspp-convert.c @@ -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; @@ -198,6 +203,8 @@ main (int argc, char *argv[]) output_filename); NOT_REACHED (); } + if (!writer) + error (1, 0, _("%s: error opening output file"), output_filename); for (i = 0; i < max_cases; i++) { @@ -216,32 +223,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 +285,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