2012-03-20 01:57:42 +01:00
|
|
|
#include "lc_global.h"
|
2011-09-07 23:06:51 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2017-03-15 21:49:48 +01:00
|
|
|
#include <sys/stat.h>
|
2012-03-21 02:54:03 +01:00
|
|
|
#include "lc_file.h"
|
2011-09-07 23:06:51 +02:00
|
|
|
|
|
|
|
// =============================================================================
|
2012-03-23 00:44:56 +01:00
|
|
|
// lcFile
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
lcFile::lcFile()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
lcFile::~lcFile()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
// =============================================================================
|
|
|
|
// lcMemFile
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
lcMemFile::lcMemFile()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
mGrowBytes = 1024;
|
|
|
|
mPosition = 0;
|
|
|
|
mBufferSize = 0;
|
|
|
|
mFileSize = 0;
|
|
|
|
mBuffer = NULL;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
lcMemFile::~lcMemFile()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
Close();
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcMemFile::Seek(long Offset, int From)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (From == SEEK_SET)
|
|
|
|
mPosition = Offset;
|
|
|
|
else if (From == SEEK_CUR)
|
|
|
|
mPosition += Offset;
|
|
|
|
else if (From == SEEK_END)
|
|
|
|
mPosition = mFileSize + Offset;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
long lcMemFile::GetPosition() const
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2016-03-06 21:19:02 +01:00
|
|
|
return (long)mPosition;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcMemFile::SetLength(size_t NewLength)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (NewLength > mBufferSize)
|
|
|
|
GrowFile(NewLength);
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
if (NewLength < mPosition)
|
|
|
|
mPosition = NewLength;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
mFileSize = NewLength;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2013-07-08 21:23:29 +02:00
|
|
|
size_t lcMemFile::GetLength() const
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
return mFileSize;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcMemFile::Flush()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcMemFile::Close()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (!mBuffer)
|
|
|
|
return;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
mPosition = 0;
|
|
|
|
mBufferSize = 0;
|
|
|
|
mFileSize = 0;
|
|
|
|
free(mBuffer);
|
|
|
|
mBuffer = NULL;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2016-02-17 00:11:52 +01:00
|
|
|
size_t lcMemFile::ReadBuffer(void* Buffer, size_t Bytes)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (Bytes == 0 || mPosition > mFileSize)
|
|
|
|
return 0;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
size_t BytesToRead;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
if (mPosition + Bytes > mFileSize)
|
|
|
|
BytesToRead = mFileSize - mPosition;
|
|
|
|
else
|
|
|
|
BytesToRead = Bytes;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
memcpy(Buffer, mBuffer + mPosition, BytesToRead);
|
|
|
|
mPosition += BytesToRead;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
return BytesToRead;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2016-02-17 00:11:52 +01:00
|
|
|
size_t lcMemFile::WriteBuffer(const void* Buffer, size_t Bytes)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (Bytes == 0)
|
|
|
|
return 0;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
if (mPosition + Bytes > mBufferSize)
|
|
|
|
GrowFile(mPosition + Bytes);
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
memcpy(mBuffer + mPosition, Buffer, Bytes);
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
mPosition += Bytes;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
if (mPosition > mFileSize)
|
|
|
|
mFileSize = mPosition;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
return Bytes;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcMemFile::GrowFile(size_t NewLength)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (NewLength <= mBufferSize)
|
|
|
|
return;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
NewLength = ((NewLength + mGrowBytes - 1) / mGrowBytes) * mGrowBytes;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2017-04-03 02:15:09 +02:00
|
|
|
if (mBuffer)
|
|
|
|
{
|
|
|
|
unsigned char* NewBuffer = (unsigned char*)realloc(mBuffer, NewLength);
|
|
|
|
|
|
|
|
if (!NewBuffer)
|
|
|
|
return;
|
|
|
|
|
|
|
|
mBuffer = NewBuffer;
|
|
|
|
}
|
2012-03-23 00:44:56 +01:00
|
|
|
else
|
|
|
|
mBuffer = (unsigned char*)malloc(NewLength);
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
mBufferSize = NewLength;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
char* lcMemFile::ReadLine(char* Buffer, size_t BufferSize)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
int BytesRead = 0;
|
|
|
|
unsigned char ch;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
if (BufferSize == 0)
|
|
|
|
return NULL;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
if (mPosition >= mFileSize)
|
|
|
|
return NULL;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
while ((--BufferSize))
|
|
|
|
{
|
|
|
|
if (mPosition == mFileSize)
|
|
|
|
break;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
ch = mBuffer[mPosition];
|
|
|
|
mPosition++;
|
|
|
|
Buffer[BytesRead++] = ch;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
if (ch == '\n')
|
|
|
|
break;
|
|
|
|
}
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
Buffer[BytesRead] = 0;
|
|
|
|
return Buffer;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcMemFile::CopyFrom(lcFile& Source)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
size_t Length = Source.GetLength();
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
SetLength(Length);
|
|
|
|
Seek(0, SEEK_SET);
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
Source.Seek(0, SEEK_SET);
|
|
|
|
Source.ReadBuffer(mBuffer, Length);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2014-09-11 21:55:34 +02:00
|
|
|
void lcMemFile::CopyFrom(lcMemFile& Source)
|
|
|
|
{
|
|
|
|
size_t Length = Source.GetLength();
|
|
|
|
|
|
|
|
SetLength(Length);
|
|
|
|
Seek(0, SEEK_SET);
|
|
|
|
|
|
|
|
Source.Seek(0, SEEK_SET);
|
|
|
|
Source.ReadBuffer(mBuffer, Length);
|
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
// =============================================================================
|
|
|
|
// lcDiskFile
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
lcDiskFile::lcDiskFile()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
mFile = NULL;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
lcDiskFile::~lcDiskFile()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
Close();
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
long lcDiskFile::GetPosition() const
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
return ftell(mFile);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcDiskFile::Seek(long Offset, int From)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
fseek(mFile, Offset, From);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcDiskFile::SetLength(size_t NewLength)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2016-03-06 21:19:02 +01:00
|
|
|
fseek(mFile, (int)NewLength, SEEK_SET);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2013-07-08 21:23:29 +02:00
|
|
|
size_t lcDiskFile::GetLength() const
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2017-03-15 21:49:48 +01:00
|
|
|
struct stat st;
|
2017-03-19 11:37:06 +01:00
|
|
|
if (fstat(fileno(mFile), &st) < 0 || (st.st_mode & S_IFMT) != S_IFREG)
|
2017-03-15 21:49:48 +01:00
|
|
|
return 0;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2017-03-15 21:49:48 +01:00
|
|
|
return st.st_size;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcDiskFile::Flush()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (mFile == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
fflush(mFile);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcDiskFile::Close()
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (mFile == NULL)
|
|
|
|
return;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
fclose(mFile);
|
|
|
|
mFile = NULL;
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2016-02-17 00:11:52 +01:00
|
|
|
size_t lcDiskFile::ReadBuffer(void* Buffer, size_t Bytes)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2016-02-17 00:11:52 +01:00
|
|
|
return fread(Buffer, 1, Bytes, mFile);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2016-02-17 00:11:52 +01:00
|
|
|
size_t lcDiskFile::WriteBuffer(const void* Buffer, size_t Bytes)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2016-02-17 00:11:52 +01:00
|
|
|
return fwrite(Buffer, 1, Bytes, mFile);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2015-02-02 07:00:42 +01:00
|
|
|
bool lcDiskFile::Open(const QString& FileName, const char* Mode)
|
|
|
|
{
|
|
|
|
return Open(FileName.toLatin1().constData(), Mode); // todo: qstring
|
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
bool lcDiskFile::Open(const char* FileName, const char* Mode)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
if (*FileName == 0)
|
|
|
|
return false;
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
Close();
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
mFile = fopen(FileName, Mode);
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
return (mFile != NULL);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
char* lcDiskFile::ReadLine(char* Buffer, size_t BufferSize)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2016-03-06 21:19:02 +01:00
|
|
|
return fgets(Buffer, (int)BufferSize, mFile);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
void lcDiskFile::CopyFrom(lcMemFile& Source)
|
2011-09-07 23:06:51 +02:00
|
|
|
{
|
2012-03-23 00:44:56 +01:00
|
|
|
size_t Length = Source.GetLength();
|
2011-09-07 23:06:51 +02:00
|
|
|
|
2012-03-23 00:44:56 +01:00
|
|
|
Seek(0, SEEK_SET);
|
|
|
|
WriteBuffer(Source.mBuffer, Length);
|
2011-09-07 23:06:51 +02:00
|
|
|
}
|