static int byteswap(
const char* filename,
uint8_t* buf,
size_t buffersize,
size_t recordsize,
int quiet
) {
int returncode = 0;
FILE* f = NULL;
f = fopen(filename, "r+b");
if(!f) { goto error_f; }
for(;;) {
size_t rec;
size_t size;
//
// Read
//
clearerr(f);
size = fread(buf, 1, buffersize, f);
if(size == 0) {
// Check for error
if(ferror(f)) {
goto error_f;
}
// Otherwise, done
break;
}
//
// Seek backwards
//
if(fseeko(f, -((off_t)size), SEEK_CUR) != 0) {
goto error_f;
}
if(size > buffersize) { size = buffersize; }
if(size < buffersize) {
//
// Round up to the next record, filling with zeroes as we go
//
size_t extra = size % recordsize;
if(extra) {
for(; extra < recordsize; extra++) {
buf[size++] = 0;
}
}
}
//
// Reverse each record in memory
//
for(rec = 0; rec < size; rec += recordsize) {
size_t a = rec;
size_t b = rec + recordsize - 1;
for(; a < b; a++, b--) {
uint8_t t = buf[a];
buf[a] = buf[b];
buf[b] = t;
}
}
//
// Write
//
if(fwrite(buf, 1, size, f) != size) {
goto error_f;
}
fflush(f);
}
if(!quiet) {
printf("%s: Done\n", filename);
}
goto done;
error_f:
printfileerror(f, filename);
goto error;
error:
returncode = 1;
done:
if(f != NULL) { fclose(f); }
return returncode;
}