OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
riff.cpp
Go to the documentation of this file.
1#include "riff.h"
2
3#include <algorithm>
4
5using namespace Dx8;
6
7Riff::Riff(const uint8_t *data, size_t size)
8 :data(data), sz(size) {
9 readHdr(head);
10 sz = std::min(sz,head.size+at);
11 }
12
14 if(std::memcmp(listId,"\0\0\0\0",4)==0)
15 read(&listId,4);
16 }
17
18void Riff::readListId(const char *id) {
19 readListId();
20 if(std::memcmp(listId,id,4)!=0)
21 throw std::runtime_error("invalid track");
22 }
23
24bool Riff::isListId(const char *id) {
25 readListId();
26 return (std::memcmp(listId,id,4)!=0)==0;
27 }
28
29void Riff::read(std::u16string &str) {
30 size_t len = (sz-at)/2;
31 if(len<=1){
32 str.clear();
33 return;
34 }
35 str.resize(len-1);
36 read(&str[0],2*str.size());
37 }
38
39void Riff::read(std::string &str) {
40 size_t len = (sz-at);
41 if(len<=1){
42 str.clear();
43 return;
44 }
45 str.resize(len-1);
46 read(&str[0],str.size());
47 }
48
49void Riff::read(std::vector<uint8_t> &vec) {
50 size_t len = (sz-at);
51 vec.resize(len);
52 if(len>0)
53 read(&vec[0],vec.size());
54 }
55
56void Riff::read(void *ctx, Riff::Callback cb) {
57 while(hasData()) {
58 Riff chunk(data+at,sz-at);
59 cb(ctx,chunk);
60 at+=chunk.head.size+8+(chunk.head.size%2);
61 }
62 }
63
64void Riff::readHdr(Riff::ChunkHeader &h) {
65 read(h.id, 4);
66 read(&h.size,4);
67 }
68
69void Riff::read(void *dest, size_t s) {
70 if(at+s>sz)
71 onError("read err");
72 std::memcpy(dest,data+at,s);
73 at+=s;
74 }
75
76void Riff::skip(size_t s) {
77 if(at+s>sz)
78 onError("read err");
79 at+=s;
80 }
81
82void Riff::onError(const char *msg) {
83 throw std::runtime_error(msg);
84 }
bool hasData() const
Definition riff.h:20
Riff(const uint8_t *data, size_t sz)
Definition riff.cpp:7
void read(std::u16string &str)
Definition riff.cpp:29
void readListId()
Definition riff.cpp:13
void(*)(void *ctx, Riff &chunk) Callback
Definition riff.h:14
void skip(size_t sz)
Definition riff.cpp:76
bool isListId(const char *id)
Definition riff.cpp:24
Definition band.h:10