2009-09-08 15:55:19 +02:00
|
|
|
// Copyright (C) 2005, Ondra Kamenik
|
|
|
|
|
|
|
|
// $Id: memory_file.cpp 987 2006-10-17 14:39:19Z kamenik $
|
|
|
|
|
|
|
|
#include "memory_file.h"
|
|
|
|
|
2009-11-03 15:16:18 +01:00
|
|
|
#include <cstdio>
|
2009-09-08 15:55:19 +02:00
|
|
|
|
|
|
|
using namespace ogu;
|
|
|
|
|
|
|
|
int ogu::calc_pos_offset(int length, const char* str, int line, int col)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
int il = 1;
|
|
|
|
int ic = 1;
|
|
|
|
while (i < length && il <= line && ic <= col) {
|
|
|
|
if (str[i] == '\n') {
|
|
|
|
il++;
|
|
|
|
ic = 1;
|
|
|
|
} else {
|
|
|
|
ic++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ogu::calc_pos_line_and_col(int length, const char* str, int offset,
|
|
|
|
int& line, int& col)
|
|
|
|
{
|
|
|
|
line = 1;
|
|
|
|
col = 0;
|
|
|
|
int i = 0;
|
|
|
|
while (i < length && i < offset) {
|
|
|
|
if (str[i] == '\n') {
|
|
|
|
line++;
|
|
|
|
col = 0;
|
|
|
|
}
|
|
|
|
i++;
|
|
|
|
col++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
MemoryFile::MemoryFile(const char* fname)
|
|
|
|
: len(-1), data(NULL)
|
|
|
|
{
|
|
|
|
FILE* fd = fopen(fname, "rb");
|
|
|
|
if (fd) {
|
|
|
|
// get the file size
|
|
|
|
fseek(fd, 0, SEEK_END);
|
|
|
|
len = ftell(fd);
|
|
|
|
// allocate space for the file plus ending '\0' character
|
|
|
|
data = new char[len+1];
|
|
|
|
// read file and set data
|
|
|
|
fseek(fd, 0, SEEK_SET);
|
|
|
|
int i = 0;
|
|
|
|
int c;
|
|
|
|
while (EOF != (c = fgetc(fd)))
|
|
|
|
data[i++] = (unsigned char)c;
|
|
|
|
data[len] = '\0';
|
|
|
|
fclose(fd);
|
|
|
|
}
|
|
|
|
}
|