Julius 4.2
|
00001 00031 /* 00032 * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University 00033 * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology 00034 * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology 00035 * All rights reserved 00036 */ 00037 00038 #include <sent/stddefs.h> 00039 #include <errno.h> 00040 00041 #ifdef HAVE_ZLIB 00042 /* use built-in zlib functions */ 00043 /* current implementatin casts gzFile to FILE... */ 00044 00045 #include <zlib.h> 00046 00054 FILE * 00055 fopen_readfile(char *filename) 00056 { 00057 gzFile gp; 00058 gp = gzopen(filename, "rb"); 00059 if (gp == NULL) { 00060 jlog("Error: gzfile: unable to open %s\n", filename); 00061 } 00062 return(gp); 00063 } 00064 00072 int 00073 fclose_readfile(FILE *fp) 00074 { 00075 if (gzclose((gzFile)fp) < 0) { 00076 jlog("Error: gzfile: unable to close file\n"); 00077 return -1; 00078 } 00079 return 0; 00080 } 00081 00092 size_t 00093 myfread(void *ptr, size_t size, size_t n, FILE *fp) 00094 { 00095 int cnt; 00096 cnt = gzread((gzFile)fp, (voidp)ptr, (unsigned)size * n); 00097 if (cnt < 0) { 00098 jlog("Error: gzfile: failed to read %d bytes\n", size * n); 00099 return(-1); 00100 } 00101 return(cnt / size); 00102 } 00103 00111 int 00112 myfgetc(FILE *fp) 00113 { 00114 int ret; 00115 ret = gzgetc((gzFile)fp); 00116 return(ret); 00117 } 00118 00126 int 00127 myfeof(FILE *fp) 00128 { 00129 if (gzeof((gzFile)fp) == 0) { 00130 return 0; 00131 } 00132 return 1; 00133 } 00134 00142 int 00143 myfrewind(FILE *fp) 00144 { 00145 if (gzrewind((gzFile)fp) != 0) return -1; 00146 return 0; 00147 } 00148 00149 #else /* ~HAVE_ZLIB */ 00150 00151 /* use external "gzip" via pipe */ 00152 /* can read only one file at a time */ 00153 00154 static boolean isopen = FALSE; 00155 static FILE *zcat_pipe = NULL; 00156 00164 static boolean 00165 is_zcatfile(char *filename) 00166 { 00167 int len; 00168 00169 len = strlen(filename); 00170 if (strmatch(".Z", &filename[len - 2])) { 00171 return TRUE; 00172 } else if (strmatch(".z", &filename[len - 2]) || strmatch(".gz", &filename[len - 3])) { 00173 return TRUE; 00174 } 00175 return FALSE; 00176 } 00177 00185 FILE * 00186 fopen_readfile(char *filename) 00187 { 00188 FILE *fp; 00189 char *cmd; 00190 00191 if (isopen) { /* already open */ 00192 jlog("Error: gzfile: previously opened file is not closed yet.\n"); 00193 return NULL; 00194 } 00195 if (is_zcatfile(filename)) { /* open compressed file */ 00196 cmd = (char *)mymalloc(strlen(ZCAT) + strlen(filename) + 2); 00197 strcpy(cmd, ZCAT); 00198 strcat(cmd," "); 00199 strcat(cmd, filename); 00200 zcat_pipe = popen(cmd, "r"); 00201 if (zcat_pipe == NULL) { 00202 jlog("Error: gzfile: failed to exec \"%s\" for opening file \"%s\"\n", cmd, filename); 00203 return NULL; 00204 } 00205 free(cmd); 00206 fp = zcat_pipe; 00207 } else { /* open normal file */ 00208 fp = fopen(filename, "rb"); 00209 if (fp == NULL) { /* error */ 00210 jlog("Error: gzfile: failed to open \"%s\"\n", filename); 00211 return NULL; 00212 } 00213 zcat_pipe = NULL; 00214 } 00215 00216 isopen = TRUE; 00217 return (fp); 00218 } 00219 00227 int 00228 fclose_readfile(FILE *fp) 00229 { 00230 if (!isopen) { /* not opened yet */ 00231 return -1; 00232 } 00233 00234 if (zcat_pipe != NULL) { /* pipe opened fp */ 00235 if (fp != zcat_pipe) { 00236 jlog("Error: gzfile: fp is not opened by fopen_readfile()\n"); 00237 return -1; 00238 } 00239 if (pclose(zcat_pipe) == -1) { 00240 jlog("Error: gzfile: failed to close gzip pipe\n"); 00241 return -1; 00242 } 00243 zcat_pipe = NULL; 00244 } else { /* normal opened fp */ 00245 if (fclose(fp) != 0) { 00246 jlog("Error: gzfile: failed to close file\n"); 00247 return -1; 00248 } 00249 } 00250 00251 isopen = FALSE; 00252 return 0; 00253 } 00254 00265 size_t 00266 myfread(void *ptr, size_t size, size_t n, FILE *fp) 00267 { 00268 size_t ret; 00269 ret = fread(ptr, size, n, fp); 00270 if (ret == 0) { 00271 if (myfeof(fp) == 1) { 00272 return 0; 00273 } else { 00274 return -1; 00275 } 00276 } 00277 return(ret); 00278 } 00279 00287 int 00288 myfgetc(FILE *fp) 00289 { 00290 int ret; 00291 ret = fgetc(fp); 00292 if (ret == EOF) return -1; 00293 return(ret); 00294 } 00295 00303 int 00304 myfeof(FILE *fp) 00305 { 00306 if (feof(fp) == 0) { 00307 return 0; 00308 } 00309 return 1; 00310 } 00311 00319 int 00320 myfrewind(FILE *fp) 00321 { 00322 if (fseek(fp, 0L, SEEK_SET) != 0) return -1; 00323 return 0; 00324 } 00325 00326 #endif /* ~HAVE_ZLIB */ 00327 00335 FILE * 00336 fopen_writefile(char *filename) 00337 { 00338 FILE *fp; 00339 00340 fp = fopen(filename, "wb"); 00341 if (fp == NULL) { /* error */ 00342 jlog("Error: gzfile: failed to open \"%s\" for writing\n", filename); 00343 } 00344 return (fp); 00345 } 00346 00354 int /* return value: 0=success, -1=failure */ 00355 fclose_writefile(FILE *fp) 00356 { 00357 if (fclose(fp) != 0) { 00358 return -1; 00359 } 00360 return 0; 00361 } 00362 00373 size_t 00374 myfwrite(void *ptr, size_t size, size_t n, FILE *fp) 00375 { 00376 return(fwrite(ptr, size, n, fp)); 00377 }