-/***************************************************************************/
-/* */
-/* ftcmru.h */
-/* */
-/* Simple MRU list-cache (specification). */
-/* */
-/* Copyright 2000-2001, 2003, 2004, 2005, 2006 by */
-/* David Turner, Robert Wilhelm, and Werner Lemberg. */
-/* */
-/* This file is part of the FreeType project, and may only be used, */
-/* modified, and distributed under the terms of the FreeType project */
-/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
-/* this file you indicate that you have read the license and */
-/* understand and accept it fully. */
-/* */
-/***************************************************************************/
-
-
- /*************************************************************************/
- /* */
- /* An MRU is a list that cannot hold more than a certain number of */
- /* elements (`max_elements'). All elements in the list are sorted in */
- /* least-recently-used order, i.e., the `oldest' element is at the tail */
- /* of the list. */
- /* */
- /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */
- /* the list is searched for an element with the corresponding key. If */
- /* it is found, the element is moved to the head of the list and is */
- /* returned. */
- /* */
- /* If no corresponding element is found, the lookup routine will try to */
- /* obtain a new element with the relevant key. If the list is already */
- /* full, the oldest element from the list is discarded and replaced by a */
- /* new one; a new element is added to the list otherwise. */
- /* */
- /* Note that it is possible to pre-allocate the element list nodes. */
- /* This is handy if `max_elements' is sufficiently small, as it saves */
- /* allocations/releases during the lookup process. */
- /* */
- /*************************************************************************/
-
-
-#ifndef __FTCMRU_H__
-#define __FTCMRU_H__
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-#ifdef FREETYPE_H
-#error "freetype.h of FreeType 1 has been loaded!"
-#error "Please fix the directory search order for header files"
-#error "so that freetype.h of FreeType 2 is found first."
-#endif
-
-#define xxFT_DEBUG_ERROR
-#define FTC_INLINE
-
-FT_BEGIN_HEADER
-
- typedef struct FTC_MruNodeRec_* FTC_MruNode;
-
- typedef struct FTC_MruNodeRec_
- {
- FTC_MruNode next;
- FTC_MruNode prev;
-
- } FTC_MruNodeRec;
-
-
- FT_LOCAL( void )
- FTC_MruNode_Prepend( FTC_MruNode *plist,
- FTC_MruNode node );
-
- FT_LOCAL( void )
- FTC_MruNode_Up( FTC_MruNode *plist,
- FTC_MruNode node );
-
- FT_LOCAL( void )
- FTC_MruNode_Remove( FTC_MruNode *plist,
- FTC_MruNode node );
-
-
- typedef struct FTC_MruListRec_* FTC_MruList;
-
- typedef struct FTC_MruListClassRec_ const * FTC_MruListClass;
-
-
- typedef FT_Bool
- (*FTC_MruNode_CompareFunc)( FTC_MruNode node,
- FT_Pointer key );
-
- typedef FT_Error
- (*FTC_MruNode_InitFunc)( FTC_MruNode node,
- FT_Pointer key,
- FT_Pointer data );
-
- typedef FT_Error
- (*FTC_MruNode_ResetFunc)( FTC_MruNode node,
- FT_Pointer key,
- FT_Pointer data );
-
- typedef void
- (*FTC_MruNode_DoneFunc)( FTC_MruNode node,
- FT_Pointer data );
-
-
- typedef struct FTC_MruListClassRec_
- {
- FT_UInt node_size;
- FTC_MruNode_CompareFunc node_compare;
- FTC_MruNode_InitFunc node_init;
- FTC_MruNode_ResetFunc node_reset;
- FTC_MruNode_DoneFunc node_done;
-
- } FTC_MruListClassRec;
-
- typedef struct FTC_MruListRec_
- {
- FT_UInt num_nodes;
- FT_UInt max_nodes;
- FTC_MruNode nodes;
- FT_Pointer data;
- FTC_MruListClassRec clazz;
- FT_Memory memory;
-
- } FTC_MruListRec;
-
-
- FT_LOCAL( void )
- FTC_MruList_Init( FTC_MruList list,
- FTC_MruListClass clazz,
- FT_UInt max_nodes,
- FT_Pointer data,
- FT_Memory memory );
-
- FT_LOCAL( void )
- FTC_MruList_Reset( FTC_MruList list );
-
-
- FT_LOCAL( void )
- FTC_MruList_Done( FTC_MruList list );
-
-
- FT_LOCAL( FT_Error )
- FTC_MruList_New( FTC_MruList list,
- FT_Pointer key,
- FTC_MruNode *anode );
-
- FT_LOCAL( void )
- FTC_MruList_Remove( FTC_MruList list,
- FTC_MruNode node );
-
- FT_LOCAL( void )
- FTC_MruList_RemoveSelection( FTC_MruList list,
- FTC_MruNode_CompareFunc selection,
- FT_Pointer key );
-
-
-#ifdef FTC_INLINE
-
-#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \
- FT_BEGIN_STMNT \
- FTC_MruNode* _pfirst = &(list)->nodes; \
- FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \
- FTC_MruNode _first, _node, *_pnode; \
- \
- \
- error = 0; \
- _first = *(_pfirst); \
- _node = NULL; \
- \
- if ( _first ) \
- { \
- _node = _first; \
- do \
- { \
- if ( _compare( _node, (key) ) ) \
- { \
- if ( _node != _first ) \
- FTC_MruNode_Up( _pfirst, _node ); \
- \
- _pnode = (FTC_MruNode*)(void*)&(node); \
- *_pnode = _node; \
- goto _MruOk; \
- } \
- _node = _node->next; \
- \
- } while ( _node != _first) ; \
- } \
- \
- error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \
- _MruOk: \
- ; \
- FT_END_STMNT
-
-#define FTC_MRULIST_LOOKUP( list, key, node, error ) \
- FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error )
-
-#else /* !FTC_INLINE */
-
- FT_LOCAL( FTC_MruNode )
- FTC_MruList_Find( FTC_MruList list,
- FT_Pointer key );
-
- FT_LOCAL( FT_Error )
- FTC_MruList_Lookup( FTC_MruList list,
- FT_Pointer key,
- FTC_MruNode *pnode );
-
-#define FTC_MRULIST_LOOKUP( list, key, node, error ) \
- error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) )
-
-#endif /* !FTC_INLINE */
-
-
-#define FTC_MRULIST_LOOP( list, node ) \
- FT_BEGIN_STMNT \
- FTC_MruNode _first = (list)->nodes; \
- \
- \
- if ( _first ) \
- { \
- FTC_MruNode _node = _first; \
- \
- \
- do \
- { \
- *(FTC_MruNode*)&(node) = _node;
-
-
-#define FTC_MRULIST_LOOP_END() \
- _node = _node->next; \
- \
- } while ( _node != _first ); \
- } \
- FT_END_STMNT
-
- /* */
-
-FT_END_HEADER
-
-
-#endif /* __FTCMRU_H__ */
-
-
-/* END */
+/***************************************************************************/\r
+/* */\r
+/* ftcmru.h */\r
+/* */\r
+/* Simple MRU list-cache (specification). */\r
+/* */\r
+/* Copyright 2000-2001, 2003, 2004, 2005, 2006 by */\r
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */\r
+/* */\r
+/* This file is part of the FreeType project, and may only be used, */\r
+/* modified, and distributed under the terms of the FreeType project */\r
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */\r
+/* this file you indicate that you have read the license and */\r
+/* understand and accept it fully. */\r
+/* */\r
+/***************************************************************************/\r
+\r
+\r
+ /*************************************************************************/\r
+ /* */\r
+ /* An MRU is a list that cannot hold more than a certain number of */\r
+ /* elements (`max_elements'). All elements in the list are sorted in */\r
+ /* least-recently-used order, i.e., the `oldest' element is at the tail */\r
+ /* of the list. */\r
+ /* */\r
+ /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */\r
+ /* the list is searched for an element with the corresponding key. If */\r
+ /* it is found, the element is moved to the head of the list and is */\r
+ /* returned. */\r
+ /* */\r
+ /* If no corresponding element is found, the lookup routine will try to */\r
+ /* obtain a new element with the relevant key. If the list is already */\r
+ /* full, the oldest element from the list is discarded and replaced by a */\r
+ /* new one; a new element is added to the list otherwise. */\r
+ /* */\r
+ /* Note that it is possible to pre-allocate the element list nodes. */\r
+ /* This is handy if `max_elements' is sufficiently small, as it saves */\r
+ /* allocations/releases during the lookup process. */\r
+ /* */\r
+ /*************************************************************************/\r
+\r
+\r
+#ifndef __FTCMRU_H__\r
+#define __FTCMRU_H__\r
+\r
+\r
+#include <ft2build.h>\r
+#include FT_FREETYPE_H\r
+\r
+#ifdef FREETYPE_H\r
+#error "freetype.h of FreeType 1 has been loaded!"\r
+#error "Please fix the directory search order for header files"\r
+#error "so that freetype.h of FreeType 2 is found first."\r
+#endif\r
+\r
+#define xxFT_DEBUG_ERROR\r
+#define FTC_INLINE\r
+\r
+FT_BEGIN_HEADER\r
+\r
+ typedef struct FTC_MruNodeRec_* FTC_MruNode;\r
+\r
+ typedef struct FTC_MruNodeRec_\r
+ {\r
+ FTC_MruNode next;\r
+ FTC_MruNode prev;\r
+\r
+ } FTC_MruNodeRec;\r
+\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruNode_Prepend( FTC_MruNode *plist,\r
+ FTC_MruNode node );\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruNode_Up( FTC_MruNode *plist,\r
+ FTC_MruNode node );\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruNode_Remove( FTC_MruNode *plist,\r
+ FTC_MruNode node );\r
+\r
+\r
+ typedef struct FTC_MruListRec_* FTC_MruList;\r
+\r
+ typedef struct FTC_MruListClassRec_ const * FTC_MruListClass;\r
+\r
+\r
+ typedef FT_Bool\r
+ (*FTC_MruNode_CompareFunc)( FTC_MruNode node,\r
+ FT_Pointer key );\r
+\r
+ typedef FT_Error\r
+ (*FTC_MruNode_InitFunc)( FTC_MruNode node,\r
+ FT_Pointer key,\r
+ FT_Pointer data );\r
+\r
+ typedef FT_Error\r
+ (*FTC_MruNode_ResetFunc)( FTC_MruNode node,\r
+ FT_Pointer key,\r
+ FT_Pointer data );\r
+\r
+ typedef void\r
+ (*FTC_MruNode_DoneFunc)( FTC_MruNode node,\r
+ FT_Pointer data );\r
+\r
+\r
+ typedef struct FTC_MruListClassRec_\r
+ {\r
+ FT_UInt node_size;\r
+ FTC_MruNode_CompareFunc node_compare;\r
+ FTC_MruNode_InitFunc node_init;\r
+ FTC_MruNode_ResetFunc node_reset;\r
+ FTC_MruNode_DoneFunc node_done;\r
+\r
+ } FTC_MruListClassRec;\r
+\r
+ typedef struct FTC_MruListRec_\r
+ {\r
+ FT_UInt num_nodes;\r
+ FT_UInt max_nodes;\r
+ FTC_MruNode nodes;\r
+ FT_Pointer data;\r
+ FTC_MruListClassRec clazz;\r
+ FT_Memory memory;\r
+\r
+ } FTC_MruListRec;\r
+\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruList_Init( FTC_MruList list,\r
+ FTC_MruListClass clazz,\r
+ FT_UInt max_nodes,\r
+ FT_Pointer data,\r
+ FT_Memory memory );\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruList_Reset( FTC_MruList list );\r
+\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruList_Done( FTC_MruList list );\r
+\r
+\r
+ FT_LOCAL( FT_Error )\r
+ FTC_MruList_New( FTC_MruList list,\r
+ FT_Pointer key,\r
+ FTC_MruNode *anode );\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruList_Remove( FTC_MruList list,\r
+ FTC_MruNode node );\r
+\r
+ FT_LOCAL( void )\r
+ FTC_MruList_RemoveSelection( FTC_MruList list,\r
+ FTC_MruNode_CompareFunc selection,\r
+ FT_Pointer key );\r
+\r
+\r
+#ifdef FTC_INLINE\r
+\r
+#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \\r
+ FT_BEGIN_STMNT \\r
+ FTC_MruNode* _pfirst = &(list)->nodes; \\r
+ FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \\r
+ FTC_MruNode _first, _node, *_pnode; \\r
+ \\r
+ \\r
+ error = 0; \\r
+ _first = *(_pfirst); \\r
+ _node = NULL; \\r
+ \\r
+ if ( _first ) \\r
+ { \\r
+ _node = _first; \\r
+ do \\r
+ { \\r
+ if ( _compare( _node, (key) ) ) \\r
+ { \\r
+ if ( _node != _first ) \\r
+ FTC_MruNode_Up( _pfirst, _node ); \\r
+ \\r
+ _pnode = (FTC_MruNode*)(void*)&(node); \\r
+ *_pnode = _node; \\r
+ goto _MruOk; \\r
+ } \\r
+ _node = _node->next; \\r
+ \\r
+ } while ( _node != _first) ; \\r
+ } \\r
+ \\r
+ error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \\r
+ _MruOk: \\r
+ ; \\r
+ FT_END_STMNT\r
+\r
+#define FTC_MRULIST_LOOKUP( list, key, node, error ) \\r
+ FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error )\r
+\r
+#else /* !FTC_INLINE */\r
+\r
+ FT_LOCAL( FTC_MruNode )\r
+ FTC_MruList_Find( FTC_MruList list,\r
+ FT_Pointer key );\r
+\r
+ FT_LOCAL( FT_Error )\r
+ FTC_MruList_Lookup( FTC_MruList list,\r
+ FT_Pointer key,\r
+ FTC_MruNode *pnode );\r
+\r
+#define FTC_MRULIST_LOOKUP( list, key, node, error ) \\r
+ error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) )\r
+\r
+#endif /* !FTC_INLINE */\r
+\r
+\r
+#define FTC_MRULIST_LOOP( list, node ) \\r
+ FT_BEGIN_STMNT \\r
+ FTC_MruNode _first = (list)->nodes; \\r
+ \\r
+ \\r
+ if ( _first ) \\r
+ { \\r
+ FTC_MruNode _node = _first; \\r
+ \\r
+ \\r
+ do \\r
+ { \\r
+ *(FTC_MruNode*)&(node) = _node;\r
+\r
+\r
+#define FTC_MRULIST_LOOP_END() \\r
+ _node = _node->next; \\r
+ \\r
+ } while ( _node != _first ); \\r
+ } \\r
+ FT_END_STMNT\r
+\r
+ /* */\r
+\r
+FT_END_HEADER\r
+\r
+\r
+#endif /* __FTCMRU_H__ */\r
+\r
+\r
+/* END */\r