diff options
author | IIMarckus <iimarckus@gmail.com> | 2015-01-08 02:14:42 -0700 |
---|---|---|
committer | IIMarckus <iimarckus@gmail.com> | 2015-01-08 02:14:42 -0700 |
commit | fa0761ea70308099bf3a61a88ecf8359cc594d44 (patch) | |
tree | 43199250a133f889f0f02f3057030d76ded4bd23 | |
parent | 4d9fd56593b692fdd1a77f2763d4e3a2c2b1d3e8 (diff) |
redrle: Add a -r flag to compress by rows (matching GF's behavior).
-rw-r--r-- | redtools/redrle.c | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/redtools/redrle.c b/redtools/redrle.c index e753b3a..580c3e4 100644 --- a/redtools/redrle.c +++ b/redtools/redrle.c @@ -1,5 +1,5 @@ /* - * Copyright © 2011 IIMarckus <iimarckus@gmail.com> + * Copyright © 2011, 2014 IIMarckus <iimarckus@gmail.com> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -23,11 +23,12 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> void usage() { - fprintf(stderr, "Usage: redrle [-d] infile outfile\n"); + fprintf(stderr, "Usage: redrle [-dr] infile outfile\n"); exit(1); } @@ -35,15 +36,28 @@ int main(int argc, char *argv[]) { FILE *infile, *outfile; + int ch; bool d = false; /* compress or decompress flag */ + bool rows = false; /* compress individual rows or entire file */ + + while ((ch = getopt(argc, argv, "dr")) != -1) { + switch(ch) { + case 'd': + d = true; + break; + case 'r': + rows = true; + break; + default: + usage(); + /* NOTREACHED */ + } + } + argc -= optind; + argv += optind; - if (argc < 3 || argc > 4) + if (argc < 2) { usage(); - - if (strcmp(argv[1], "-d") == 0) { - if (argc != 4) - usage(); - d = true; } infile = fopen(argv[argc - 2], "rb"); @@ -80,17 +94,37 @@ main(int argc, char *argv[]) fputc(byte, outfile); } } else { /* compress */ - int byte, count = 0, lastbyte = 0; + int byte, count = 0, lastbyte = 0, xpos = 0; for (;;) { byte = fgetc(infile); if (feof(infile)) { while (count > 0xF) { + if (rows && 20 - xpos <= 0xF) { + count -= (20 - xpos); + fputc(lastbyte << 4 | + (20 - xpos), outfile); + xpos = 0; + continue; + } count -= 0xF; fputc(lastbyte << 4 | 0xF, outfile); + xpos += 0xF; + if (xpos == 20) + xpos = 0; } if (count != 0) { + if (rows && 20 - xpos < count) { + count -= (20 - xpos); + fputc(lastbyte << 4 | + (20 - xpos), outfile); + xpos = 0; + } fputc(lastbyte << 4 | count, outfile); + xpos += count; + if (xpos == 20) + xpos = 0; + count = 0; } break; } @@ -105,11 +139,30 @@ main(int argc, char *argv[]) ++count; else { while (count > 0xF) { + if (rows && 20 - xpos <= 0xF) { + count -= (20 - xpos); + fputc(lastbyte << 4 | + (20 - xpos), outfile); + xpos = 0; + continue; + } count -= 0xF; fputc(lastbyte << 4 | 0xF, outfile); + xpos += 0xF; + if (xpos == 20) + xpos = 0; } if (count != 0) { + if (rows && 20 - xpos < count) { + count -= (20 - xpos); + fputc(lastbyte << 4 | + (20 - xpos), outfile); + xpos = 0; + } fputc(lastbyte << 4 | count, outfile); + xpos += count; + if (xpos == 20) + xpos = 0; count = 0; } |