aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/EmPalmStructs.h
diff options
context:
space:
mode:
Diffstat (limited to 'SrcShared/EmPalmStructs.h')
-rw-r--r--SrcShared/EmPalmStructs.h1136
1 files changed, 1136 insertions, 0 deletions
diff --git a/SrcShared/EmPalmStructs.h b/SrcShared/EmPalmStructs.h
new file mode 100644
index 0000000..b066be4
--- /dev/null
+++ b/SrcShared/EmPalmStructs.h
@@ -0,0 +1,1136 @@
+/* -*- mode: C++; tab-width: 4 -*- */
+/* ===================================================================== *\
+ Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries.
+ All rights reserved.
+
+ This file is part of the Palm OS Emulator.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+\* ===================================================================== */
+
+#ifndef EmPalmStructs_h
+#define EmPalmStructs_h
+
+#include "EmMemory.h" // EmMemGet8, EmMemPut8, EmMem_memcpy, etc.
+#include "EmPalmStructs.i"
+#include "HostControl.h" // HostControlSelectorType, etc.
+
+#include <stddef.h> // ptrdiff_t
+
+/*
+ The Palm OS Emulator interacts closely with legacy Palm OS data
+ structures. These data structures are laid out by the compilers
+ designed for the Palm OS. However, the Palm OS Emulator -- which needs
+ to access these structures at times -- is NOT necessarily compiled with
+ a compiler that lays out the structures in a compatible fashion. Thus,
+ if the emulator needs to muck with, say, a variable of EventType, it
+ can't merely create one and have at it. Nor can it get a pointer to
+ one, cast it to an EventType*, and have at it. There's just no guarantee
+ that the compiler used to build Poser will put the fields in the same
+ places that the Palm OS expects it, or that the architecture will
+ support accessing fields in those places.
+
+ To solve this problem, for each Palm OS struct Poser wants to
+ manipulate, it creates two parallel "Rep" classes: an "Alias" class and
+ a "Proxy" class. These Rep classes appear and act as much as the
+ original struct as possible. However, behind the scenes C++ magic
+ allows Poser to access the data in a manner that is guaranteed to be
+ binary-compatible with the Palm OS structs, regardless of what platform
+ it's running on and what compiler it was built with.
+
+ Aliases and Proxies are very similar to each other in the way the user
+ interacts with them. The have fields which, when used as an lvalue,
+ will store the proferred data in the correct memory location and with
+ the correct endianness and, when used as an rvalue, will produce the
+ necessary value, fetching the data from the correct memory location and
+ byteswapping it if necessary.
+
+ Aliases and Proxies differ in their backing store. An Alias class is
+ initialized with a pointer to some buffer that already exists. This
+ buffer may exist as a Poser variable or as a buffer in the emulated Palm
+ OS space. All data accesses are made against that provided buffer.
+ When an Alias is created from another Alias, they both end up pointing
+ to the same space. If one Alias is used to modify the buffer, the
+ second Alias will also reflect that change.
+
+ Proxies, on the other hand, are more stand-alone. They provide their
+ own buffers as a backing store. Copying one Proxy to another or
+ creating one Proxy from another results in a new independent object.
+ After the copy has been made, modifying one object does not affect the
+ second.
+
+ Aliases are not only handy for wrapping a chunk of data that was
+ generated elsewhere, but they are also essential for providing an "array
+ operator" (that is, "operator[]") for both kinds of Rep classes. That
+ operator returns an Alias that points to the right location in memory.
+ If we didn't have Aliases -- for instance, we only had Proxies -- then
+ the Proxy returned by operator[] could not be used to modify the backing
+ store, since it's independent of the backing store used by the object
+ that created it.
+
+ Proxies, on the other hand, are handy when you need to treat an object
+ more like a real-live struct. Proxies can be copied and put into
+ STL-like collections without having to worry about the lifetime of the
+ object they were created from.
+
+ Let's look at the Alias class for EventType:
+
+ template <class A>
+ class EmAliasEventType
+ {
+ public:
+ typedef typename A::ptr_type ptr_type;
+
+ EmAliasEventType (ptr_type);
+ EmAliasEventType (const EmAliasEventType&);
+
+ ptr_type GetPtr (void) const;
+ static size_t GetSize (void);
+
+ EmAliasEventType<A>& operator= (const EmAliasEventType<A>&);
+ EmAliasEventType<A> operator[] (int);
+
+ private:
+ EmAliasEventType (void);
+
+ EmAliasEventType<A>& operator= (const bool);
+ EmAliasEventType<A>& operator= (const char);
+ EmAliasEventType<A>& operator= (const unsigned char);
+ EmAliasEventType<A>& operator= (const unsigned short);
+ EmAliasEventType<A>& operator= (const unsigned int);
+ EmAliasEventType<A>& operator= (const unsigned long);
+ EmAliasEventType<A>& operator= (const signed char);
+ EmAliasEventType<A>& operator= (const signed short);
+ EmAliasEventType<A>& operator= (const signed int);
+ EmAliasEventType<A>& operator= (const signed long);
+ EmAliasEventType<A>& operator= (const void*);
+
+ ptr_type fPtr;
+
+ public:
+ EmAliasInt16<A> eType;
+ EmAliasBoolean<A> penDown;
+ EmAliasUInt8<A> tapCount;
+ EmAliasInt16<A> screenX;
+ EmAliasInt16<A> screenY;
+ EmAliasEventTypeData<A> data;
+ };
+
+ This is a template class parameterized with a data accessor. This data
+ accessor has static methods for reading and writing 1-, 2-, and 4-byte
+ values. In this module, we define two such accessors. One, called LAS
+ for Local Address Space, accesses Big Endian values in Poser's address
+ space. The second, called PAS for Palm Address Space, accesses Big
+ Endian values in the emulated address space.
+
+ There are two constructors. The first constructor takes a pointer to an
+ appropriately-sized buffer that already exists -- all reads and write
+ take place against that buffer. The second constructor is the copy
+ constructor. It copies the pointer used by the original object. After
+ the copy, if the original object modifies the data in the backing store,
+ the copy with reflect that change, too.
+
+ GetPtr returns the pointer to the buffer backing the struct. The return
+ type of this function is based on the class the proxy class is
+ instantiated with. It is void* if used with LAS, and emuptr if used
+ with PAS.
+
+ GetSize returns the size of the represented struct, in this case
+ EventType, which is 24 bytes long.
+
+ An assignment operator is provided to perform a memberwise copy
+ operation.
+
+ An array operator is provided to return Alias objects that point to the
+ appropriately index location in memory.
+
+ Following these standard methods are the fields. These fields are also
+ Alias classes, initialized with the base pointer passed into the
+ EmAliasEventType constructor plus an appropriate offset.
+
+ Now let's take a look at a Proxy class:
+
+ class EmProxyEventType
+ {
+ public:
+ typedef void ptr_type;
+
+ EmProxyEventType (void);
+ EmProxyEventType (const EmProxyEventType&);
+
+ ptr_type GetPtr (void) const;
+ static size_t GetSize (void);
+
+ EmProxyEventType& operator= (const EmProxyEventType&);
+ EmAliasEventType<LAS> operator[] (int);
+
+ private:
+ EmProxyEventType& operator= (const bool);
+ EmProxyEventType& operator= (const char);
+ EmProxyEventType& operator= (const unsigned char);
+ EmProxyEventType& operator= (const unsigned short);
+ EmProxyEventType& operator= (const unsigned int);
+ EmProxyEventType& operator= (const unsigned long);
+ EmProxyEventType& operator= (const signed char);
+ EmProxyEventType& operator= (const signed short);
+ EmProxyEventType& operator= (const signed int);
+ EmProxyEventType& operator= (const signed long);
+ EmProxyEventType<& operator= (const void*);
+
+ char fLocalData[24];
+
+ public:
+ EmAliasInt16<LAS> eType;
+ EmAliasBoolean<LAS> penDown;
+ EmAliasUInt8<LAS> tapCount;
+ EmAliasInt16<LAS> screenX;
+ EmAliasInt16<LAS> screenY;
+ EmAliasEventTypeData<LAS> data;
+ };
+
+ As you can see, this Proxy class is almost the same as an Alias class.
+ However:
+
+ * Instead of having an fPtr field to hold the pointer to the data
+ buffer, it has an fLocalData field that holds the data itself.
+
+ * There is no constructor that accepts a pointer. Instead, there
+ is a public default constructor.
+
+ * It is not a template class. Since the data is local, it is
+ always accessed in a manner consistant with the LAS accessor.
+
+ * The copy constructor copies the data instead of the pointer.
+
+ There are two sorts of Rep classes: primitive and aggregate. Primitive
+ Rep classes are responsible for the management of simple scalar types.
+ Aggregate Rep classes represent structs, and are composed of other
+ primitive and aggregate Alias classes. The biggest difference between
+ primitive and aggregate Rep classes is the set of assignment operators
+ clients are allowed to call. For instance, you can assign integers to
+ primitive Rep classes, but not to aggregate Rep classes
+
+ EXAMPLE:
+
+ Say you wanted to call void EvtAddEventToQueue (EventType*).
+ You would use EmEventType as follows:
+
+ EmProxyEventType event; // Use local buffer
+
+ event.eType = penDownEvent;
+ event.penDown = true;
+ event.screenX = 100;
+ event.screenY = 100;
+
+ EvtAddEventToQueue((EventType*) event.GetPtr ());
+
+ EFFICIENCY:
+
+ There is some overhead using these classes instead of using structs
+ directly. At the very least, there's an additional level of
+ redirection, as the fields accessed contain pointers to the actual
+ data as opposed to the actual data itself. Additionally, on Little
+ Endian systems, there is the cost of byteswapping on every access.
+ Finally, there is the cost of calling and executing the proxy class
+ constructor.
+
+ In EmPalmStructs.cpp, there are two functions: Test1 and Test2. The
+ first accesses the struct SysPktRPC2Type using the proxy class, the
+ second using the struct directly.
+
+ On the Mac, using CW Pro 5.2 with optimizations on, Test1 is 88
+ bytes, calls an out-of-line constructor, and each field access takes
+ one additional level of indirection. Test2 is 64 bytes. The 24-byte
+ difference is taken up by an additional 4 bytes for each of the
+ assignments, and an additional 12 bytes to call the proxy class's
+ constructor.
+
+ LIMITATIONS:
+
+ * Can't take the adress of an EmFoo. Will get *its* address
+ instead of what you want (the address of the storage). Instead,
+ call GetPtr.
+
+ * Need explicit casts to extract the value in cases where the
+ type is ambigous. Classic case is "printf("%d", my_EmInt)". The
+ object will be pushed onto the stack, not the wrapped integer.
+
+ * Can't take the size of the object. Instead, call GetSize.
+
+ * Can't call offsetof to get field offsets. Instead, call
+ offsetof_<fieldName>. Note that this returns the offset of the most
+ immediate struct. That is, struct1.struct2.offsetof_field()
+ returns the offset from the beginning of struct2 to field.
+ Calling offsetof(StructType1, struct2.field) returns the offset
+ from the beginning of struct1 to the field.
+
+ * Need a way to copy between classes instantiated with different
+ address space objects.
+*/
+
+int BadGetter (void);
+void BadSetter (void);
+
+#if PLATFORM_MAC
+
+#define PUT_BE_LONG(p, v) *(uint32*) p = (v)
+#define PUT_BE_SHORT(p, v) *(uint16*) p = (v)
+#define PUT_BE_BYTE(p, v) *(uint8*) p = (v)
+
+#define GET_BE_LONG(p) (*(uint32*) p)
+#define GET_BE_SHORT(p) (*(uint16*) p)
+#define GET_BE_BYTE(p) (*(uint8*) p)
+
+#else
+
+#define PUT_BE_LONG(p, v) do { \
+ ((unsigned char*)(p))[0] = (unsigned char)(((unsigned long)(v)) >> 24); \
+ ((unsigned char*)(p))[1] = (unsigned char)(((unsigned long)(v)) >> 16); \
+ ((unsigned char*)(p))[2] = (unsigned char)(((unsigned long)(v)) >> 8); \
+ ((unsigned char*)(p))[3] = (unsigned char)(((unsigned long)(v)) >> 0); \
+ } while(0)
+
+#define PUT_BE_SHORT(p, v) do { \
+ ((unsigned char*)(p))[0] = (unsigned char)(((unsigned short)(v)) >> 8); \
+ ((unsigned char*)(p))[1] = (unsigned char)(((unsigned short)(v)) >> 0); \
+ } while(0)
+
+#define PUT_BE_BYTE(p, v) do { \
+ ((unsigned char*)(p))[0] = (unsigned char)(v); \
+ } while(0)
+
+#define GET_BE_LONG(p) (unsigned long)(\
+ (((unsigned long)((unsigned char*)(p))[0]) << 24) | \
+ (((unsigned long)((unsigned char*)(p))[1]) << 16) | \
+ (((unsigned long)((unsigned char*)(p))[2]) << 8) | \
+ (((unsigned long)((unsigned char*)(p))[3]) << 0) \
+ )
+
+#define GET_BE_SHORT(p) (unsigned short)(\
+ (((unsigned short)((unsigned char*)(p))[0]) << 8) | \
+ (((unsigned short)((unsigned char*)(p))[1]) << 0) \
+ )
+
+#define GET_BE_BYTE(p) (unsigned char)(\
+ (((unsigned char)((unsigned char*)(p))[0]) << 0) \
+ )
+
+#endif
+
+
+// Provide methods for getting and setting Big Endian data in Local Address Space
+
+class LAS
+{
+ public:
+ typedef void* ptr_type;
+
+ inline static uint8 GetByte (ptr_type p) { return (uint8) GET_BE_BYTE (p); }
+ inline static uint16 GetWord (ptr_type p) { return (uint16) GET_BE_SHORT (p); }
+ inline static uint32 GetLong (ptr_type p) { return (uint32) GET_BE_LONG (p); }
+ inline static void PutByte (ptr_type p, const uint8 v) { PUT_BE_BYTE (p, v); }
+ inline static void PutWord (ptr_type p, const uint16 v) { PUT_BE_SHORT (p, v); }
+ inline static void PutLong (ptr_type p, const uint32 v) { PUT_BE_LONG (p, v); }
+
+ inline static void BlockCopy (ptr_type d, ptr_type s, size_t len)
+ { memcpy (d, s, len); }
+
+ inline static ptr_type add (ptr_type p, ptrdiff_t diff)
+ { return (ptr_type)(((size_t)p) + diff); }
+ inline static ptrdiff_t diff (ptr_type a, ptr_type b)
+ { return (ptrdiff_t)(((ptrdiff_t)a) - (ptrdiff_t)b); }
+};
+
+
+// Provide methods for getting and setting Big Endian data in Palm Addres Space
+
+class PAS
+{
+ public:
+ typedef emuptr ptr_type;
+
+ inline static uint8 GetByte (ptr_type p) { return (uint8) EmMemGet8 (p); }
+ inline static uint16 GetWord (ptr_type p) { return (uint16) EmMemGet16 (p); }
+ inline static uint32 GetLong (ptr_type p) { return (uint32) EmMemGet32 (p); }
+ inline static void PutByte (ptr_type p, const uint8 v) { EmMemPut8 (p, v); }
+ inline static void PutWord (ptr_type p, const uint16 v) { EmMemPut16 (p, v); }
+ inline static void PutLong (ptr_type p, const uint32 v) { EmMemPut32 (p, v); }
+
+ inline static void BlockCopy (ptr_type d, ptr_type s, size_t len)
+ { EmMem_memcpy (d, s, len); }
+
+ inline static ptr_type add (ptr_type p, ptrdiff_t diff)
+ { return (ptr_type)(((size_t)p) + diff); }
+ inline static ptrdiff_t diff (ptr_type a, ptr_type b)
+ { return (ptrdiff_t)(((ptrdiff_t)a) - (ptrdiff_t)b); }
+};
+
+
+// ======================================================================
+// Macro for creating the class that wraps up simple types.
+// ======================================================================
+
+#define DECLARE_SCALAR_ALIAS(type, asType) \
+ \
+ template <class A> \
+ class EmAlias##type \
+ { \
+ public: \
+ typedef typename A::ptr_type ptr_type; \
+ \
+ EmAlias##type (ptr_type); \
+ EmAlias##type (const EmAlias##type<A>&); \
+ \
+ ptr_type GetPtr (void) const { return fPtr; } \
+ static size_t GetSize (void) { return sizeof (asType); } \
+ \
+ EmAlias##type<A>& operator= (const bool); \
+ EmAlias##type<A>& operator= (const char); \
+ \
+ EmAlias##type<A>& operator= (const unsigned char); \
+ EmAlias##type<A>& operator= (const unsigned short); \
+ EmAlias##type<A>& operator= (const unsigned int); \
+ EmAlias##type<A>& operator= (const unsigned long); \
+ \
+ EmAlias##type<A>& operator= (const signed char); \
+ EmAlias##type<A>& operator= (const signed short); \
+ EmAlias##type<A>& operator= (const signed int); \
+ EmAlias##type<A>& operator= (const signed long); \
+ \
+ EmAlias##type<A>& operator= (const void*); \
+ EmAlias##type<A>& operator= (const EmAlias##type<A>&); \
+ \
+ operator type (void) const; \
+ \
+ EmAlias##type<A> operator[] (int); \
+ const EmAlias##type<A> operator[] (int) const; \
+ \
+ private: \
+ EmAlias##type (void); \
+ \
+ ptr_type fPtr; \
+ };
+
+#define DECLARE_SCALAR_PROXY(type, asType) \
+ \
+ class EmProxy##type \
+ { \
+ public: \
+ typedef void* ptr_type; \
+ \
+ EmProxy##type (void); \
+ EmProxy##type (const EmProxy##type&); \
+ \
+ ptr_type GetPtr (void) const { return (ptr_type) &fLocalData; } \
+ static size_t GetSize (void) { return sizeof (asType); } \
+ \
+ EmProxy##type& operator= (const bool); \
+ EmProxy##type& operator= (const char); \
+ \
+ EmProxy##type& operator= (const unsigned char); \
+ EmProxy##type& operator= (const unsigned short); \
+ EmProxy##type& operator= (const unsigned int); \
+ EmProxy##type& operator= (const unsigned long); \
+ \
+ EmProxy##type& operator= (const signed char); \
+ EmProxy##type& operator= (const signed short); \
+ EmProxy##type& operator= (const signed int); \
+ EmProxy##type& operator= (const signed long); \
+ \
+ EmProxy##type& operator= (const void*); \
+ EmProxy##type& operator= (const EmProxy##type&); \
+ \
+ operator type (void) const; \
+ \
+ EmAlias##type<LAS> operator[] (int); \
+ const EmAlias##type<LAS> operator[] (int) const; \
+ \
+ private: \
+ struct { \
+ char _bytes[sizeof (asType)]; \
+ } fLocalData; \
+ };
+
+#define DECLARE_SCALAR_CLASSES(type, asType) \
+ DECLARE_SCALAR_ALIAS(type, asType) \
+ DECLARE_SCALAR_PROXY(type, asType)
+
+#define DEFINE_SCALAR_ALIAS(type, asType) \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>::EmAlias##type (void) : \
+ fPtr ((ptr_type) NULL) \
+ { \
+ } \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>::EmAlias##type (ptr_type p) : \
+ fPtr (p) \
+ { \
+ } \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>::EmAlias##type (const EmAlias##type<A>& that) : \
+ fPtr (that.GetPtr ()) \
+ { \
+ } \
+ \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, bool) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, char) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, signed char) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, signed short) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, signed int) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, signed long) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, unsigned char) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, unsigned short) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, unsigned int) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, unsigned long) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, const void*) \
+ MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, const EmAlias##type<A>&)\
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>::operator type (void) const \
+ { \
+ if (sizeof (asType) == 1) \
+ return (type) A::GetByte((ptr_type) fPtr); \
+ \
+ if (sizeof (asType) == 2) \
+ return (type) A::GetWord((ptr_type) fPtr); \
+ \
+ if (sizeof (asType) == 4) \
+ return (type) A::GetLong((ptr_type) fPtr); \
+ \
+ return (type) BadGetter (); \
+ } \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A> EmAlias##type<A>::operator [] (int index) \
+ { \
+ return EmAlias##type<A> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ } \
+ \
+ template <class A> \
+ INLINE_ const EmAlias##type<A> EmAlias##type<A>::operator [] (int index) const \
+ { \
+ return EmAlias##type<A> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ }
+
+#define DEFINE_SCALAR_PROXY(type, asType) \
+ \
+ INLINE_ EmProxy##type::EmProxy##type (void) \
+ { \
+ } \
+ \
+ INLINE_ EmProxy##type::EmProxy##type (const EmProxy##type& that) \
+ { \
+ *this = (asType) (type) that; \
+ } \
+ \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, bool) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, char) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, signed char) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, signed short) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, signed int) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, signed long) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, unsigned char) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, unsigned short) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, unsigned int) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, unsigned long) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, const void*) \
+ MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, const EmProxy##type&) \
+ \
+ INLINE_ EmProxy##type::operator type (void) const \
+ { \
+ if (sizeof (asType) == 1) \
+ return (type) LAS::GetByte((ptr_type) &fLocalData); \
+ \
+ if (sizeof (asType) == 2) \
+ return (type) LAS::GetWord((ptr_type) &fLocalData); \
+ \
+ if (sizeof (asType) == 4) \
+ return (type) LAS::GetLong((ptr_type) &fLocalData); \
+ \
+ return (type) BadGetter (); \
+ } \
+ \
+ INLINE_ EmAlias##type<LAS> EmProxy##type::operator [] (int index) \
+ { \
+ return EmAlias##type<LAS> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ } \
+ \
+ INLINE_ const EmAlias##type<LAS> EmProxy##type::operator [] (int index) const \
+ { \
+ return EmAlias##type<LAS> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ }
+
+#define DEFINE_SCALAR_CLASSES(type, asType) \
+ DEFINE_SCALAR_ALIAS(type, asType) \
+ DEFINE_SCALAR_PROXY(type, asType)
+
+// Macro that creates the implementation for an assignment operator for simple types.
+
+#define MAKE_ONE_SCALAR_ALIAS_ASSIGNMENT_OPERATOR(type, asType, rhs_type) \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>& EmAlias##type<A>::operator= (rhs_type val) \
+ { \
+ if (sizeof (asType) == 1) A::PutByte (this->GetPtr (), (unsigned char) (asType) val); \
+ else if (sizeof (asType) == 2) A::PutWord (this->GetPtr (), (unsigned short) (asType) val); \
+ else if (sizeof (asType) == 4) A::PutLong (this->GetPtr (), (unsigned long) (asType) val); \
+ else BadSetter (); \
+ \
+ return *this; \
+ }
+
+#define MAKE_ONE_SCALAR_PROXY_ASSIGNMENT_OPERATOR(type, asType, rhs_type) \
+ \
+ INLINE_ EmProxy##type& EmProxy##type::operator= (rhs_type val) \
+ { \
+ if (sizeof (asType) == 1) LAS::PutByte (this->GetPtr (), (unsigned char) (asType) val); \
+ else if (sizeof (asType) == 2) LAS::PutWord (this->GetPtr (), (unsigned short) (asType) val); \
+ else if (sizeof (asType) == 4) LAS::PutLong (this->GetPtr (), (unsigned long) (asType) val); \
+ else BadSetter (); \
+ \
+ return *this; \
+ }
+
+
+// ======================================================================
+// Macro for creating the class that wraps up aggregate types.
+// ======================================================================
+
+#define DECLARE_STRUCT_ALIAS(type, size, FOR_EACH_FIELD) \
+ \
+ template <class A> \
+ class EmAlias##type \
+ { \
+ public: \
+ typedef typename A::ptr_type ptr_type; \
+ \
+ EmAlias##type (ptr_type); \
+ EmAlias##type (const EmAlias##type&); \
+ \
+ ptr_type GetPtr (void) const { return fPtr; } \
+ static size_t GetSize (void) { return size; } \
+ \
+ EmAlias##type<A>& operator= (const EmAlias##type<A>&); \
+ \
+ EmAlias##type<A> operator[] (int); \
+ const EmAlias##type<A> operator[] (int) const; \
+ \
+ private: \
+ EmAlias##type (void); \
+ \
+ ptr_type fPtr; \
+ \
+ public: \
+ FOR_EACH_FIELD(DECLARE_FIELD_ALIAS) \
+ FOR_EACH_FIELD(DECLARE_FIELD_OFFSET) \
+ };
+
+#define DECLARE_STRUCT_PROXY(type, size, FOR_EACH_FIELD) \
+ \
+ class EmProxy##type \
+ { \
+ public: \
+ typedef void* ptr_type; \
+ \
+ EmProxy##type (void); \
+ EmProxy##type (const EmProxy##type&); \
+ \
+ ptr_type GetPtr (void) const { return (ptr_type) &fLocalData; } \
+ static size_t GetSize (void) { return size; } \
+ \
+ EmProxy##type& operator= (const EmProxy##type&); \
+ \
+ EmAlias##type<LAS> operator[] (int); \
+ const EmAlias##type<LAS> operator[] (int) const; \
+ \
+ private: \
+ struct { \
+ char _bytes[size]; \
+ } fLocalData; \
+ \
+ public: \
+ FOR_EACH_FIELD(DECLARE_FIELD_PROXY) \
+ FOR_EACH_FIELD(DECLARE_FIELD_OFFSET) \
+ };
+
+#define DECLARE_STRUCT_CLASSES(type, size, FOR_EACH_FIELD) \
+ DECLARE_STRUCT_ALIAS(type, size, FOR_EACH_FIELD) \
+ DECLARE_STRUCT_PROXY(type, size, FOR_EACH_FIELD)
+
+#define DEFINE_STRUCT_ALIAS(type, size, FOR_EACH_FIELD) \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>::EmAlias##type (void) : \
+ fPtr ((ptr_type) NULL) \
+ FOR_EACH_FIELD(MAKE_MEMBER_INITIALIZER_ALIAS) \
+ { \
+ } \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>::EmAlias##type (ptr_type p) : \
+ fPtr (p) \
+ FOR_EACH_FIELD(MAKE_MEMBER_INITIALIZER_ALIAS) \
+ { \
+ } \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>::EmAlias##type (const EmAlias##type<A>& that) : \
+ fPtr (that.fPtr) \
+ FOR_EACH_FIELD(MAKE_MEMBER_INITIALIZER_ALIAS) \
+ { \
+ } \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A>& EmAlias##type<A>::operator= (const EmAlias##type<A>& val) \
+ { \
+ if (this != &val) \
+ { \
+ A::BlockCopy (this->GetPtr (), val.GetPtr (), this->GetSize ()); \
+ } \
+ \
+ return *this; \
+ } \
+ \
+ template <class A> \
+ INLINE_ EmAlias##type<A> EmAlias##type<A>::operator [] (int index) \
+ { \
+ return EmAlias##type<A> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ } \
+ \
+ template <class A> \
+ INLINE_ const EmAlias##type<A> EmAlias##type<A>::operator [] (int index) const \
+ { \
+ return EmAlias##type<A> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ }
+
+#define DEFINE_STRUCT_PROXY(type, size, FOR_EACH_FIELD) \
+ \
+ INLINE_ EmProxy##type::EmProxy##type (void) : \
+ fLocalData () \
+ FOR_EACH_FIELD(MAKE_MEMBER_INITIALIZER_PROXY) \
+ { \
+ } \
+ \
+ INLINE_ EmProxy##type::EmProxy##type (const EmProxy##type& that) : \
+ fLocalData () \
+ FOR_EACH_FIELD(MAKE_MEMBER_INITIALIZER_PROXY) \
+ { \
+ *this = that; \
+ } \
+ \
+ INLINE_ EmProxy##type& EmProxy##type::operator= (const EmProxy##type& val) \
+ { \
+ if (this != &val) \
+ { \
+ LAS::BlockCopy (this->GetPtr (), val.GetPtr (), this->GetSize ()); \
+ } \
+ \
+ return *this; \
+ } \
+ \
+ INLINE_ EmAlias##type<LAS> EmProxy##type::operator [] (int index) \
+ { \
+ return EmAlias##type<LAS> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ } \
+ \
+ INLINE_ const EmAlias##type<LAS> EmProxy##type::operator [] (int index) const \
+ { \
+ return EmAlias##type<LAS> ((ptr_type) (((char*) this->GetPtr ()) + index * this->GetSize ())); \
+ }
+
+#define DEFINE_STRUCT_CLASSES(type, size, FOR_EACH_FIELD) \
+ DEFINE_STRUCT_ALIAS(type, size, FOR_EACH_FIELD) \
+ DEFINE_STRUCT_PROXY(type, size, FOR_EACH_FIELD)
+
+// Macro for creating the data member that acts as a proxy for the data
+// we're wrapping up.
+
+#define DECLARE_FIELD_ALIAS(field_offset, field_type, field_name) \
+ \
+ EmAlias##field_type<A> field_name;
+
+
+#define DECLARE_FIELD_PROXY(field_offset, field_type, field_name) \
+ \
+ EmAlias##field_type<LAS> field_name;
+
+
+#define DECLARE_FIELD_OFFSET(field_offset, field_type, field_name) \
+ \
+ static size_t offsetof_##field_name (void) { return field_offset; }
+
+
+// Macros for creating the data member initializers in the constructors
+
+#define MAKE_MEMBER_INITIALIZER_ALIAS(field_offset, field_type, field_name) \
+ \
+ , field_name((ptr_type) (((char*) fPtr) + field_offset))
+
+
+#define MAKE_MEMBER_INITIALIZER_PROXY(field_offset, field_type, field_name) \
+ \
+ , field_name((ptr_type) (((char*) this->GetPtr ()) + field_offset))
+
+
+
+
+typedef uint8 UIOptionsType;
+typedef uint8 ScrOperation;
+
+#define FOR_EACH_SCALAR_1(DO_TO_SCALAR) \
+ DO_TO_SCALAR (char, char) \
+ DO_TO_SCALAR (Int8, Int8) \
+ DO_TO_SCALAR (UInt8, UInt8) \
+ DO_TO_SCALAR (Int16, Int16) \
+ DO_TO_SCALAR (UInt16, UInt16) \
+ DO_TO_SCALAR (Int32, Int32) \
+ DO_TO_SCALAR (UInt32, UInt32) \
+
+
+#define FOR_EACH_SCALAR_2(DO_TO_SCALAR) \
+ DO_TO_SCALAR (Boolean, uint8) \
+ DO_TO_SCALAR (Char, uint8) \
+ DO_TO_SCALAR (ControlStyleType, uint8) \
+ DO_TO_SCALAR (Coord, uint16) \
+ DO_TO_SCALAR (DmResID, uint16) \
+ DO_TO_SCALAR (emuptr, emuptr) \
+ DO_TO_SCALAR (Err, uint16) \
+ DO_TO_SCALAR (FontID, uint8) \
+ DO_TO_SCALAR (FormObjectKind, uint8) \
+ DO_TO_SCALAR (LocalID, uint32) \
+
+
+#define FOR_EACH_SCALAR_3(DO_TO_SCALAR) \
+ DO_TO_SCALAR (NetIPAddr, uint32) \
+ DO_TO_SCALAR (PatternType, uint8) \
+ DO_TO_SCALAR (ScrOperation, uint8) \
+ DO_TO_SCALAR (SlkPktHeaderChecksum, uint8) \
+ DO_TO_SCALAR (UnderlineModeType, uint8) \
+ DO_TO_SCALAR (UndoMode, uint8) \
+ DO_TO_SCALAR (UIOptionsType, uint8) \
+ DO_TO_SCALAR (WChar, uint16) \
+
+
+#define FOR_EACH_SCALAR_4(DO_TO_SCALAR) \
+ DO_TO_SCALAR (HostControlSelectorType, uint16) \
+ DO_TO_SCALAR (HostBoolType, int32) \
+ DO_TO_SCALAR (HostClockType, int32) \
+ DO_TO_SCALAR (HostErrType, int32) \
+ DO_TO_SCALAR (HostIDType, int32) \
+ DO_TO_SCALAR (HostPlatformType, int32) \
+ DO_TO_SCALAR (HostSignalType, int32) \
+ DO_TO_SCALAR (HostSizeType, int32) \
+ DO_TO_SCALAR (HostTimeType, int32) \
+
+
+#define FOR_EACH_STRUCT_1(DO_TO_STRUCT) \
+ FOR_AbsRectType_STRUCT (DO_TO_STRUCT) \
+ FOR_PointType_STRUCT (DO_TO_STRUCT) \
+ FOR_RectangleType_STRUCT (DO_TO_STRUCT) \
+ FOR_RGBColorType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_2(DO_TO_STRUCT) \
+ FOR_BreakpointType_STRUCT (DO_TO_STRUCT) \
+ FOR_M68KRegsType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_UsbHwrType_STRUCT (DO_TO_STRUCT) \
+ FOR_HwrBatCmdReadType_STRUCT (DO_TO_STRUCT) \
+ FOR_HwrJerryPLDType_STRUCT (DO_TO_STRUCT) \
+ FOR_HwrLAPType_STRUCT (DO_TO_STRUCT) \
+ FOR_HwrMediaQ11xxType_STRUCT (DO_TO_STRUCT) \
+ FOR_HwrPalmI705PLDType_STRUCT (DO_TO_STRUCT) \
+ FOR_HwrSymbolASICType_STRUCT (DO_TO_STRUCT) \
+ FOR_SED1375RegsType_STRUCT (DO_TO_STRUCT) \
+ FOR_SED1376RegsType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_SysBatteryDataStructV1_STRUCT (DO_TO_STRUCT) \
+ FOR_SysBatteryDataStructV2_STRUCT (DO_TO_STRUCT) \
+ FOR_SysBatteryDataStructV3_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_SysNVParamsType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_3(DO_TO_STRUCT) \
+ FOR_ClipboardItem_STRUCT (DO_TO_STRUCT) \
+ FOR_FieldUndoType_STRUCT (DO_TO_STRUCT) \
+ FOR_GraphicStateTypeV1_STRUCT (DO_TO_STRUCT) \
+ FOR_GraphicStateTypeV2_STRUCT (DO_TO_STRUCT) \
+ FOR_GraphicStateTypeV3_STRUCT (DO_TO_STRUCT) \
+ FOR_UIColorStateType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_4(DO_TO_STRUCT) \
+ FOR_UIGlobalsType_STRUCT (DO_TO_STRUCT) \
+ FOR_UIGlobalsTypeCommon_STRUCT (DO_TO_STRUCT) \
+ FOR_UIGlobalsTypeV1_STRUCT (DO_TO_STRUCT) \
+ FOR_UIGlobalsTypeV2_STRUCT (DO_TO_STRUCT) \
+ FOR_UIGlobalsTypeV3_STRUCT (DO_TO_STRUCT) \
+ FOR_UIGlobalsTypeV31_STRUCT (DO_TO_STRUCT) \
+ FOR_UIGlobalsTypeV32_STRUCT (DO_TO_STRUCT) \
+ FOR_UIGlobalsTypeV35_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_5(DO_TO_STRUCT) \
+ FOR_M68KExcTableType_STRUCT (DO_TO_STRUCT) \
+ FOR_FixedGlobalsType_STRUCT (DO_TO_STRUCT) \
+ FOR_LowMemHdrType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysAppInfoType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysLibTblEntryType_STRUCT (DO_TO_STRUCT) \
+ FOR_PenBtnInfoType_STRUCT (DO_TO_STRUCT) \
+ FOR_SndCommandType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_kernel_info_task_STRUCT (DO_TO_STRUCT) \
+ FOR_kernel_info_semaphore_STRUCT (DO_TO_STRUCT) \
+ FOR_kernel_info_timer_STRUCT (DO_TO_STRUCT) \
+ FOR_SysKernelInfoType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_6(DO_TO_STRUCT) \
+ FOR_SlkPktFooterType_STRUCT (DO_TO_STRUCT) \
+ FOR_SlkPktHeaderType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_SysPktRPCParamType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_SysPktBodyType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktContinueCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktDbgBreakToggleCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktDbgBreakToggleRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktFindCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktFindRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktGetBreakpointsCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktEmptyRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktGetBreakpointsRspType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_7(DO_TO_STRUCT) \
+ FOR_SysPktGetTrapBreaksCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktGetTrapBreaksRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktGetTrapConditionsCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktGetTrapConditionsRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktReadMemCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktReadMemRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktReadRegsCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktReadRegsRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktRPC2Type_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktRPCType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktRtnNameCmdType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_8(DO_TO_STRUCT) \
+ FOR_SysPktRtnNameRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktSetBreakpointsCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktSetBreakpointsRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktSetTrapBreaksCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktSetTrapConditionsCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktSetTrapConditionsRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktStateCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktStateRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktWriteMemCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktWriteMemRspType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktWriteRegsCmdType_STRUCT (DO_TO_STRUCT) \
+ FOR_SysPktWriteRegsRspType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_9(DO_TO_STRUCT) \
+ FOR_RecordEntryType_STRUCT (DO_TO_STRUCT) \
+ FOR_RsrcEntryType_STRUCT (DO_TO_STRUCT) \
+ FOR_RecordListType_STRUCT (DO_TO_STRUCT) \
+ FOR_DatabaseHdrType_STRUCT (DO_TO_STRUCT) \
+ FOR_DatabaseDirEntryType_STRUCT (DO_TO_STRUCT) \
+ FOR_DatabaseDirType_STRUCT (DO_TO_STRUCT) \
+ FOR_DmOpenInfoType_STRUCT(DO_TO_STRUCT) \
+ FOR_DmAccessType_STRUCT(DO_TO_STRUCT) \
+ FOR_DmSearchStateType_STRUCT(DO_TO_STRUCT) \
+ \
+ FOR_CardHeaderType_STRUCT(DO_TO_STRUCT) \
+ FOR_CardInfoType_STRUCT(DO_TO_STRUCT) \
+ FOR_StorageHeaderType_STRUCT(DO_TO_STRUCT) \
+ \
+ FOR_ExgGoToType_STRUCT (DO_TO_STRUCT) \
+ FOR_ExgSocketType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_DlkDBCreatorList_STRUCT (DO_TO_STRUCT) \
+ FOR_DlkServerSessionType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_10(DO_TO_STRUCT) \
+ FOR_generic_STRUCT (DO_TO_STRUCT) \
+ FOR_penUp_STRUCT (DO_TO_STRUCT) \
+ FOR_keyDown_STRUCT (DO_TO_STRUCT) \
+ FOR_winEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_winExit_STRUCT (DO_TO_STRUCT) \
+ FOR_tsmConfirm_STRUCT (DO_TO_STRUCT) \
+ FOR_tsmFepButton_STRUCT (DO_TO_STRUCT) \
+ FOR_tsmFepMode_STRUCT (DO_TO_STRUCT) \
+ FOR_ctlEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_ctlSelect_STRUCT (DO_TO_STRUCT) \
+ FOR_ctlRepeat_STRUCT (DO_TO_STRUCT) \
+ FOR_ctlExit_STRUCT (DO_TO_STRUCT) \
+ FOR_fldEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_fldHeightChanged_STRUCT (DO_TO_STRUCT) \
+ FOR_fldChanged_STRUCT (DO_TO_STRUCT) \
+ FOR_fldExit_STRUCT (DO_TO_STRUCT) \
+ FOR_lstEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_lstExit_STRUCT (DO_TO_STRUCT) \
+ FOR_lstSelect_STRUCT (DO_TO_STRUCT) \
+ FOR_tblEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_tblExit_STRUCT (DO_TO_STRUCT) \
+ FOR_tblSelect_STRUCT (DO_TO_STRUCT) \
+ FOR_frmLoad_STRUCT (DO_TO_STRUCT) \
+ FOR_frmOpen_STRUCT (DO_TO_STRUCT) \
+ FOR_frmGoto_STRUCT (DO_TO_STRUCT) \
+ FOR_frmClose_STRUCT (DO_TO_STRUCT) \
+ FOR_frmUpdate_STRUCT (DO_TO_STRUCT) \
+ FOR_frmTitleEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_frmTitleSelect_STRUCT (DO_TO_STRUCT) \
+ FOR_attnIndicatorEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_attnIndicatorSelect_STRUCT (DO_TO_STRUCT) \
+ FOR_daySelect_STRUCT (DO_TO_STRUCT) \
+ FOR_menu_STRUCT (DO_TO_STRUCT) \
+ FOR_popSelect_STRUCT (DO_TO_STRUCT) \
+ FOR_sclEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_sclExit_STRUCT (DO_TO_STRUCT) \
+ FOR_sclRepeat_STRUCT (DO_TO_STRUCT) \
+ FOR_menuCmdBarOpen_STRUCT (DO_TO_STRUCT) \
+ FOR_menuOpen_STRUCT (DO_TO_STRUCT) \
+ FOR_gadgetEnter_STRUCT (DO_TO_STRUCT) \
+ FOR_gadgetMisc_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_EventTypeData_STRUCT (DO_TO_STRUCT) \
+ FOR_EventType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_11(DO_TO_STRUCT) \
+ FOR_ROMDBRecordHeader1Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMDBResourceHeader1Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMDBHeader1Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMCardHeader5Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMStoreHeader4Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMHeapHeader1Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMHeapHeader2Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMHeapHeader3Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMDBDir1Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMHeapChunkHdr2Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMHeapChunkHdr1Type_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMFtrFeatureType_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMFtrCreatorType_STRUCT (DO_TO_STRUCT) \
+ FOR_ROMFtrTableType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_12(DO_TO_STRUCT) \
+ FOR_ControlAttrType_STRUCT (DO_TO_STRUCT) \
+ FOR_ControlType_STRUCT (DO_TO_STRUCT) \
+ FOR_GraphicControlType_STRUCT (DO_TO_STRUCT) \
+ FOR_SliderControlType_STRUCT (DO_TO_STRUCT) \
+ FOR_BitmapTypeV2_STRUCT (DO_TO_STRUCT) \
+ FOR_BitmapTypeV3_STRUCT (DO_TO_STRUCT) \
+ FOR_FrameBitsType_STRUCT (DO_TO_STRUCT) \
+ FOR_WindowFlagsType_STRUCT (DO_TO_STRUCT) \
+ FOR_WindowType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormObjListType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormAttrType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_cjxln_STRUCT (DO_TO_STRUCT) \
+ FOR_cj_xgbh_STRUCT (DO_TO_STRUCT) \
+ FOR_cj_xsmb_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_13(DO_TO_STRUCT) \
+ FOR_TimGlobalsType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_FormObjAttrType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_FormBitmapType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormLineType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormFrameType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormRectangleType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormTitleType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormPopupType_STRUCT (DO_TO_STRUCT) \
+ FOR_FrmGraffitiStateType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_ScrollBarAttrType_STRUCT (DO_TO_STRUCT) \
+ FOR_ScrollBarType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_FormGadgetAttrType_STRUCT (DO_TO_STRUCT) \
+ FOR_FormGadgetType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_FormLabelType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_FieldAttrType_STRUCT (DO_TO_STRUCT) \
+ FOR_FieldType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_ListAttrType_STRUCT (DO_TO_STRUCT) \
+ FOR_ListType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_TableAttrType_STRUCT (DO_TO_STRUCT) \
+ FOR_TableType_STRUCT (DO_TO_STRUCT) \
+
+
+#define FOR_EACH_STRUCT_14(DO_TO_STRUCT) \
+ FOR_HostDirEntType_STRUCT (DO_TO_STRUCT) \
+ FOR_HostGremlinInfoType_STRUCT (DO_TO_STRUCT) \
+ FOR_HostStatType_STRUCT (DO_TO_STRUCT) \
+ FOR_HostTmType_STRUCT (DO_TO_STRUCT) \
+ FOR_HostUTimeType_STRUCT (DO_TO_STRUCT) \
+ \
+ FOR_NetHostInfoType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetHostInfoBufType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetIOParamType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetIOVecType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetServInfoType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetServInfoBufType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetSocketAddrINType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetSocketAddrRawType_STRUCT (DO_TO_STRUCT) \
+ FOR_NetSocketAddrType_STRUCT (DO_TO_STRUCT) \
+
+
+#if PLATFORM_MAC
+ #define INLINE_SCALAR_IMPLEMENTATION 1
+#else
+ #define INLINE_SCALAR_IMPLEMENTATION 0
+#endif
+
+FOR_EACH_SCALAR_1 (DECLARE_SCALAR_CLASSES)
+FOR_EACH_SCALAR_2 (DECLARE_SCALAR_CLASSES)
+FOR_EACH_SCALAR_3 (DECLARE_SCALAR_CLASSES)
+FOR_EACH_SCALAR_4 (DECLARE_SCALAR_CLASSES)
+
+#if INLINE_SCALAR_IMPLEMENTATION
+
+#undef INLINE_
+#define INLINE_ inline
+
+FOR_EACH_SCALAR_1 (DEFINE_SCALAR_CLASSES)
+FOR_EACH_SCALAR_2 (DEFINE_SCALAR_CLASSES)
+FOR_EACH_SCALAR_3 (DEFINE_SCALAR_CLASSES)
+FOR_EACH_SCALAR_4 (DEFINE_SCALAR_CLASSES)
+
+#undef INLINE_
+#define INLINE_
+
+#endif
+
+FOR_EACH_STRUCT_1 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_2 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_3 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_4 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_5 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_6 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_7 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_8 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_9 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_10 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_11 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_12 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_13 (DECLARE_STRUCT_CLASSES)
+FOR_EACH_STRUCT_14 (DECLARE_STRUCT_CLASSES)
+
+#endif // EmPalmStructs_h