Delete trailing whitespace at end of lines.
[pspp-builds.git] / src / data / make-file.c
1 /* PSPP - computes sample statistics.
2    Copyright (C) 2004 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or
5    modify it under the terms of the GNU General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful, but
10    WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17    02110-1301, USA. */
18
19 #include <config.h>
20 #include <assert.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include "file-name.h"
26 #include "make-file.h"
27 #include <libpspp/message.h>
28 #include <libpspp/alloc.h>
29
30 #include "gettext.h"
31 #define _(msgid) gettext (msgid)
32
33 /* Non ansi compilers may set this */
34 #ifndef P_tmpdir
35 #define P_tmpdir "/tmp"
36 #endif
37
38 /* Creates a temporary file and stores its name in *FILE_NAME and
39    a file descriptor for it in *FD.  Returns success.  Caller is
40    responsible for freeing *FILE_NAME. */
41 int
42 make_temp_file (int *fd, char **file_name)
43 {
44   const char *parent_dir;
45
46   assert (file_name != NULL);
47   assert (fd != NULL);
48
49   if (getenv ("TMPDIR") != NULL)
50     parent_dir = getenv ("TMPDIR");
51   else
52     parent_dir = P_tmpdir;
53
54   *file_name = xmalloc (strlen (parent_dir) + 32);
55   sprintf (*file_name, "%s/psppXXXXXX", parent_dir);
56   *fd = mkstemp (*file_name);
57   if (*fd < 0)
58     {
59       msg (ME, _("%s: Creating temporary file: %s."),
60            *file_name, strerror (errno));
61       free (*file_name);
62       *file_name = NULL;
63       return 0;
64     }
65   return 1;
66 }
67
68
69 /* Creates a temporary file and stores its name in *FILE_NAME and
70    a file stream for it in *FP.  Returns success.  Caller is
71    responsible for freeing *FILE_NAME and for closing *FP */
72 int
73 make_unique_file_stream (FILE **fp, char **file_name)
74 {
75   static int serial = 0;
76   const char *parent_dir;
77
78
79   /* FIXME:
80      Need to check for pre-existing file name.
81      Need also to pass in the directory instead of using /tmp
82   */
83
84   assert (file_name != NULL);
85   assert (fp != NULL);
86
87   if (getenv ("TMPDIR") != NULL)
88     parent_dir = getenv ("TMPDIR");
89   else
90     parent_dir = P_tmpdir;
91
92   *file_name = xmalloc (strlen (parent_dir) + 32);
93
94
95   sprintf (*file_name, "%s/pspp%d.png", parent_dir, serial++);
96
97   *fp = fopen(*file_name, "w");
98
99   if (! *fp )
100     {
101       msg (ME, _("%s: Creating file: %s."), *file_name, strerror (errno));
102       free (*file_name);
103       *file_name = NULL;
104       return 0;
105     }
106
107   return 1;
108 }
109
110
111
112