00001 #ifndef SPARSE_H
00002 #define SPARSE_H
00003 
00004 #include "util.h"
00005 
00006 
00007 #define sm_alloc sm_allocate
00008 #define sm_free sm_free_space
00009 
00010 
00011 
00012 
00013 
00014 typedef struct sm_element_struct sm_element;
00015 typedef struct sm_row_struct sm_row;
00016 typedef struct sm_col_struct sm_col;
00017 typedef struct sm_matrix_struct sm_matrix;
00018 
00019 
00020 
00021 
00022 
00023 struct sm_element_struct {
00024     int row_num;                
00025     int col_num;                
00026     sm_element *next_row;       
00027     sm_element *prev_row;       
00028     sm_element *next_col;       
00029     sm_element *prev_col;       
00030     char *user_word;            
00031 };
00032 
00033 
00034 
00035 
00036 
00037 struct sm_row_struct {
00038     int row_num;                
00039     int length;                 
00040     int flag;                   
00041     sm_element *first_col;      
00042     sm_element *last_col;       
00043     sm_row *next_row;           
00044     sm_row *prev_row;           
00045     char *user_word;            
00046 };
00047 
00048 
00049 
00050 
00051 
00052 struct sm_col_struct {
00053     int col_num;                
00054     int length;                 
00055     int flag;                   
00056     sm_element *first_row;      
00057     sm_element *last_row;       
00058     sm_col *next_col;           
00059     sm_col *prev_col;           
00060     char *user_word;            
00061 };
00062 
00063 
00064 
00065 
00066 
00067 struct sm_matrix_struct {
00068     sm_row **rows;              
00069     int rows_size;              
00070     sm_col **cols;              
00071     int cols_size;              
00072     sm_row *first_row;          
00073     sm_row *last_row;           
00074     int nrows;                  
00075     sm_col *first_col;          
00076     sm_col *last_col;           
00077     int ncols;                  
00078     char *user_word;            
00079 };
00080 
00081 
00082 #define sm_get_col(A, colnum)   \
00083     (((colnum) >= 0 && (colnum) < (A)->cols_size) ? \
00084         (A)->cols[colnum] : (sm_col *) 0)
00085 
00086 #define sm_get_row(A, rownum)   \
00087     (((rownum) >= 0 && (rownum) < (A)->rows_size) ? \
00088         (A)->rows[rownum] : (sm_row *) 0)
00089 
00090 #define sm_foreach_row(A, prow) \
00091         for(prow = A->first_row; prow != 0; prow = prow->next_row)
00092 
00093 #define sm_foreach_col(A, pcol) \
00094         for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col)
00095 
00096 #define sm_foreach_row_element(prow, p) \
00097         for(p = (prow == 0) ? 0 : prow->first_col; p != 0; p = p->next_col)
00098 
00099 #define sm_foreach_col_element(pcol, p) \
00100         for(p = (pcol == 0) ? 0 : pcol->first_row; p != 0; p = p->next_row)
00101 
00102 #define sm_put(x, val) \
00103         (x->user_word = (char *) val)
00104 
00105 #define sm_get(type, x) \
00106         ((type) (x->user_word))
00107 
00108 EXTERN sm_matrix *sm_allocate ARGS((void));
00109 EXTERN sm_matrix *sm_alloc_size ARGS((int, int));
00110 EXTERN void sm_free_space ARGS((sm_matrix *));
00111 EXTERN sm_matrix *sm_dup ARGS((sm_matrix *));
00112 EXTERN void sm_resize ARGS((sm_matrix *, int, int));
00113 EXTERN sm_element *sm_insert ARGS((sm_matrix *, int, int));
00114 EXTERN sm_element *sm_find ARGS((sm_matrix *, int, int));
00115 EXTERN void sm_remove ARGS((sm_matrix *, int, int));
00116 EXTERN void sm_remove_element ARGS((sm_matrix *, sm_element *));
00117 EXTERN void sm_delrow ARGS((sm_matrix *, int));
00118 EXTERN void sm_delcol ARGS((sm_matrix *, int));
00119 EXTERN void sm_copy_row ARGS((sm_matrix *, int, sm_row *));
00120 EXTERN void sm_copy_col ARGS((sm_matrix *, int, sm_col *));
00121 EXTERN sm_row *sm_longest_row ARGS((sm_matrix *));
00122 EXTERN sm_col *sm_longest_col ARGS((sm_matrix *));
00123 EXTERN int sm_num_elements ARGS((sm_matrix *));
00124 EXTERN int sm_read ARGS((FILE *, sm_matrix **));
00125 EXTERN int sm_read_compressed ARGS((FILE *, sm_matrix **));
00126 EXTERN void sm_write ARGS((FILE *, sm_matrix *));
00127 EXTERN void sm_print ARGS((FILE *, sm_matrix *));
00128 EXTERN void sm_dump ARGS((sm_matrix *, char *, int));
00129 EXTERN void sm_cleanup ARGS((void));
00130 
00131 EXTERN sm_col *sm_col_alloc ARGS((void));
00132 EXTERN void sm_col_free ARGS((sm_col *));
00133 EXTERN sm_col *sm_col_dup ARGS((sm_col *));
00134 EXTERN sm_element *sm_col_insert ARGS((sm_col *, int));
00135 EXTERN void sm_col_remove ARGS((sm_col *, int));
00136 EXTERN sm_element *sm_col_find ARGS((sm_col *, int));
00137 EXTERN int sm_col_contains ARGS((sm_col *, sm_col *));
00138 EXTERN int sm_col_intersects ARGS((sm_col *, sm_col *));
00139 EXTERN int sm_col_compare ARGS((sm_col *, sm_col *));
00140 EXTERN sm_col *sm_col_and ARGS((sm_col *, sm_col *));
00141 EXTERN int sm_col_hash ARGS((sm_col *, int));
00142 EXTERN void sm_col_remove_element ARGS((sm_col *, sm_element *));
00143 EXTERN void sm_col_print ARGS((FILE *, sm_col *));
00144 
00145 EXTERN sm_row *sm_row_alloc ARGS((void));
00146 EXTERN void sm_row_free ARGS((sm_row *));
00147 EXTERN sm_row *sm_row_dup ARGS((sm_row *));
00148 EXTERN sm_element *sm_row_insert ARGS((sm_row *, int));
00149 EXTERN void sm_row_remove ARGS((sm_row *, int));
00150 EXTERN sm_element *sm_row_find ARGS((sm_row *, int));
00151 EXTERN int sm_row_contains ARGS((sm_row *, sm_row *));
00152 EXTERN int sm_row_intersects ARGS((sm_row *, sm_row *));
00153 EXTERN int sm_row_compare ARGS((sm_row *, sm_row *));
00154 EXTERN sm_row *sm_row_and ARGS((sm_row *, sm_row *));
00155 EXTERN int sm_row_hash ARGS((sm_row *, int));
00156 EXTERN void sm_row_remove_element ARGS((sm_row *, sm_element *));
00157 EXTERN void sm_row_print ARGS((FILE *, sm_row *));
00158 
00159 #endif