00001
00031
00032
00033
00034
00035
00036
00037
00038 #include <sent/stddefs.h>
00039 #include <errno.h>
00040
00041 #ifdef HAVE_ZLIB
00042
00043
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
00150
00151
00152
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) {
00192 jlog("Error: gzfile: previously opened file is not closed yet.\n");
00193 return NULL;
00194 }
00195 if (is_zcatfile(filename)) {
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 {
00208 fp = fopen(filename, "rb");
00209 if (fp == NULL) {
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) {
00231 return -1;
00232 }
00233
00234 if (zcat_pipe != NULL) {
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 {
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
00327
00335 FILE *
00336 fopen_writefile(char *filename)
00337 {
00338 FILE *fp;
00339
00340 fp = fopen(filename, "wb");
00341 if (fp == NULL) {
00342 jlog("Error: gzfile: failed to open \"%s\" for writing\n", filename);
00343 }
00344 return (fp);
00345 }
00346
00354 int
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 }