Add baseconv as noinst.
[doldaconnect.git] / config / baseconv.c
CommitLineData
dc32e1a7 1#include <stdlib.h>
2#include <stdio.h>
3#include <string.h>
4#include <unistd.h>
5
6#include "utils.h"
7
8int 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}