diff options
| author | Rebellion Developments <rebellion@nomail> | 2000-03-16 11:25:00 +0100 |
|---|---|---|
| committer | Patryk Obara <dreamer.tan@gmail.com> | 2019-08-19 05:45:17 +0200 |
| commit | 218ca90543758a20ac326e444ca0643174ca7384 (patch) | |
| tree | 16bfe3e5307f9f515489000f28728224291a0e3b /3dc/win95/ENUMSCH.CPP | |
Import Aliens vs Predator - Gold (Build 116)
Source code release, imported from:
https://www.gamefront.com/games/aliens-vs-predator-3/file/avp-gold-complete-source-code
All text files were converted to Unix format.
Diffstat (limited to '3dc/win95/ENUMSCH.CPP')
| -rw-r--r-- | 3dc/win95/ENUMSCH.CPP | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/3dc/win95/ENUMSCH.CPP b/3dc/win95/ENUMSCH.CPP new file mode 100644 index 0000000..0138cab --- /dev/null +++ b/3dc/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(); + } + +} + |
