71 lines
1.1 KiB
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;
|
|
}
|