1*37da2899SCharles.Forsyth #ifndef __OT_LAYOUT_H__ 2*37da2899SCharles.Forsyth #define __OT_LAYOUT_H__ 3*37da2899SCharles.Forsyth 4*37da2899SCharles.Forsyth 5*37da2899SCharles.Forsyth #include "otlconf.h" 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsyth OTL_BEGIN_HEADER 8*37da2899SCharles.Forsyth 9*37da2899SCharles.Forsyth /************************************************************************/ 10*37da2899SCharles.Forsyth /************************************************************************/ 11*37da2899SCharles.Forsyth /***** *****/ 12*37da2899SCharles.Forsyth /***** BASE DATA TYPES *****/ 13*37da2899SCharles.Forsyth /***** *****/ 14*37da2899SCharles.Forsyth /************************************************************************/ 15*37da2899SCharles.Forsyth /************************************************************************/ 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsyth typedef unsigned char OTL_Byte; 18*37da2899SCharles.Forsyth typedef const OTL_Byte* OTL_Bytes; 19*37da2899SCharles.Forsyth 20*37da2899SCharles.Forsyth typedef int OTL_Error; 21*37da2899SCharles.Forsyth 22*37da2899SCharles.Forsyth typedef void* OTL_Pointer; 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth typedef int OTL_Int; 25*37da2899SCharles.Forsyth typedef unsigned int OTL_UInt; 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth typedef long OTL_Long; 28*37da2899SCharles.Forsyth typedef unsigned long OTL_ULong; 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsyth typedef short OTL_Int16; 31*37da2899SCharles.Forsyth typedef unsigned short OTL_UInt16; 32*37da2899SCharles.Forsyth 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsyth #if OTL_SIZEOF_INT == 4 35*37da2899SCharles.Forsyth 36*37da2899SCharles.Forsyth typedef int OTL_Int32; 37*37da2899SCharles.Forsyth typedef unsigned int OTL_UInt32; 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth #elif OTL_SIZEOF_LONG == 4 40*37da2899SCharles.Forsyth 41*37da2899SCharles.Forsyth typedef long OTL_Int32; 42*37da2899SCharles.Forsyth typedef unsigned long OTL_UInt32; 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth #else 45*37da2899SCharles.Forsyth # error "no 32-bits type found" 46*37da2899SCharles.Forsyth #endif 47*37da2899SCharles.Forsyth 48*37da2899SCharles.Forsyth typedef OTL_UInt32 OTL_Tag; 49*37da2899SCharles.Forsyth 50*37da2899SCharles.Forsyth /************************************************************************/ 51*37da2899SCharles.Forsyth /************************************************************************/ 52*37da2899SCharles.Forsyth /***** *****/ 53*37da2899SCharles.Forsyth /***** ERROR CODES *****/ 54*37da2899SCharles.Forsyth /***** *****/ 55*37da2899SCharles.Forsyth /************************************************************************/ 56*37da2899SCharles.Forsyth /************************************************************************/ 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsyth typedef enum 59*37da2899SCharles.Forsyth { 60*37da2899SCharles.Forsyth OTL_Err_Ok = 0, 61*37da2899SCharles.Forsyth OTL_Err_InvalidArgument, 62*37da2899SCharles.Forsyth OTL_Err_InvalidFormat, 63*37da2899SCharles.Forsyth OTL_Err_InvalidOffset, 64*37da2899SCharles.Forsyth 65*37da2899SCharles.Forsyth OTL_Err_Max 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth } OTL_Error; 68*37da2899SCharles.Forsyth 69*37da2899SCharles.Forsyth 70*37da2899SCharles.Forsyth /************************************************************************/ 71*37da2899SCharles.Forsyth /************************************************************************/ 72*37da2899SCharles.Forsyth /***** *****/ 73*37da2899SCharles.Forsyth /***** MEMORY MANAGEMENT *****/ 74*37da2899SCharles.Forsyth /***** *****/ 75*37da2899SCharles.Forsyth /************************************************************************/ 76*37da2899SCharles.Forsyth /************************************************************************/ 77*37da2899SCharles.Forsyth 78*37da2899SCharles.Forsyth typedef OTL_Pointer (*OTL_AllocFunc)( OTL_ULong size, 79*37da2899SCharles.Forsyth OTL_Pointer data ); 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth typedef OTL_Pointer (*OTL_ReallocFunc)( OTL_Pointer block, 82*37da2899SCharles.Forsyth OTL_ULong size, 83*37da2899SCharles.Forsyth OTL_Pointer data ); 84*37da2899SCharles.Forsyth 85*37da2899SCharles.Forsyth typedef void (*OTL_FreeFunc)( OTL_Pointer block, 86*37da2899SCharles.Forsyth OTL_Pointer data ); 87*37da2899SCharles.Forsyth 88*37da2899SCharles.Forsyth typedef struct OTL_MemoryRec_ 89*37da2899SCharles.Forsyth { 90*37da2899SCharles.Forsyth OTL_Pointer mem_data; 91*37da2899SCharles.Forsyth OTL_AllocFunc mem_alloc; 92*37da2899SCharles.Forsyth OTL_ReallocFunc mem_realloc; 93*37da2899SCharles.Forsyth OTL_FreeFunc mem_free; 94*37da2899SCharles.Forsyth 95*37da2899SCharles.Forsyth } OTL_MemoryRec, *OTL_Memory; 96*37da2899SCharles.Forsyth 97*37da2899SCharles.Forsyth /************************************************************************/ 98*37da2899SCharles.Forsyth /************************************************************************/ 99*37da2899SCharles.Forsyth /***** *****/ 100*37da2899SCharles.Forsyth /***** ENUMERATIONS *****/ 101*37da2899SCharles.Forsyth /***** *****/ 102*37da2899SCharles.Forsyth /************************************************************************/ 103*37da2899SCharles.Forsyth /************************************************************************/ 104*37da2899SCharles.Forsyth 105*37da2899SCharles.Forsyth /* re-define OTL_MAKE_TAG to something different if you're not */ 106*37da2899SCharles.Forsyth /* using an ASCII-based character set (Vaxes anyone ?) */ 107*37da2899SCharles.Forsyth #ifndef OTL_MAKE_TAG 108*37da2899SCharles.Forsyth #define OTL_MAKE_TAG(c1,c2,c3,c4) \ 109*37da2899SCharles.Forsyth ( ( (OTL_UInt32)(c1) << 24 ) | \ 110*37da2899SCharles.Forsyth (OTL_UInt32)(c2) << 16 ) | \ 111*37da2899SCharles.Forsyth (OTL_UInt32)(c3) << 8 ) | \ 112*37da2899SCharles.Forsyth (OTL_UInt32)(c4) ) 113*37da2899SCharles.Forsyth #endif 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth typedef enum OTL_ScriptTag_ 116*37da2899SCharles.Forsyth { 117*37da2899SCharles.Forsyth OTL_SCRIPT_NONE = 0, 118*37da2899SCharles.Forsyth 119*37da2899SCharles.Forsyth #define OTL_SCRIPT_TAG(c1,c2,c3,c4,s,n) OTL_SCRIPT_TAG_ ## n = OTL_MAKE_TAG(c1,c2,c3,c4), 120*37da2899SCharles.Forsyth #include "otltags.h" 121*37da2899SCharles.Forsyth 122*37da2899SCharles.Forsyth OTL_SCRIPT_MAX 123*37da2899SCharles.Forsyth 124*37da2899SCharles.Forsyth } OTL_ScriptTag; 125*37da2899SCharles.Forsyth 126*37da2899SCharles.Forsyth 127*37da2899SCharles.Forsyth typedef enum OTL_LangTag_ 128*37da2899SCharles.Forsyth { 129*37da2899SCharles.Forsyth OTL_LANG_DEFAULT = 0, 130*37da2899SCharles.Forsyth 131*37da2899SCharles.Forsyth #define OTL_LANG_TAG(c1,c2,c3,c4,s,n) OTL_LANG_TAG_ ## n = OTL_MAKE_TAG(c1,c2,c3,c4), 132*37da2899SCharles.Forsyth #include "otltags.h" 133*37da2899SCharles.Forsyth 134*37da2899SCharles.Forsyth OTL_LANG_MAX 135*37da2899SCharles.Forsyth 136*37da2899SCharles.Forsyth } OTL_LangTag; 137*37da2899SCharles.Forsyth 138*37da2899SCharles.Forsyth 139*37da2899SCharles.Forsyth /************************************************************************/ 140*37da2899SCharles.Forsyth /************************************************************************/ 141*37da2899SCharles.Forsyth /***** *****/ 142*37da2899SCharles.Forsyth /***** MEMORY READS *****/ 143*37da2899SCharles.Forsyth /***** *****/ 144*37da2899SCharles.Forsyth /************************************************************************/ 145*37da2899SCharles.Forsyth /************************************************************************/ 146*37da2899SCharles.Forsyth 147*37da2899SCharles.Forsyth #define OTL_PEEK_USHORT(p) ( ((OTL_UInt)((p)[0]) << 8) | \ 148*37da2899SCharles.Forsyth ((OTL_UInt)((p)[1]) ) ) 149*37da2899SCharles.Forsyth 150*37da2899SCharles.Forsyth #define OTL_PEEK_ULONG(p) ( ((OTL_UInt32)((p)[0]) << 24) | \ 151*37da2899SCharles.Forsyth ((OTL_UInt32)((p)[1]) << 16) | \ 152*37da2899SCharles.Forsyth ((OTL_UInt32)((p)[2]) << 8) | \ 153*37da2899SCharles.Forsyth ((OTL_UInt32)((p)[3]) ) ) 154*37da2899SCharles.Forsyth 155*37da2899SCharles.Forsyth #define OTL_PEEK_SHORT(p) ((OTL_Int16)OTL_PEEK_USHORT(p)) 156*37da2899SCharles.Forsyth 157*37da2899SCharles.Forsyth #define OTL_PEEK_LONG(p) ((OTL_Int32)OTL_PEEK_ULONG(p)) 158*37da2899SCharles.Forsyth 159*37da2899SCharles.Forsyth #define OTL_NEXT_USHORT(p) ( (p) += 2, OTL_PEEK_USHORT((p)-2) ) 160*37da2899SCharles.Forsyth #define OTL_NEXT_ULONG(p) ( (p) += 4, OTL_PEEK_ULONG((p)-4) ) 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth #define OTL_NEXT_SHORT(p) ((OTL_Int16)OTL_NEXT_USHORT(p)) 163*37da2899SCharles.Forsyth #define OTL_NEXT_LONG(p) ((OTL_Int32)OTL_NEXT_ULONG(p)) 164*37da2899SCharles.Forsyth 165*37da2899SCharles.Forsyth /************************************************************************/ 166*37da2899SCharles.Forsyth /************************************************************************/ 167*37da2899SCharles.Forsyth /***** *****/ 168*37da2899SCharles.Forsyth /***** VALIDATION *****/ 169*37da2899SCharles.Forsyth /***** *****/ 170*37da2899SCharles.Forsyth /************************************************************************/ 171*37da2899SCharles.Forsyth /************************************************************************/ 172*37da2899SCharles.Forsyth 173*37da2899SCharles.Forsyth typedef struct OTL_ValidatorRec_* OTL_Validator; 174*37da2899SCharles.Forsyth 175*37da2899SCharles.Forsyth typedef struct OTL_ValidatorRec_ 176*37da2899SCharles.Forsyth { 177*37da2899SCharles.Forsyth OTL_Bytes limit; 178*37da2899SCharles.Forsyth OTL_Bytes base; 179*37da2899SCharles.Forsyth OTL_Error error; 180*37da2899SCharles.Forsyth OTL_jmp_buf jump_buffer; 181*37da2899SCharles.Forsyth 182*37da2899SCharles.Forsyth } OTL_ValidatorRec; 183*37da2899SCharles.Forsyth 184*37da2899SCharles.Forsyth typedef void (*OTL_ValidateFunc)( OTL_Bytes table, 185*37da2899SCharles.Forsyth OTL_Valid valid ); 186*37da2899SCharles.Forsyth 187*37da2899SCharles.Forsyth OTL_API( void ) 188*37da2899SCharles.Forsyth otl_validator_error( OTL_Validator validator, 189*37da2899SCharles.Forsyth OTL_Error error ); 190*37da2899SCharles.Forsyth 191*37da2899SCharles.Forsyth #define OTL_INVALID(e) otl_validator_error( valid, e ) 192*37da2899SCharles.Forsyth 193*37da2899SCharles.Forsyth #define OTL_INVALID_TOO_SHORT OTL_INVALID( OTL_Err_InvalidOffset ) 194*37da2899SCharles.Forsyth #define OTL_INVALID_DATA OTL_INVALID( OTL_Err_InvalidFormat ) 195*37da2899SCharles.Forsyth 196*37da2899SCharles.Forsyth #define OTL_CHECK(_count) OTL_BEGIN_STMNT \ 197*37da2899SCharles.Forsyth if ( p + (_count) > valid->limit ) \ 198*37da2899SCharles.Forsyth OTL_INVALID_TOO_SHORT; \ 199*37da2899SCharles.Forsyth OTL_END_STMNT 200*37da2899SCharles.Forsyth 201*37da2899SCharles.Forsyth /* */ 202*37da2899SCharles.Forsyth 203*37da2899SCharles.Forsyth OTL_END_HEADER 204*37da2899SCharles.Forsyth 205*37da2899SCharles.Forsyth #endif /* __OPENTYPE_LAYOUT_H__ */ 206