mirror of
https://github.com/autc04/Retro68.git
synced 2025-02-20 02:29:11 +00:00
use ResType class in Resources lib, prevent dupicate resources
This commit is contained in:
parent
127db48a26
commit
df0e042120
@ -2,6 +2,8 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "ResType.h"
|
||||||
|
|
||||||
void byte(std::ostream& out, int byte)
|
void byte(std::ostream& out, int byte)
|
||||||
{
|
{
|
||||||
out.put((unsigned char)byte);
|
out.put((unsigned char)byte);
|
||||||
@ -11,10 +13,9 @@ void word(std::ostream& out, int word)
|
|||||||
byte(out,(word >> 8) & 0xFF);
|
byte(out,(word >> 8) & 0xFF);
|
||||||
byte(out,word & 0xFF);
|
byte(out,word & 0xFF);
|
||||||
}
|
}
|
||||||
void ostype(std::ostream& out, std::string type)
|
void ostype(std::ostream& out, ResType type)
|
||||||
{
|
{
|
||||||
assert(type.size() == 4);
|
longword(out, type);
|
||||||
out << type;
|
|
||||||
}
|
}
|
||||||
void longword(std::ostream& out, int longword)
|
void longword(std::ostream& out, int longword)
|
||||||
{
|
{
|
||||||
@ -34,12 +35,9 @@ int word(std::istream& in)
|
|||||||
int b = byte(in);
|
int b = byte(in);
|
||||||
return (a << 8) | b;
|
return (a << 8) | b;
|
||||||
}
|
}
|
||||||
std::string ostype(std::istream& in)
|
ResType ostype(std::istream& in)
|
||||||
{
|
{
|
||||||
char s[5];
|
return longword(in);
|
||||||
in.read(s,4);
|
|
||||||
s[4] = 0;
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
int longword(std::istream& in)
|
int longword(std::istream& in)
|
||||||
{
|
{
|
||||||
|
@ -4,14 +4,16 @@
|
|||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
class ResType;
|
||||||
|
|
||||||
void byte(std::ostream& out, int byte);
|
void byte(std::ostream& out, int byte);
|
||||||
void word(std::ostream& out, int word);
|
void word(std::ostream& out, int word);
|
||||||
void ostype(std::ostream& out, std::string type);
|
void ostype(std::ostream& out, ResType type);
|
||||||
void longword(std::ostream& out, int longword);
|
void longword(std::ostream& out, int longword);
|
||||||
|
|
||||||
int byte(std::istream& in);
|
int byte(std::istream& in);
|
||||||
int word(std::istream& in);
|
int word(std::istream& in);
|
||||||
std::string ostype(std::istream& in);
|
ResType ostype(std::istream& in);
|
||||||
int longword(std::istream& in);
|
int longword(std::istream& in);
|
||||||
|
|
||||||
#endif // BINARYIO_H
|
#endif // BINARYIO_H
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
#include "ResType.h"
|
#include "ResType.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
ResType::ResType(const std::string &str)
|
ResType::ResType(const std::string &str)
|
||||||
{
|
{
|
||||||
auto p = str.begin();
|
auto p = str.begin();
|
||||||
auto e = str.end();
|
auto e = str.end();
|
||||||
|
|
||||||
|
assert(str.size() == 4);
|
||||||
|
|
||||||
x = 0;
|
x = 0;
|
||||||
while(p != e)
|
while(p != e)
|
||||||
{
|
{
|
||||||
@ -15,6 +18,23 @@ ResType::ResType(const std::string &str)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResType::ResType(const char *s)
|
||||||
|
{
|
||||||
|
auto p = s;
|
||||||
|
auto e = s + 4;
|
||||||
|
|
||||||
|
assert(s[0] && s[1] && s[2] && s[3] && !s[4]);
|
||||||
|
|
||||||
|
x = 0;
|
||||||
|
while(p != e)
|
||||||
|
{
|
||||||
|
x <<= 8;
|
||||||
|
x |= (*p) & 0xFF;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ResType::operator std::string()
|
ResType::operator std::string()
|
||||||
{
|
{
|
||||||
char c1 = static_cast<char>(x >> 24);
|
char c1 = static_cast<char>(x >> 24);
|
||||||
|
@ -11,6 +11,7 @@ public:
|
|||||||
ResType() : x(0) {}
|
ResType() : x(0) {}
|
||||||
ResType(int x) : x(x) {}
|
ResType(int x) : x(x) {}
|
||||||
ResType(const std::string& s);
|
ResType(const std::string& s);
|
||||||
|
ResType(const char* s);
|
||||||
|
|
||||||
operator int() const { return x; }
|
operator int() const { return x; }
|
||||||
bool operator<(ResType y) const { return x < y.x; }
|
bool operator<(ResType y) const { return x < y.x; }
|
||||||
@ -20,4 +21,15 @@ public:
|
|||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, ResType t);
|
std::ostream& operator<<(std::ostream& out, ResType t);
|
||||||
|
|
||||||
|
struct ResRef : public std::pair<ResType, int>
|
||||||
|
{
|
||||||
|
ResRef() : std::pair<ResType, int>(ResType(), 0) {}
|
||||||
|
ResRef(ResType t, int id) : std::pair<ResType, int>(t,id) {}
|
||||||
|
|
||||||
|
ResType& type() { return first; }
|
||||||
|
ResType type() const { return first; }
|
||||||
|
int& id() { return second; }
|
||||||
|
int id() const { return second; }
|
||||||
|
};
|
||||||
|
|
||||||
#endif // RESTYPE_H
|
#endif // RESTYPE_H
|
||||||
|
@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
void Resources::addResources(const Resources& res)
|
void Resources::addResources(const Resources& res)
|
||||||
{
|
{
|
||||||
resources.insert(resources.end(),res.resources.begin(), res.resources.end());
|
for(auto& rr : res.resources)
|
||||||
|
resources.insert(rr);
|
||||||
|
// resources.insert(resources.end(),res.resources.begin(), res.resources.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Resources::writeFork(std::ostream& out) const
|
void Resources::writeFork(std::ostream& out) const
|
||||||
@ -19,10 +22,11 @@ void Resources::writeFork(std::ostream& out) const
|
|||||||
out.seekp(start + std::streampos(0x100));
|
out.seekp(start + std::streampos(0x100));
|
||||||
std::map< std::string, std::map<int, int> > resourceInfos;
|
std::map< std::string, std::map<int, int> > resourceInfos;
|
||||||
std::streampos datastart = out.tellp();
|
std::streampos datastart = out.tellp();
|
||||||
for(std::vector<Resource>::const_iterator p = resources.begin(); p != resources.end(); ++p)
|
for(auto& rr : resources)
|
||||||
{
|
{
|
||||||
const std::string& data = p->getData();
|
const Resource& r = rr.second;
|
||||||
resourceInfos[ p->getType() ][ p->getID() ] = out.tellp() - datastart;
|
const std::string& data = r.getData();
|
||||||
|
resourceInfos[ r.getType() ][ r.getID() ] = out.tellp() - datastart;
|
||||||
longword(out, data.size());
|
longword(out, data.size());
|
||||||
out << data;
|
out << data;
|
||||||
}
|
}
|
||||||
|
@ -2,22 +2,25 @@
|
|||||||
#define RESOURCEFILES_H
|
#define RESOURCEFILES_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <map>
|
||||||
|
#include "ResType.h"
|
||||||
|
|
||||||
class Resource
|
class Resource
|
||||||
{
|
{
|
||||||
std::string type;
|
ResType type;
|
||||||
int id;
|
int id;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string data;
|
std::string data;
|
||||||
int attr;
|
int attr;
|
||||||
public:
|
public:
|
||||||
Resource(std::string type, int id, std::string data, std::string name = "", int attr = 0)
|
Resource() {}
|
||||||
|
Resource(ResType type, int id, std::string data, std::string name = "", int attr = 0)
|
||||||
: type(type), id(id), data(data), name(name), attr(attr) {}
|
: type(type), id(id), data(data), name(name), attr(attr) {}
|
||||||
|
|
||||||
const std::string& getData() const { return data; }
|
const std::string& getData() const { return data; }
|
||||||
inline std::string getType() const { return type; }
|
inline ResType getType() const { return type; }
|
||||||
inline int getID() const { return id; }
|
inline int getID() const { return id; }
|
||||||
|
inline ResRef getTypeAndID() const { return ResRef(type, id); }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Fork
|
class Fork
|
||||||
@ -29,13 +32,12 @@ public:
|
|||||||
|
|
||||||
class Resources : public Fork
|
class Resources : public Fork
|
||||||
{
|
{
|
||||||
std::vector<Resource> resources;
|
std::map<ResRef, Resource> resources;
|
||||||
public:
|
public:
|
||||||
Resources() {}
|
Resources() {}
|
||||||
Resources(std::istream& in);
|
Resources(std::istream& in);
|
||||||
void writeFork(std::ostream& out) const;
|
void writeFork(std::ostream& out) const;
|
||||||
void addResource(Resource res) { resources.push_back(res); }
|
void addResource(Resource res) { resources[res.getTypeAndID()] = res; }
|
||||||
|
|
||||||
void addResources(const Resources& res);
|
void addResources(const Resources& res);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ int main(int argc, char *argv[])
|
|||||||
std::string fn = argv[i++];
|
std::string fn = argv[i++];
|
||||||
std::string flt = readfile(fn);
|
std::string flt = readfile(fn);
|
||||||
|
|
||||||
rsrc.addResource(Resource("CODE", 0,
|
rsrc.addResource(Resource(ResType("CODE"), 0,
|
||||||
fromhex(
|
fromhex(
|
||||||
"00000028 00000000 00000008 00000020"
|
"00000028 00000000 00000008 00000020"
|
||||||
"0000 3F3C 0001 A9F0"
|
"0000 3F3C 0001 A9F0"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user