FileStream: Fix potential segfault
[gemrb.git] / gemrb / core / System / MemoryStream.cpp
blob1ce9656f584735c027239d1c1890642e0bb13942
1 /* GemRB - Infinity Engine Emulator
2 * Copyright (C) 2003 The GemRB Project
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include "System/MemoryStream.h"
23 #include "win32def.h"
25 #include <cstring>
27 MemoryStream::MemoryStream(void* buffer, int length, bool autoFree)
29 ptr = buffer;
30 size = length;
31 Pos = 0;
32 strcpy( filename, "" );
33 this->autoFree = autoFree;
36 MemoryStream::~MemoryStream(void)
38 if (autoFree) {
39 free( ptr );
43 int MemoryStream::Read(void* dest, unsigned int length)
45 if (length + Pos > size) {
46 return GEM_ERROR;
48 ieByte* p = ( ieByte* ) ptr + Pos;
49 memcpy( dest, p, length );
50 if (Encrypted) {
51 ReadDecrypted( dest, length );
53 Pos += length;
54 return GEM_OK;
57 int MemoryStream::Seek(int newpos, int type)
59 switch (type) {
60 case GEM_CURRENT_POS:
61 if (( Pos + newpos ) > size) {
62 printf("[Streams]: Invalid seek\n");
63 return GEM_ERROR;
65 Pos += newpos;
66 break;
68 case GEM_STREAM_START:
69 if ((unsigned long) newpos > size) {
70 printf("[Streams]: Invalid seek\n");
71 return GEM_ERROR;
73 Pos = newpos;
74 break;
76 default:
77 return GEM_ERROR;
79 return GEM_OK;
82 /** No descriptions */
83 int MemoryStream::ReadLine(void* buf, unsigned int maxlen)
85 if(!maxlen) {
86 return 0;
88 unsigned char * p = ( unsigned char * ) buf;
89 if (Pos >= size) {
90 p[0]=0;
91 return -1;
93 unsigned int i = 0;
94 while (i < ( maxlen - 1 )) {
95 ieByte ch = *( ( ieByte* ) ptr + Pos );
96 if (Pos == size)
97 break;
98 if (Encrypted)
99 p[i] ^= GEM_ENCRYPTION_KEY[Pos & 63];
100 Pos++;
101 if (( ( char ) ch ) == '\n')
102 break;
103 if (( ( char ) ch ) == '\t')
104 ch = ' ';
105 if (( ( char ) ch ) != '\r')
106 p[i++] = ch;
108 p[i] = 0;
109 return i;