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
00132 #else
00133
00134
00135
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) {
00182 j_printerr("fopen_readfile: previously opened file is not closed yet.\n");
00183 return NULL;
00184 }
00185 if (is_zcatfile(filename)) {
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 {
00197 fp = fopen(filename, "rb");
00198 if (fp == NULL) {
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) {
00220 return -1;
00221 }
00222
00223 if (zcat_pipe != NULL) {
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 {
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
00303
00311 FILE *
00312 fopen_writefile(char *filename)
00313 {
00314 FILE *fp;
00315
00316 fp = fopen(filename, "wb");
00317 if (fp == NULL) {
00318 perror("fopen_writefile");
00319 }
00320 return (fp);
00321 }
00322
00330 int
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 }