Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
RishiRecon
GitHub Repository: RishiRecon/exploits
Path: blob/main/misc/emulator/xnes/snes9x/jma/iiostrm.cpp
28798 views
1
/*
2
Copyright (C) 2005-2006 NSRT Team ( http://nsrt.edgeemu.com )
3
Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net )
4
Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org )
5
6
This library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Lesser General Public
8
License version 2.1 as published by the Free Software Foundation.
9
10
This library is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Lesser General Public License for more details.
14
15
You should have received a copy of the GNU Lesser General Public
16
License along with this library; if not, write to the Free Software
17
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
*/
19
20
#include "portable.h"
21
#include "iiostrm.h"
22
#include "crc32.h"
23
24
HRESULT ISequentialInStream_Array::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize)
25
{
26
if (aSize > size)
27
{
28
aSize = size;
29
}
30
31
*aProcessedSize = aSize;
32
memcpy(aData, data, aSize);
33
size -= aSize;
34
data += aSize;
35
return(S_OK);
36
}
37
38
HRESULT ISequentialOutStream_Array::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize)
39
{
40
if (aSize > size)
41
{
42
overflow = true;
43
aSize = size;
44
}
45
46
*aProcessedSize = aSize;
47
memcpy(data, aData, aSize);
48
size -= aSize;
49
data += aSize;
50
total += aSize;
51
return(S_OK);
52
}
53
54
HRESULT ISequentialInStream_String::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize)
55
{
56
if (aSize > data.size())
57
{
58
aSize = data.size();
59
}
60
61
*aProcessedSize = aSize;
62
memcpy(aData, data.c_str(), aSize);
63
data.erase(0, aSize);
64
return(S_OK);
65
}
66
67
HRESULT ISequentialOutStream_String::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize)
68
{
69
*aProcessedSize = aSize;
70
data.append((const char *)aData, aSize);
71
total += aSize;
72
return(S_OK);
73
}
74
75
HRESULT ISequentialInStream_Istream::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize)
76
{
77
data.read((char *)aData, aSize);
78
*aProcessedSize = data.gcount();
79
return(S_OK);
80
}
81
82
HRESULT ISequentialOutStream_Ostream::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize)
83
{
84
*aProcessedSize = aSize;
85
data.write((char *)aData, aSize);
86
total += aSize;
87
return(S_OK);
88
}
89
90
91
92
HRESULT ISequentialInStreamCRC32_Array::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize)
93
{
94
ISequentialInStream_Array::Read(aData, aSize, aProcessedSize);
95
crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32);
96
return(S_OK);
97
}
98
99
HRESULT ISequentialOutStreamCRC32_Array::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize)
100
{
101
ISequentialOutStream_Array::Write(aData, aSize, aProcessedSize);
102
crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32);
103
return(S_OK);
104
}
105
106
HRESULT ISequentialInStreamCRC32_String::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize)
107
{
108
ISequentialInStream_String::Read(aData, aSize, aProcessedSize);
109
crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32);
110
return(S_OK);
111
}
112
113
HRESULT ISequentialOutStreamCRC32_String::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize)
114
{
115
ISequentialOutStream_String::Write(aData, aSize, aProcessedSize);
116
crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32);
117
return(S_OK);
118
}
119
120
HRESULT ISequentialInStreamCRC32_Istream::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize)
121
{
122
ISequentialInStream_Istream::Read(aData, aSize, aProcessedSize);
123
crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32);
124
return(S_OK);
125
}
126
127
HRESULT ISequentialOutStreamCRC32_Ostream::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize)
128
{
129
ISequentialOutStream_Ostream::Write(aData, aSize, aProcessedSize);
130
crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32);
131
return(S_OK);
132
}
133
134