Charles.Forsyth20060303a828770d19 years agoHistory
205 lines · 7.1 KB · C
RawDownload
#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__ */