Загрузка данных


#include <stdio.h>

int hex(int ch) {
    int value = -1;

    if (ch >= '0' && ch <= '9') {
        value = ch - '0';
    } else if (ch >= 'A' && ch <= 'F') {
        value = ch - 'A' + 10;
    } else if (ch >= 'a' && ch <= 'f') {
        value = ch - 'a' + 10;
    }

    return value;
}

int kod(FILE *out) {
    int ch = getchar();

    return ch != EOF && ch != '\n' && ch != ' ' &&
           fprintf(out, "%02X", (unsigned int)ch) >= 0;
}

int dekod(FILE *out) {
    int first = hex(getchar());
    int second = hex(getchar());

    return first >= 0 && second >= 0 &&
           fputc(first * 16 + second, out) != EOF;
}

int main(int argc, char **argv) {
    FILE *out = NULL;
    int valid = 0;
    int separator = ' ';

    if (argc == 2 &&
        (argv[1][0] == '0' || argv[1][0] == '1') &&
        argv[1][1] == '\0') {
        out = tmpfile();
        valid = out != NULL;
    }

    while (valid && separator == ' ') {
        if (argv[1][0] == '0') {
            valid = kod(out);
        } else {
            valid = dekod(out);
        }

        if (valid) {
            separator = getchar();
            valid = separator == ' ' || separator == '\n' || separator == EOF;

            if (valid && separator == ' ') {
                valid = fputc(' ', out) != EOF;
            }
        }
    }

    if (valid) {
        rewind(out);
        int ch;

        while ((ch = fgetc(out)) != EOF) {
            putchar(ch);
        }

        putchar('\n');
    } else {
        printf("n/a\n");
    }

    if (out != NULL) {
        fclose(out);
    }

    return 0;
}