Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
thd_compress.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "thd_compress.h"
00008 #include "Amalloc.h"
00009
00010
00011
00012
00013 int COMPRESS_is_file( char * pathname )
00014 {
00015 static struct stat buf ;
00016 int ii ;
00017
00018 if( pathname == NULL ) return 0 ;
00019 ii = stat( pathname , &buf ) ; if( ii != 0 ) return 0 ;
00020 ii = (buf.st_mode & S_IFREG) != 0 ; return ii ;
00021 }
00022
00023
00024
00025
00026
00027
00028 int COMPRESS_has_suffix( char * fname , int mode )
00029 {
00030 int ll ;
00031
00032 if( mode < 0 ) return 1 ;
00033 if( mode > COMPRESS_LASTCODE ) return 0 ;
00034
00035 ll = strlen(fname) ;
00036 return ( ll > COMPRESS_suffix_len[mode] &&
00037 strcmp(COMPRESS_suffix[mode] ,
00038 fname+(ll-COMPRESS_suffix_len[mode])) == 0 ) ;
00039 }
00040
00041
00042
00043
00044
00045
00046 int COMPRESS_filecode( char * fname )
00047 {
00048 int ii ;
00049 char * buf ;
00050
00051 if( fname == NULL || fname[0] == '\0' ) return COMPRESS_NOFILE ;
00052
00053
00054
00055 for( ii=0 ; ii <= COMPRESS_LASTCODE ; ii++ ){
00056 if( COMPRESS_has_suffix(fname,ii) ){
00057 if( COMPRESS_is_file(fname) ) return ii ;
00058 else return COMPRESS_NOFILE ;
00059 }
00060 }
00061 if( COMPRESS_is_file(fname) ) return COMPRESS_NONE ;
00062
00063
00064
00065 buf = AFMALL(char, sizeof(char) * (strlen(fname)+16) ) ;
00066 for( ii=0 ; ii <= COMPRESS_LASTCODE ; ii++ ){
00067 strcpy(buf,fname) ; strcat(buf,COMPRESS_suffix[ii]) ;
00068 if( COMPRESS_is_file(buf) ){ free(buf) ; return ii ; }
00069 }
00070 free(buf) ; return COMPRESS_NOFILE ;
00071 }
00072
00073
00074
00075
00076
00077
00078 #define NFOPMAX 16
00079 static int fop_init = 0 ;
00080 static int fop_fileno[NFOPMAX] ;
00081 static int fop_popend[NFOPMAX] ;
00082
00083 static void putin_fop_table( FILE * fp , int ppp )
00084 {
00085 int ii ;
00086
00087 if( fp == NULL ) return ;
00088
00089 if( ! fop_init ){
00090 for( ii=0 ; ii < NFOPMAX ; ii++ ){
00091 fop_fileno[ii] = -1 ;
00092 fop_popend[ii] = 0 ;
00093 }
00094 fop_init = 1 ;
00095 }
00096
00097 for( ii=0 ; ii < NFOPMAX ; ii++ )
00098 if( fop_fileno[ii] < 0 ) break ;
00099
00100 if( ii == NFOPMAX ){
00101 fprintf(stderr,"\n*** AFNI compressor table overflow!\n") ;
00102 return ;
00103 }
00104
00105 fop_fileno[ii] = fileno(fp) ;
00106 fop_popend[ii] = ppp ;
00107 return ;
00108 }
00109
00110
00111
00112
00113 int COMPRESS_fclose( FILE * fp )
00114 {
00115 int fn , ii ;
00116
00117 if( fp == NULL || ! fop_init ) return fclose(fp) ;
00118
00119 fn = fileno(fp) ;
00120 for( ii=0 ; ii < NFOPMAX ; ii++ ){
00121 if( fop_fileno[ii] == fn ){
00122 fop_fileno[ii] = -1 ;
00123 if( fop_popend[ii] ) return pclose(fp) ;
00124 else return fclose(fp) ;
00125 }
00126 }
00127
00128 return fclose(fp) ;
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138 char * COMPRESS_filename( char * fname )
00139 {
00140 char * buf ;
00141 int ll , mm ;
00142
00143 if( fname == NULL || fname[0] == '\0' ) return NULL ;
00144
00145 mm = COMPRESS_filecode( fname ) ;
00146 if( mm == COMPRESS_NOFILE ) return NULL ;
00147
00148 ll = strlen(fname) ;
00149 buf = AFMALL(char, sizeof(char) * (ll+16) ) ;
00150
00151 if( mm == COMPRESS_NONE ){
00152 strcpy(buf,fname) ;
00153 } else {
00154 if( ! COMPRESS_has_suffix(fname,mm) ){
00155 strcpy(buf,fname) ; strcat(buf,COMPRESS_suffix[mm]) ;
00156 } else {
00157 strcpy(buf,fname) ;
00158 }
00159 }
00160 return buf ;
00161 }
00162
00163
00164
00165 char * COMPRESS_add_suffix( char * fname , int mm )
00166 {
00167 char * buf ;
00168 int ll ;
00169
00170 if( fname == NULL || fname[0] == '\0' ) return NULL ;
00171
00172 ll = strlen(fname) ;
00173 buf = AFMALL(char, sizeof(char) * (ll+16) ) ;
00174
00175 strcpy(buf,fname) ;
00176 if( mm >= 0 && mm <= COMPRESS_LASTCODE &&
00177 ! COMPRESS_has_suffix(fname,mm) ){
00178
00179 strcat(buf,COMPRESS_suffix[mm]) ;
00180 }
00181
00182 return buf ;
00183 }
00184
00185
00186
00187
00188
00189 FILE * COMPRESS_fopen_read( char * fname )
00190 {
00191 FILE * fp ;
00192 int mm ;
00193 char * buf , * cmd ;
00194
00195 if( fname == NULL || fname[0] == '\0' ) return NULL ;
00196
00197 mm = COMPRESS_filecode( fname ) ;
00198
00199 if( mm == COMPRESS_NOFILE ) return NULL ;
00200
00201 if( mm == COMPRESS_NONE ){
00202 fp = fopen(fname,"r") ;
00203 putin_fop_table(fp,0) ;
00204 return fp ;
00205 }
00206
00207 #if 1
00208 if( ! COMPRESS_has_suffix(fname,mm) ){
00209 buf = AFMALL(char, sizeof(char) * (strlen(fname)+16) ) ;
00210 strcpy(buf,fname) ; strcat(buf,COMPRESS_suffix[mm]) ;
00211 } else {
00212 buf = fname ;
00213 }
00214 #else
00215 buf = fname ;
00216 #endif
00217
00218 cmd = AFMALL(char, sizeof(char) * (strlen(buf)+32) ) ;
00219 sprintf(cmd,COMPRESS_unprogram[mm],buf) ;
00220
00221 fp = popen(cmd,"r") ;
00222 putin_fop_table(fp,1) ;
00223
00224 free(cmd) ; if( buf != fname ) free(buf) ;
00225 return fp ;
00226 }
00227
00228
00229
00230
00231
00232
00233
00234 FILE * COMPRESS_fopen_write( char * fname , int mm )
00235 {
00236 FILE * fp ;
00237 char * buf , * cmd ;
00238
00239 if( fname == NULL || fname[0] == '\0' ) return NULL ;
00240
00241
00242
00243
00244 if( mm < 0 || ! COMPRESS_program_ok[mm] ){
00245 fp = fopen(fname,"w") ;
00246 putin_fop_table(fp,0) ;
00247 return fp ;
00248 }
00249
00250 #if 1
00251 if( ! COMPRESS_has_suffix(fname,mm) ){
00252 buf = AFMALL(char, sizeof(char) * (strlen(fname)+16) ) ;
00253 strcpy(buf,fname) ; strcat(buf,COMPRESS_suffix[mm]) ;
00254 } else {
00255 buf = fname ;
00256 }
00257 #else
00258 buf = fname ;
00259 #endif
00260
00261 cmd = AFMALL(char, sizeof(char) * (strlen(buf)+32) ) ;
00262 sprintf(cmd,COMPRESS_program[mm],buf) ;
00263
00264 fp = popen(cmd,"w") ;
00265 putin_fop_table(fp,1) ;
00266
00267 free(cmd) ; if( buf != fname ) free(buf) ;
00268 return fp ;
00269 }
00270
00271
00272
00273 int COMPRESS_unlink( char * fname )
00274 {
00275 char * fff = COMPRESS_filename(fname) ;
00276 int ii = -1 ;
00277 if( fff != NULL ){ ii=unlink(fff); free(fff); }
00278 return ii ;
00279 }