plainhex/plainunhex.c

71 lines
1.1 KiB
C

#include <assert.h>
#include <err.h>
#include <stdbool.h>
#include <stdio.h>
int nybble(char c) {
if ('0' <= c && c <= '9') {
return c - '0';
} else if ('A' <= c && c <= 'F') {
return c - 'A' + 10;
} else if ('a' <= c && c <= 'f') {
return c - 'a' + 10;
} else {
return -1;
}
}
int main(void) {
for (;;) {
int high_nybble;
bool eof_reached = false;
for (;;) {
char c = getchar();
if (c == EOF) {
if (feof(stdin)) {
eof_reached = true;
break;
} else {
err(1, "Error reading high nybble");
}
}
high_nybble = nybble(c);
if (high_nybble != -1) {
break;
}
}
if (eof_reached) {
break;
}
int low_nybble;
for (;;) {
char c = getchar();
if (c == EOF) {
if (feof(stdin)) {
errx(1, "Expected low nybble");
} else {
err(1, "Error reading low nybble");
}
}
low_nybble = nybble(c);
if (low_nybble != -1) {
break;
}
}
if (putchar((high_nybble << 4) | low_nybble) == EOF) {
err(1, "Error writing byte");
}
}
if (fflush(stdout) == EOF) {
err(1, "Error flushing stdout");
}
return 0;
}