1 /* 2 * Revision Control Information 3 * 4 * $Source$ 5 * $Author$ 6 * $Revision$ 7 * $Date$ 8 * 9 */ 10 //#include "port.h" 11 //#include "utility.h" 12 #include "sparse.h" 13 14 #include "util_hack.h" // added 15 16 17 18 /* 19 * sorted, double-linked list insertion 20 * 21 * type: object type 22 * 23 * first, last: fields (in header) to head and tail of the list 24 * count: field (in header) of length of the list 25 * 26 * next, prev: fields (in object) to link next and previous objects 27 * value: field (in object) which controls the order 28 * 29 * newval: value field for new object 30 * e: an object to use if insertion needed (set to actual value used) 31 */ 32 33 #define ABC__misc__espresso__sparse_int_h 34 if (last == 0) { \ 35 e->value = newval; \ 36 first = e; \ 37 last = e; \ 38 e->next = 0; \ 39 e->prev = 0; \ 40 count++; \ 41 } else if (last->value < newval) { \ 42 e->value = newval; \ 43 last->next = e; \ 44 e->prev = last; \ 45 last = e; \ 46 e->next = 0; \ 47 count++; \ 48 } else if (first->value > newval) { \ 49 e->value = newval; \ 50 first->prev = e; \ 51 e->next = first; \ 52 first = e; \ 53 e->prev = 0; \ 54 count++; \ 55 } else { \ 56 type *p; \ 57 for(p = first; p->value < newval; p = p->next) \ 58 ; \ 59 if (p->value > newval) { \ 60 e->value = newval; \ 61 p = p->prev; \ 62 p->next->prev = e; \ 63 e->next = p->next; \ 64 p->next = e; \ 65 e->prev = p; \ 66 count++; \ 67 } else { \ 68 e = p; \ 69 } \ 70 } 71 72 73 /* 74 * double linked-list deletion 75 */ 76 #define dll_unlink(p, first, last, next, prev, count) { \ 77 if (p->prev == 0) { \ 78 first = p->next; \ 79 } else { \ 80 p->prev->next = p->next; \ 81 } \ 82 if (p->next == 0) { \ 83 last = p->prev; \ 84 } else { \ 85 p->next->prev = p->prev; \ 86 } \ 87 count--; \ 88 } 89 90 91 #ifdef FAST_AND_LOOSE 92 extern sm_element *sm_element_freelist; 93 extern sm_row *sm_row_freelist; 94 extern sm_col *sm_col_freelist; 95 96 #define sm_element_alloc(newobj) \ 97 if (sm_element_freelist == NIL(sm_element)) { \ 98 newobj = ALLOC(sm_element, 1); \ 99 } else { \ 100 newobj = sm_element_freelist; \ 101 sm_element_freelist = sm_element_freelist->next_col; \ 102 } \ 103 newobj->user_word = NIL(char); \ 104 105 #define sm_element_free(e) \ 106 (e->next_col = sm_element_freelist, sm_element_freelist = e) 107 108 #else 109 110 #define sm_element_alloc(newobj) \ 111 newobj = ALLOC(sm_element, 1); \ 112 newobj->user_word = NIL(char); 113 #define sm_element_free(e) \ 114 FREE(e) 115 #endif 116 117 118 extern void sm_row_remove_element(); 119 extern void sm_col_remove_element(); 120 121 /* LINTLIBRARY */ 122