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; }