/* file.c */ #include /* FILE, fprintf, perror */ #include /* exit */ #include /* stat */ #include /* strlen, strcpy */ #include /* malloc, free */ #include "gendefs.h" /* general use defs */ #include "file.h" /* file handling */ /* * file handling functions */ /* stat the File */ File *stat_file(const char *filename) { File *file; /* ptr to File structure */ /* create a new File structure */ file = (File *) malloc(sizeof(File)); /* allocate space & copy filename */ file->filename = (char *) malloc(strlen(filename) + 1); strcpy(file->filename, filename); /* initialize fp to null */ file->fp = NULL; /* stat the file */ if (stat(file->filename, &(file->buf)) == FAILURE) /* file does not yet exist; it will be new */ file->newfile = TRUE; else { /* check file size */ if (file->buf.st_size == 0) /* file is 0 bytes; good enough to be new */ file->newfile = TRUE; else /* filesize is not 0, therefore it is not new */ file->newfile = FALSE; } return file; } /* opens a File */ void open_file(File *file) { char read_mode[READ_MODE_SZ+1]; /* file read mode (r+ or w+) */ /* set read mode */ if (file->newfile) strcpy(read_mode, OVERWRITE_MODE); else /* ! file.newfile */ strcpy(read_mode, APPEND_MODE); /* open the file */ if ((file->fp = fopen(file->filename, read_mode)) == NULL) file_error(file, "Could not open file"); return; } /* closes a File */ void close_file(File *file) { /* make sure we have actually opened it */ if (file->fp != NULL) { /* close the file */ if (fclose(file->fp) != SUCCESS) file_error(file, "Cannot close file"); } /* free space used by filename */ free(file->filename); /* free space used by file */ free(file); return; } /* error handling function */ void file_error(const File *file, const char *text) { /* write to stderr */ fprintf(stderr, "%s: %s\n", file->filename, text); /* do a perror */ perror(file->filename); /* exit */ exit(FAILURE); }