|
- #include <errno.h>
- #include <stdio.h>
- #include <string.h>
-
- #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;
- }
|