Doxygen Source Code Documentation
multivector.h File Reference
#include <ctype.h>#include "mrilib.h"Go to the source code of this file.
Data Structures | |
| struct | multivector |
Defines | |
| #define | MV_FLOAT 1 |
| #define | MV_STRING 2 |
| #define | MV_TYPELABEL(i) |
| #define | MV_NVEC(m) ((m)->nvec) |
| #define | MV_NDIM(m) ((m)->ndim) |
| #define | MV_FLOAT_VEC(m, i) ((float *)(m)->vec[(i)]) |
| #define | MV_FLOAT_VAL(m, i, j) (((float *)(m)->vec[(i)])[(j)]) |
| #define | MV_STRING_VEC(m, i) ((char **)(m)->vec[(i)]) |
| #define | MV_STRING_VAL(m, i, j) (((char **)(m)->vec[(i)])[(j)]) |
| #define | MV_TYPE(m, i) ((m)->type[(i)]) |
| #define | MV_LABEL(m, i) (((m)->label != NULL) ? (m)->label[(i)] : NULL) |
| #define | MV_NAME(m) ((m)->name) |
| #define | MV_FREE(m) do{ multivector_free((m)); (m)=NULL; }while(0) |
Functions | |
| multivector * | multivector_read (char *) |
| int | multivector_write (char *, multivector *) |
| void | multivector_free (multivector *mv) |
| void | multivector_set_name (multivector *, char *) |
| char * | MV_format_fval (float) |
| char * | MV_format_fval2 (float, int) |
| s = MV_format_fval2( fval, len); same as fval, but will attempt to keep the number len characters long. That's done by truncating digits to the right of the decimal point, if one exists. | |
Define Documentation
|
|
Definition at line 13 of file multivector.h. Referenced by multivector_read(), and multivector_write(). |
|
|
Definition at line 31 of file multivector.h. |
|
|
Definition at line 30 of file multivector.h. |
|
|
Definition at line 48 of file multivector.h. |
|
|
Definition at line 37 of file multivector.h. |
|
|
Definition at line 38 of file multivector.h. |
|
|
Definition at line 28 of file multivector.h. |
|
|
Definition at line 27 of file multivector.h. |
|
|
Definition at line 14 of file multivector.h. Referenced by multivector_read(), and multivector_write(). |
|
|
Definition at line 34 of file multivector.h. |
|
|
Definition at line 33 of file multivector.h. |
|
|
Definition at line 36 of file multivector.h. |
|
|
Value: Definition at line 16 of file multivector.h. |
Function Documentation
|
|
Definition at line 38 of file multivector.c. References free, multivector::label, multivector::name, multivector::nvec, multivector::type, and multivector::vec. Referenced by main(), and multivector_read().
00039 {
00040 int ii ;
00041
00042 if( mv == NULL ) return ;
00043
00044 if( mv->name != NULL ) free(mv->name) ;
00045 if( mv->type != NULL ) free(mv->type) ;
00046 if( mv->label != NULL )
00047 for( ii=0 ; ii < mv->nvec ; ii++ ) free(mv->label[ii]) ;
00048 if( mv->vec != NULL )
00049 for( ii=0 ; ii < mv->nvec ; ii++ ) free(mv->vec[ii]) ;
00050
00051 free(mv) ; return ;
00052 }
|
|
|
Definition at line 65 of file multivector.c. References free, multivector::label, LBUF, malloc, MERR, multivector_free(), MV_FLOAT, MV_STRING, my_strequiv(), multivector::name, multivector::ndim, multivector::nvec, NVMAX, realloc, SEPCH, strtod(), typ, multivector::type, and multivector::vec. Referenced by main().
00066 {
00067 FILE * fp ;
00068 char buf[LBUF] ;
00069 char * ptr , * pp[NVMAX] ;
00070 multivector * mv ;
00071 int ii , ll , nvec,ndim , first=0 ;
00072 float val ;
00073
00074 /*-- sanity check --*/
00075
00076 if( fname == NULL || fname[0] == '\0' ) return NULL ;
00077
00078 fp = fopen( fname , "r" ) ;
00079 if( fp == NULL ){ MERR("can't open file"); return NULL; }
00080
00081 mv = (multivector *) malloc( sizeof(multivector) ) ;
00082 nvec = ndim = mv->nvec = mv->ndim = 0 ;
00083 mv->name = strdup(fname) ;
00084 mv->type = NULL ; mv->label = NULL ; mv->vec = NULL ;
00085
00086 /*-- read and process any header comments --*/
00087
00088 while(1){
00089 ptr = fgets( buf , LBUF , fp ) ;
00090 if( ptr == NULL ){
00091 fclose(fp); multivector_free(mv); MERR("no data"); return NULL;
00092 }
00093
00094 ll = strlen(buf) ;
00095 for( ii=ll-1 ; ii >= 0 ; ii-- ) if( !isspace(buf[ii]) ) break ;
00096 if( ii < 0 ) continue ; /* was all blanks; goto next line */
00097
00098 if( buf[0] != '#' ){ first=1; break; } /* not a header line ==> done */
00099
00100 ptr = strtok( buf , SEPCH ) ;
00101
00102 /* handle #NAME */
00103
00104 if( my_strequiv(ptr,"#NAME") ){
00105 ptr = strtok( NULL , SEPCH ) ;
00106 if( ptr != NULL ){
00107 free(mv->name) ; mv->name = strdup(ptr) ;
00108 }
00109 continue ; /* goto next line */
00110 }
00111
00112 /* handle #TYPE */
00113
00114 if( my_strequiv(ptr,"#TYPE") ){
00115 int ntyp=0 , typ[NVMAX] ;
00116
00117 if( mv->type != NULL ){
00118 fclose(fp); multivector_free(mv); MERR("second #TYPE"); return NULL;
00119 }
00120
00121 /* scan tokens for type strings */
00122
00123 while(1){
00124 ptr = strtok( NULL , SEPCH ) ;
00125 if( ptr == NULL ) break ;
00126
00127 if( ntyp >= NVMAX ){
00128 fclose(fp); multivector_free(mv); MERR("oversize #TYPE"); return NULL;
00129 }
00130
00131 if( my_strequiv(ptr,"STRING") ) typ[ntyp++] = MV_STRING ;
00132 else if( my_strequiv(ptr,"FLOAT") ) typ[ntyp++] = MV_FLOAT ;
00133 else {
00134 fclose(fp); multivector_free(mv); MERR("illegal #TYPE"); return NULL;
00135 }
00136 }
00137
00138 if( ntyp == 0 ){
00139 fclose(fp); multivector_free(mv); MERR("illegal #TYPE"); return NULL;
00140 }
00141
00142 if( mv->nvec > 0 && ntyp != mv->nvec ){
00143 fclose(fp); multivector_free(mv); MERR("illegal #TYPE count"); return NULL;
00144 }
00145
00146 if( mv->nvec == 0 ) nvec = mv->nvec = ntyp ;
00147 mv->type = (int *) malloc( sizeof(int) * ntyp ) ;
00148 for( ii=0 ; ii < ntyp ; ii++ ) mv->type[ii] = typ[ii] ;
00149 continue ; /* goto next line */
00150 }
00151
00152 /* handle #LABEL */
00153
00154 if( my_strequiv(ptr,"#LABEL") ){
00155 int nlab=0 ; char * lab[NVMAX] ;
00156
00157 if( mv->label != NULL ){
00158 fclose(fp); multivector_free(mv); MERR("second #LABEL"); return NULL;
00159 }
00160
00161 /* scan tokens for label strings */
00162
00163 while(1){
00164 ptr = strtok( NULL , SEPCH ) ;
00165 if( ptr == NULL ) break ;
00166
00167 if( nlab >= NVMAX ){
00168 for( ii=0 ; ii < nlab ; ii++ ) free( lab[ii] ) ;
00169 fclose(fp); multivector_free(mv); MERR("oversize #LABEL"); return NULL;
00170 }
00171
00172 lab[nlab++] = strdup(ptr) ;
00173 }
00174
00175 if( nlab == 0 ){
00176 fclose(fp); multivector_free(mv); MERR("illegal #LABEL"); return NULL;
00177 }
00178
00179 if( mv->nvec > 0 && nlab != mv->nvec ){
00180 for( ii=0 ; ii < nlab ; ii++ ) free( lab[ii] ) ;
00181 fclose(fp); multivector_free(mv); MERR("illegal #LABEL count"); return NULL;
00182 }
00183
00184 if( mv->nvec == 0 ) nvec = mv->nvec = nlab ;
00185 mv->label = (char **) malloc( sizeof(char *) * nlab ) ;
00186 for( ii=0 ; ii < nlab ; ii++ ) mv->label[ii] = lab[ii] ;
00187 continue ; /* goto next line */
00188 }
00189
00190 /* otherwise, just ignore the line (it's a comment, maybe) */
00191
00192 } /* end of scan over header lines */
00193
00194 /*-- read and store data lines --*/
00195
00196 while(1){
00197 if( !first ) ptr = fgets( buf , LBUF , fp ) ;
00198 if( ptr == NULL ) break ; /* end of input */
00199 first = 0 ;
00200
00201 ll = strlen(buf) ;
00202 for( ii=ll-1 ; ii >= 0 ; ii-- ) if( !isspace(buf[ii]) ) break ;
00203 if( ii < 0 ) continue ; /* was all blanks; goto next line */
00204 if( buf[0] == '#' ) continue ; /* a comment line; goto next line */
00205
00206 /* extract tokens from this line */
00207
00208 pp[0] = strtok(buf,SEPCH) ; if( pp[0] == NULL ) continue ;
00209 ll = 1 ;
00210 while(1){
00211 pp[ll] = strtok(NULL,SEPCH) ; if( pp[ll] == NULL ) break ;
00212 ll++ ;
00213 }
00214
00215 /* check count */
00216
00217 if( nvec == 0 ){
00218 mv->nvec = nvec = ll ;
00219 if( nvec > NVMAX ) MERR("too many columns") ;
00220 }
00221 if( ll > nvec ) ll = nvec ;
00222
00223 /* make type, if needed */
00224
00225 if( mv->type == NULL ){
00226 mv->type = (int *) malloc( sizeof(int) * nvec ) ;
00227 for( ii=0 ; ii < ll ; ii++ ){
00228 val = strtod( pp[ii] , &ptr ) ;
00229 if( *ptr != '\0' ) mv->type[ii] = MV_STRING ;
00230 else mv->type[ii] = MV_FLOAT ;
00231 }
00232 for( ; ii < nvec ; ii++ ) /* this can only happen if #LABEL */
00233 mv->type[ii] = MV_FLOAT ; /* is used and has too many labels */
00234 }
00235
00236 /* initialize vector space, if needed */
00237
00238 if( mv->vec == NULL ){
00239 mv->vec = (void **) malloc( sizeof(void *) * nvec ) ;
00240 for( ii=0 ; ii < nvec ; ii++ )
00241 mv->vec[ii] = (void *) malloc( sizeof(float)*16 ) ;
00242 }
00243
00244 /* expand vector space for new row of data,
00245 convert tokens to values and store them in this space */
00246
00247 for( ii=0 ; ii < nvec ; ii++ ){
00248 switch( mv->type[ii] ){
00249 case MV_FLOAT:{
00250 float * fpt ;
00251 mv->vec[ii] = (void *) realloc( mv->vec[ii], sizeof(float)*(ndim+1) );
00252 fpt = (float *) mv->vec[ii] ;
00253 fpt[ndim] = (ii < ll) ? strtod( pp[ii] , NULL ) : 0.0 ;
00254 }
00255 break ;
00256
00257 case MV_STRING:{
00258 char ** cpt ;
00259 mv->vec[ii] = (void *) realloc( mv->vec[ii], sizeof(char *)*(ndim+1) );
00260 cpt = (char **) mv->vec[ii] ;
00261 cpt[ndim] = (ii < ll) ? strdup(pp[ii]) : strdup("\0") ;
00262 }
00263 break ;
00264 }
00265 }
00266 ndim++ ; /* just added a new element! */
00267
00268 } /* end of processing this line */
00269
00270 /*-- done --*/
00271
00272 mv->ndim = ndim ; return mv ;
00273 }
|
|
||||||||||||
|
Definition at line 280 of file multivector.c. References free, and multivector::name. Referenced by main().
00281 {
00282 if( mv->name != NULL ){ free(mv->name); mv->name = NULL; }
00283
00284 if( nname != NULL ) mv->name = strdup(nname) ;
00285 return ;
00286 }
|
|
||||||||||||
|
Definition at line 294 of file multivector.c. References multivector::label, LBUF, MAX, MV_FLOAT, MV_fval_to_char(), MV_STRING, multivector::name, multivector::ndim, multivector::nvec, NVMAX, THD_filename_ok(), multivector::type, and multivector::vec. Referenced by main().
00295 {
00296 int nvec,ndim , ii,kk,ll , width[NVMAX] ;
00297 char buf[LBUF] , fbuf[32] ;
00298 FILE * fp ;
00299 float * fpt ;
00300 char ** cpt ;
00301
00302 /*-- sanity checks --*/
00303
00304 if( !THD_filename_ok(fname) || mv == NULL ) return 0 ;
00305
00306 nvec = mv->nvec ; ndim = mv->ndim ;
00307 if( nvec < 1 || ndim < 1 ) return 0 ;
00308
00309 if( mv->type == NULL || mv->vec == NULL ) return 0 ;
00310
00311 /*-- open file, write headers --*/
00312
00313 if( strcmp(fname,"-") == 0 ){
00314 fp = stdout ;
00315 } else {
00316 fp = fopen( fname , "w" ) ; if( fp == NULL ) return 0 ;
00317 }
00318
00319 if( mv->name != NULL ) fprintf(fp,"#NAME %s\n",mv->name) ;
00320
00321 if( mv->label != NULL ){
00322 sprintf(buf,"#LABEL") ;
00323 for( ii=0 ; ii < nvec ; ii++ ){
00324 ll = strlen(buf) ;
00325 if( mv->label[ii] != NULL )
00326 sprintf(buf+ll," %s",mv->label[ii]) ;
00327 else
00328 sprintf(buf+ll," -none-") ;
00329 }
00330 fprintf(fp,"%s\n",buf) ;
00331 }
00332
00333 sprintf(buf,"#TYPE") ;
00334 for( ii=0 ; ii < nvec ; ii++ ){
00335 ll = strlen(buf) ;
00336 switch( mv->type[ii] ){
00337 case MV_FLOAT: sprintf(buf+ll," FLOAT" ) ; break ;
00338 case MV_STRING: sprintf(buf+ll," STRING") ; break ;
00339 }
00340 width[ii] = 1 ;
00341 }
00342 fprintf(fp,"%s\n",buf) ;
00343
00344 /*-- scan vectors to determine maximum column widths --*/
00345
00346 for( kk=0 ; kk < ndim ; kk++ ){
00347 for( ii=0 ; ii < nvec ; ii++ ){
00348 switch( mv->type[ii] ){
00349 case MV_FLOAT:
00350 fpt = (float *) mv->vec[ii] ;
00351 MV_fval_to_char( fpt[kk] , fbuf ) ; ll = strlen(fbuf) ;
00352 width[ii] = MAX( width[ii] , ll ) ;
00353 break ;
00354
00355 case MV_STRING:
00356 cpt = (char **) mv->vec[ii] ; ll = strlen(cpt[kk]) ;
00357 width[ii] = MAX( width[ii] , ll ) ;
00358 break ;
00359 }
00360 }
00361 }
00362
00363 /*-- write data in columns --*/
00364
00365 for( kk=0 ; kk < ndim ; kk++ ){
00366 buf[0] = '\0' ;
00367 for( ii=0 ; ii < nvec ; ii++ ){
00368 ll = strlen(buf) ;
00369 switch( mv->type[ii] ){
00370 case MV_FLOAT:
00371 fpt = (float *) mv->vec[ii] ;
00372 MV_fval_to_char( fpt[kk] , fbuf ) ;
00373 sprintf(buf+ll," %*s",width[ii],fbuf) ;
00374 break ;
00375
00376 case MV_STRING:
00377 cpt = (char **) mv->vec[ii] ;
00378 sprintf(buf+ll," %*s",width[ii],cpt[kk]) ;
00379 break ;
00380 }
00381 }
00382 fprintf(fp,"%s\n",buf) ;
00383 }
00384
00385 /*-- done --*/
00386
00387 if( fp != stdout ) fclose(fp) ;
00388 return 1 ;
00389 }
|
|
|
Definition at line 464 of file multivector.c. References MV_fval_to_char(). Referenced by AFNI_niml_redisplay_CB(), atr_print(), compute_node_areas(), disp_f3_point(), disp_surf_vals(), main(), redraw_graph(), SUMA_cb_AbsThresh_tb_toggled(), SUMA_cb_set_threshold_label(), SUMA_SetScaleRange(), and v2s_write_outfile_1D().
00465 {
00466 static char buf[32] ;
00467 MV_fval_to_char( fval , buf ) ;
00468 return buf ;
00469 }
|
|
||||||||||||
|
s = MV_format_fval2( fval, len); same as fval, but will attempt to keep the number len characters long. That's done by truncating digits to the right of the decimal point, if one exists.
Definition at line 480 of file multivector.c. References MV_fval_to_char(). Referenced by main(), SUMA_M2M_node_Info(), SUMA_TableF_SetString(), SUMA_UpdateNodeLblField(), and SUMA_UpdateNodeNodeField().
00481 {
00482 static char buf[32] ;
00483 int wid;
00484 char *pos = NULL;
00485
00486 MV_fval_to_char( fval , buf ) ;
00487 if (len < 1) return (buf);
00488 if (strlen(buf) < len) return (buf);
00489
00490 /* trim it down */
00491 pos = strchr (buf, '.');
00492 if (!pos) return(buf); /* can't do no'in */
00493 wid = pos - buf;
00494 if (wid < len) buf[len] = '\0';
00495 if (buf[len-1] == '.') buf[len-1] = '\0'; /* remove trailing period */
00496 return buf ;
00497
00498 }
|