revb

Byte-wise data-stream reverser
git clone https://git.sinitax.com/sinitax/revb
Log | Files | Refs | LICENSE | sfeed.txt

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}