/* * FUNCTIONS */ const char* on_off ( int*, int ); const char* true_false ( int*, int ); const char* yes_no ( int*, int ); /* * GENERAL */ template < class T > void swap( T& a, T& b ) { T temp; memcpy( &temp, &a, sizeof( T ) ); memcpy( &a, &b, sizeof( T ) ); memcpy( &b, &temp, sizeof( T ) ); return; } template < class T > bool exchange( T& value, T a, T b ) { if( value == a ) value = b; else if( value == b ) value = a; else return FALSE; return TRUE; } template < class T > T element( int i, T* first, T* second ) { return *(first+i*(second-first)); }; /* * LINKED LIST */ template < class T > void add( T*& list, T* item ) { item->next = list; list = item; return; } template < class T > void append( T*& list, T* item ) { item->next = NULL; cat( list, item ); return; } template < class T > void cat( T*& list, T* item ) { T* prev; if( list == NULL ) { list = item; } else { for( prev = list; prev->next != NULL; prev = prev->next ); prev->next = item; } return; } template < class T > void remove( T*& list, T* item ) { T* prev; if( list == item ) { list = item->next; } else { for( prev = list; prev != NULL && prev->next != item; prev = prev->next ); if( prev != NULL ) prev->next = item->next; else { bug( "Remove: Not in list." ); } } return; } template < class T > void remove( T*& list, T* item, const char* msg ) { T* prev; if( list == item ) { list = item->next; } else { for( prev = list; prev != NULL && prev->next != item; prev = prev->next ); if( prev != NULL ) prev->next = item->next; else bug( msg ); } return; } template < class T > int count( T* list ) { int i; for( i = 0; list != NULL; i++ ) list = list->next; return i; } template < class T > T* locate( T* list, int i ) { for( ; list != NULL; list = list->next ) if( --i == 0 ) return list; return NULL; } template < class T > void delete_list( T*& list ) { T* item; while( ( item = list ) != NULL ) { list = list->next; delete item; } return; } template < class T > void extract_list( T*& list ) { T* item; T* item_next; for( item = list; item != NULL; item = item_next ) { item_next = item->next; extract( item ); } list = NULL; return; } template < class T > bool is_listed( T* list, T* element ) { for( ; list != NULL; list = list->next ) if( list == element ) return TRUE; return FALSE; } /* * ARRAY */ template < class T > void vzero( T* item, int max ) { for( int i = 0; i < max; i++ ) item[i] = NULL; } /* * SEARCH/SORT TEMPLATES */ template < class T > void sort( T* list, int size ) { bool done; int i, j; for( i = 0; i < size-1; i++ ) { done = TRUE; for( j = 0; j < size-1-i; j++ ) { if( strcasecmp( list[j].name, list[j+1].name ) > 0 ) { swap( list[j], list[j+1] ); done = FALSE; } } if( done ) break; } } template < class T > int pntr_search( T** list, int max, const char* word ) { int min = 0; int value; int mid; if( list == NULL ) return -1; max--; for( ; ; ) { if( max < min ) return -min-1; mid = (max+min)/2; value = strcasecmp( name( list[mid] ), word ); if( value == 0 ) break; if( value < 0 ) min = mid+1; else max = mid-1; } return mid; } template < class T > int pntr_search( T** list, int max, const char* word, int n ) { int min = 0; int value; int mid; if( list == NULL ) return -1; max--; for( ; ; ) { if( max < min ) return -min-1; mid = (max+min)/2; value = strncasecmp( name( list[mid] ), word, n ); if( value == 0 ) break; if( value < 0 ) min = mid+1; else max = mid-1; } return mid; } template < class T > int search( T* list, int max, const char* word ) { int min = 0; int value; int mid; if( list == NULL ) return -1; max--; for( ; ; ) { if( max < min ) return -min-1; mid = (max+min)/2; value = strcasecmp( list[mid].name, word ); if( value == 0 ) break; if( value < 0 ) min = mid+1; else max = mid-1; } return mid; } /* * STATIC LIST ROUTINES */ template < class T > void insert( T*& prev, int& size, T element, int pos ) { T* next; if( prev == NULL ) { prev = new T[1]; prev[0] = element; size = 1; return; } next = new T[size+1]; memcpy( next, prev, pos*sizeof( T ) ); memcpy( &next[pos+1], &prev[pos], (size-pos)*sizeof( T ) ); delete [] prev; next[pos] = element; prev = next; size++; } template < class T > void remove( T*& prev, int& size, int pos ) { T* next; if( pos < 0 || pos >= size ) return; if( size == 1 ) { delete [] prev; prev = NULL; size = 0; return; } next = new T[size-1]; memcpy( next, prev, pos*sizeof( T ) ); memcpy( &next[pos], &prev[pos+1], (size-pos-1)*sizeof( T ) ); delete [] prev; prev = next; size--; }