Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement