        -:    0:Source:fmtio-util.c
        -:    0:Graph:/__w/c-modernization-kit/c-modernization-kit/test/util/src/libutilTest/fopenfTest/obj/fmtio-util.gcno
        -:    0:Data:/__w/c-modernization-kit/c-modernization-kit/test/util/src/libutilTest/fopenfTest/obj/fmtio-util.gcda
        -:    0:Runs:1
        -:    1:#include <fmtio-util.h>
        -:    2:#include <stdlib.h>
        -:    3:#include <string.h>
        -:    4:#include <errno.h>
        -:    5:
        -:    6:/* ===== 内部ヘルパーマクロ ===== */
        -:    7:
        -:    8:/**
        -:    9: *  ファイル名フォーマットの共通処理。
        -:   10: *  va_list から FILE_PATH_MAX バッファにファイル名を展開し、
        -:   11: *  失敗時は指定された値を返す。
        -:   12: *  成功時は filename[] に結果が格納される。
        -:   13: */
        -:   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 コメントは、ヘッダに記載 */
        1:   34:FILE *FMTIO_UTIL_API vfopenf(const char *modes, int *errno_out, const char *format, va_list args)
        -:   35:{
        1:   36:    char filename[FILE_PATH_MAX] = {0};
        -:   37:    int written;
        -:   38:
        -:   39:    /* 引数チェック */
        1:   40:    if (modes == NULL || format == NULL)
        -:   41:    {
    #####:   42:        if (errno_out != NULL)
        -:   43:        {
    #####:   44:            *errno_out = EINVAL;
        -:   45:        }
    #####:   46:        return NULL;
        -:   47:    }
        -:   48:
        -:   49:    /* ファイル名をフォーマット */
        1:   50:    written = vsnprintf(filename, sizeof(filename), format, args);
        -:   51:
        -:   52:    /* フォーマット失敗チェック */
        1:   53:    if (written < 0)
        -:   54:    {
    #####:   55:        if (errno_out != NULL)
        -:   56:        {
    #####:   57:            *errno_out = EINVAL;
        -:   58:        }
    #####:   59:        return NULL;
        -:   60:    }
        -:   61:
        -:   62:    /* バッファオーバーフローチェック */
        1:   63:    if (written >= (int)sizeof(filename))
        -:   64:    {
        1:   65:        if (errno_out != NULL)
        -:   66:        {
    #####:   67:            *errno_out = ENAMETOOLONG;
        -:   68:        }
        1:   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 コメントは、ヘッダに記載 */
        1:   97:FILE *FMTIO_UTIL_API fopenf(const char *modes, int *errno_out, const char *format, ...)
        -:   98:{
        -:   99:    FILE *result;
        -:  100:    va_list args;
        -:  101:
        1:  102:    va_start(args, format);
        1:  103:    result = vfopenf(modes, errno_out, format, args);
        1:  104:    va_end(args);
        -:  105:
        1:  106:    return result;
        -:  107:}
        -:  108:
        -:  109:/* ===== vstatf / statf ===== */
        -:  110:
        -:  111:/* Doxygen コメントは、ヘッダに記載 */
    #####:  112:int 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 コメントは、ヘッダに記載 */
    #####:  132:int 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 コメントは、ヘッダに記載 */
    #####:  147:int 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 コメントは、ヘッダに記載 */
    #####:  155:int 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 コメントは、ヘッダに記載 */
    #####:  170:int 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 コメントは、ヘッダに記載 */
    #####:  182:int 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 コメントは、ヘッダに記載 */
    #####:  197:int 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 コメントは、ヘッダに記載 */
    #####:  209:int 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 コメントは、ヘッダに記載 */
    #####:  224:int 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 コメントは、ヘッダに記載 */
    #####:  236:int 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:}
