diff options
Diffstat (limited to 'src/win95/enumsch.cpp')
| -rw-r--r-- | src/win95/enumsch.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/win95/enumsch.cpp b/src/win95/enumsch.cpp new file mode 100644 index 0000000..0138cab --- /dev/null +++ b/src/win95/enumsch.cpp @@ -0,0 +1,163 @@ +#include <string.h> + +#include "enumsch.hpp" + +#ifdef cencon +#define new my_new +#endif + +//macro for helping to force inclusion of chunks when using libraries +FORCE_CHUNK_INCLUDE_IMPLEMENT(enumsch) + +Enum_Constant::Enum_Constant(char const * const _cname, int const _value) : cname(0), value(_value), reserved(0) +{ + if (_cname) + { + cname = new char[strlen(_cname)+1]; + strcpy(cname,_cname); + } +} + +Enum_Constant::Enum_Constant(Enum_Constant const & ec2) : reserved(ec2.reserved), value(ec2.value), cname(0) +{ + if (ec2.cname) + { + cname = new char[strlen(ec2.cname)+1]; + strcpy(cname,ec2.cname); + } +} + +Enum_Constant & Enum_Constant::operator = (Enum_Constant const & ec2) +{ + if (cname) delete[] cname; + cname = 0; + value = ec2.value; + reserved = ec2.reserved; + if (ec2.cname) + { + cname = new char[strlen(ec2.cname)+1]; + strcpy(cname,ec2.cname); + } + + return *this; +} + +BOOL Enum_Constant::operator == (Enum_Constant const & ec2) const +{ + if (cname && ec2.cname) + if (!strcmp(cname,ec2.cname)) return TRUE; + return FALSE; +} + +BOOL Enum_Constant::operator != (Enum_Constant const & ec2) const +{ + if (cname && ec2.cname) + if (!strcmp(cname,ec2.cname)) return FALSE; + return TRUE; +} + +BOOL Enum_Constant::operator < (Enum_Constant const & ec2) const +{ + if (cname && ec2.cname) + if (strcmp(cname,ec2.cname)<0) return TRUE; + return FALSE; +} + + +Enum_Constant::Enum_Constant(char const * sdata) +: value(*(int *)sdata), reserved(*(int *)(sdata+4)), cname(0) +{ + sdata+=8; + if (*sdata) + { + cname = new char[strlen(sdata)+1]; + strcpy(cname,sdata); + } +} + +size_t Enum_Constant::size_chunk() const +{ + return 8 + ((cname ? strlen(cname)+1 : 1) +3 &~3); +} + +void Enum_Constant::fill_data_block (char * data_start) +{ + *(int*)data_start = value; + *(int*)(data_start+4) = reserved; + + data_start += 8; + + strcpy(data_start,cname ? cname : ""); +} + + +/////// +RIF_IMPLEMENT_DYNCREATE("BMPENUMS",BMP_Enums_Chunk) + +BMP_Enums_Chunk::BMP_Enums_Chunk(Chunk_With_Children * const parent, char const * sdata, size_t const /*ssize*/) +: Chunk(parent,"BMPENUMS") +, reserved1(*(int *)sdata) +, reserved2(*(int *)(sdata+4)) +, ctype(0) +{ + sdata+=8; + unsigned int const len = strlen(sdata)+1; + + if (len>1) + { + ctype = new char[len]; + strcpy(ctype,sdata); + } + + sdata += len + 3 &~3; + + unsigned int const enlistsize = *(int *)sdata; + sdata += 4; + + for (unsigned int i = enlistsize; i; --i) + { + Enum_Constant current(sdata); + sdata += current.size_chunk(); + enums.add_entry(current); + } +} + +size_t BMP_Enums_Chunk::size_chunk () +{ + chunk_size = 12 + 8 + (ctype ? strlen(ctype)+1 : 1) + 4 +3 &~3; + + for (LIF<Enum_Constant> li(&enums); !li.done(); li.next()) + { + chunk_size += li().size_chunk(); + } + return chunk_size; +} + +void BMP_Enums_Chunk::fill_data_block (char * data_start) +{ + strncpy (data_start, identifier, 8); + data_start += 8; + + *(int *) data_start = chunk_size; + data_start += 4; + + *(int*)data_start = reserved1; + *(int*)(data_start+4) = reserved2; + data_start += 8; + + strcpy(data_start,ctype ? ctype : ""); + data_start += strlen(data_start)+1 +3 &~3; + + *(int *)data_start = enums.size(); + data_start += 4; + + for (LIF<Enum_Constant> li(&enums); !li.done(); li.next()) + { + Enum_Constant current(li()); + + current.fill_data_block(data_start); + data_start += current.size_chunk(); + } + +} + |
