1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2006, 2010, 2011, 2012 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "data/any-reader.h"
27 #include "data/dataset-reader.h"
28 #include "data/file-handle-def.h"
29 #include "data/file-name.h"
30 #include "data/por-file-reader.h"
31 #include "data/sys-file-reader.h"
32 #include "libpspp/assertion.h"
33 #include "libpspp/message.h"
34 #include "libpspp/str.h"
36 #include "gl/xalloc.h"
39 #define _(msgid) gettext (msgid)
41 /* Result of type detection. */
44 YES, /* It is this type. */
45 NO, /* It is not this type. */
46 IO_ERROR /* File couldn't be opened. */
49 /* Tries to detect whether FILE is a given type of file, by opening the file
50 and passing it to DETECT, and returns a detect_result. */
51 static enum detect_result
52 try_detect (const char *file_name, bool (*detect) (FILE *))
57 file = fn_open (file_name, "rb");
60 msg (ME, _("An error occurred while opening `%s': %s."),
61 file_name, strerror (errno));
65 is_type = detect (file);
67 fn_close (file_name, file);
69 return is_type ? YES : NO;
72 /* Returns true if any_reader_open() would be able to open FILE as a data
73 file, false otherwise. */
75 any_reader_may_open (const char *file)
77 return (try_detect (file, sfm_detect) == YES
78 || try_detect (file, pfm_detect) == YES);
81 /* Returns a casereader for HANDLE. On success, returns the new
82 casereader and stores the file's dictionary into *DICT. On
83 failure, returns a null pointer.
85 Ordinarily the reader attempts to automatically detect the character
86 encoding based on the file's contents. This isn't always possible,
87 especially for files written by old versions of SPSS or PSPP, so specifying
88 a nonnull ENCODING overrides the choice of character encoding. */
90 any_reader_open (struct file_handle *handle, const char *encoding,
91 struct dictionary **dict)
93 switch (fh_get_referent (handle))
97 enum detect_result result;
99 result = try_detect (fh_get_file_name (handle), sfm_detect);
100 if (result == IO_ERROR)
102 else if (result == YES)
103 return sfm_open_reader (handle, encoding, dict, NULL);
105 result = try_detect (fh_get_file_name (handle), pfm_detect);
106 if (result == IO_ERROR)
108 else if (result == YES)
109 return pfm_open_reader (handle, dict, NULL);
111 msg (SE, _("`%s' is not a system or portable file."),
112 fh_get_file_name (handle));
117 msg (SE, _("The inline file is not allowed here."));
121 return dataset_reader_open (handle, dict);