84 static char rcsid[]
MTR_UNUSED =
"$Id: mtrGroup.c,v 1.21 2012/02/05 01:06:19 fabio Exp $";
127 if (root == NULL)
return(NULL);
175 if (low < (
unsigned int) root->
low ||
176 low + size > (
unsigned int) (root->
low + root->
size))
185 if (root->
child == NULL) {
187 if (newn == NULL)
return(NULL);
202 while (first != NULL && low >= (
unsigned int) (first->
low + first->
size)) {
211 if (newn == NULL)
return(NULL);
216 newn->
elder = previous;
222 if (low >= (
unsigned int) first->
low &&
223 low + size <= (
unsigned int) (first->
low + first->
size)) {
227 }
else if (low + size <= first->low) {
231 if (newn == NULL)
return(NULL);
237 newn->
elder = previous;
240 if (previous != NULL) {
246 }
else if (low < (
unsigned int) first->
low &&
247 low + size < (
unsigned int) (first->
low + first->
size)) {
250 }
else if (low > first->
low) {
261 while (last != NULL &&
262 (
unsigned int) (last->
low + last->
size) < low + size) {
269 if (newn == NULL)
return(NULL);
275 newn->
elder = previous;
278 if (previous != NULL) {
284 while (last != NULL) {
292 if (low + size - 1 >= (
unsigned int) last->
low &&
293 low + size < (
unsigned int) (last->
low + last->
size)) {
305 if (newn == NULL)
return(NULL);
311 if (previous == NULL) {
316 newn->
elder = previous;
323 for (node = first; node != NULL; node = node->
younger) {
357 if (parent == NULL)
return(NULL);
373 if (group == parent->
child) {
414 if (size < 1)
return(NULL);
419 if (low < (
unsigned int) root->
low ||
420 low + size > (
unsigned int) (root->
low + root->
size))
423 if (root->
size == size && root->
low == low)
426 if (root->
child == NULL)
433 while (low >= (
unsigned int) (node->
low + node->
size)) {
436 if (low + size <= (
unsigned int) (node->
low + node->
size)) {
471 if (second->
younger == first) {
475 }
else if (first->
younger != second) {
479 sizeFirst = first->
size;
480 sizeSecond = second->
size;
484 if (parent == NULL || second->
parent != parent)
return(0);
485 if (parent->
child == first) {
486 parent->
child = second;
495 first->
elder = second;
500 if (!
mtrShiftHL(second,-sizeFirst))
return(0);
531 sorted->
low = permutation[sorted->
index];
532 if (sorted->
child != NULL)
536 while (auxnode != NULL) {
539 auxnode->
low = permutation[auxnode->
index];
540 if (auxnode->
child != NULL)
542 rightplace = auxnode->
elder;
544 while (rightplace != NULL && auxnode->
low < rightplace->
low)
545 rightplace = rightplace->
elder;
547 if (auxnode != NULL) {
553 if (rightplace == NULL) {
554 sorted->
elder = moving;
555 moving->
elder = NULL;
559 moving->
elder = rightplace;
561 if (rightplace->
younger != NULL)
567 if (sorted->
parent != NULL)
604 #if SIZEOF_VOID_P == 8 605 if (!silent) (void) printf(
"(%u",root->
low);
607 if (!silent) (void) printf(
"(%hu",root->
low);
610 if (!silent) (void) printf(
",");
613 while (node != NULL) {
621 #if SIZEOF_VOID_P == 8 622 (void) printf(
"%u", root->
low + root->
size - 1);
624 (void) printf(
"%hu", root->
low + root->
size - 1);
633 if (root->
parent == NULL) (void) printf(
"\n");
674 retval = fprintf(fp,
"(");
675 if (retval == EOF)
return(0);
678 while (child != NULL) {
681 while (level < child->low) {
682 retval = fprintf(fp,
"%d%s", invperm[level], (level < root->low + root->
size - 1) ?
"," :
"");
683 if (retval == EOF)
return(0);
687 if (retval == 0)
return(0);
688 level += child->
size;
689 if (level < root->low + root->
size - 1) {
690 retval = fprintf(fp,
",");
691 if (retval == EOF)
return(0);
695 while (level < root->low + root->
size) {
696 retval = fprintf(fp,
"%d%s", invperm[level], (level < root->low + root->
size - 1) ?
"," :
"");
697 if (retval == EOF)
return(0);
701 retval = fprintf(fp,
"|");
702 if (retval == EOF)
return(0);
704 retval = fprintf(fp,
"F");
705 if (retval == EOF)
return(0);
708 retval = fprintf(fp,
"N");
709 if (retval == EOF)
return(0);
712 retval = fprintf(fp,
"S");
713 if (retval == EOF)
return(0);
716 retval = fprintf(fp,
")");
717 if (retval == EOF)
return(0);
718 if (root->
parent == NULL) {
719 retval = fprintf(fp,
"\n");
720 if (retval == EOF)
return(0);
766 char attrib[8*
sizeof(
unsigned int)+1];
770 if (root == NULL)
return NULL;
774 err = fscanf(fp,
"%d %d %s", &low, &size, attrib);
777 }
else if (err != 3) {
780 }
else if (low < 0 || low+size > nleaves || size < 1) {
794 for (c=attrib; *c != 0; c++) {
858 low = (int) node->
low;
868 auxnode = node->
child;
872 }
while (auxnode != NULL);
static char rcsid [] MTR_UNUSED
MtrNode * Mtr_InitGroupTree(int lower, int size)
unsigned short MtrHalfWord
MtrNode * Mtr_DissolveGroup(MtrNode *group)
void Mtr_FreeTree(MtrNode *node)
void Mtr_PrintGroups(MtrNode *root, int silent)
#define MTR_TEST(node, flag)
int Mtr_SwapGroups(MtrNode *first, MtrNode *second)
MtrNode * Mtr_MakeGroup(MtrNode *root, unsigned int low, unsigned int size, unsigned int flags)
MtrNode * Mtr_AllocNode(void)
MtrNode * Mtr_FindGroup(MtrNode *root, unsigned int low, unsigned int size)
void Mtr_DeallocNode(MtrNode *node)
void Mtr_ReorderGroups(MtrNode *treenode, int *permutation)
MtrNode * Mtr_InitTree(void)
int Mtr_PrintGroupedOrder(MtrNode *root, int *invperm, FILE *fp)
MtrNode * Mtr_ReadGroups(FILE *fp, int nleaves)
static int mtrShiftHL(MtrNode *node, int shift)