Advertisement
Guest User

Byteswap

a guest
Jan 27th, 2013
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.88 KB | None | 0 0
  1. static int byteswap(
  2.     const char* filename,
  3.     uint8_t* buf,
  4.     size_t buffersize,
  5.     size_t recordsize,
  6.     int quiet
  7. ) {
  8.     int returncode = 0;
  9.     FILE* f = NULL;
  10.  
  11.     f = fopen(filename, "r+b");
  12.     if(!f) { goto error_f; }
  13.  
  14.     for(;;) {
  15.         size_t rec;
  16.         size_t size;
  17.         //
  18.         // Read
  19.         //
  20.         clearerr(f);
  21.         size = fread(buf, 1, buffersize, f);
  22.         if(size == 0) {
  23.             // Check for error
  24.             if(ferror(f)) {
  25.                 goto error_f;
  26.             }
  27.             // Otherwise, done
  28.             break;
  29.         }
  30.         //
  31.         // Seek backwards
  32.         //
  33.         if(fseeko(f, -((off_t)size), SEEK_CUR) != 0) {
  34.             goto error_f;
  35.         }
  36.  
  37.         if(size > buffersize) { size = buffersize; }
  38.         if(size < buffersize) {
  39.             //
  40.             // Round up to the next record, filling with zeroes as we go
  41.             //
  42.             size_t extra = size % recordsize;
  43.             if(extra) {
  44.                 for(; extra < recordsize; extra++) {
  45.                     buf[size++] = 0;
  46.                 }
  47.             }
  48.         }
  49.         //
  50.         // Reverse each record in memory
  51.         //
  52.         for(rec = 0; rec < size; rec += recordsize) {
  53.             size_t a = rec;
  54.             size_t b = rec + recordsize - 1;
  55.             for(; a < b; a++, b--) {
  56.                 uint8_t t = buf[a];
  57.                 buf[a] = buf[b];
  58.                 buf[b] =  t;
  59.             }
  60.         }
  61.         //
  62.         // Write
  63.         //
  64.         if(fwrite(buf, 1, size, f) != size) {
  65.             goto error_f;
  66.         }
  67.         fflush(f);
  68.     }
  69.  
  70.     if(!quiet) {
  71.         printf("%s: Done\n", filename);
  72.     }
  73.     goto done;
  74.  
  75. error_f:
  76.     printfileerror(f, filename);
  77.     goto error;
  78.  
  79. error:
  80.     returncode = 1;
  81.  
  82. done:
  83.     if(f != NULL) { fclose(f); }
  84.     return returncode;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement