Advertisement
Guest User

Untitled

a guest
Feb 7th, 2014
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.41 KB | None | 0 0
  1. #include <stdint.h>
  2. #include <sys/stat.h>
  3. #include <sys/mman.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6.  
  7. typedef struct {
  8.   void * ptr;
  9.   uintmax_t len;
  10. } buf_t;
  11.  
  12. inline uintmax_t file_size(int fd) {
  13.   struct stat f_stat;
  14.   fstat(fd, &f_stat);
  15.   return f_stat.st_size;
  16. }
  17.  
  18. inline buf_t map_file(int fd) {
  19.   uintmax_t size = file_size(fd);
  20.   return (buf_t){mmap(NULL, size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0), size};
  21. }
  22.  
  23. inline buf_t alloc(uint64_t size) {
  24.   return (buf_t){mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_POPULATE | MAP_ANONYMOUS, 0, 0), size};
  25. }
  26.  
  27. inline uint64_t true_write(int fd, buf_t buf) {
  28.   return write(fd, buf.ptr, buf.len);
  29. }
  30.  
  31. inline void * end(buf_t t) { return t.ptr + t.len;}
  32.  
  33. typedef uint8_t v8b_t __attribute__((__vector_size__(8)));
  34.  
  35. inline uint8_t next_bit(uint64_t t, uint64_t i) { return (((t >> i++) & 1) + '0');}
  36.  
  37. inline buf_t bit_to_byte(buf_t in) {
  38.   buf_t out = alloc(in.len << 3);
  39.   uint8_t * in_it = in.ptr, * end_in = end(in); v8b_t * out_it = out.ptr;
  40.   do {
  41.     uint8_t t = *in_it, i = 0;
  42.     *out_it = (v8b_t){next_bit(t, i++), next_bit(t, i++), next_bit(t, i++), next_bit(t, i++),
  43.                       next_bit(t, i++), next_bit(t, i++), next_bit(t, i++), next_bit(t, i++)};
  44.   } while(++out_it, ++in_it != end_in);
  45.   return out;
  46. }
  47.  
  48. int32_t main(void) {
  49.   return !!true_write(STDOUT_FILENO, bit_to_byte(map_file(STDIN_FILENO)));
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement