dc32e1a7 |
1 | #include <stdlib.h> |
2 | #include <stdio.h> |
3 | #include <string.h> |
4 | #include <unistd.h> |
5 | |
6 | #include "utils.h" |
7 | |
8 | int main(int argc, char **argv) |
9 | { |
10 | char buf[25]; |
11 | int ret, linelen; |
12 | char *decbuf, *encbuf; |
13 | size_t data, buflen; |
14 | char *(*decfn)(char *, size_t *); |
15 | char *(*encfn)(char *, size_t); |
16 | |
17 | data = 0; |
18 | if(!strcmp(argv[1], "4")) { |
19 | decfn = hexdecode; |
20 | } else if(!strcmp(argv[1], "5")) { |
21 | decfn = base32decode; |
22 | } else if(!strcmp(argv[1], "6")) { |
23 | decfn = base64decode; |
24 | } else if(!strcmp(argv[1], "8")) { |
25 | decfn = NULL; |
26 | } else { |
27 | fprintf(stderr, "unknown decoding: %s\n", argv[1]); |
28 | exit(1); |
29 | } |
30 | if(!strcmp(argv[2], "4")) { |
31 | encfn = hexencode; |
32 | } else if(!strcmp(argv[2], "5")) { |
33 | encfn = base32encode; |
34 | } else if(!strcmp(argv[2], "6")) { |
35 | encfn = base64encode; |
36 | } else if(!strcmp(argv[2], "8")) { |
37 | encfn = NULL; |
38 | } else { |
39 | fprintf(stderr, "unknown encoding: %s\n", argv[1]); |
40 | exit(1); |
41 | } |
42 | linelen = 0; |
43 | while((ret = read(0, buf + data, 24 - data)) >= 0) { |
44 | if(((data += ret) == 24) || (ret == 0)) { |
45 | if(decfn == NULL) { |
46 | decbuf = memcpy(smalloc(data), buf, data); |
47 | buflen = data; |
48 | } else { |
49 | buf[data] = 0; |
50 | if((decbuf = decfn(buf, &buflen)) == NULL) { |
51 | fprintf(stderr, "invalid input\n"); |
52 | exit(1); |
53 | } |
54 | } |
55 | if(encfn == NULL) { |
56 | encbuf = memcpy(smalloc(buflen), decbuf, buflen); |
57 | fwrite(encbuf, 1, buflen, stdout); |
58 | } else { |
59 | encbuf = encfn(decbuf, buflen); |
60 | buflen = strlen(encbuf); |
61 | if(linelen + buflen > 60) { |
62 | fwrite(encbuf, 1, 60 - linelen, stdout); |
63 | fwrite("\n", 1, 1, stdout); |
64 | buflen -= 60 - linelen; |
65 | } |
66 | fwrite(encbuf, 1, buflen, stdout); |
67 | linelen += buflen; |
68 | } |
69 | fflush(stdout); |
70 | free(encbuf); |
71 | free(decbuf); |
72 | data = 0; |
73 | } |
74 | if(ret == 0) |
75 | break; |
76 | } |
77 | if(ret < 0) { |
78 | perror("read"); |
79 | exit(1); |
80 | } |
81 | return(0); |
82 | } |