Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <sys/stat.h>
- #include <sys/mman.h>
- #include <unistd.h>
- #include <stdio.h>
- typedef struct {
- void * ptr;
- uintmax_t len;
- } buf_t;
- inline uintmax_t file_size(int fd) {
- struct stat f_stat;
- fstat(fd, &f_stat);
- return f_stat.st_size;
- }
- inline buf_t map_file(int fd) {
- uintmax_t size = file_size(fd);
- return (buf_t){mmap(NULL, size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0), size};
- }
- inline buf_t alloc(uint64_t size) {
- return (buf_t){mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_POPULATE | MAP_ANONYMOUS, 0, 0), size};
- }
- inline uint64_t true_write(int fd, buf_t buf) {
- return write(fd, buf.ptr, buf.len);
- }
- inline void * end(buf_t t) { return t.ptr + t.len;}
- typedef uint8_t v8b_t __attribute__((__vector_size__(8)));
- inline uint8_t next_bit(uint64_t t, uint64_t i) { return (((t >> i++) & 1) + '0');}
- inline buf_t bit_to_byte(buf_t in) {
- buf_t out = alloc(in.len << 3);
- uint8_t * in_it = in.ptr, * end_in = end(in); v8b_t * out_it = out.ptr;
- do {
- uint8_t t = *in_it, i = 0;
- *out_it = (v8b_t){next_bit(t, i++), next_bit(t, i++), next_bit(t, i++), next_bit(t, i++),
- next_bit(t, i++), next_bit(t, i++), next_bit(t, i++), next_bit(t, i++)};
- } while(++out_it, ++in_it != end_in);
- return out;
- }
- int32_t main(void) {
- return !!true_write(STDOUT_FILENO, bit_to_byte(map_file(STDIN_FILENO)));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement