#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 make_filename(char* filename, int max_len, const char* orig_name, const char* subdir, 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_path_len = orig_base - orig_name; int orig_base_len = (NULL == orig_dot) ? strlen(orig_base) : (orig_dot - orig_base); // Part 1/4: Leading path if (0 == status && orig_path_len <= remain) { memcpy(filename, orig_name, orig_path_len); remain -= orig_path_len; filename += orig_path_len; } else { status = -1; } // Part 2/4: Subdirectory if (0 == status && NULL != subdir) { int subdir_len = strlen(subdir); if ((subdir_len + 1) <= remain) { memcpy(filename, subdir, subdir_len); filename += subdir_len; *filename++ = '/'; remain -= (subdir_len + 1); } else { status = -1; } } // Part 3/4: Basename if (0 == status && orig_base_len <= remain) { memcpy(filename, orig_name, orig_base_len); remain -= orig_base_len; filename += orig_base_len; } else { status = -1; } // Part 4/4: Extension if (0 == status && NULL != ext) { int ext_len = strlen(ext); if ((ext_len + 1) <= remain) { *filename++ = '.'; memcpy(filename, ext, ext_len); remain -= (ext_len + 1); filename += ext_len; } 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; }