1
0
mirror of https://gitlab.com/80486DX2-66/gists synced 2025-01-10 17:32:05 +05:30

reverse-ramdisk.c: improve, separate debug log

This commit is contained in:
パチュリー・ノーレッジ 2023-12-27 17:55:20 +03:00
parent 4984016201
commit 1bae07c9c7
Signed by: 80486DX2-66
GPG Key ID: 83631EF27054609B

View File

@ -3,7 +3,13 @@ C programming idea: Handling temporary files like memory allocations (allocating
50% AI, 50% human (the code is tested and reviewed) 50% AI, 50% human (the code is tested and reviewed)
GCC/Clang/TCC: Compile with -DTEST to set macro TEST as defined Warning: The current result is quick and dirty. Not for educational or
production purposes.
GCC/Clang/TCC: Compile with -DTEST to set macro TEST as defined, with -DDEBUG
to enable debug mode
To-Do: error handling on line 167, function fread()
*/ */
#include <errno.h> #include <errno.h>
@ -21,14 +27,34 @@ typedef struct {
TempFile* temp_files = NULL; TempFile* temp_files = NULL;
size_t num_temp_files = 0; size_t num_temp_files = 0;
#define line_fail(x) do { \ #ifdef DEBUG
# define line_fail(x) do { \
printf("failed on line %d\n", __LINE__ + x); \ printf("failed on line %d\n", __LINE__ + x); \
} while (0) } while (0)
#else
# define line_fail(x) do {} while (0)
#endif
int tf_alloc(size_t n, size_t type_size) { int tf_alloc(size_t n, size_t type_size) {
// Create an empty file // Create an empty file
char file_path[20]; size_t len_digit;
sprintf(file_path, "tf_%zu.tmp", num_temp_files); if (num_temp_files == 0)
len_digit = 1;
else
len_digit = (size_t) log((double) num_temp_files + 1.) / log(10.);
size_t file_path_len = len_digit + strlen("tf_.tmp");
char* file_path = malloc((file_path_len + 1) * sizeof(char));
if (file_path == NULL) {
fail_line(-2);
return -1;
}
int res = snprintf(file_path, file_path_len, "tf_%zu.tmp", num_temp_files);
if ((size_t) res != file_path_len) {
fail_line(-2);
return -1;
}
// Open the file
FILE* file = fopen(file_path, "w+b"); FILE* file = fopen(file_path, "w+b");
if (file == NULL) { if (file == NULL) {
line_fail(-2); line_fail(-2);
@ -36,7 +62,7 @@ int tf_alloc(size_t n, size_t type_size) {
} }
// Allocate memory for the TempFile struct // Allocate memory for the TempFile struct
TempFile* temp_file = (TempFile*)malloc(sizeof(TempFile)); TempFile* temp_file = malloc(sizeof(TempFile));
if (temp_file == NULL) { if (temp_file == NULL) {
line_fail(-2); line_fail(-2);
return -1; return -1;
@ -51,7 +77,7 @@ int tf_alloc(size_t n, size_t type_size) {
num_temp_files++; num_temp_files++;
// Reallocate memory for the temp_files array // Reallocate memory for the temp_files array
temp_files = (TempFile*)realloc(temp_files, num_temp_files * sizeof(TempFile)); temp_files = realloc(temp_files, num_temp_files * sizeof(TempFile));
if (temp_files == NULL) { if (temp_files == NULL) {
line_fail(-2); line_fail(-2);
return -1; return -1;
@ -64,13 +90,7 @@ int tf_alloc(size_t n, size_t type_size) {
} }
int tf_free(int ID) { int tf_free(int ID) {
// Find the temp file with the given ID size_t index = (size_t) ID;
int index = -1;
for (int i = 0; i < num_temp_files; i++)
if (temp_files[i].ID == ID) {
index = i;
break;
}
if (index == -1) if (index == -1)
return -1; return -1;
@ -79,6 +99,7 @@ int tf_free(int ID) {
// Delete the file // Delete the file
if (remove(temp_files[index].file_path) != 0) { if (remove(temp_files[index].file_path) != 0) {
line_fail(-1);
return -1; return -1;
} }
@ -86,15 +107,15 @@ int tf_free(int ID) {
// Shift the remaining temp files in the array // Shift the remaining temp files in the array
for (int i = index; i < num_temp_files - 1; i++) { for (int i = index; i < num_temp_files - 1; i++) {
temp_files[i] = temp_files[i + 1]; temp_files[(size_t) i] = temp_files[(size_t) i + 1];
} }
// Decrease the number of temp files
num_temp_files--; num_temp_files--;
// Reallocate memory for the temp_files array // Reallocate memory for the temp_files array
temp_files = (TempFile*)realloc(temp_files, num_temp_files * sizeof(TempFile)); temp_files = realloc(temp_files, num_temp_files * sizeof(TempFile));
if (temp_files == NULL && num_temp_files > 0) { if (temp_files == NULL && num_temp_files > 0) {
line_fail(-2);
return -1; return -1;
} }
@ -102,24 +123,17 @@ int tf_free(int ID) {
} }
int tf_write(int ID, size_t offset, void* data, size_t data_size) { int tf_write(int ID, size_t offset, void* data, size_t data_size) {
// Find the temp file with the given ID size_t index = (size_t) ID;
int index = -1;
for (int i = 0; i < num_temp_files; i++) {
if (temp_files[i].ID == ID) {
index = i;
break;
}
}
if (index == -1) if (index == -1)
return -1; return -1;
// Open the file in append mode // Check file handler for NULL
FILE* file = temp_files[index].file; FILE* file = temp_files[index].file;
if (file == NULL) if (file == NULL)
return -1; return -1;
// Seek // Set the position
fseek(file, offset, SEEK_SET); fseek(file, offset, SEEK_SET);
// Write the data to the file // Write the data to the file
@ -132,18 +146,7 @@ int tf_write(int ID, size_t offset, void* data, size_t data_size) {
} }
int tf_read(int ID, size_t offset, void* dest, size_t data_size) { int tf_read(int ID, size_t offset, void* dest, size_t data_size) {
// Find the temp file with the given ID size_t index = (size_t) ID;
int index = -1;
for (int i = 0; i < num_temp_files; i++) {
if (temp_files[i].ID == ID) {
index = i;
break;
}
}
if (index == -1) {
return -1;
}
// Open the file in read mode // Open the file in read mode
FILE* file = temp_files[index].file; FILE* file = temp_files[index].file;
@ -154,16 +157,14 @@ int tf_read(int ID, size_t offset, void* dest, size_t data_size) {
void* data = malloc(data_size); void* data = malloc(data_size);
if (data == NULL) { if (data == NULL) {
fclose(file); fclose(file);
fail_line(-3);
return -1; return -1;
} }
// Initialize the memory in the data buffer // Initialize the memory in the data buffer
memset(data, 0, data_size); memset(data, 0, data_size); // clear destination
fseek(file, offset, SEEK_SET); // set position
fseek(file, offset, SEEK_SET); size_t bytes_read = fread(data, 1, data_size, file); // read bytes
size_t bytes_read = fread(data, 1, data_size, file);
// Copy the data to the destination pointer
memcpy(dest, data, data_size); memcpy(dest, data, data_size);
free(data); // Free the allocated memory free(data); // Free the allocated memory
@ -173,11 +174,13 @@ int tf_read(int ID, size_t offset, void* dest, size_t data_size) {
return -1; return -1;
} }
#ifdef DEBUG
printf("Read: ID = %d, data = %016" PRIXPTR ", size = %zu -> '", printf("Read: ID = %d, data = %016" PRIXPTR ", size = %zu -> '",
ID, (uintptr_t)dest, data_size); ID, (uintptr_t)dest, data_size);
for (size_t i = 0; i < data_size; i++) for (size_t i = 0; i < data_size; i++)
printf("0x%02" PRIX8 " ", *((uint8_t*)(dest + i))); printf("0x%02" PRIX8 " ", *((uint8_t*)(dest + i)));
printf("'\n"); printf("'\n");
#endif
return 0; return 0;
} }