| #ifndef __OT_LAYOUT_H__ |
| #define __OT_LAYOUT_H__ |
| |
| |
| #include "otlconf.h" |
| |
| OTL_BEGIN_HEADER |
| |
| /************************************************************************/ |
| /************************************************************************/ |
| /***** *****/ |
| /***** BASE DATA TYPES *****/ |
| /***** *****/ |
| /************************************************************************/ |
| /************************************************************************/ |
| |
| typedef unsigned char OTL_Byte; |
| typedef const OTL_Byte* OTL_Bytes; |
| |
| typedef int OTL_Error; |
| |
| typedef void* OTL_Pointer; |
| |
| typedef int OTL_Int; |
| typedef unsigned int OTL_UInt; |
| |
| typedef long OTL_Long; |
| typedef unsigned long OTL_ULong; |
| |
| typedef short OTL_Int16; |
| typedef unsigned short OTL_UInt16; |
| |
| |
| #if OTL_SIZEOF_INT == 4 |
| |
| typedef int OTL_Int32; |
| typedef unsigned int OTL_UInt32; |
| |
| #elif OTL_SIZEOF_LONG == 4 |
| |
| typedef long OTL_Int32; |
| typedef unsigned long OTL_UInt32; |
| |
| #else |
| # error "no 32-bits type found" |
| #endif |
| |
| typedef OTL_UInt32 OTL_Tag; |
| |
| /************************************************************************/ |
| /************************************************************************/ |
| /***** *****/ |
| /***** ERROR CODES *****/ |
| /***** *****/ |
| /************************************************************************/ |
| /************************************************************************/ |
| |
| typedef enum |
| { |
| OTL_Err_Ok = 0, |
| OTL_Err_InvalidArgument, |
| OTL_Err_InvalidFormat, |
| OTL_Err_InvalidOffset, |
| |
| OTL_Err_Max |
| |
| } OTL_Error; |
| |
| |
| /************************************************************************/ |
| /************************************************************************/ |
| /***** *****/ |
| /***** MEMORY MANAGEMENT *****/ |
| /***** *****/ |
| /************************************************************************/ |
| /************************************************************************/ |
| |
| typedef OTL_Pointer (*OTL_AllocFunc)( OTL_ULong size, |
| OTL_Pointer data ); |
| |
| typedef OTL_Pointer (*OTL_ReallocFunc)( OTL_Pointer block, |
| OTL_ULong size, |
| OTL_Pointer data ); |
| |
| typedef void (*OTL_FreeFunc)( OTL_Pointer block, |
| OTL_Pointer data ); |
| |
| typedef struct OTL_MemoryRec_ |
| { |
| OTL_Pointer mem_data; |
| OTL_AllocFunc mem_alloc; |
| OTL_ReallocFunc mem_realloc; |
| OTL_FreeFunc mem_free; |
| |
| } OTL_MemoryRec, *OTL_Memory; |
| |
| /************************************************************************/ |
| /************************************************************************/ |
| /***** *****/ |
| /***** ENUMERATIONS *****/ |
| /***** *****/ |
| /************************************************************************/ |
| /************************************************************************/ |
| |
| /* re-define OTL_MAKE_TAG to something different if you're not */ |
| /* using an ASCII-based character set (Vaxes anyone ?) */ |
| #ifndef OTL_MAKE_TAG |
| #define OTL_MAKE_TAG(c1,c2,c3,c4) \ |
| ( ( (OTL_UInt32)(c1) << 24 ) | \ |
| (OTL_UInt32)(c2) << 16 ) | \ |
| (OTL_UInt32)(c3) << 8 ) | \ |
| (OTL_UInt32)(c4) ) |
| #endif |
| |
| typedef enum OTL_ScriptTag_ |
| { |
| OTL_SCRIPT_NONE = 0, |
| |
| #define OTL_SCRIPT_TAG(c1,c2,c3,c4,s,n) OTL_SCRIPT_TAG_ ## n = OTL_MAKE_TAG(c1,c2,c3,c4), |
| #include "otltags.h" |
| |
| OTL_SCRIPT_MAX |
| |
| } OTL_ScriptTag; |
| |
| |
| typedef enum OTL_LangTag_ |
| { |
| OTL_LANG_DEFAULT = 0, |
| |
| #define OTL_LANG_TAG(c1,c2,c3,c4,s,n) OTL_LANG_TAG_ ## n = OTL_MAKE_TAG(c1,c2,c3,c4), |
| #include "otltags.h" |
| |
| OTL_LANG_MAX |
| |
| } OTL_LangTag; |
| |
| |
| /************************************************************************/ |
| /************************************************************************/ |
| /***** *****/ |
| /***** MEMORY READS *****/ |
| /***** *****/ |
| /************************************************************************/ |
| /************************************************************************/ |
| |
| #define OTL_PEEK_USHORT(p) ( ((OTL_UInt)((p)[0]) << 8) | \ |
| ((OTL_UInt)((p)[1]) ) ) |
| |
| #define OTL_PEEK_ULONG(p) ( ((OTL_UInt32)((p)[0]) << 24) | \ |
| ((OTL_UInt32)((p)[1]) << 16) | \ |
| ((OTL_UInt32)((p)[2]) << 8) | \ |
| ((OTL_UInt32)((p)[3]) ) ) |
| |
| #define OTL_PEEK_SHORT(p) ((OTL_Int16)OTL_PEEK_USHORT(p)) |
| |
| #define OTL_PEEK_LONG(p) ((OTL_Int32)OTL_PEEK_ULONG(p)) |
| |
| #define OTL_NEXT_USHORT(p) ( (p) += 2, OTL_PEEK_USHORT((p)-2) ) |
| #define OTL_NEXT_ULONG(p) ( (p) += 4, OTL_PEEK_ULONG((p)-4) ) |
| |
| #define OTL_NEXT_SHORT(p) ((OTL_Int16)OTL_NEXT_USHORT(p)) |
| #define OTL_NEXT_LONG(p) ((OTL_Int32)OTL_NEXT_ULONG(p)) |
| |
| /************************************************************************/ |
| /************************************************************************/ |
| /***** *****/ |
| /***** VALIDATION *****/ |
| /***** *****/ |
| /************************************************************************/ |
| /************************************************************************/ |
| |
| typedef struct OTL_ValidatorRec_* OTL_Validator; |
| |
| typedef struct OTL_ValidatorRec_ |
| { |
| OTL_Bytes limit; |
| OTL_Bytes base; |
| OTL_Error error; |
| OTL_jmp_buf jump_buffer; |
| |
| } OTL_ValidatorRec; |
| |
| typedef void (*OTL_ValidateFunc)( OTL_Bytes table, |
| OTL_Valid valid ); |
| |
| OTL_API( void ) |
| otl_validator_error( OTL_Validator validator, |
| OTL_Error error ); |
| |
| #define OTL_INVALID(e) otl_validator_error( valid, e ) |
| |
| #define OTL_INVALID_TOO_SHORT OTL_INVALID( OTL_Err_InvalidOffset ) |
| #define OTL_INVALID_DATA OTL_INVALID( OTL_Err_InvalidFormat ) |
| |
| #define OTL_CHECK(_count) OTL_BEGIN_STMNT \ |
| if ( p + (_count) > valid->limit ) \ |
| OTL_INVALID_TOO_SHORT; \ |
| OTL_END_STMNT |
| |
| /* */ |
| |
| OTL_END_HEADER |
| |
| #endif /* __OPENTYPE_LAYOUT_H__ */ |