os3/host/mbrcopy/mbrcopy.c
2022-09-24 22:30:25 -04:00

96 lines
No EOL
1.7 KiB
C

#include "libfat.h"
#include "stdio.h"
#include "stdlib.h"
os_u32 readRoutine(os_u32 amount, void* buffer, void* user_data) {
if (user_data == 0) {
return 0;
}
FILE** f = (FILE**)user_data;
os_u32 read_bytes = fread(buffer, 1, amount, *f);
return read_bytes;
}
os_u32 writeRoutine(os_u32 amount, void* buffer, void* user_data) {
if (user_data == 0) {
return 0;
}
FILE** f = (FILE**)user_data;
os_u32 written_bytes = fwrite(buffer, 1, amount, *f);
return written_bytes;
}
os_bool seekRoutine(os_u32 offset, os_u32 direction, void* user_data) {
if (user_data == 0) {
return OS_FALSE;
}
FILE** f = (FILE**)user_data;
int seek_dir = SEEK_SET;
switch(direction) {
case LIBFAT_SEEK_ORIGIN:
seek_dir = SEEK_SET;
break;
case LIBFAT_SEEK_CURRENT:
seek_dir = SEEK_CUR;
break;
case LIBFAT_SEEK_END:
seek_dir = SEEK_END;
break;
}
int result = fseek(*f, offset, seek_dir);
return result == 0 ? OS_TRUE : OS_FALSE;
}
os_u32 tellRoutine(void* user_data) {
if (user_data == 0) {
return 0;
}
FILE** f = (FILE**)user_data;
os_u32 result = ftell(*f);
return result;
}
void printRoutine(os_s8* data, os_u16 size) {
if (size == 0) {
printf("%s\n", data);
return;
}
for(os_u16 s = 0; s < size; s++) {
printf("%c", *data);
data++;
}
printf("\n");
}
void printNumber(os_u32 number) {
printf("%#x\n", number);
}
int main(int argc, char** argv) {
if (argc < 2) {
printf("No file provided\n");
return 1;
}
FILE* f = fopen(argv[1], "rb");
FileHandle h;
h.read = readRoutine;
h.write = writeRoutine;
h.seek = seekRoutine;
h.tell = tellRoutine;
h.user_data = (void*)&f;
libfat_test(h, printRoutine, printNumber);
fclose(f);
return 0;
}