360daad9d6185c517b64ace285e9b38f5fda57af
[doldaconnect.git] / config / baseconv.c
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 }