file_util.c
Go to the documentation of this file.
1 
9 #include "file_util.h"
10 #include "mcl_core/mcl_assert.h"
11 #include <stdio.h>
12 
13 #if HAVE_FILE_SYSTEM_
14 #include <sys/stat.h>
15 #include <sys/types.h>
16 
17 static mcl_error_t _file_util_fstat(void *file_descriptor, struct stat *file_attributes);
18 #else
19 static const char mcl_no_file_system_message[] = "MCL file utility cannot be used.";
20 #endif
21 
22 #if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
23 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
24 #endif
25 
26 mcl_error_t mcl_file_util_fopen(const char *file_name, const char *mode, void **file_descriptor)
27 {
28 #if HAVE_FILE_SYSTEM_
29  mcl_error_t return_code;
30 
31  MCL_DEBUG_ENTRY("const char *file_name = <%s>, const char *mode = <%s>, void **file_descriptor = <%p>", file_name, mode, file_descriptor);
32 
33  return_code = mcl_file_util_fopen_without_log(file_name, mode, file_descriptor);
34 
35  MCL_DEBUG_LEAVE("retVal = <%d>", return_code);
36  return return_code;
37 #else
39  return MCL_FAIL;
40 #endif
41 }
42 
43 mcl_error_t mcl_file_util_fopen_without_log(const char *file_name, const char *mode, void **file_descriptor)
44 {
45 #if HAVE_FILE_SYSTEM_
46  mcl_error_t return_code = MCL_OK;
47  FILE *file;
48 
49 #if defined(WIN32) || defined(WIN64)
50  fopen_s(&file, file_name, mode);
51 #else
52  file = fopen(file_name, mode);
53 #endif
54  *file_descriptor = file;
55  if (MCL_NULL == file)
56  {
57  return_code = MCL_FAIL;
58  }
59 
60  return return_code;
61 #else
62  return MCL_FAIL;
63 #endif
64 }
65 
66 mcl_error_t mcl_file_util_fclose(void *file_descriptor)
67 {
68 #if HAVE_FILE_SYSTEM_
69  mcl_error_t return_code;
70 
71  MCL_DEBUG_ENTRY("void *file_descriptor = <%p>", file_descriptor);
72 
73  return_code = mcl_file_util_fclose_without_log(file_descriptor);
74 
75  MCL_DEBUG_LEAVE("retVal = <%d>", return_code);
76  return return_code;
77 #else
79  return MCL_FAIL;
80 #endif
81 }
82 
84 {
85 #if HAVE_FILE_SYSTEM_
86  mcl_error_t return_code = MCL_OK;
87 
88  if (MCL_NULL != file_descriptor)
89  {
90  mcl_error_t result = fclose((FILE *)file_descriptor);
91  if (0 != result)
92  {
93  return_code = MCL_FAIL;
94  }
95  }
96 
97  return return_code;
98 #else
99  return MCL_FAIL;
100 #endif
101 }
102 
103 mcl_error_t mcl_file_util_fwrite(const void *data, mcl_size_t size, mcl_size_t count, void *file_descriptor)
104 {
105 #if HAVE_FILE_SYSTEM_
106  mcl_error_t return_code;
107 
108  MCL_DEBUG_ENTRY("const void *data = <%p>, mcl_size_t size = <%u>, mcl_size_t count = <%u>, void *file_descriptor = <%p>",
109  data, size, count, file_descriptor);
110 
111  return_code = mcl_file_util_fwrite_without_log(data, size, count, file_descriptor);
112 
113  MCL_DEBUG_LEAVE("retVal = <%d>", return_code);
114  return return_code;
115 #else
117  return MCL_FAIL;
118 #endif
119 }
120 
121 mcl_error_t mcl_file_util_fwrite_without_log(const void *data, mcl_size_t size, mcl_size_t count, void *file_descriptor)
122 {
123 #if HAVE_FILE_SYSTEM_
124  mcl_error_t return_code = MCL_FAIL;
125 
126  mcl_size_t actual_count = fwrite(data, size, count, (FILE *)file_descriptor);
127  if (count == actual_count)
128  {
129  return_code = MCL_OK;
130  }
131  else
132  {
133  MCL_ERROR("Data can not be written to file.");
134  }
135 
136  return return_code;
137 #else
138  return MCL_FAIL;
139 #endif
140 }
141 
142 void mcl_file_util_fread(void *data, mcl_size_t size, mcl_size_t count, void *file_descriptor, mcl_size_t *actual_count)
143 {
144 #if HAVE_FILE_SYSTEM_
145  MCL_DEBUG_ENTRY("void *data = <%p>, mcl_size_t size = <%u>, mcl_size_t count = <%u>, void *file_descriptor = <%p>, mcl_size_t *actual_count = <%p>",
146  data, size, count, file_descriptor, actual_count);
147 
148  *actual_count = fread(data, size, count, (FILE *)file_descriptor);
149 
150  MCL_DEBUG_LEAVE("retVal = void");
151 #else
153 #endif
154 }
155 
156 mcl_error_t mcl_file_util_fputs(const char *data, void *file_descriptor)
157 {
158 #if HAVE_FILE_SYSTEM_
159  mcl_error_t return_code = MCL_FAIL;
160  mcl_error_t result;
161 
162  MCL_DEBUG_ENTRY("const char *data = <%s>, void *file_descriptor = <%p>", data, file_descriptor);
163 
164  result = fputs(data, (FILE *)file_descriptor);
165  if (0 <= result)
166  {
167  return_code = MCL_OK;
168  }
169  else
170  {
171  MCL_ERROR("Data can not be written to file.");
172  }
173 
174  MCL_DEBUG_LEAVE("retVal = <%d>", return_code);
175  return return_code;
176 #else
178  return MCL_FAIL;
179 #endif
180 }
181 
182 mcl_error_t mcl_file_util_fgets(char *data, mcl_size_t data_size, void *file_descriptor)
183 {
184 #if HAVE_FILE_SYSTEM_
185  mcl_error_t return_code = MCL_FAIL;
186  char *output;
187 
188  MCL_DEBUG_ENTRY("char *data = <%p>, mcl_size_t data_size = <%u>, void *file_descriptor = <%p>", data, data_size, file_descriptor);
189 
190  output = fgets(data, (int)data_size, (FILE *)file_descriptor);
191  if (MCL_NULL != output)
192  {
193  return_code = MCL_OK;
194  }
195  else
196  {
197  MCL_DEBUG("No data is read from file.");
198  }
199 
200  MCL_DEBUG_LEAVE("retVal = <%d>", return_code);
201  return return_code;
202 #else
204  return MCL_FAIL;
205 #endif
206 }
207 
208 mcl_error_t mcl_file_util_fflush(void *file_descriptor)
209 {
210 #if HAVE_FILE_SYSTEM_
211  mcl_error_t return_code;
212 
213  MCL_DEBUG_ENTRY("void *file_descriptor = <%p>", file_descriptor);
214 
215  return_code = mcl_file_util_fflush_without_log(file_descriptor);
216 
217  MCL_DEBUG_LEAVE("retVal = <%d>", return_code);
218  return return_code;
219 #else
221  return MCL_FAIL;
222 #endif
223 }
224 
226 {
227 #if HAVE_FILE_SYSTEM_
228  mcl_error_t return_code = MCL_FAIL;
229  int result;
230 
231  result = fflush((FILE *)file_descriptor);
232 
233  if (0 == result)
234  {
235  return_code = MCL_OK;
236  }
237  else
238  {
239  MCL_ERROR("Error in flush.");
240  }
241 
242  return return_code;
243 #else
245  return MCL_FAIL;
246 #endif
247 }
248 
249 void mcl_file_util_rewind(void *file_descriptor)
250 {
251 #if HAVE_FILE_SYSTEM_
252  MCL_DEBUG_ENTRY("void *file_descriptor = <%p>", file_descriptor);
253 
254  if (MCL_NULL != file_descriptor)
255  {
256  rewind((FILE *)file_descriptor);
257  }
258 
259  MCL_DEBUG_LEAVE("retVal = void");
260 #else
262 #endif
263 }
264 
266 {
267 #if HAVE_FILE_SYSTEM_
268  mcl_bool_t is_regular_file = MCL_FALSE;
269  struct stat file_attributes;
270 
271  MCL_DEBUG_ENTRY("void *file_descriptor = <%p>", file_descriptor);
272 
273 #ifdef S_ISREG
274  if (MCL_OK == _file_util_fstat(file_descriptor, &file_attributes))
275  {
276  is_regular_file = S_ISREG(file_attributes.st_mode);
277  }
278 #endif
279 
280  MCL_DEBUG_LEAVE("retVal = <%d>", is_regular_file);
281  return is_regular_file;
282 #else
284  return MCL_FALSE;
285 #endif
286 }
287 
289 {
290 #if HAVE_FILE_SYSTEM_
291  struct stat file_attributes;
292  mcl_size_t file_size = 0;
293 
294  MCL_DEBUG_ENTRY("void *file_descriptor = <%p>", file_descriptor);
295 
296  if (MCL_OK == _file_util_fstat(file_descriptor, &file_attributes))
297  {
298  file_size = file_attributes.st_size;
299  }
300 
301  MCL_DEBUG_LEAVE("retVal = <%u>", file_size);
302  return file_size;
303 #else
305  return 0;
306 #endif
307 }
308 
310 {
311 #if HAVE_FILE_SYSTEM_
312  struct stat file_attributes;
313  mcl_time_t time = 0;
314 
315  MCL_DEBUG_ENTRY("void *file_descriptor = <%p>", file_descriptor);
316 
317  if (MCL_OK == _file_util_fstat(file_descriptor, &file_attributes))
318  {
319  time = file_attributes.st_ctime;
320  }
321 
322  MCL_DEBUG_LEAVE("retVal = <%u>", time);
323  return time;
324 #else
326  return 0;
327 #endif
328 }
329 
330 #if HAVE_FILE_SYSTEM_
331 static mcl_error_t _file_util_fstat(void *file_descriptor, struct stat *file_attributes)
332 {
333  mcl_error_t return_code = MCL_FAIL;
334  int result;
335 
336  MCL_DEBUG_ENTRY("void *file_descriptor = <%p>, struct stat *file_attributes = <%p>", file_descriptor, file_attributes);
337 
338 #if defined(WIN32) || defined(WIN64)
339  result = fstat(_fileno((FILE *)file_descriptor), file_attributes);
340 #else
341  result = fstat(fileno((FILE *)file_descriptor), file_attributes);
342 #endif
343 
344  if (0 == result)
345  {
346  return_code = MCL_OK;
347  }
348  else
349  {
350  MCL_ERROR("Error in retrieving file attributes.");
351  }
352 
353  MCL_DEBUG_LEAVE("retVal = <%d>", return_code);
354  return return_code;
355 }
356 #endif
mcl_error_t mcl_file_util_fopen(const char *file_name, const char *mode, void **file_descriptor)
Definition: file_util.c:26
size_t mcl_size_t
Assert module header file.
Success.
#define MCL_DEBUG(...)
Definition: mcl_log_util.h:114
mcl_error_t mcl_file_util_fgets(char *data, mcl_size_t data_size, void *file_descriptor)
Definition: file_util.c:182
mcl_error_t mcl_file_util_fopen_without_log(const char *file_name, const char *mode, void **file_descriptor)
Definition: file_util.c:43
mcl_int32_t mcl_error_t
mcl_bool_t mcl_file_util_check_if_regular_file(void *file_descriptor)
Definition: file_util.c:265
#define MCL_DEBUG_ENTRY(...)
Definition: mcl_log_util.h:115
#define MCL_FALSE
mcl_error_t mcl_file_util_fflush_without_log(void *file_descriptor)
Definition: file_util.c:225
#define MCL_ERROR_STRING(string)
Definition: mcl_log_util.h:143
#define MCL_NULL
mcl_error_t mcl_file_util_fflush(void *file_descriptor)
Definition: file_util.c:208
mcl_error_t mcl_file_util_fclose(void *file_descriptor)
Definition: file_util.c:66
#define MCL_ERROR(...)
Definition: mcl_log_util.h:142
mcl_error_t mcl_file_util_fputs(const char *data, void *file_descriptor)
Definition: file_util.c:156
void mcl_file_util_fread(void *data, mcl_size_t size, mcl_size_t count, void *file_descriptor, mcl_size_t *actual_count)
Definition: file_util.c:142
mcl_error_t mcl_file_util_fwrite_without_log(const void *data, mcl_size_t size, mcl_size_t count, void *file_descriptor)
Definition: file_util.c:121
static const char mcl_no_file_system_message[]
Definition: file_util.c:19
File utility module header file.
mcl_size_t mcl_file_util_get_file_size(void *file_descriptor)
Definition: file_util.c:288
time_t mcl_time_t
mcl_error_t mcl_file_util_fclose_without_log(void *file_descriptor)
Definition: file_util.c:83
mcl_uint8_t mcl_bool_t
mcl_time_t mcl_file_util_get_time_of_last_status_change(void *file_descriptor)
Definition: file_util.c:309
void mcl_file_util_rewind(void *file_descriptor)
Definition: file_util.c:249
#define MCL_DEBUG_LEAVE(...)
Definition: mcl_log_util.h:116
mcl_error_t mcl_file_util_fwrite(const void *data, mcl_size_t size, mcl_size_t count, void *file_descriptor)
Definition: file_util.c:103
Internal failure in MCL.