Julius 4.2
libsent/src/util/gzfile.c
説明を見る。
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 }