Jeff Becker
7 years ago
3 changed files with 91 additions and 2 deletions
@ -0,0 +1,85 @@ |
|||||||
|
#include <unistd.h> |
||||||
|
#include <fcntl.h> |
||||||
|
#include <iostream> |
||||||
|
#include <fstream> |
||||||
|
#include <functional> |
||||||
|
#include <cassert> |
||||||
|
#include "Base.h" |
||||||
|
|
||||||
|
const size_t BUFFSZ = 1024; |
||||||
|
|
||||||
|
static int printHelp(const char * exe, int exitcode) |
||||||
|
{ |
||||||
|
std::cout << "usage: " << exe << " [-d] [filename]" << std::endl; |
||||||
|
return exitcode; |
||||||
|
} |
||||||
|
|
||||||
|
template <typename InCh, typename OutCh, size_t isz, size_t osz> |
||||||
|
static int operate(std::function<std::size_t(const InCh *, size_t, OutCh *, size_t)> f, int infile, int outfile) |
||||||
|
{ |
||||||
|
InCh inbuf[isz]; |
||||||
|
OutCh outbuf[osz]; |
||||||
|
ssize_t sz; |
||||||
|
size_t outsz; |
||||||
|
while((sz = read(infile, inbuf, sizeof(inbuf))) > 0) |
||||||
|
{ |
||||||
|
outsz = f(inbuf, sz, outbuf, sizeof(outbuf)); |
||||||
|
if(outsz && outsz <= sizeof(outbuf)) |
||||||
|
{ |
||||||
|
write(outfile, outbuf, outsz); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
return errno; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) |
||||||
|
{ |
||||||
|
int opt; |
||||||
|
bool decode = false; |
||||||
|
int infile = 0; |
||||||
|
while((opt = getopt(argc, argv, "dh")) != -1) |
||||||
|
{ |
||||||
|
switch(opt) |
||||||
|
{ |
||||||
|
case 'h': |
||||||
|
return printHelp(argv[0], 0); |
||||||
|
case 'd': |
||||||
|
decode = true; |
||||||
|
break; |
||||||
|
default: |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (argc - optind > 1) |
||||||
|
{ |
||||||
|
return printHelp(argv[0], -1); |
||||||
|
} |
||||||
|
|
||||||
|
if (optind < argc) |
||||||
|
{ |
||||||
|
infile = open(argv[optind], O_RDONLY); |
||||||
|
if(infile == -1) { |
||||||
|
perror(argv[optind]); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
int retcode = 0; |
||||||
|
if(decode) |
||||||
|
{ |
||||||
|
retcode = operate<char, uint8_t, BUFFSZ*4, BUFFSZ*3>(i2p::data::Base64ToByteStream, infile, 1); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
retcode = operate<uint8_t, char, BUFFSZ*3, BUFFSZ*4>(&i2p::data::ByteStreamToBase64, infile, 1); |
||||||
|
} |
||||||
|
close(infile); |
||||||
|
return retcode; |
||||||
|
} |
Loading…
Reference in new issue