From 776dd74325db2a1fddcb830e3ddb42ebee0516ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 31 Dec 2022 11:50:29 +0100 Subject: [PATCH] add files --- .gitignore | 4 ++++ main.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 .gitignore create mode 100644 main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ecf86be --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/ +*.o +bsplit + diff --git a/main.c b/main.c new file mode 100644 index 0000000..affcd20 --- /dev/null +++ b/main.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +#define MAX(a,b) ((a)>(b)?(a):(b)) +#define MIN(a,b) ((a)<(b)?(a):(b)) + +int main(int argc, char *argv[]) { + for (int i = 1; i < argc; i++) { + if (0==strcmp(argv[i], "-h") || 0==strcmp(argv[i], "--help")) { + fprintf(stderr, "binary split\nArguments: file start end\nStart and end are byte indexes. End is optional\n"); + return 1; + } + } + + if (argc < 3) { + fprintf(stderr, "Bad argc\n"); + return 1; + } + size_t pos = atol(argv[2]); + + size_t take = argc==4?atol(argv[3]):0; + + FILE * f = fopen(argv[1], "rb"); + fseek(f, pos, SEEK_SET); + +#define CHUNKSZ 8192 + + unsigned char chunk[CHUNKSZ]; + + while (1) { + size_t maxtake = take==0?CHUNKSZ : MIN(take, CHUNKSZ); + size_t len = fread(chunk, 1, maxtake, f); + if (errno != 0 || len == 0) { + break; + } + + fwrite(chunk, 1, len, stdout); + + if (take > 0) { + take -= len; + if (take == 0) break; + } + } + + return 0; +}