- new_border() war verwirrt darüber, wie man borders abspeichert.
This commit is contained in:
Enno Rehling 2004-05-22 21:01:13 +00:00
parent 4f14c6fbfb
commit 51c5570bf2
2 changed files with 143 additions and 146 deletions

View File

@ -57,17 +57,28 @@ resolve_borderid(void * id) {
return (void*)find_border((unsigned int)id); return (void*)find_border((unsigned int)id);
} }
border * static border **
get_borders(const region * r1, const region * r2) get_borders_i(const region * r1, const region * r2)
{ {
border * b; border ** bp;
int key = region_hashkey(r1); int key = region_hashkey(r1);
int k2 = region_hashkey(r2); int k2 = region_hashkey(r2);
key = min(k2, key) % BMAXHASH; key = min(k2, key) % BMAXHASH;
b = borders[key]; bp = &borders[key];
while (b && !((b->from==r1 && b->to==r2) || (b->from==r2 && b->to==r1))) b = b->nexthash; while (*bp) {
return b; border * b = *bp;
if ((b->from==r1 && b->to==r2) || (b->from==r2 && b->to==r1)) break;
bp = &b->nexthash;
}
return bp;
}
border *
get_borders(const region * r1, const region * r2)
{
border ** bp = get_borders_i(r1, r2);
return *bp;
} }
void void
@ -134,21 +145,9 @@ read_borders(FILE * f)
border * border *
new_border(border_type * type, region * from, region * to) new_border(border_type * type, region * from, region * to)
{ {
border ** bp, * b; border ** bp = get_borders_i(from, to);
int key = region_hashkey(from); border * b = calloc(1, sizeof(struct border));
int k2 = region_hashkey(to);
key = min(k2, key) % BMAXHASH;
bp = &borders[key];
/* find the first border across the same edge, so we can insert before it.
* if there's no border here yet, add the border to the end (this way, the
* b->next pointer will point to *bp, which is NULL).
*/
while (*bp && ((*bp)->from!=from || (*bp)->to!=to)) {
bp = &(*bp)->nexthash;
}
b = calloc(1, sizeof(struct border));
b->type = type; b->type = type;
b->nexthash = *bp; b->nexthash = *bp;
b->next = *bp; b->next = *bp;
@ -164,22 +163,20 @@ new_border(border_type * type, region * from, region * to)
void void
erase_border(border * b) erase_border(border * b)
{ {
border ** np = NULL, ** hp; border ** bp = get_borders_i(b->from, b->to);
int key = region_hashkey(b->from); border ** np = NULL;
int k2 = region_hashkey(b->to);
attrib ** ap = &b->attribs; attrib ** ap = &b->attribs;
while (*ap) a_remove(ap, *ap); while (*ap) a_remove(ap, *ap);
key = min(k2, key) % BMAXHASH;
hp = &borders[key]; while (*bp && *bp != b) {
while (*hp && *hp != b) { border * bprev = *bp;
border * bp = *hp; if (bprev->next==b) np=&bprev->next;
if (bp->next==b) np = &bp->next; bp = &bprev->next;
hp = &(*hp)->nexthash;
} }
assert(*hp!=NULL || !"error: border is not registered"); assert(*bp!=NULL || !"error: border is not registered");
if (np!=NULL) *np = b->next; if (np!=NULL) *np = b->next;
*hp = b->nexthash; *bp = b->nexthash;
if (b->type->destroy) b->type->destroy(b); if (b->type->destroy) b->type->destroy(b);
free(b); free(b);
} }