00001
00063 #include "util.h"
00064 #include "mtrInt.h"
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #ifndef lint
00084 static char rcsid[] MTR_UNUSED = "$Id: mtrBasic.c,v 1.13 2009/02/20 02:03:47 fabio Exp $";
00085 #endif
00086
00087
00088
00089
00090
00093
00094
00095
00096
00097
00101
00102
00103
00104
00116 MtrNode *
00117 Mtr_AllocNode(void)
00118 {
00119 MtrNode *node;
00120
00121 node = ALLOC(MtrNode,1);
00122 return node;
00123
00124 }
00125
00126
00138 void
00139 Mtr_DeallocNode(
00140 MtrNode * node )
00141 {
00142 FREE(node);
00143 return;
00144
00145 }
00146
00147
00159 MtrNode *
00160 Mtr_InitTree(void)
00161 {
00162 MtrNode *node;
00163
00164 node = Mtr_AllocNode();
00165 if (node == NULL) return(NULL);
00166
00167 node->parent = node->child = node->elder = node->younger = NULL;
00168 node->flags = 0;
00169
00170 return(node);
00171
00172 }
00173
00174
00186 void
00187 Mtr_FreeTree(
00188 MtrNode * node)
00189 {
00190 if (node == NULL) return;
00191 if (! MTR_TEST(node,MTR_TERMINAL)) Mtr_FreeTree(node->child);
00192 Mtr_FreeTree(node->younger);
00193 Mtr_DeallocNode(node);
00194 return;
00195
00196 }
00197
00198
00213 MtrNode *
00214 Mtr_CopyTree(
00215 MtrNode * node,
00216 int expansion)
00217 {
00218 MtrNode *copy;
00219
00220 if (node == NULL) return(NULL);
00221 if (expansion < 1) return(NULL);
00222 copy = Mtr_AllocNode();
00223 if (copy == NULL) return(NULL);
00224 copy->parent = copy->elder = copy->child = copy->younger = NULL;
00225 if (node->child != NULL) {
00226 copy->child = Mtr_CopyTree(node->child, expansion);
00227 if (copy->child == NULL) {
00228 Mtr_DeallocNode(copy);
00229 return(NULL);
00230 }
00231 }
00232 if (node->younger != NULL) {
00233 copy->younger = Mtr_CopyTree(node->younger, expansion);
00234 if (copy->younger == NULL) {
00235 Mtr_FreeTree(copy);
00236 return(NULL);
00237 }
00238 }
00239 copy->flags = node->flags;
00240 copy->low = node->low * expansion;
00241 copy->size = node->size * expansion;
00242 copy->index = node->index * expansion;
00243 if (copy->younger) copy->younger->elder = copy;
00244 if (copy->child) {
00245 MtrNode *auxnode = copy->child;
00246 while (auxnode != NULL) {
00247 auxnode->parent = copy;
00248 auxnode = auxnode->younger;
00249 }
00250 }
00251 return(copy);
00252
00253 }
00254
00255
00267 void
00268 Mtr_MakeFirstChild(
00269 MtrNode * parent,
00270 MtrNode * child)
00271 {
00272 child->parent = parent;
00273 child->younger = parent->child;
00274 child->elder = NULL;
00275 if (parent->child != NULL) {
00276 #ifdef MTR_DEBUG
00277 assert(parent->child->elder == NULL);
00278 #endif
00279 parent->child->elder = child;
00280 }
00281 parent->child = child;
00282 return;
00283
00284 }
00285
00286
00298 void
00299 Mtr_MakeLastChild(
00300 MtrNode * parent,
00301 MtrNode * child)
00302 {
00303 MtrNode *node;
00304
00305 child->younger = NULL;
00306
00307 if (parent->child == NULL) {
00308 parent->child = child;
00309 child->elder = NULL;
00310 } else {
00311 for (node = parent->child;
00312 node->younger != NULL;
00313 node = node->younger);
00314 node->younger = child;
00315 child->elder = node;
00316 }
00317 child->parent = parent;
00318 return;
00319
00320 }
00321
00322
00335 MtrNode *
00336 Mtr_CreateFirstChild(
00337 MtrNode * parent)
00338 {
00339 MtrNode *child;
00340
00341 child = Mtr_AllocNode();
00342 if (child == NULL) return(NULL);
00343
00344 child->child = child->younger = child-> elder = NULL;
00345 child->flags = 0;
00346 Mtr_MakeFirstChild(parent,child);
00347 return(child);
00348
00349 }
00350
00351
00364 MtrNode *
00365 Mtr_CreateLastChild(
00366 MtrNode * parent)
00367 {
00368 MtrNode *child;
00369
00370 child = Mtr_AllocNode();
00371 if (child == NULL) return(NULL);
00372
00373 child->child = child->younger = child->elder = NULL;
00374 child->flags = 0;
00375 Mtr_MakeLastChild(parent,child);
00376 return(child);
00377
00378 }
00379
00380
00393 void
00394 Mtr_MakeNextSibling(
00395 MtrNode * first,
00396 MtrNode * second)
00397 {
00398 second->younger = first->younger;
00399 if (first->younger != NULL) {
00400 first->younger->elder = second;
00401 }
00402 second->parent = first->parent;
00403 first->younger = second;
00404 second->elder = first;
00405 return;
00406
00407 }
00408
00409
00421 void
00422 Mtr_PrintTree(
00423 MtrNode * node)
00424 {
00425 if (node == NULL) return;
00426 (void) fprintf(stdout,
00427 #if SIZEOF_VOID_P == 8
00428 "N=0x%-8lx C=0x%-8lx Y=0x%-8lx E=0x%-8lx P=0x%-8lx F=%x L=%u S=%u\n",
00429 (unsigned long) node, (unsigned long) node->child,
00430 (unsigned long) node->younger, (unsigned long) node->elder,
00431 (unsigned long) node->parent, node->flags, node->low, node->size);
00432 #else
00433 "N=0x%-8x C=0x%-8x Y=0x%-8x E=0x%-8x P=0x%-8x F=%x L=%hu S=%hu\n",
00434 (unsigned) node, (unsigned) node->child,
00435 (unsigned) node->younger, (unsigned) node->elder,
00436 (unsigned) node->parent, node->flags, node->low, node->size);
00437 #endif
00438 if (!MTR_TEST(node,MTR_TERMINAL)) Mtr_PrintTree(node->child);
00439 Mtr_PrintTree(node->younger);
00440 return;
00441
00442 }
00443
00444
00445
00446
00447
00448
00449
00450