Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

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, 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 
00132 #else  /* ~HAVE_ZLIB */
00133 
00134 /* use external "gzip" via pipe */
00135 /* can read only one file at a time */
00136 
00137 static boolean isopen = FALSE;  
00138 static FILE *zcat_pipe = NULL; 
00139 
00147 static boolean
00148 is_zcatfile(char *filename)
00149 {
00150   int len;
00151 
00152   len = strlen(filename);
00153   if (strmatch(".Z", &filename[len - 2])) {
00154     return TRUE;
00155   } else {
00156     if (strmatch(".z", &filename[len - 2]) || strmatch(".gz", &filename[len - 3])) {
00157 #ifdef ZCAT
00158       return TRUE;
00159 #else
00160       j_error("Error: cannot read \".gz\" or \".z\" file without \"gzip\"\n");
00161 #endif
00162     } else {
00163       return FALSE;
00164     }
00165   }
00166 }
00167 
00175 FILE *
00176 fopen_readfile(char *filename)
00177 {
00178   FILE *fp;
00179   char *cmd;
00180 
00181   if (isopen) {         /* already open */
00182     j_printerr("fopen_readfile: previously opened file is not closed yet.\n");
00183     return NULL;
00184   }
00185   if (is_zcatfile(filename)) {  /* open compressed file */
00186     cmd = (char *)mymalloc(strlen(ZCAT) + strlen(filename) + 2);
00187     strcpy(cmd, ZCAT);
00188     strcat(cmd," ");
00189     strcat(cmd, filename);
00190     zcat_pipe = popen(cmd, "r");
00191     if (zcat_pipe == NULL) {
00192       perror("fopen_readfile");
00193       return NULL;
00194     }
00195     fp = zcat_pipe;
00196   } else {                      /* open normal file */
00197     fp = fopen(filename, "rb");
00198     if (fp == NULL) {           /* error */
00199       perror("fopen_readfile");
00200       return NULL;
00201     }
00202     zcat_pipe = NULL;
00203   }
00204   
00205   isopen = TRUE;
00206   return (fp);
00207 }
00208 
00216 int
00217 fclose_readfile(FILE *fp)
00218 {
00219   if (!isopen) {                /* not opened yet */
00220     return -1;
00221   }
00222   
00223   if (zcat_pipe != NULL) {      /* pipe opened fp */
00224     if (fp != zcat_pipe) {
00225       j_printerr("fp is not opened by fopen_readfile()\n");
00226       return -1;
00227     }
00228     if (pclose(zcat_pipe) == -1) {
00229       perror("fclose_readfile");
00230       j_printerr("failed to close gzip pipe\n");
00231       return -1;
00232     }
00233     zcat_pipe = NULL;
00234   } else  {                     /* normal opened fp */
00235     if (fclose(fp) != 0) {
00236       perror("fclose_readfile");
00237       return -1;
00238     }
00239   }
00240   
00241   isopen = FALSE;
00242   return 0;
00243 }
00244 
00255 size_t
00256 myfread(void *ptr, size_t size, size_t n, FILE *fp)
00257 {
00258   size_t ret;
00259   ret = fread(ptr, size, n, fp);
00260   if (ret == 0) {
00261     if (myfeof(fp) == 1) {
00262       return 0;
00263     } else {
00264       return -1;
00265     }
00266   }
00267   return(ret);
00268 }
00269 
00277 int
00278 myfgetc(FILE *fp)
00279 {
00280   int ret;
00281   ret = fgetc(fp);
00282   if (ret == EOF) return -1;
00283   return(ret);
00284 }
00285 
00293 int
00294 myfeof(FILE *fp)
00295 {
00296   if (feof(fp) == 0) {
00297     return 0;
00298   }
00299   return 1;
00300 }
00301 
00302 #endif /* ~HAVE_ZLIB */
00303 
00311 FILE *
00312 fopen_writefile(char *filename)
00313 {
00314   FILE *fp;
00315 
00316   fp = fopen(filename, "wb");
00317   if (fp == NULL) {             /* error */
00318     perror("fopen_writefile");
00319   }
00320   return (fp);
00321 }
00322 
00330 int                             /* return value: 0=success, -1=failure */
00331 fclose_writefile(FILE *fp)
00332 {
00333   if (fclose(fp) != 0) {
00334     return -1;
00335   }
00336   return 0;
00337 }
00338 
00349 size_t
00350 myfwrite(void *ptr, size_t size, size_t n, FILE *fp)
00351 {
00352   return(fwrite(ptr, size, n, fp));
00353 }

Generated on Tue Mar 28 16:01:39 2006 for Julius by  doxygen 1.4.2