/* * base64 [-e|-d] * * -e specifies encoding, -d decoding. */ #include #include #include extern const char *__progname; static char encoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static void encode(void) { unsigned long int buf; int c; int n; int ol; n = 0; ol = 0; while (1) { c = getchar(); if (c == EOF) break; buf = (buf << 8) | c; n ++; if (n > 2) { for (n=18;n>=0;n-=6) putchar(encoding[(buf>>n)&0x3f]); ol += 4; if (ol > 60) { putchar('\n'); ol = 0; } n = 0; } } switch (n) { case 0: break; case 1: putchar(encoding[(buf>>2)&0x3f]); putchar(encoding[(buf<<4)&0x30]); printf("=="); ol += 4; break; case 2: putchar(encoding[(buf>>10)&0x3f]); putchar(encoding[(buf>>4)&0x3f]); putchar(encoding[(buf<<2)&0x3c]); putchar('='); ol += 4; break; } if (ol > 0) putchar('\n'); } static void decode(void) { unsigned long int buf; int n; int c; char *ep; n = 0; while (1) { c = getchar(); if (c == EOF) { if (n) fprintf(stderr,"%s: warning: unexpected EOF\n",__progname); break; } if (c == '=') { switch (n) { case 0: break; case 1: fprintf(stderr,"%s: warning: invalid encoding: = at invalid place\n",__progname); break; case 2: putchar((buf>>4)&0xff); break; case 3: putchar((buf>>10)&0xff); putchar((buf>>2)&0xff); break; } break; } ep = index(&encoding[0],c); if (! ep) continue; buf = (buf << 6) | (ep - &encoding[0]); n ++; if (n > 3) { putchar((buf>>16)&0xff); putchar((buf>>8)&0xff); putchar(buf&0xff); n = 0; } } } int main(int, char **); int main(int ac, char **av) { if (0) { usage:; fprintf(stderr,"Usage: %s [-e|-d]\n",__progname); exit(1); } if (ac != 2) goto usage; if (!strcmp(av[1],"-e")) encode(); else if (!strcmp(av[1],"-d")) decode(); else goto usage; exit(0); }