Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
niml_dtable.c
Go to the documentation of this file.00001 #include "niml_private.h"
00002 #include <math.h>
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 Dtable * new_Dtable( int len )
00013 {
00014    Dtable *dt ;
00015    dt = (Dtable *) calloc( 1 , sizeof(Dtable) ) ;
00016    dt->hta = new_Htable( len ) ;
00017    dt->htb = new_Htable( len ) ;
00018    return dt ;
00019 }
00020 
00021 
00022 
00023 
00024 
00025 void destroy_Dtable( Dtable *dt )
00026 {
00027    if( dt == NULL ) return ;
00028    Htable_set_vtkill(1) ;
00029    destroy_Htable( dt->hta ) ;
00030    destroy_Htable( dt->htb ) ;
00031    Htable_set_vtkill(0) ; ;
00032    return ;
00033 }
00034 
00035 
00036 
00037 
00038 
00039 
00040 void addto_Dtable( char *str_a , char *str_b , Dtable *dt )
00041 {
00042    char *sa , *sb ;
00043    if( dt == NULL || str_a == NULL || str_b == NULL ) return ;
00044    sa = strdup(str_a) ; sb = strdup(str_b) ;
00045    addto_Htable( sa , (void *)sb , dt->hta ) ;
00046    addto_Htable( sb , (void *)sa , dt->htb ) ;
00047    return ;
00048 }
00049 
00050 
00051 
00052 char * findin_Dtable_a( char *str_a , Dtable *dt )
00053 {
00054    if( dt == NULL || str_a == NULL ) return NULL ;
00055    return (char *)findin_Htable( str_a , dt->hta ) ;
00056 }
00057 
00058 
00059 
00060 char * findin_Dtable_b( char *str_b , Dtable *dt )
00061 {
00062    if( dt == NULL || str_b == NULL ) return NULL ;
00063    return (char *)findin_Htable( str_b , dt->htb ) ;
00064 }
00065 
00066 
00067 
00068 void removefrom_Dtable_a( char *str_a , Dtable *dt )
00069 {
00070    char *str_bb , *str_aa ;
00071    if( dt == NULL ) return ;
00072    str_bb = (char *)findin_Htable( str_a , dt->hta ) ;
00073    if( str_bb == NULL ) return ;
00074    str_aa = (char *)findin_Htable( str_bb, dt->htb ) ;
00075    removefrom_Htable( str_a , dt->hta ) ;
00076    removefrom_Htable( str_bb, dt->htb ) ;
00077 
00078    
00079 
00080    free((void *)str_bb) ; if( str_aa != NULL ) free((void *)str_aa) ;
00081    return ;
00082 }
00083 
00084 
00085 
00086 void removefrom_Dtable_b( char *str_b , Dtable *dt )
00087 {
00088    char *str_aa , *str_bb ;
00089    if( dt == NULL ) return ;
00090    str_aa = (char *)findin_Htable( str_b , dt->htb ) ;
00091    if( str_aa == NULL ) return ;
00092    str_bb = (char *)findin_Htable( str_aa, dt->hta ) ;
00093    removefrom_Htable( str_b , dt->htb ) ;
00094    removefrom_Htable( str_aa, dt->hta ) ;
00095 
00096    free((void *)str_aa) ; if( str_bb != NULL ) free((void *)str_bb) ;
00097    return ;
00098 }
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 int listize_Dtable( Dtable *dt , char ***list_a , char ***list_b )
00108 {
00109    char **la=NULL , **lb=NULL , *sa,*sb ;
00110    int jj,kk,nn ;
00111    Htable *ht ;
00112 
00113    if( dt == NULL || list_a == NULL || list_b == NULL ) return 0 ;
00114 
00115    ht = dt->hta ;
00116 
00117    for( nn=jj=0 ; jj < ht->len ; jj++ ){
00118      if( ht->vtab[jj] == NULL ) continue ;
00119      for( kk=0 ; kk < ht->ntab[jj] ; kk++ ){
00120        sa = (char *) ht->ctab[jj][kk] ; if( sa == NULL ) continue ;
00121        sb = (char *) ht->vtab[jj][kk] ; if( sb == NULL ) continue ;
00122        la = (char **) realloc( (void *)la , sizeof(char *)*(nn+1) ) ;
00123        lb = (char **) realloc( (void *)lb , sizeof(char *)*(nn+1) ) ;
00124        la[nn] = sa ; lb[nn] = sb ; nn++ ;
00125      }
00126    }
00127    *list_a = la ; *list_b = lb ; return nn ;
00128 }
00129 
00130 
00131 
00132 
00133 
00134 char * Dtable_to_nimlstring( Dtable *dt , char *name )
00135 {
00136    int nn , ii ;
00137    char **la , **lb , *stout ;
00138    NI_element *nel ;
00139    NI_stream ns ;
00140 
00141    nn = listize_Dtable( dt , &la , &lb ) ;
00142    if( nn == 0 || la == NULL || lb == NULL ) return (char *)NULL ;
00143 
00144    if( name == NULL || *name == '\0' ) name = "Dtable" ;
00145 
00146    nel = NI_new_data_element( name , nn ) ;
00147    NI_add_column( nel , NI_STRING , la ) ;
00148    NI_add_column( nel , NI_STRING , lb ) ;
00149    free(la) ; free(lb) ;
00150 
00151    ns = NI_stream_open( "str:" , "w" ) ;
00152    (void) NI_write_element( ns , nel , NI_TEXT_MODE ) ;
00153    NI_free_element( nel ) ;
00154    stout = strdup( NI_stream_getbuf(ns) ) ;
00155    NI_stream_close( ns ) ;
00156    nn = strlen(stout) ;
00157    for( ii=nn-1 ; ii > 0 && isspace(stout[ii]) ; ii-- ) ; 
00158    stout[ii+1] = '\0' ;
00159    return stout ;
00160 }
00161 
00162 
00163 
00164 Dtable * Dtable_from_nimlstring( char *nstr )
00165 {
00166    NI_stream ns ;
00167    NI_element *nel ;
00168    int nn , ii ;
00169    Dtable *dt ;
00170    char **la , **lb ;
00171 
00172    if( nstr == NULL || *nstr == '\0' ) return NULL ;
00173 
00174    
00175 
00176    ns = NI_stream_open( "str:" , "r" ) ;
00177    NI_stream_setbuf( ns , nstr ) ;
00178    nel = (NI_element *)NI_read_element( ns , 1 ) ;
00179    NI_stream_close( ns ) ;
00180    if( nel == NULL ) return NULL ;
00181 
00182    
00183 
00184    if( NI_element_type(nel) != NI_ELEMENT_TYPE ){
00185      NI_free_element(nel) ; return NULL ;
00186    }
00187 
00188    if( nel->vec_len    <  1         ||  
00189        nel->vec_filled <  1         ||  
00190        nel->vec_num    <  2         ||  
00191        nel->vec_typ[0] != NI_STRING ||  
00192        nel->vec_typ[1] != NI_STRING   ){
00193 
00194      NI_free_element(nel) ; return NULL ;
00195    }
00196 
00197    la = (char **) nel->vec[0] ;  
00198    lb = (char **) nel->vec[1] ;  
00199 
00200    nn = nel->vec_filled ;
00201    ii = rint(sqrt(2*nn+1.0l)) ;
00202    if( ii < 7 ) ii = 7 ; else if( ii%2 == 0 ) ii++ ;
00203 
00204    
00205 
00206    dt = new_Dtable( ii ) ;
00207    for( ii=0 ; ii < nn ; ii++ )
00208      addto_Dtable( la[ii] , lb[ii] , dt ) ;
00209 
00210    NI_free_element(nel) ; return dt ;
00211 }