projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix segfault.
[pspp]
/
src
/
language
/
data-io
/
data-writer.c
diff --git
a/src/language/data-io/data-writer.c
b/src/language/data-io/data-writer.c
index 993b81ca3f8dee58f4afb2fd8e56972675600e5f..652d522f3e1ab7ad5f8b363d5c06c09a14e29577 100644
(file)
--- a/
src/language/data-io/data-writer.c
+++ b/
src/language/data-io/data-writer.c
@@
-18,15
+18,15
@@
02110-1301, USA. */
#include <config.h>
02110-1301, USA. */
#include <config.h>
-#include
"data-writer.h"
+#include
<language/data-io/data-writer.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
-#include
"alloc.h"
-#include
"message.h"
-#include
"file-handle.h"
-#include
"filename.h"
-#include
"str.h"
+#include
<libpspp/alloc.h>
+#include
<libpspp/message.h>
+#include
<language/data-io/file-handle.h>
+#include
<data/file-name.h>
+#include
<libpspp/str.h>
#include "gettext.h"
#define _(msgid) gettext (msgid)
#include "gettext.h"
#define _(msgid) gettext (msgid)
@@
-35,7
+35,7
@@
struct dfm_writer
{
struct file_handle *fh; /* File handle. */
struct dfm_writer
{
struct file_handle *fh; /* File handle. */
-
struct file_ext file;
/* Associated file. */
+
FILE *file;
/* Associated file. */
char *bounce; /* Bounce buffer for fixed-size fields. */
};
char *bounce; /* Bounce buffer for fixed-size fields. */
};
@@
-54,22
+54,14
@@
dfm_open_writer (struct file_handle *fh)
w = *aux = xmalloc (sizeof *w);
w->fh = fh;
w = *aux = xmalloc (sizeof *w);
w->fh = fh;
- w->file
.file = NULL
;
+ w->file
= fn_open (fh_get_file_name (w->fh), "wb")
;
w->bounce = NULL;
w->bounce = NULL;
- w->file.filename = xstrdup (fh_get_filename (w->fh));
- w->file.mode = "wb";
- w->file.file = NULL;
- w->file.sequence_no = NULL;
- w->file.param = NULL;
- w->file.postopen = NULL;
- w->file.preclose = NULL;
-
- if (!fn_open_ext (&w->file))
+ if (w->file == NULL)
{
msg (ME, _("An error occurred while opening \"%s\" for writing "
"as a data file: %s."),
{
msg (ME, _("An error occurred while opening \"%s\" for writing "
"as a data file: %s."),
- fh_get_filename (w->fh), strerror (errno));
+ fh_get_file
_
name (w->fh), strerror (errno));
goto error;
}
goto error;
}
@@
-84,7
+76,7
@@
dfm_open_writer (struct file_handle *fh)
bool
dfm_write_error (const struct dfm_writer *writer)
{
bool
dfm_write_error (const struct dfm_writer *writer)
{
- return ferror (writer->file
.file
);
+ return ferror (writer->file);
}
/* Writes record REC having length LEN to the file corresponding to
}
/* Writes record REC having length LEN to the file corresponding to
@@
-110,7
+102,7
@@
dfm_put_record (struct dfm_writer *w, const char *rec, size_t len)
len = rec_width;
}
len = rec_width;
}
- fwrite (rec, len, 1, w->file
.file
);
+ fwrite (rec, len, 1, w->file);
return !dfm_write_error (w);
}
return !dfm_write_error (w);
}
@@
-118,29
+110,29
@@
dfm_put_record (struct dfm_writer *w, const char *rec, size_t len)
bool
dfm_close_writer (struct dfm_writer *w)
{
bool
dfm_close_writer (struct dfm_writer *w)
{
+ char *file_name;
bool ok;
if (w == NULL)
return true;
bool ok;
if (w == NULL)
return true;
+ file_name = xstrdup (fh_get_name (w->fh));
if (fh_close (w->fh, "data file", "ws"))
if (fh_close (w->fh, "data file", "ws"))
- return true;
+ {
+ free (file_name);
+ return true;
+ }
ok = true;
ok = true;
- if (w->file
.file
!= NULL)
+ if (w->file != NULL)
{
{
- ok = !dfm_write_error (w);
- if (!fn_close_ext (&w->file))
- ok = false;
+ ok = !dfm_write_error (w) && !fn_close (file_name, w->file);
if (!ok)
if (!ok)
- msg (ME, _("I/O error occurred writing data file \"%s\"."),
- fh_get_filename (w->fh));
-
- free (w->file.filename);
- w->file.filename = NULL;
+ msg (ME, _("I/O error occurred writing data file \"%s\"."), file_name);
}
free (w->bounce);
free (w);
}
free (w->bounce);
free (w);
+ free (file_name);
return ok;
}
return ok;
}