revb.c (1095B)
1#include <unistd.h> 2#include <fcntl.h> 3#include <err.h> 4#include <stdio.h> 5#include <stdint.h> 6#include <stdlib.h> 7 8static uint8_t * 9load(FILE *file, uint8_t *data, size_t *datalen) 10{ 11 size_t cap, len, nread; 12 13 len = *datalen; 14 cap = len + BUFSIZ; 15 data = realloc(data, cap); 16 if (!data) err(1, "realloc"); 17 18 while (1) { 19 if (len + BUFSIZ > cap) { 20 cap *= 2; 21 data = realloc(data, cap); 22 if (!data) err(1, "realloc"); 23 } 24 25 nread = fread(data + len, 1, BUFSIZ, file); 26 if (!nread) break; 27 28 len += nread; 29 } 30 31 *datalen = len; 32 33 return data; 34} 35 36int 37main(int argc, const char **argv) 38{ 39 uint8_t *data, tmp; 40 size_t a, b, len; 41 FILE *file; 42 int i; 43 44 len = 0; 45 data = NULL; 46 if (argc > 1) { 47 for (i = 1; i < argc; i++) { 48 file = fopen(argv[i], "r"); 49 if (!file) err(1, "fopen"); 50 data = load(file, data, &len); 51 fclose(file); 52 } 53 } else { 54 data = load(stdin, data, &len); 55 } 56 if (!len) return 0; 57 58 a = 0; 59 b = len - 1; 60 while (a < b) { 61 tmp = data[a]; 62 data[a] = data[b]; 63 data[b] = tmp; 64 a++; b--; 65 } 66 67 if (!fwrite(data, len, 1, stdout)) 68 err(1, "fwrite"); 69 70 free(data); 71}