Guest User

Untitled

a guest
Jan 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.03 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <limits.h>
  4. #include "my.qsort.h"
  5.  
  6. #define TYPE char
  7. #define MEM_AVAILIBLE 4096
  8. #define LARGE  (MEM_AVAILIBLE / sizeof(TYPE))
  9. #define FILES 8
  10.  
  11. typedef unsigned int uint;
  12.  
  13. int main(int argc, char** argv){
  14.     FILE* input = fopen("Weetabix.mp4", "rb"); 
  15.     FILE* files[FILES * 2];
  16.     uint how_many;
  17.    
  18.     char buf[LARGE];
  19.     char filename[] = "0.bin";
  20.     char from = 'a';
  21.     char to = 'a' + FILES;
  22.     char* buffers[FILES];
  23.     char* brick;
  24.    
  25.     uint files_active = FILES;
  26.    
  27.     for(char c = from; c < to; ++c){
  28.         filename[0] = c;
  29.         files[c - 'a'] = fopen(filename, "wb");
  30.     }
  31.        
  32.     char cur = 0;
  33.        
  34.     while(!feof(input)){
  35.         /* first time. read from source file */
  36.        
  37.         how_many = fread(&buf, sizeof(TYPE), LARGE, input);
  38.         my::qsort(buf, how_many);
  39.        
  40.         fwrite(&buf, sizeof(TYPE), how_many, files[cur]);
  41.        
  42.         if(++cur == FILES) cur = 0;
  43.     }  
  44.     fcloseall();
  45.    
  46.     while(true){
  47.         uint block_size = LARGE / (files_active + 1);
  48.         uint brick_size = LARGE - block_size * files_active;
  49.         brick = (char*) calloc(brick_size, sizeof(char));
  50.        
  51.         for(char c = from; c <  from + files_active; ++c)
  52.             filename[0] = c, files[c - 'a'] = fopen(filename, "rb");
  53.            
  54.         for(char c = to; c < to + files_active; ++c)
  55.             filename[0] = c, files[c - 'a'] = fopen(filename, "wb");
  56.            
  57.         bool flag = true;
  58.        
  59.         for(uint i = from - 'a'; i < from + files_active - 'a'; ++i){
  60.             buffers[i] = buf + i * files_active;
  61.             fread(buffers[i], sizeof(TYPE), block_size, files[i]);
  62.             my::qsort(buffers[i], block_size);
  63.         }
  64.        
  65.         uint where_i_am[FILES] = {0};
  66.         uint to_cur = to;
  67.        
  68.         while(true){
  69.        
  70.             for(uint i = 0; i < brick_size; ++i){
  71.                 for(uint j = from + 1; j < from + files_active; ++j){
  72.                     if(where_i_am[j] < from + files_active &&
  73.                        buffers[where_i_am[j]] < buffers[to_cur]){
  74.                         to_cur = j;
  75.                     }              
  76.                 }
  77.                 ++where_i_am[to_cur];  
  78.             }
  79.         }
  80.            
  81.        
  82.         while(false){
  83.            
  84.         }
  85.            
  86.        
  87.         char tmp = from;
  88.         from = to;
  89.         to = tmp;
  90.            
  91.         fcloseall();
  92.        
  93.         free(brick);
  94.         break;
  95.     }
  96. }
Add Comment
Please, Sign In to add comment