|
Packit |
807167 |
/*************************************************************************************************
|
|
Packit |
807167 |
* The command line interface of miscellaneous utilities
|
|
Packit |
807167 |
* Copyright (C) 2009-2012 FAL Labs
|
|
Packit |
807167 |
* This file is part of Kyoto Cabinet.
|
|
Packit |
807167 |
* This program is free software: you can redistribute it and/or modify it under the terms of
|
|
Packit |
807167 |
* the GNU General Public License as published by the Free Software Foundation, either version
|
|
Packit |
807167 |
* 3 of the License, or any later version.
|
|
Packit |
807167 |
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
Packit |
807167 |
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
807167 |
* See the GNU General Public License for more details.
|
|
Packit |
807167 |
* You should have received a copy of the GNU General Public License along with this program.
|
|
Packit |
807167 |
* If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
807167 |
*************************************************************************************************/
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
#include "cmdcommon.h"
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// global variables
|
|
Packit |
807167 |
const char* g_progname; // program name
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// function prototypes
|
|
Packit |
807167 |
int main(int argc, char** argv);
|
|
Packit |
807167 |
static void usage();
|
|
Packit |
807167 |
static int32_t runhex(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runenc(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runciph(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runcomp(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runhash(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runregex(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t runconf(int argc, char** argv);
|
|
Packit |
807167 |
static int32_t prochex(const char* file, bool dec);
|
|
Packit |
807167 |
static int32_t procenc(const char* file, int32_t mode, bool dec);
|
|
Packit |
807167 |
static int32_t procciph(const char* file, const char* key);
|
|
Packit |
807167 |
static int32_t proccomp(const char* file, int32_t mode, bool dec);
|
|
Packit |
807167 |
static int32_t prochash(const char* file, int32_t mode);
|
|
Packit |
807167 |
static int32_t procregex(const char* file, const char* pattern, const char* alt, int32_t opts);
|
|
Packit |
807167 |
static int32_t procconf(int32_t mode);
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// main routine
|
|
Packit |
807167 |
int main(int argc, char** argv) {
|
|
Packit |
807167 |
g_progname = argv[0];
|
|
Packit |
807167 |
kc::setstdiobin();
|
|
Packit |
807167 |
if (argc < 2) usage();
|
|
Packit |
807167 |
int32_t rv = 0;
|
|
Packit |
807167 |
if (!std::strcmp(argv[1], "hex")) {
|
|
Packit |
807167 |
rv = runhex(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "enc")) {
|
|
Packit |
807167 |
rv = runenc(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "ciph")) {
|
|
Packit |
807167 |
rv = runciph(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "comp")) {
|
|
Packit |
807167 |
rv = runcomp(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "hash")) {
|
|
Packit |
807167 |
rv = runhash(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "regex")) {
|
|
Packit |
807167 |
rv = runregex(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "conf")) {
|
|
Packit |
807167 |
rv = runconf(argc, argv);
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[1], "version") || !std::strcmp(argv[1], "--version")) {
|
|
Packit |
807167 |
printversion();
|
|
Packit |
807167 |
rv = 0;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// print the usage and exit
|
|
Packit |
807167 |
static void usage() {
|
|
Packit |
807167 |
eprintf("%s: command line interface of miscellaneous utilities of Kyoto Cabinet\n",
|
|
Packit |
807167 |
g_progname);
|
|
Packit |
807167 |
eprintf("\n");
|
|
Packit |
807167 |
eprintf("usage:\n");
|
|
Packit |
807167 |
eprintf(" %s hex [-d] [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s enc [-hex|-url|-quote] [-d] [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s ciph [-key str] [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s comp [-def|-gz|-lzo|-lzma] [-d] [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s hash [-fnv|-path|-crc] [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s regex [-alt str] [-ic] pattern [file]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s conf [-v|-i|-l|-p]\n", g_progname);
|
|
Packit |
807167 |
eprintf(" %s version\n", g_progname);
|
|
Packit |
807167 |
eprintf("\n");
|
|
Packit |
807167 |
std::exit(1);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of hex command
|
|
Packit |
807167 |
static int32_t runhex(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
bool dec = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-d")) {
|
|
Packit |
807167 |
dec = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = prochex(file, dec);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of enc command
|
|
Packit |
807167 |
static int32_t runenc(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
int32_t mode = 0;
|
|
Packit |
807167 |
bool dec = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-hex")) {
|
|
Packit |
807167 |
mode = 1;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-url")) {
|
|
Packit |
807167 |
mode = 2;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-quote")) {
|
|
Packit |
807167 |
mode = 3;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-d")) {
|
|
Packit |
807167 |
dec = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = procenc(file, mode, dec);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of ciph command
|
|
Packit |
807167 |
static int32_t runciph(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
const char* key = "";
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-key")) {
|
|
Packit |
807167 |
if (++i >= argc) usage();
|
|
Packit |
807167 |
key = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = procciph(file, key);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of comp command
|
|
Packit |
807167 |
static int32_t runcomp(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
int32_t mode = 0;
|
|
Packit |
807167 |
bool dec = false;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-def")) {
|
|
Packit |
807167 |
mode = 1;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-gz")) {
|
|
Packit |
807167 |
mode = 2;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-lzo")) {
|
|
Packit |
807167 |
mode = 3;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-lzma")) {
|
|
Packit |
807167 |
mode = 4;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-d")) {
|
|
Packit |
807167 |
dec = true;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = proccomp(file, mode, dec);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of hash command
|
|
Packit |
807167 |
static int32_t runhash(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
int32_t mode = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-fnv")) {
|
|
Packit |
807167 |
mode = 1;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-path")) {
|
|
Packit |
807167 |
mode = 2;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-crc")) {
|
|
Packit |
807167 |
mode = 3;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = prochash(file, mode);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of regex command
|
|
Packit |
807167 |
static int32_t runregex(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
const char* pattern = NULL;
|
|
Packit |
807167 |
const char* file = NULL;
|
|
Packit |
807167 |
const char* alt = NULL;
|
|
Packit |
807167 |
int32_t opts = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-alt")) {
|
|
Packit |
807167 |
if (++i >= argc) usage();
|
|
Packit |
807167 |
alt = argv[i];
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-ic")) {
|
|
Packit |
807167 |
opts |= kc::Regex::IGNCASE;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else if (!pattern) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
pattern = argv[i];
|
|
Packit |
807167 |
} else if (!file) {
|
|
Packit |
807167 |
file = argv[i];
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (!pattern) usage();
|
|
Packit |
807167 |
int32_t rv = procregex(file, pattern, alt, opts);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// parse arguments of conf command
|
|
Packit |
807167 |
static int32_t runconf(int argc, char** argv) {
|
|
Packit |
807167 |
bool argbrk = false;
|
|
Packit |
807167 |
int32_t mode = 0;
|
|
Packit |
807167 |
for (int32_t i = 2; i < argc; i++) {
|
|
Packit |
807167 |
if (!argbrk && argv[i][0] == '-') {
|
|
Packit |
807167 |
if (!std::strcmp(argv[i], "--")) {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-v")) {
|
|
Packit |
807167 |
mode = 'v';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-i")) {
|
|
Packit |
807167 |
mode = 'i';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-l")) {
|
|
Packit |
807167 |
mode = 'l';
|
|
Packit |
807167 |
} else if (!std::strcmp(argv[i], "-p")) {
|
|
Packit |
807167 |
mode = 'p';
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
argbrk = true;
|
|
Packit |
807167 |
usage();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
int32_t rv = procconf(mode);
|
|
Packit |
807167 |
return rv;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform hex command
|
|
Packit |
807167 |
static int32_t prochex(const char* file, bool dec) {
|
|
Packit |
807167 |
const char* istr = file && *file == '@' ? file + 1 : NULL;
|
|
Packit |
807167 |
std::istream *is;
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
std::istringstream iss(istr ? istr : "");
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
if (istr) {
|
|
Packit |
807167 |
is = &iss;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ifs.open(file, std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (!ifs) {
|
|
Packit |
807167 |
eprintf("%s: %s: open error\n", g_progname, file);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
is = &ifs;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
is = &std::cin;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
char c;
|
|
Packit |
807167 |
while (is->get(c)) {
|
|
Packit |
807167 |
int32_t cc = (unsigned char)c;
|
|
Packit |
807167 |
int32_t num = -1;
|
|
Packit |
807167 |
if (cc >= '0' && cc <= '9') {
|
|
Packit |
807167 |
num = cc - '0';
|
|
Packit |
807167 |
} else if (cc >= 'a' && cc <= 'f') {
|
|
Packit |
807167 |
num = cc - 'a' + 10;
|
|
Packit |
807167 |
} else if (cc >= 'A' && cc <= 'F') {
|
|
Packit |
807167 |
num = cc - 'A' + 10;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (num >= 0) {
|
|
Packit |
807167 |
if (is->get(c)) {
|
|
Packit |
807167 |
cc = (unsigned char)c;
|
|
Packit |
807167 |
if (cc >= '0' && cc <= '9') {
|
|
Packit |
807167 |
num = num * 0x10 + cc - '0';
|
|
Packit |
807167 |
} else if (cc >= 'a' && cc <= 'f') {
|
|
Packit |
807167 |
num = num * 0x10 + cc - 'a' + 10;
|
|
Packit |
807167 |
} else if (cc >= 'A' && cc <= 'F') {
|
|
Packit |
807167 |
num = num * 0x10 + cc - 'A' + 10;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::cout << (char)num;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
std::cout << (char)num;
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (istr) std::cout << std::endl;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
bool mid = false;
|
|
Packit |
807167 |
char c;
|
|
Packit |
807167 |
while (is->get(c)) {
|
|
Packit |
807167 |
if (mid) std::cout << ' ';
|
|
Packit |
807167 |
int32_t cc = (unsigned char)c;
|
|
Packit |
807167 |
int32_t num = (cc >> 4);
|
|
Packit |
807167 |
if (num < 10) {
|
|
Packit |
807167 |
std::cout << (char)('0' + num);
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
std::cout << (char)('a' + num - 10);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
num = (cc & 0x0f);
|
|
Packit |
807167 |
if (num < 10) {
|
|
Packit |
807167 |
std::cout << (char)('0' + num);
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
std::cout << (char)('a' + num - 10);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
mid = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::cout << std::endl;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform enc command
|
|
Packit |
807167 |
static int32_t procenc(const char* file, int32_t mode, bool dec) {
|
|
Packit |
807167 |
const char* istr = file && *file == '@' ? file + 1 : NULL;
|
|
Packit |
807167 |
std::istream *is;
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
std::istringstream iss(istr ? istr : "");
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
if (istr) {
|
|
Packit |
807167 |
is = &iss;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ifs.open(file, std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (!ifs) {
|
|
Packit |
807167 |
eprintf("%s: %s: open error\n", g_progname, file);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
is = &ifs;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
is = &std::cin;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::ostringstream oss;
|
|
Packit |
807167 |
char c;
|
|
Packit |
807167 |
while (is->get(c)) {
|
|
Packit |
807167 |
oss.put(c);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const std::string& ostr = oss.str();
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
switch (mode) {
|
|
Packit |
807167 |
default: {
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::basedecode(ostr.c_str(), &zsiz);
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
if (istr) std::cout << std::endl;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
char* zbuf = kc::baseencode(ostr.data(), ostr.size());
|
|
Packit |
807167 |
std::cout << zbuf;
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
std::cout << std::endl;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 1: {
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::hexdecode(ostr.c_str(), &zsiz);
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
if (istr) std::cout << std::endl;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
char* zbuf = kc::hexencode(ostr.data(), ostr.size());
|
|
Packit |
807167 |
std::cout << zbuf;
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
std::cout << std::endl;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 2: {
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::urldecode(ostr.c_str(), &zsiz);
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
if (istr) std::cout << std::endl;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
char* zbuf = kc::urlencode(ostr.data(), ostr.size());
|
|
Packit |
807167 |
std::cout << zbuf;
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
std::cout << std::endl;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 3: {
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::quotedecode(ostr.c_str(), &zsiz);
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
if (istr) std::cout << std::endl;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
char* zbuf = kc::quoteencode(ostr.data(), ostr.size());
|
|
Packit |
807167 |
std::cout << zbuf;
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
std::cout << std::endl;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform ciph command
|
|
Packit |
807167 |
static int32_t procciph(const char* file, const char* key) {
|
|
Packit |
807167 |
const char* istr = file && *file == '@' ? file + 1 : NULL;
|
|
Packit |
807167 |
std::istream *is;
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
std::istringstream iss(istr ? istr : "");
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
if (istr) {
|
|
Packit |
807167 |
is = &iss;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ifs.open(file, std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (!ifs) {
|
|
Packit |
807167 |
eprintf("%s: %s: open error\n", g_progname, file);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
is = &ifs;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
is = &std::cin;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::ostringstream oss;
|
|
Packit |
807167 |
char c;
|
|
Packit |
807167 |
while (is->get(c)) {
|
|
Packit |
807167 |
oss.put(c);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const std::string& ostr = oss.str();
|
|
Packit |
807167 |
char* cbuf = new char[ostr.size()];
|
|
Packit |
807167 |
kc::arccipher(ostr.data(), ostr.size(), key, std::strlen(key), cbuf);
|
|
Packit |
807167 |
std::cout.write(cbuf, ostr.size());
|
|
Packit |
807167 |
delete[] cbuf;
|
|
Packit |
807167 |
return 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform comp command
|
|
Packit |
807167 |
static int32_t proccomp(const char* file, int32_t mode, bool dec) {
|
|
Packit |
807167 |
const char* istr = file && *file == '@' ? file + 1 : NULL;
|
|
Packit |
807167 |
std::istream *is;
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
std::istringstream iss(istr ? istr : "");
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
if (istr) {
|
|
Packit |
807167 |
is = &iss;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ifs.open(file, std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (!ifs) {
|
|
Packit |
807167 |
eprintf("%s: %s: open error\n", g_progname, file);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
is = &ifs;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
is = &std::cin;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::ostringstream oss;
|
|
Packit |
807167 |
char c;
|
|
Packit |
807167 |
while (is->get(c)) {
|
|
Packit |
807167 |
oss.put(c);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const std::string& ostr = oss.str();
|
|
Packit |
807167 |
bool err = false;
|
|
Packit |
807167 |
switch (mode) {
|
|
Packit |
807167 |
default: {
|
|
Packit |
807167 |
kc::ZLIB::Mode zmode;
|
|
Packit |
807167 |
switch (mode) {
|
|
Packit |
807167 |
default: zmode = kc::ZLIB::RAW; break;
|
|
Packit |
807167 |
case 1: zmode = kc::ZLIB::DEFLATE; break;
|
|
Packit |
807167 |
case 2: zmode = kc::ZLIB::GZIP; break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::ZLIB::decompress(ostr.data(), ostr.size(), &zsiz, zmode);
|
|
Packit |
807167 |
if (zbuf) {
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
eprintf("%s: decompression failed\n", g_progname);
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::ZLIB::compress(ostr.data(), ostr.size(), &zsiz, zmode);
|
|
Packit |
807167 |
if (zbuf) {
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
eprintf("%s: compression failed\n", g_progname);
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 3: {
|
|
Packit |
807167 |
kc::LZO::Mode zmode = kc::LZO::RAW;
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::LZO::decompress(ostr.data(), ostr.size(), &zsiz, zmode);
|
|
Packit |
807167 |
if (zbuf) {
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
eprintf("%s: decompression failed\n", g_progname);
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::LZO::compress(ostr.data(), ostr.size(), &zsiz, zmode);
|
|
Packit |
807167 |
if (zbuf) {
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
eprintf("%s: compression failed\n", g_progname);
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 4: {
|
|
Packit |
807167 |
kc::LZMA::Mode zmode = kc::LZMA::RAW;
|
|
Packit |
807167 |
if (dec) {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::LZMA::decompress(ostr.data(), ostr.size(), &zsiz, zmode);
|
|
Packit |
807167 |
if (zbuf) {
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
eprintf("%s: decompression failed\n", g_progname);
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
size_t zsiz;
|
|
Packit |
807167 |
char* zbuf = kc::LZMA::compress(ostr.data(), ostr.size(), &zsiz, zmode);
|
|
Packit |
807167 |
if (zbuf) {
|
|
Packit |
807167 |
std::cout.write(zbuf, zsiz);
|
|
Packit |
807167 |
delete[] zbuf;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
eprintf("%s: compression failed\n", g_progname);
|
|
Packit |
807167 |
err = true;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return err ? 1 : 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform hash command
|
|
Packit |
807167 |
static int32_t prochash(const char* file, int32_t mode) {
|
|
Packit |
807167 |
const char* istr = file && *file == '@' ? file + 1 : NULL;
|
|
Packit |
807167 |
std::istream *is;
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
std::istringstream iss(istr ? istr : "");
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
if (istr) {
|
|
Packit |
807167 |
is = &iss;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ifs.open(file, std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (!ifs) {
|
|
Packit |
807167 |
eprintf("%s: %s: open error\n", g_progname, file);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
is = &ifs;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
is = &std::cin;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::ostringstream oss;
|
|
Packit |
807167 |
char c;
|
|
Packit |
807167 |
while (is->get(c)) {
|
|
Packit |
807167 |
oss.put(c);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const std::string& ostr = oss.str();
|
|
Packit |
807167 |
switch (mode) {
|
|
Packit |
807167 |
default: {
|
|
Packit |
807167 |
uint64_t hash = kc::hashmurmur(ostr.data(), ostr.size());
|
|
Packit |
807167 |
oprintf("%016llx\n", (unsigned long long)hash);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 1: {
|
|
Packit |
807167 |
uint64_t hash = kc::hashfnv(ostr.data(), ostr.size());
|
|
Packit |
807167 |
oprintf("%016llx\n", (unsigned long long)hash);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 2: {
|
|
Packit |
807167 |
char name[kc::NUMBUFSIZ];
|
|
Packit |
807167 |
uint32_t hash = kc::hashpath(ostr.data(), ostr.size(), name);
|
|
Packit |
807167 |
oprintf("%s\t%08lx\n", name, (unsigned long)hash);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 3: {
|
|
Packit |
807167 |
uint32_t hash = kc::ZLIB::calculate_crc(ostr.data(), ostr.size());
|
|
Packit |
807167 |
oprintf("%08x\n", (unsigned)hash);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform regex command
|
|
Packit |
807167 |
static int32_t procregex(const char* file, const char* pattern, const char* alt, int32_t opts) {
|
|
Packit |
807167 |
const char* istr = file && *file == '@' ? file + 1 : NULL;
|
|
Packit |
807167 |
std::istream *is;
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
std::istringstream iss(istr ? istr : "");
|
|
Packit |
807167 |
if (file) {
|
|
Packit |
807167 |
if (istr) {
|
|
Packit |
807167 |
is = &iss;
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
ifs.open(file, std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (!ifs) {
|
|
Packit |
807167 |
eprintf("%s: %s: open error\n", g_progname, file);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
is = &ifs;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
is = &std::cin;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
if (alt) {
|
|
Packit |
807167 |
kc::Regex regex;
|
|
Packit |
807167 |
if (!regex.compile(pattern, opts)) {
|
|
Packit |
807167 |
eprintf("%s: %s: compilation failed\n", g_progname, pattern);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::string altstr(alt);
|
|
Packit |
807167 |
std::string line;
|
|
Packit |
807167 |
while (mygetline(is, &line)) {
|
|
Packit |
807167 |
|
|
Packit |
807167 |
std::cout << regex.replace(line, altstr) << std::endl;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
} else {
|
|
Packit |
807167 |
kc::Regex regex;
|
|
Packit |
807167 |
if (!regex.compile(pattern, opts | kc::Regex::MATCHONLY)) {
|
|
Packit |
807167 |
eprintf("%s: %s: compilation failed\n", g_progname, pattern);
|
|
Packit |
807167 |
return 1;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::string line;
|
|
Packit |
807167 |
while (mygetline(is, &line)) {
|
|
Packit |
807167 |
if (regex.match(line)) std::cout << line << std::endl;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// perform conf command
|
|
Packit |
807167 |
static int32_t procconf(int32_t mode) {
|
|
Packit |
807167 |
switch (mode) {
|
|
Packit |
807167 |
case 'v': {
|
|
Packit |
807167 |
oprintf("%s\n", kc::VERSION);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'i': {
|
|
Packit |
807167 |
oprintf("%s\n", _KC_APPINC);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'l': {
|
|
Packit |
807167 |
oprintf("%s\n", _KC_APPLIBS);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
case 'p': {
|
|
Packit |
807167 |
oprintf("%s\n", _KC_BINDIR);
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
default: {
|
|
Packit |
807167 |
oprintf("VERSION: %s\n", kc::VERSION);
|
|
Packit |
807167 |
oprintf("LIBVER: %d\n", kc::LIBVER);
|
|
Packit |
807167 |
oprintf("LIBREV: %d\n", kc::LIBREV);
|
|
Packit |
807167 |
oprintf("FMTVER: %d\n", kc::FMTVER);
|
|
Packit |
807167 |
oprintf("OSNAME: %s\n", kc::OSNAME);
|
|
Packit |
807167 |
oprintf("BIGEND: %d\n", kc::BIGEND);
|
|
Packit |
807167 |
oprintf("CLOCKTICK: %d\n", kc::CLOCKTICK);
|
|
Packit |
807167 |
oprintf("PAGESIZ: %d\n", kc::PAGESIZ);
|
|
Packit |
807167 |
oprintf("FEATURES: %s\n", kc::FEATURES);
|
|
Packit |
807167 |
oprintf("TYPES: void*=%d short=%d int=%d long=%d long_long=%d size_t=%d"
|
|
Packit |
807167 |
" float=%d double=%d long_double=%d\n",
|
|
Packit |
807167 |
(int)sizeof(void*), (int)sizeof(short), (int)sizeof(int), (int)sizeof(long),
|
|
Packit |
807167 |
(int)sizeof(long long), (int)sizeof(size_t),
|
|
Packit |
807167 |
(int)sizeof(float), (int)sizeof(double), (int)sizeof(long double));
|
|
Packit |
807167 |
std::map<std::string, std::string> info;
|
|
Packit |
807167 |
kc::getsysinfo(&info;;
|
|
Packit |
807167 |
if (info["mem_total"].size() > 0)
|
|
Packit |
807167 |
oprintf("MEMORY: total=%s free=%s cached=%s\n",
|
|
Packit |
807167 |
info["mem_total"].c_str(), info["mem_free"].c_str(),
|
|
Packit |
807167 |
info["mem_cached"].c_str());
|
|
Packit |
807167 |
if (std::strcmp(_KC_PREFIX, "*")) {
|
|
Packit |
807167 |
oprintf("prefix: %s\n", _KC_PREFIX);
|
|
Packit |
807167 |
oprintf("includedir: %s\n", _KC_INCLUDEDIR);
|
|
Packit |
807167 |
oprintf("libdir: %s\n", _KC_LIBDIR);
|
|
Packit |
807167 |
oprintf("bindir: %s\n", _KC_BINDIR);
|
|
Packit |
807167 |
oprintf("libexecdir: %s\n", _KC_LIBEXECDIR);
|
|
Packit |
807167 |
oprintf("appinc: %s\n", _KC_APPINC);
|
|
Packit |
807167 |
oprintf("applibs: %s\n", _KC_APPLIBS);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
break;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
return 0;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// END OF FILE
|