| #include "port.h" |
| #include "utility.h" |
| #include "sparse.h" |
| |
| |
| |
| /* |
| * sorted, double-linked list insertion |
| * |
| * type: object type |
| * |
| * first, last: fields (in header) to head and tail of the list |
| * count: field (in header) of length of the list |
| * |
| * next, prev: fields (in object) to link next and previous objects |
| * value: field (in object) which controls the order |
| * |
| * newval: value field for new object |
| * e: an object to use if insertion needed (set to actual value used) |
| */ |
| |
| #define sorted_insert(type, first, last, count, next, prev, value, newval, e) \ |
| if (last == 0) { \ |
| e->value = newval; \ |
| first = e; \ |
| last = e; \ |
| e->next = 0; \ |
| e->prev = 0; \ |
| count++; \ |
| } else if (last->value < newval) { \ |
| e->value = newval; \ |
| last->next = e; \ |
| e->prev = last; \ |
| last = e; \ |
| e->next = 0; \ |
| count++; \ |
| } else if (first->value > newval) { \ |
| e->value = newval; \ |
| first->prev = e; \ |
| e->next = first; \ |
| first = e; \ |
| e->prev = 0; \ |
| count++; \ |
| } else { \ |
| type *p; \ |
| for(p = first; p->value < newval; p = p->next) \ |
| ; \ |
| if (p->value > newval) { \ |
| e->value = newval; \ |
| p = p->prev; \ |
| p->next->prev = e; \ |
| e->next = p->next; \ |
| p->next = e; \ |
| e->prev = p; \ |
| count++; \ |
| } else { \ |
| e = p; \ |
| } \ |
| } |
| |
| |
| /* |
| * double linked-list deletion |
| */ |
| #define dll_unlink(p, first, last, next, prev, count) { \ |
| if (p->prev == 0) { \ |
| first = p->next; \ |
| } else { \ |
| p->prev->next = p->next; \ |
| } \ |
| if (p->next == 0) { \ |
| last = p->prev; \ |
| } else { \ |
| p->next->prev = p->prev; \ |
| } \ |
| count--; \ |
| } |
| |
| |
| #ifdef FAST_AND_LOOSE |
| extern sm_element *sm_element_freelist; |
| extern sm_row *sm_row_freelist; |
| extern sm_col *sm_col_freelist; |
| |
| #define sm_element_alloc(newobj) \ |
| if (sm_element_freelist == NIL(sm_element)) { \ |
| newobj = ALLOC(sm_element, 1); \ |
| } else { \ |
| newobj = sm_element_freelist; \ |
| sm_element_freelist = sm_element_freelist->next_col; \ |
| } \ |
| newobj->user_word = NIL(char); \ |
| |
| #define sm_element_free(e) \ |
| (e->next_col = sm_element_freelist, sm_element_freelist = e) |
| |
| #else |
| |
| #define sm_element_alloc(newobj) \ |
| newobj = ALLOC(sm_element, 1); \ |
| newobj->user_word = NIL(char); |
| #define sm_element_free(e) \ |
| FREE(e) |
| #endif |
| |
| |
| extern void sm_row_remove_element(); |
| extern void sm_col_remove_element(); |
| |
| /* LINTLIBRARY */ |