Программирование в стандарте POSIX


Пример 5.19


#include

#include

#include

#include

FILE *input=NULL, *output=NULL;

const char str []

="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

unsigned int Prm [256]; /* Таблица перекодировки */

const int WHITE = 100, ERR = 101, END = 102;

static void usage (char argv0 []) {

fprintf (stderr,"Программа раскодирует файлы

формата base64\n");

fprintf (stderr,"Использование:\n%s входной_файл

выходной_файл\n", argv0);

fprintf (stderr,"Файл должен начинаться с

первого символа в кодировке base64.\n");

}

int main (int argc, char *argv []) {

int n;

union {

unsigned long l;

char c[4];

} a;

{

int i;

for (i = 0; i < 256; i++) Prm [i] = ERR;

Prm [' '] = WHITE; Prm ['\t'] = WHITE;

Prm ['\n'] = WHITE; Prm ['\r'] = WHITE;

Prm ['='] = END;

for (i = 0; i < 64; i++) Prm [(int) str [i]] = i;

}

if (argc != 3) {

usage (argv [0]);

return (1);

}

assert (NULL != (input = fopen (argv [1], "r")));

assert (NULL != (output = fopen (argv [2], "w")));

for (a.l = 0, n = 0; ; ) { /* Цикл обработки

входного файла */

int c, b, shift;

assert (EOF != (c = fgetc (input)));

b = Prm [c];

if (WHITE == b) continue;

if (END == b) break;

if (ERR == b) {

fprintf (stderr,"Символ номер %d: %d не

входит в кодировку base64\n", n, c);

return (1);

}

n++;

assert (b < 64);

shift = 6 * (4 - n % 4);

if (shift != 24) b = b << shift;

a.l += b;

if (0 == n % 4) {

#if __BYTE_ORDER == __BIG_ENDIAN

fputc (a.c[1], output); fputc (a.c[2], output); fputc (a.c[3], output);

#elif __BYTE_ORDER == __LITTLE_ENDIAN

fputc (a.c[2], output); fputc (a.c[1],

output); fputc (a.c[0], output);

#elif __BYTE_ORDER == __PDP_ENDIAN

fputc (a.c[0], output); fputc (a.c[3],

output); fputc (a.c[2], output);

#else

#error "Unknown endian"

#endif

a.l = 0;

}

}

{ /* Обработка остатка входного файла */

int tl = (((n - 1) % 4) * 6 + 7) / 8;

if (tl == 3) {

#if __BYTE_ORDER == __BIG_ENDIAN




Начало  Назад  Вперед