OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
riff.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdlib>
4#include <cstdint>
5#include <cstring>
6#include <string>
7#include <vector>
8#include <stdexcept>
9
10namespace Dx8 {
11
12class Riff final {
13 public:
14 using Callback = void(*)(void* ctx,Riff& chunk);
15
16 Riff(const uint8_t* data,size_t sz);
17
18 const char* id() const { return head.id; }
19 bool is(const char* idx) const { return head.is(idx); }
20 bool hasData() const { return at<sz; }
21
22 size_t remaning() const { return sz-at; }
23
24 void readListId();
25 void readListId(const char* id);
26 bool isListId(const char* id);
27
28 void read(std::u16string& str);
29 void read(std::string& str);
30 void read(std::vector<uint8_t>& vec);
31 void read(void* dest,size_t sz);
32 void skip(size_t sz);
33 void read(void* ctx, Callback cb);
34 template<class F>
35 void read(F f){
36 Callback cb = [](void* pf,Riff& chunk){
37 F& f = *reinterpret_cast<F*>(pf);
38 f(chunk);
39 };
40 read(&f,cb);
41 }
42
43 template<class T>
44 void readAll(std::vector<T>& all){
45 uint32_t sz=0;
46 read(&sz,4);
47 size_t cnt = remaning()/sz;
48 if(sz>sizeof(T)) {
49 all.resize(cnt);
50 for(size_t i=0;i<cnt;++i) {
51 read(&all[i],sizeof(T));
52 skip(sz-sizeof(T));
53 }
54 } else {
55 all.resize(cnt);
56 for(size_t i=0;i<cnt;++i) {
57 read(&all[i],sz);
58 }
59 }
60 }
61
62 private:
63 struct ChunkHeader final {
64 char id[5]={};
65 std::uint32_t size =0;
66 bool is(const char* idx) const { return std::memcmp(id,idx,4)==0; }
67 };
68
69 void readHdr(ChunkHeader& h);
70
71 [[noreturn]]
72 void onError(const char* msg);
73
74 const uint8_t* data;
75 size_t sz=0;
76 size_t at=0;
77
78 ChunkHeader head;
79 char listId[4]={};
80 };
81
82}
void read(F f)
Definition riff.h:35
const char * id() const
Definition riff.h:18
bool hasData() const
Definition riff.h:20
bool is(const char *idx) const
Definition riff.h:19
void read(std::u16string &str)
Definition riff.cpp:29
size_t remaning() const
Definition riff.h:22
void readAll(std::vector< T > &all)
Definition riff.h:44
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