Document of c-modernization-kit (util) 1.0.0
Loading...
Searching...
No Matches
fmtio-util.c
Go to the documentation of this file.
1#include <fmtio-util.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5
6/* ===== 内部ヘルパーマクロ ===== */
7
14#define FMTIO_FORMAT_FILENAME(format, args, fail_return) \
15 char filename[FILE_PATH_MAX] = {0}; \
16 int written; \
17 if (format == NULL) \
18 { \
19 return (fail_return); \
20 } \
21 written = vsnprintf(filename, sizeof(filename), format, args); \
22 if (written < 0) \
23 { \
24 return (fail_return); \
25 } \
26 if (written >= (int)sizeof(filename)) \
27 { \
28 return (fail_return); \
29 }
30
31/* ===== vfopenf / fopenf ===== */
32
33/* Doxygen コメントは、ヘッダに記載 */
34FILE *FMTIO_UTIL_API vfopenf(const char *modes, int *errno_out, const char *format, va_list args)
35{
36 char filename[FILE_PATH_MAX] = {0};
37 int written;
38
39 /* 引数チェック */
40 if (modes == NULL || format == NULL)
41 {
42 if (errno_out != NULL)
43 {
44 *errno_out = EINVAL;
45 }
46 return NULL;
47 }
48
49 /* ファイル名をフォーマット */
50 written = vsnprintf(filename, sizeof(filename), format, args);
51
52 /* フォーマット失敗チェック */
53 if (written < 0)
54 {
55 if (errno_out != NULL)
56 {
57 *errno_out = EINVAL;
58 }
59 return NULL;
60 }
61
62 /* バッファオーバーフローチェック */
63 if (written >= (int)sizeof(filename))
64 {
65 if (errno_out != NULL)
66 {
67 *errno_out = ENAMETOOLONG;
68 }
69 return NULL;
70 }
71
72 /* fopen を呼び出してファイルを開く */
73#ifndef _WIN32
74 errno = 0;
75 FILE *fp = fopen(filename, modes);
76 if (fp == NULL && errno_out != NULL)
77 {
78 *errno_out = errno;
79 }
80 return fp;
81#else /* _WIN32 */
82 FILE *fp = NULL;
83 errno_t err = fopen_s(&fp, filename, modes);
84 if (err != 0)
85 {
86 if (errno_out != NULL)
87 {
88 *errno_out = err;
89 }
90 return NULL;
91 }
92 return fp;
93#endif /* _WIN32 */
94}
95
96/* Doxygen コメントは、ヘッダに記載 */
97FILE *FMTIO_UTIL_API fopenf(const char *modes, int *errno_out, const char *format, ...)
98{
99 FILE *result;
100 va_list args;
101
102 va_start(args, format);
103 result = vfopenf(modes, errno_out, format, args);
104 va_end(args);
105
106 return result;
107}
108
109/* ===== vstatf / statf ===== */
110
111/* Doxygen コメントは、ヘッダに記載 */
112int FMTIO_UTIL_API vstatf(file_stat_t *buf, const char *format, va_list args)
113{
114 FMTIO_FORMAT_FILENAME(format, args, -1)
115
116 /* 引数チェック */
117 if (buf == NULL)
118 {
119 return -1;
120 }
121
122 /* stat を呼び出してファイル情報を取得 */
123#ifndef _WIN32
124 return stat(filename, buf);
125#else /* _WIN32 */
126 /* Windows では _stat64 を使用(file_stat_t は struct _stat64 の typedef) */
127 return _stat64(filename, buf);
128#endif /* _WIN32 */
129}
130
131/* Doxygen コメントは、ヘッダに記載 */
132int FMTIO_UTIL_API statf(file_stat_t *buf, const char *format, ...)
133{
134 int result;
135 va_list args;
136
137 va_start(args, format);
138 result = vstatf(buf, format, args);
139 va_end(args);
140
141 return result;
142}
143
144/* ===== vremovef / removef ===== */
145
146/* Doxygen コメントは、ヘッダに記載 */
147int FMTIO_UTIL_API vremovef(const char *format, va_list args)
148{
149 FMTIO_FORMAT_FILENAME(format, args, -1)
150
151 return remove(filename);
152}
153
154/* Doxygen コメントは、ヘッダに記載 */
155int FMTIO_UTIL_API removef(const char *format, ...)
156{
157 int result;
158 va_list args;
159
160 va_start(args, format);
161 result = vremovef(format, args);
162 va_end(args);
163
164 return result;
165}
166
167/* ===== vopenf / openf ===== */
168
169/* Doxygen コメントは、ヘッダに記載 */
170int FMTIO_UTIL_API vopenf(int flags, int mode, const char *format, va_list args)
171{
172 FMTIO_FORMAT_FILENAME(format, args, -1)
173
174#ifndef _WIN32
175 return open(filename, flags, mode);
176#else /* _WIN32 */
177 return _open(filename, flags, mode);
178#endif /* _WIN32 */
179}
180
181/* Doxygen コメントは、ヘッダに記載 */
182int FMTIO_UTIL_API openf(int flags, int mode, const char *format, ...)
183{
184 int result;
185 va_list args;
186
187 va_start(args, format);
188 result = vopenf(flags, mode, format, args);
189 va_end(args);
190
191 return result;
192}
193
194/* ===== vaccessf / accessf ===== */
195
196/* Doxygen コメントは、ヘッダに記載 */
197int FMTIO_UTIL_API vaccessf(int mode, const char *format, va_list args)
198{
199 FMTIO_FORMAT_FILENAME(format, args, -1)
200
201#ifndef _WIN32
202 return access(filename, mode);
203#else /* _WIN32 */
204 return _access(filename, mode);
205#endif /* _WIN32 */
206}
207
208/* Doxygen コメントは、ヘッダに記載 */
209int FMTIO_UTIL_API accessf(int mode, const char *format, ...)
210{
211 int result;
212 va_list args;
213
214 va_start(args, format);
215 result = vaccessf(mode, format, args);
216 va_end(args);
217
218 return result;
219}
220
221/* ===== vmkdirf / mkdirf ===== */
222
223/* Doxygen コメントは、ヘッダに記載 */
224int FMTIO_UTIL_API vmkdirf(const char *format, va_list args)
225{
226 FMTIO_FORMAT_FILENAME(format, args, -1)
227
228#ifndef _WIN32
229 return mkdir(filename, 0755);
230#else /* _WIN32 */
231 return _mkdir(filename);
232#endif /* _WIN32 */
233}
234
235/* Doxygen コメントは、ヘッダに記載 */
236int FMTIO_UTIL_API mkdirf(const char *format, ...)
237{
238 int result;
239 va_list args;
240
241 va_start(args, format);
242 result = vmkdirf(format, args);
243 va_end(args);
244
245 return result;
246}
int FMTIO_UTIL_API vmkdirf(const char *format, va_list args)
printf 形式でディレクトリ名を指定してディレクトリを作成します (va_list 版)。
Definition fmtio-util.c:224
int FMTIO_UTIL_API accessf(int mode, const char *format,...)
printf 形式でファイル名を指定してアクセス可否を確認します。
Definition fmtio-util.c:209
int FMTIO_UTIL_API vopenf(int flags, int mode, const char *format, va_list args)
printf 形式でファイル名を指定してファイルを開きます (低レベル、va_list 版)。
Definition fmtio-util.c:170
int FMTIO_UTIL_API vremovef(const char *format, va_list args)
printf 形式でファイル名を指定してファイルを削除します (va_list 版)。
Definition fmtio-util.c:147
int FMTIO_UTIL_API removef(const char *format,...)
printf 形式でファイル名を指定してファイルを削除します。
Definition fmtio-util.c:155
FILE *FMTIO_UTIL_API vfopenf(const char *modes, int *errno_out, const char *format, va_list args)
printf 形式でファイル名を指定してファイルを開きます (va_list 版)。
Definition fmtio-util.c:34
int FMTIO_UTIL_API mkdirf(const char *format,...)
printf 形式でディレクトリ名を指定してディレクトリを作成します。
Definition fmtio-util.c:236
FILE *FMTIO_UTIL_API fopenf(const char *modes, int *errno_out, const char *format,...)
printf 形式でファイル名を指定してファイルを開きます。
Definition fmtio-util.c:97
#define FMTIO_FORMAT_FILENAME(format, args, fail_return)
ファイル名フォーマットの共通処理。 va_list から FILE_PATH_MAX バッファにファイル名を展開し、 失敗時は指定された値を返す。 成功時は filename[] に結果が格納される。
Definition fmtio-util.c:14
int FMTIO_UTIL_API statf(file_stat_t *buf, const char *format,...)
printf 形式でファイル名を指定する stat ラッパー関数
Definition fmtio-util.c:132
int FMTIO_UTIL_API vaccessf(int mode, const char *format, va_list args)
printf 形式でファイル名を指定してアクセス可否を確認します (va_list 版)。
Definition fmtio-util.c:197
int FMTIO_UTIL_API openf(int flags, int mode, const char *format,...)
printf 形式でファイル名を指定してファイルを開きます (低レベル)。
Definition fmtio-util.c:182
int FMTIO_UTIL_API vstatf(file_stat_t *buf, const char *format, va_list args)
printf 形式でファイル名を指定する stat ラッパー関数 (va_list 版)。
Definition fmtio-util.c:112
struct stat file_stat_t
Definition fmtio-util.h:12
#define FMTIO_UTIL_API
呼び出し規約マクロ。
Definition fmtio-util.h:102