]> pd.if.org Git - pdutils/blob - utils/uuencode/uuencode.c
implemented pwd
[pdutils] / utils / uuencode / uuencode.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
6 char oldbase[65];
7
8 void do_historical(FILE *in, FILE *out, char *decode) {
9         unsigned char input[45];
10         unsigned char output[62];
11         size_t bytes;
12
13         fprintf(out, "begin %s %s\n", "644", decode);
14         do {
15                 unsigned int bits;
16                 int i;
17                 input[0] = 0; input[1] = 0; input[2] = 0;
18                 bytes = fread(input, 1, 45, in);
19
20                 for (i = bytes; i < 45; i++) {
21                         input[i] = 0;
22                 }
23                 output[0] = oldbase[bytes];
24                 output[1] = 0;
25
26                 for (i=0;i<bytes;i+=3) {
27                         bits = (input[i] << 16) | (input[i+1] << 8) | (input[i+2]);
28
29                         output[i/3*4+4] = oldbase[(bits & 0x3f)];
30                         output[i/3*4+3] = oldbase[((bits >> 6) & 0x3f)];
31                         output[i/3*4+2] = oldbase[((bits >> 12) & 0x3f)];
32                         output[i/3*4+1] = oldbase[((bits >> 18) & 0x3f)];
33                         output[i/3*4+5] = 0;
34                 }
35                 fprintf(out, "%s\n", output);
36         } while (bytes);
37         fprintf(out, "end\n");
38 }
39
40 int main(int ac, char *av[]) {
41         int mime = 0;
42         char *file = 0;
43         char *decode = 0;
44         FILE *output = stdout;
45         unsigned char input[3];
46         int groups = 0;
47         size_t bytes;
48         int i;
49
50         for (i = 0; i<64; i++) {
51                 oldbase[i] = i + 0x20;
52         }
53         oldbase[0] = '`';
54
55         decode = av[ac-1];
56         if (!strcmp(av[1], "-m")) {
57                 mime = 1;
58                 if (ac == 4) {
59                         file = av[ac-2];
60                 }
61         } else if (ac == 3) {
62                 file = av[ac-2];
63         }
64
65         if (file) {
66                 if (freopen(file, "r", stdin) == 0) {
67                         perror("can't open file:");
68                         exit(EXIT_FAILURE);
69                 }
70         }
71
72         if (!mime) {
73                 do_historical(stdin, output, decode);
74                 exit(EXIT_SUCCESS);
75         }
76
77         fprintf(output, "begin-base64 %s %s\n", "644", decode);
78
79         do {
80                 unsigned char out[4];
81                 unsigned int bits;
82                 int i;
83                 input[0] = 0; input[1] = 0; input[2] = 0;
84                 bytes = fread(input, 1, 3, stdin);
85                 if (!bytes) {
86                         continue;
87                 }
88                 bits = (input[0] << 16) | (input[1] << 8) | (input[2]);
89
90                 out[3] = bits & 0x3f;
91                 out[2] = (bits >> 6) & 0x3f;
92                 out[1] = (bits >> 12) & 0x3f;
93                 out[0] = (bits >> 18) & 0x3f;
94                 
95                 for (i=0;i < bytes+1; i++) {
96                         fputc(base64[out[i]], stdout);
97                 }
98
99                 switch (bytes) {
100                         case 1:
101                                 fputc('=', stdout);
102                         case 2:
103                                 fputc('=', stdout);
104                 }
105                 if (++groups % 15 == 0) {
106                         fputc('\n', stdout);
107                 }
108         } while (bytes);
109
110         if (groups % 15 != 0) {
111                 fputc('\n', stdout);
112         }
113         fprintf(stdout, "====\n");
114
115         return 0;
116 }