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


     Найден по ссылке: шнур базальтовый. | На сайте agapas.ru экспорт товаров из россии в ОАЭ. |     

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


#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

Содержание  Назад  Вперед