178c51b7c6ee1e9e64ad7025e64c3d75b2c875b0
5 #define isbase64(c) ( ((c) >= 'A' && (c) <= 'Z') || \
6 ((c) >= 'a' && (c) <= 'z') || \
7 ((c) >= '0' && (c) <= '9') || \
8 (c) == '+' || (c) == '/' || (c) == '=' \
11 int base64_decode_atom(char *atom
, unsigned char *out
) {
17 for (i
= 0; i
< 4; i
++) {
19 if (c
>= 'A' && c
<= 'Z')
21 else if (c
>= 'a' && c
<= 'z')
23 else if (c
>= '0' && c
<= '9')
32 return 0; /* invalid atom */
36 if (vals
[0] == -1 || vals
[1] == -1)
38 if (vals
[2] == -1 && vals
[3] != -1)
43 else if (vals
[2] != -1)
48 word
= ((vals
[0] << 18) |
50 ((vals
[2] & 0x3F) << 6) |
52 out
[0] = (word
>> 16) & 0xFF;
54 out
[1] = (word
>> 8) & 0xFF;
60 void base64_encode_atom(unsigned char *data
, int n
, char *out
) {
61 static const char base64_chars
[] =
62 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
71 out
[0] = base64_chars
[(word
>> 18) & 0x3F];
72 out
[1] = base64_chars
[(word
>> 12) & 0x3F];
74 out
[2] = base64_chars
[(word
>> 6) & 0x3F];
78 out
[3] = base64_chars
[word
& 0x3F];
83 const char usagemsg
[] =
84 "usage: base64 [-d] [filename] decode from a file or from stdin\n"
85 " or: base64 -e [-cNNN] [filename] encode from a file or from stdin\n"
86 " also: base64 --version report version number\n"
87 " and: base64 --help display this help text\n"
88 "where: -d decode mode (default)\n"
90 " -cNNN set number of chars per line for encoded output\n"
94 fputs(usagemsg
, stdout
);
98 #define SVN_REV "$Revision$"
99 char rev
[sizeof(SVN_REV
)];
102 strcpy(rev
, SVN_REV
);
104 for (p
= rev
; *p
&& *p
!= ':'; p
++);
107 while (*p
&& isspace(*p
)) p
++;
108 for (q
= p
; *q
&& *q
!= '$'; q
++);
110 printf("base64 revision %s\n", p
);
112 printf("base64: unknown version\n");
116 int main(int ac
, char **av
) {
132 if (!strcmp(p
, "version")) {
136 if (!strcmp(p
, "help")) {
159 * Options requiring values.
167 fprintf(stderr
, "base64: option '-%c' expects"
168 " an argument\n", c
);
173 cpl
= strtol(v
, &eptr
, 10);
175 fprintf(stderr
, "base64: option -c expects"
176 " a numeric argument\n");
180 fprintf(stderr
, "base64: chars per line should be"
181 " divisible by 4\n");
194 fprintf(stderr
, "base64: expected only one filename\n");
201 fp
= fopen(fname
, encoding ?
"rb" : "r");
203 fprintf(stderr
, "base64: unable to open '%s': %s\n", fname
,
218 if (cpl
&& column
>= cpl
) {
222 n
= fread(in
, 1, 3, fp
);
224 base64_encode_atom(in
, n
, out
);
225 fwrite(out
, 1, 4, stdout
);
232 unsigned char out
[3];
237 for (i
= 0; i
< 4; i
++) {
240 } while (c
!= EOF
&& !isbase64(c
));
249 fprintf(stderr
, "base64: warning: number of base64"
250 " characters was not a multiple of 4\n");
251 while (i
< 4) in
[i
++] = '=';
253 n
= base64_decode_atom(in
, out
);
254 fwrite(out
, 1, n
, stdout
);