
// Copyright {Jagger Software Limited} 2003

#include "io/file_size.hpp"

#include "io/auto_fsetpos.hpp"
#include "c/stdio.hpp"

namespace
{
    std::fpos_t getpos(FILE * stream, int mode)
    {
        std::fpos_t position;

        c::fseek(stream, 0, mode);
        c::fgetpos(stream, &position);

        return position;
    }
}

namespace io
{
    size_t file_size(FILE * stream)
    {
        const auto_fsetpos reset(stream);

        // WARNING: non-portable
        return static_cast<size_t>(::getpos(stream, SEEK_END) - ::getpos(stream, SEEK_SET));
    }
}

