#include /* assert */ #include /* FILE* */ #include /* malloc, free */ #include /* unlink */ #include "io.h" /* */ char *file_read(const char *filename, size_t *readSize) { char *buffer; FILE *fh; long size; size_t nread; assert(filename != NULL); buffer = NULL; fh = fopen(filename, "rb"); if (fh != NULL) { fseek(fh, 0L, SEEK_END); size = ftell(fh); rewind(fh); if (size > 0) buffer = (char *)malloc((size_t)size); if (buffer != NULL) { assert(buffer != NULL); nread = fread(buffer, 1, (size_t)size, fh); fclose(fh); fh = NULL; if (size != (long)nread) { free(buffer); buffer = NULL; } assert(size == (long)nread); if (NULL != readSize) { *readSize = nread; } } if (fh != NULL) fclose(fh); } return buffer; } /* */ size_t file_write(const char *fileName, const void *data, const size_t size) { size_t numberBytesWritten = 0; FILE *file; assert(fileName != NULL); assert(data != NULL); assert(size > 0); if (fileName != NULL && *fileName != '\0') { file = fopen(fileName, "wb"); if (file != NULL) { if (data != NULL) { numberBytesWritten = fwrite(data, 1, size, file); } fclose(file); } } return numberBytesWritten; } int copy_file(const char *srcname, const char *dstname) { int rc; char *buf; size_t nread, nwrite; rc = -1; buf = file_read(srcname, &nread); if (buf) { nwrite = file_write(dstname, buf, nread); if (nread != nwrite) { fprintf(stderr, "Incorrect write size (%ld != %ld)\n", nread, nwrite); unlink(dstname); } assert(nread == nwrite); free(buf); rc = 0; } return rc; }