/*
Copyright (c) 2013 yvt
This file is part of OpenSpades.
OpenSpades is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenSpades is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenSpades. If not, see .
*/
#ifndef _MSC_VER
#include
#else
#include
#define ftruncate _chsize
#define fileno _fileno
#endif
#include "StdStream.h"
#include "Exception.h"
#include "Debug.h"
namespace spades {
StdStream::StdStream(FILE *f, bool ac) : handle(f), autoClose(ac) {
SPADES_MARK_FUNCTION();
if (!f)
SPInvalidArgument("f");
}
StdStream::~StdStream() {
SPADES_MARK_FUNCTION();
if (autoClose)
fclose(handle);
}
int StdStream::ReadByte() {
SPADES_MARK_FUNCTION();
int ret = fgetc(handle);
if (ret == EOF) {
if (ferror(handle)) {
SPRaise("I/O error.");
} else {
return -1;
}
} else {
return ret;
}
}
size_t StdStream::Read(void *buf, size_t bytes) {
SPADES_MARK_FUNCTION_DEBUG();
return fread(buf, 1, bytes, handle);
}
void StdStream::WriteByte(int byte) {
SPADES_MARK_FUNCTION();
if (fputc(byte, handle) != 0) {
SPRaise("I/O error.");
}
}
void StdStream::Write(const void *buf, size_t bytes) {
SPADES_MARK_FUNCTION();
if (fwrite(buf, 1, bytes, handle) < bytes) {
SPRaise("I/O error.");
}
}
uint64_t StdStream::GetPosition() {
SPADES_MARK_FUNCTION_DEBUG();
return ftell(handle);
}
void StdStream::SetPosition(uint64_t pos) {
SPADES_MARK_FUNCTION();
if (pos > 0x7fffffffULL) {
SPRaise("Currently StdStream doesn't support 64-bit offset.");
}
fseek(handle, (long)pos, SEEK_SET);
}
uint64_t StdStream::GetLength() {
SPADES_MARK_FUNCTION();
uint64_t opos = GetPosition();
fseek(handle, 0, SEEK_END);
uint64_t len = GetPosition();
SetPosition(opos);
return len;
}
void StdStream::SetLength(uint64_t len) {
SPADES_MARK_FUNCTION_DEBUG();
// this is not safe
ftruncate(fileno(handle), len);
}
void StdStream::Flush() { fflush(handle); }
}