libsent/src/util/gzfile.c

Go to the documentation of this file.
00001 
00030 /*
00031  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00032  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00033  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology
00034  * All rights reserved
00035  */
00036 
00037 #include <sent/stddefs.h>
00038 #include <errno.h>
00039 
00040 #ifdef HAVE_ZLIB
00041 /* use built-in zlib functions */
00042 /* current implementatin casts gzFile to FILE... */
00043 
00044 #include <zlib.h>
00045 
00053 FILE *
00054 fopen_readfile(char *filename)
00055 {
00056   gzFile gp;
00057   gp = gzopen(filename, "rb");
00058   if (gp == NULL) perror("fopen_readfile");
00059   return(gp);
00060 }
00061 
00069 int
00070 fclose_readfile(FILE *fp)
00071 {
00072   if (gzclose((gzFile)fp) < 0) {
00073     perror("fclose_readfile");
00074     return -1;
00075   }
00076   return 0;
00077 }
00078 
00089 size_t
00090 myfread(void *ptr, size_t size, size_t n, FILE *fp)
00091 {
00092   int cnt;
00093   cnt = gzread((gzFile)fp, (voidp)ptr, (unsigned)size * n);
00094   if (cnt < 0) {
00095     perror("myfread");
00096     return(-1);
00097   }
00098   return(cnt / size);
00099 }
00100 
00108 int
00109 myfgetc(FILE *fp)
00110 {
00111   int ret;
00112   ret = gzgetc((gzFile)fp);
00113   return(ret);
00114 }
00115 
00123 int
00124 myfeof(FILE *fp)
00125 {
00126   if (gzeof((gzFile)fp) == 0) {
00127     return 0;
00128   }
00129   return 1;
00130 }
00131 
00139 int
00140 myfrewind(FILE *fp)
00141 {
00142   if (gzrewind((gzFile)fp) != 0) return -1;
00143   return 0;
00144 }
00145 
00146 #else  /* ~HAVE_ZLIB */
00147 
00148 /* use external "gzip" via pipe */
00149 /* can read only one file at a time */
00150 
00151 static boolean isopen = FALSE;  
00152 static FILE *zcat_pipe = NULL; 
00153 
00161 static boolean
00162 is_zcatfile(char *filename)
00163 {
00164   int len;
00165 
00166   len = strlen(filename);
00167   if (strmatch(".Z", &filename[len - 2])) {
00168     return TRUE;
00169   } else {
00170     if (strmatch(".z", &filename[len - 2]) || strmatch(".gz", &filename[len - 3])) {
00171 #ifdef ZCAT
00172       return TRUE;
00173 #else
00174       j_error("Error: cannot read \".gz\" or \".z\" file without \"gzip\"\n");
00175 #endif
00176     } else {
00177       return FALSE;
00178     }
00179   }
00180 }
00181 
00189 FILE *
00190 fopen_readfile(char *filename)
00191 {
00192   FILE *fp;
00193   char *cmd;
00194 
00195   if (isopen) {         /* already open */
00196     j_printerr("fopen_readfile: previously opened file is not closed yet.\n");
00197     return NULL;
00198   }
00199   if (is_zcatfile(filename)) {  /* open compressed file */
00200     cmd = (char *)mymalloc(strlen(ZCAT) + strlen(filename) + 2);
00201     strcpy(cmd, ZCAT);
00202     strcat(cmd," ");
00203     strcat(cmd, filename);
00204     zcat_pipe = popen(cmd, "r");
00205     free(cmd);
00206     if (zcat_pipe == NULL) {
00207       perror("fopen_readfile");
00208       return NULL;
00209     }
00210     fp = zcat_pipe;
00211   } else {                      /* open normal file */
00212     fp = fopen(filename, "rb");
00213     if (fp == NULL) {           /* error */
00214       perror("fopen_readfile");
00215       return NULL;
00216     }
00217     zcat_pipe = NULL;
00218   }
00219   
00220   isopen = TRUE;
00221   return (fp);
00222 }
00223 
00231 int
00232 fclose_readfile(FILE *fp)
00233 {
00234   if (!isopen) {                /* not opened yet */
00235     return -1;
00236   }
00237   
00238   if (zcat_pipe != NULL) {      /* pipe opened fp */
00239     if (fp != zcat_pipe) {
00240       j_printerr("fp is not opened by fopen_readfile()\n");
00241       return -1;
00242     }
00243     if (pclose(zcat_pipe) == -1) {
00244       perror("fclose_readfile");
00245       j_printerr("failed to close gzip pipe\n");
00246       return -1;
00247     }
00248     zcat_pipe = NULL;
00249   } else  {                     /* normal opened fp */
00250     if (fclose(fp) != 0) {
00251       perror("fclose_readfile");
00252       return -1;
00253     }
00254   }
00255   
00256   isopen = FALSE;
00257   return 0;
00258 }
00259 
00270 size_t
00271 myfread(void *ptr, size_t size, size_t n, FILE *fp)
00272 {
00273   size_t ret;
00274   ret = fread(ptr, size, n, fp);
00275   if (ret == 0) {
00276     if (myfeof(fp) == 1) {
00277       return 0;
00278     } else {
00279       return -1;
00280     }
00281   }
00282   return(ret);
00283 }
00284 
00292 int
00293 myfgetc(FILE *fp)
00294 {
00295   int ret;
00296   ret = fgetc(fp);
00297   if (ret == EOF) return -1;
00298   return(ret);
00299 }
00300 
00308 int
00309 myfeof(FILE *fp)
00310 {
00311   if (feof(fp) == 0) {
00312     return 0;
00313   }
00314   return 1;
00315 }
00316 
00324 int
00325 myfrewind(FILE *fp)
00326 {
00327   if (fseek(fp, 0L, SEEK_SET) != 0) return -1;
00328   return 0;
00329 }
00330 
00331 #endif /* ~HAVE_ZLIB */
00332 
00340 FILE *
00341 fopen_writefile(char *filename)
00342 {
00343   FILE *fp;
00344 
00345   fp = fopen(filename, "wb");
00346   if (fp == NULL) {             /* error */
00347     perror("fopen_writefile");
00348   }
00349   return (fp);
00350 }
00351 
00359 int                             /* return value: 0=success, -1=failure */
00360 fclose_writefile(FILE *fp)
00361 {
00362   if (fclose(fp) != 0) {
00363     return -1;
00364   }
00365   return 0;
00366 }
00367 
00378 size_t
00379 myfwrite(void *ptr, size_t size, size_t n, FILE *fp)
00380 {
00381   return(fwrite(ptr, size, n, fp));
00382 }

Generated on Tue Dec 26 16:16:33 2006 for Julius by  doxygen 1.5.0