#include #include #include #include "file.h" const char* basename(const char* filename) { const char* slash = filename + strlen(filename) - 1; for ( ; slash >= filename && *slash != '\\' && *slash != '/'; --slash ); return &slash[1]; } int replace_extension(char* filename, int max_len, const char* orig_name, const char* ext) { int status = 0; int remain = max_len; const char* orig_base = basename(orig_name); const char* orig_dot = strrchr(orig_base, '.'); int orig_base_len = (NULL == orig_dot) ? strlen(orig_name) : (orig_dot - orig_name); if (orig_base_len <= remain) { strncpy(filename, orig_name, orig_base_len); remain -= orig_base_len; filename += orig_base_len; } else { status = -1; } if (0 == status && NULL != ext) { int ext_len = strlen(ext); if ((ext_len + 1) <= remain) { *filename++ = '.'; strncpy(filename, ext, ext_len); remain -= (ext_len + 1); } else { status = -1; } } return (status < 0 ? status : (max_len - remain)); } int write_file(const char* filename, const void* data, int len) { int status = -1; FILE* file = fopen(filename, "wb"); if (NULL != file) { if (1 == fwrite(data, len, 1, file)) { status = 0; } else { fprintf(stderr, "Failed to write %d bytes from %s: %d\n", len, filename, errno); } fclose(file); } else { fprintf(stderr, "Failed to open %s: %d\n", filename, errno); } return status; } int read_file(const char* filename, void* data, int len) { int status = -1; FILE* file = fopen(filename, "rb"); if (NULL != file) { if (1 == fread(data, len, 1, file)) { status = 0; } else { fprintf(stderr, "Failed to read %d bytes from %s: %d\n", len, filename, errno); } fclose(file); } else { fprintf(stderr, "Failed to open %s: %d\n", filename, errno); } return status; }