00001
00059 #ifndef __MTR
00060 #define __MTR
00061
00062
00063
00064
00065
00066 #ifdef __cplusplus
00067 extern "C" {
00068 #endif
00069
00070
00071
00072
00073
00074 #ifndef SIZEOF_VOID_P
00075 #define SIZEOF_VOID_P 4
00076 #endif
00077 #ifndef SIZEOF_INT
00078 #define SIZEOF_INT 4
00079 #endif
00080
00081 #undef CONST
00082 #if defined(__STDC__) || defined(__cplusplus)
00083 #define CONST const
00084 #else
00085 #define CONST
00086 #endif
00087
00088 #if defined(__GNUC__)
00089 #define MTR_INLINE __inline__
00090 # if (__GNUC__ >2 || __GNUC_MINOR__ >=7)
00091 # define MTR_UNUSED __attribute__ ((unused))
00092 # else
00093 # define MTR_UNUSED
00094 # endif
00095 #else
00096 #define MTR_INLINE
00097 #define MTR_UNUSED
00098 #endif
00099
00100
00101 #define MTR_DEFAULT 0x00000000
00102 #define MTR_TERMINAL 0x00000001
00103 #define MTR_SOFT 0x00000002
00104 #define MTR_FIXED 0x00000004
00105 #define MTR_NEWNODE 0x00000008
00106
00107
00108
00109
00110
00111 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00112 #define MTR_MAXHIGH (((MtrHalfWord) ~0) >> 1)
00113 #else
00114 #define MTR_MAXHIGH ((MtrHalfWord) ~0)
00115 #endif
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00128 typedef unsigned int MtrHalfWord;
00129 #else
00130 typedef unsigned short MtrHalfWord;
00131 #endif
00132
00133 typedef struct MtrNode {
00134 MtrHalfWord flags;
00135 MtrHalfWord low;
00136 MtrHalfWord size;
00137 MtrHalfWord index;
00138 struct MtrNode *parent;
00139 struct MtrNode *child;
00140 struct MtrNode *elder;
00141 struct MtrNode *younger;
00142 } MtrNode;
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 #define MTR_SET(node, flag) (node->flags |= (flag))
00156 #define MTR_RESET(node, flag) (node->flags &= ~ (flag))
00157 #define MTR_TEST(node, flag) (node->flags & (flag))
00158
00159
00162
00163
00164
00165
00166 extern MtrNode * Mtr_AllocNode (void);
00167 extern void Mtr_DeallocNode (MtrNode *node);
00168 extern MtrNode * Mtr_InitTree (void);
00169 extern void Mtr_FreeTree (MtrNode *node);
00170 extern MtrNode * Mtr_CopyTree (MtrNode *node, int expansion);
00171 extern void Mtr_MakeFirstChild (MtrNode *parent, MtrNode *child);
00172 extern void Mtr_MakeLastChild (MtrNode *parent, MtrNode *child);
00173 extern MtrNode * Mtr_CreateFirstChild (MtrNode *parent);
00174 extern MtrNode * Mtr_CreateLastChild (MtrNode *parent);
00175 extern void Mtr_MakeNextSibling (MtrNode *first, MtrNode *second);
00176 extern void Mtr_PrintTree (MtrNode *node);
00177 extern MtrNode * Mtr_InitGroupTree (int lower, int size);
00178 extern MtrNode * Mtr_MakeGroup (MtrNode *root, unsigned int low, unsigned int high, unsigned int flags);
00179 extern MtrNode * Mtr_DissolveGroup (MtrNode *group);
00180 extern MtrNode * Mtr_FindGroup (MtrNode *root, unsigned int low, unsigned int high);
00181 extern int Mtr_SwapGroups (MtrNode *first, MtrNode *second);
00182 extern void Mtr_PrintGroups (MtrNode *root, int silent);
00183 extern MtrNode * Mtr_ReadGroups (FILE *fp, int nleaves);
00184
00187 #ifdef __cplusplus
00188 }
00189 #endif
00190
00191 #endif