00001
00030
00031
00032
00033
00034
00035
00036
00037 #include <sent/stddefs.h>
00038 #include <errno.h>
00039
00040 #ifdef HAVE_ZLIB
00041
00042
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
00147
00148
00149
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) {
00196 j_printerr("fopen_readfile: previously opened file is not closed yet.\n");
00197 return NULL;
00198 }
00199 if (is_zcatfile(filename)) {
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 {
00212 fp = fopen(filename, "rb");
00213 if (fp == NULL) {
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) {
00235 return -1;
00236 }
00237
00238 if (zcat_pipe != NULL) {
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 {
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
00332
00340 FILE *
00341 fopen_writefile(char *filename)
00342 {
00343 FILE *fp;
00344
00345 fp = fopen(filename, "wb");
00346 if (fp == NULL) {
00347 perror("fopen_writefile");
00348 }
00349 return (fp);
00350 }
00351
00359 int
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 }