diff options
Diffstat (limited to 'qdbm/cbcodec.c')
-rw-r--r-- | qdbm/cbcodec.c | 1079 |
1 files changed, 0 insertions, 1079 deletions
diff --git a/qdbm/cbcodec.c b/qdbm/cbcodec.c deleted file mode 100644 index 1ab45153..00000000 --- a/qdbm/cbcodec.c +++ /dev/null @@ -1,1079 +0,0 @@ -/************************************************************************************************* - * Popular encoders and decoders - * Copyright (C) 2000-2007 Mikio Hirabayashi - * This file is part of QDBM, Quick Database Manager. - * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU - * Lesser General Public License as published by the Free Software Foundation; either version - * 2.1 of the License or any later version. QDBM is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * You should have received a copy of the GNU Lesser General Public License along with QDBM; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA. - *************************************************************************************************/ - - -#include <cabin.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#undef TRUE -#define TRUE 1 /* boolean true */ -#undef FALSE -#define FALSE 0 /* boolean false */ - -#define DEFCODE "UTF-8" /* default encoding */ - - -/* for RISC OS */ -#if defined(__riscos__) || defined(__riscos) -#include <unixlib/local.h> -int __riscosify_control = __RISCOSIFY_NO_PROCESS; -#endif - - -/* global variables */ -const char *progname; /* program name */ - - -/* function prototypes */ -int main(int argc, char **argv); -void usage(void); -char *readstdin(int *sp); -int runurl(int argc, char **argv); -int runbase(int argc, char **argv); -int runquote(int argc, char **argv); -int runmime(int argc, char **argv); -int runcsv(int argc, char **argv); -int runxml(int argc, char **argv); -int runzlib(int argc, char **argv); -int runlzo(int argc, char **argv); -int runbzip(int argc, char **argv); -int runiconv(int argc, char **argv); -int rundate(int argc, char **argv); -void shouucsmap(void); - - -/* main routine */ -int main(int argc, char **argv){ - int rv; - cbstdiobin(); - progname = argv[0]; - if(argc < 2) usage(); - rv = 0; - if(!strcmp(argv[1], "url")){ - rv = runurl(argc, argv); - } else if(!strcmp(argv[1], "base")){ - rv = runbase(argc, argv); - } else if(!strcmp(argv[1], "quote")){ - rv = runquote(argc, argv); - } else if(!strcmp(argv[1], "mime")){ - rv = runmime(argc, argv); - } else if(!strcmp(argv[1], "csv")){ - rv = runcsv(argc, argv); - } else if(!strcmp(argv[1], "xml")){ - rv = runxml(argc, argv); - } else if(!strcmp(argv[1], "zlib")){ - rv = runzlib(argc, argv); - } else if(!strcmp(argv[1], "lzo")){ - rv = runlzo(argc, argv); - } else if(!strcmp(argv[1], "bzip")){ - rv = runbzip(argc, argv); - } else if(!strcmp(argv[1], "iconv")){ - rv = runiconv(argc, argv); - } else if(!strcmp(argv[1], "date")){ - rv = rundate(argc, argv); - } else { - usage(); - } - return rv; -} - - -/* print the usage and exit */ -void usage(void){ - char *tmp; - int tsiz; - fprintf(stderr, "%s: popular encoders and decoders\n", progname); - fprintf(stderr, "\n"); - fprintf(stderr, "usage:\n"); - fprintf(stderr, " %s url [-d] [-br] [-rs base target] [-l] [-e expr] [file]\n", progname); - fprintf(stderr, " %s base [-d] [-l] [-c num] [-e expr] [file]\n", progname); - fprintf(stderr, " %s quote [-d] [-l] [-c num] [-e expr] [file]\n", progname); - fprintf(stderr, " %s mime [-d] [-hd] [-bd] [-part num] [-l] [-ec code] [-qp] [-dc] [-e expr]" - " [file]\n", progname); - fprintf(stderr, " %s csv [-d] [-t] [-l] [-e expr] [-html] [file]\n", progname); - fprintf(stderr, " %s xml [-d] [-p] [-l] [-e expr] [-tsv] [file]\n", progname); - if((tmp = cbdeflate("", 0, &tsiz)) != NULL){ - fprintf(stderr, " %s zlib [-d] [-gz] [-crc] [file]\n", progname); - free(tmp); - } - if((tmp = cblzoencode("", 0, &tsiz)) != NULL){ - fprintf(stderr, " %s lzo [-d] [file]\n", progname); - free(tmp); - } - if((tmp = cbbzencode("", 0, &tsiz)) != NULL){ - fprintf(stderr, " %s bzip [-d] [file]\n", progname); - free(tmp); - } - if((tmp = cbiconv("", 0, "US-ASCII", "US-ASCII", NULL, NULL)) != NULL){ - fprintf(stderr, " %s iconv [-ic code] [-oc code] [-ol ltype] [-cn] [-wc] [-um] [file]\n", - progname); - free(tmp); - } - fprintf(stderr, " %s date [-wf] [-rf] [-utc] [str]\n", progname); - fprintf(stderr, "\n"); - exit(1); -} - - -/* read the standard input */ -char *readstdin(int *sp){ - char *buf; - int i, blen, c; - blen = 256; - buf = cbmalloc(blen); - for(i = 0; (c = getchar()) != EOF; i++){ - if(i >= blen - 1) buf = cbrealloc(buf, blen *= 2); - buf[i] = c; - } - buf[i] = '\0'; - if(sp) *sp = i; - return buf; -} - - -/* parse arguments of url command */ -int runurl(int argc, char **argv){ - CBMAP *map; - int i, size, dec, br, line; - const char *val; - char *base, *target, *expr, *file, *buf, *res; - dec = FALSE; - br = FALSE; - line = FALSE; - base = NULL; - target = NULL; - expr = NULL; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else if(!strcmp(argv[i], "-br")){ - br = TRUE; - } else if(!strcmp(argv[i], "-rs")){ - if(++i >= argc) usage(); - base = argv[i]; - if(++i >= argc) usage(); - target = argv[i]; - } else if(!strcmp(argv[i], "-l")){ - line = TRUE; - } else if(!strcmp(argv[i], "-e")){ - if(++i >= argc) usage(); - expr = argv[i]; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(base){ - size = strlen(base); - buf = cbmemdup(base, size); - } else if(expr){ - size = strlen(expr); - buf = cbmemdup(expr, size); - } else if(file){ - if(!(buf = cbreadfile(file, &size))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&size); - } - if(target){ - res = cburlresolve(base, target); - printf("%s", res); - free(res); - } else if(br){ - map = cburlbreak(buf); - if((val = cbmapget(map, "self", -1, NULL))) printf("self\t%s\n", val); - if((val = cbmapget(map, "scheme", -1, NULL))) printf("scheme\t%s\n", val); - if((val = cbmapget(map, "host", -1, NULL))) printf("host\t%s\n", val); - if((val = cbmapget(map, "port", -1, NULL))) printf("port\t%s\n", val); - if((val = cbmapget(map, "authority", -1, NULL))) printf("authority\t%s\n", val); - if((val = cbmapget(map, "path", -1, NULL))) printf("path\t%s\n", val); - if((val = cbmapget(map, "file", -1, NULL))) printf("file\t%s\n", val); - if((val = cbmapget(map, "query", -1, NULL))) printf("query\t%s\n", val); - if((val = cbmapget(map, "fragment", -1, NULL))) printf("fragment\t%s\n", val); - cbmapclose(map); - } else if(dec){ - res = cburldecode(buf, &size); - for(i = 0; i < size; i++){ - putchar(res[i]); - } - free(res); - } else { - res = cburlencode(buf, size); - for(i = 0; res[i] != '\0'; i++){ - putchar(res[i]); - } - free(res); - } - if(line) putchar('\n'); - free(buf); - return 0; -} - - -/* parse arguments of base command */ -int runbase(int argc, char **argv){ - int i, ci, size, dec, line, cols; - char *expr, *file, *buf, *res; - dec = FALSE; - line = FALSE; - cols = -1; - expr = NULL; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else if(!strcmp(argv[i], "-l")){ - line = TRUE; - } else if(!strcmp(argv[i], "-c")){ - if(++i >= argc) usage(); - cols = atoi(argv[i]); - } else if(!strcmp(argv[i], "-e")){ - if(++i >= argc) usage(); - expr = argv[i]; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(expr){ - size = strlen(expr); - buf = cbmemdup(expr, size); - } else if(file){ - if(!(buf = cbreadfile(file, &size))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&size); - } - if(dec){ - res = cbbasedecode(buf, &size); - for(i = 0; i < size; i++){ - putchar(res[i]); - } - free(res); - } else { - res = cbbaseencode(buf, size); - ci = 0; - for(i = 0; res[i] != '\0'; i++){ - if(cols > 0 && ci >= cols){ - putchar('\n'); - ci = 0; - } - putchar(res[i]); - ci++; - } - free(res); - } - if(line) putchar('\n'); - free(buf); - return 0; -} - - -/* parse arguments of quote command */ -int runquote(int argc, char **argv){ - int i, ci, size, dec, line, cols; - char *expr, *file, *buf, *res; - dec = FALSE; - line = FALSE; - cols = -1; - expr = NULL; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else if(!strcmp(argv[i], "-l")){ - line = TRUE; - } else if(!strcmp(argv[i], "-c")){ - if(++i >= argc) usage(); - cols = atoi(argv[i]); - } else if(!strcmp(argv[i], "-e")){ - if(++i >= argc) usage(); - expr = argv[i]; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(expr){ - size = strlen(expr); - buf = cbmemdup(expr, size); - } else if(file){ - if(!(buf = cbreadfile(file, &size))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&size); - } - if(dec){ - res = cbquotedecode(buf, &size); - for(i = 0; i < size; i++){ - putchar(res[i]); - } - free(res); - } else { - res = cbquoteencode(buf, size); - ci = 0; - for(i = 0; res[i] != '\0'; i++){ - if(cols > 0 && (ci >= cols || (ci >= cols - 2 && res[i] == '='))){ - printf("=\n"); - ci = 0; - } - if(res[i] == '\r' || res[i] == '\n') ci = 0; - putchar(res[i]); - ci++; - } - free(res); - } - if(line) putchar('\n'); - free(buf); - return 0; -} - - -/* parse arguments of mime command */ -int runmime(int argc, char **argv){ - CBMAP *attrs; - CBLIST *parts; - int i, size, dec, line, qp, dc, hd, bd, pnum, rsiz, bsiz; - const char *key, *body; - char *code, *expr, *file, *buf, *res, renc[64]; - dec = FALSE; - hd = FALSE; - bd = FALSE; - pnum = 0; - line = FALSE; - dc = FALSE; - qp = FALSE; - code = NULL; - expr = NULL; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else if(!strcmp(argv[i], "-hd")){ - hd = TRUE; - } else if(!strcmp(argv[i], "-bd")){ - bd = TRUE; - } else if(!strcmp(argv[i], "-part")){ - if(++i >= argc) usage(); - pnum = atoi(argv[i]); - } else if(!strcmp(argv[i], "-l")){ - line = TRUE; - } else if(!strcmp(argv[i], "-ec")){ - if(++i >= argc) usage(); - code = argv[i]; - } else if(!strcmp(argv[i], "-qp")){ - qp = TRUE; - } else if(!strcmp(argv[i], "-dc")){ - dc = TRUE; - } else if(!strcmp(argv[i], "-e")){ - if(++i >= argc) usage(); - expr = argv[i]; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(expr){ - size = strlen(expr); - buf = cbmemdup(expr, size); - } else if(file){ - if(!(buf = cbreadfile(file, &size))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&size); - } - if(hd || bd || pnum > 0){ - attrs = cbmapopen(); - res = cbmimebreak(buf, size, attrs, &rsiz); - if(pnum > 0){ - parts = NULL; - if(!(key = cbmapget(attrs, "TYPE", -1, NULL)) || !cbstrfwimatch(key, "multipart/") || - !(key = cbmapget(attrs, "BOUNDARY", -1, NULL)) || - !(parts = cbmimeparts(res, rsiz, key)) || cblistnum(parts) < pnum){ - fprintf(stderr, "%s: not multipart or no such part\n", progname); - if(parts) cblistclose(parts); - free(res); - cbmapclose(attrs); - free(buf); - return 1; - } - body = cblistval(parts, pnum - 1, &bsiz); - for(i = 0; i < bsiz; i++){ - putchar(body[i]); - } - cblistclose(parts); - } else if(hd){ - cbmapiterinit(attrs); - while((key = cbmapiternext(attrs, NULL)) != NULL){ - printf("%s\t%s\n", key, cbmapget(attrs, key, -1, NULL)); - } - } else { - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - } - free(res); - cbmapclose(attrs); - } else if(dec){ - res = cbmimedecode(buf, renc); - printf("%s", dc ? renc : res); - free(res); - } else { - res = cbmimeencode(buf, code ? code : DEFCODE, !qp); - printf("%s", res); - free(res); - } - if(line) putchar('\n'); - free(buf); - return 0; -} - - -/* parse arguments of csv command */ -int runcsv(int argc, char **argv){ - CBLIST *rows, *cells; - int i, j, k, dec, tb, line, html; - const char *row, *cell; - char *expr, *file, *buf, *res; - dec = FALSE; - tb = FALSE; - line = FALSE; - html = FALSE; - expr = NULL; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else if(!strcmp(argv[i], "-t")){ - tb = TRUE; - } else if(!strcmp(argv[i], "-l")){ - line = TRUE; - } else if(!strcmp(argv[i], "-e")){ - if(++i >= argc) usage(); - expr = argv[i]; - } else if(!strcmp(argv[i], "-html")){ - html = TRUE; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(expr){ - buf = cbmemdup(expr, -1); - } else if(file){ - if(!(buf = cbreadfile(file, NULL))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(NULL); - } - if(tb || html){ - if(html) printf("<table border=\"1\">\n"); - rows = cbcsvrows(buf); - for(i = 0; i < cblistnum(rows); i++){ - if(html) printf("<tr>"); - row = cblistval(rows, i, NULL); - cells = cbcsvcells(row); - for(j = 0; j < cblistnum(cells); j++){ - cell = cblistval(cells, j, NULL); - if(html){ - printf("<td>"); - for(k = 0; cell[k] != '\0'; k++){ - if(cell[k] == '\r' || cell[k] == '\n'){ - printf("<br>"); - if(cell[k] == '\r' && cell[k] == '\n') k++; - } else { - switch(cell[k]){ - case '&': printf("&"); break; - case '<': printf("<"); break; - case '>': printf(">"); break; - default: putchar(cell[k]); break; - } - } - } - printf("</td>"); - } else { - if(j > 0) putchar('\t'); - for(k = 0; cell[k] != '\0'; k++){ - if(((unsigned char *)cell)[k] >= 0x20) putchar(cell[k]); - } - } - } - cblistclose(cells); - if(html) printf("</tr>"); - putchar('\n'); - } - cblistclose(rows); - if(html) printf("</table>\n"); - } else if(dec){ - res = cbcsvunescape(buf); - for(i = 0; res[i] != '\0'; i++){ - putchar(res[i]); - } - free(res); - } else { - res = cbcsvescape(buf); - for(i = 0; res[i] != '\0'; i++){ - putchar(res[i]); - } - free(res); - } - if(line) putchar('\n'); - free(buf); - return 0; -} - - -/* parse arguments of xml command */ -int runxml(int argc, char **argv){ - CBLIST *elems; - CBMAP *attrs; - int i, j, dec, pb, line, tsv, div; - const char *elem, *attr; - char *expr, *file, *buf, *res; - dec = FALSE; - pb = FALSE; - line = FALSE; - tsv = FALSE; - expr = NULL; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else if(!strcmp(argv[i], "-p")){ - pb = TRUE; - } else if(!strcmp(argv[i], "-l")){ - line = TRUE; - } else if(!strcmp(argv[i], "-e")){ - if(++i >= argc) usage(); - expr = argv[i]; - } else if(!strcmp(argv[i], "-tsv")){ - tsv = TRUE; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(expr){ - buf = cbmemdup(expr, -1); - } else if(file){ - if(!(buf = cbreadfile(file, NULL))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(NULL); - } - if(pb || tsv){ - elems = cbxmlbreak(buf, FALSE); - for(i = 0; i < cblistnum(elems); i++){ - elem = cblistval(elems, i, NULL); - div = FALSE; - if(elem[0] == '<'){ - if(cbstrfwimatch(elem, "<?xml")){ - printf("XMLDECL"); - div = TRUE; - } else if(cbstrfwimatch(elem, "<!DOCTYPE")){ - printf("DOCTYPE"); - } else if(cbstrfwimatch(elem, "<!--")){ - printf("COMMENT"); - } else if(cbstrfwimatch(elem, "</")){ - printf("ENDTAG"); - div = TRUE; - } else if(cbstrbwimatch(elem, "/>")){ - printf("EMPTAG"); - div = TRUE; - } else { - printf("BEGTAG"); - div = TRUE; - } - } else { - printf("TEXT"); - } - putchar('\t'); - if(tsv){ - if(div){ - attrs = cbxmlattrs(elem); - cbmapiterinit(attrs); - for(j = 0; (attr = cbmapiternext(attrs, NULL)) != NULL; j++){ - if(j < 1){ - printf("%s", cbmapget(attrs, attr, -1, NULL)); - } else { - printf("\t%s\t%s", attr, cbmapget(attrs, attr, -1, NULL)); - } - } - cbmapclose(attrs); - } else { - res = cbxmlunescape(elem); - for(j = 0; elem[j] != '\0'; j++){ - if(((unsigned char *)elem)[j] < 0x20 || elem[j] == '%'){ - printf("%%%02X", elem[j]); - } else { - putchar(elem[j]); - } - } - free(res); - } - } else { - printf("%s", elem); - } - putchar('\n'); - } - cblistclose(elems); - } else if(dec){ - res = cbxmlunescape(buf); - for(i = 0; res[i] != '\0'; i++){ - putchar(res[i]); - } - free(res); - } else { - res = cbxmlescape(buf); - for(i = 0; res[i] != '\0'; i++){ - putchar(res[i]); - } - free(res); - } - if(line) putchar('\n'); - free(buf); - return 0; -} - - -/* parse arguments of zlib command */ -int runzlib(int argc, char **argv){ - unsigned int sum; - int i, bsiz, rsiz, dec, gz, crc; - char *file, *buf, *res; - dec = FALSE; - gz = FALSE; - crc = FALSE; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else if(!strcmp(argv[i], "-gz")){ - gz = TRUE; - } else if(!strcmp(argv[i], "-crc")){ - crc = TRUE; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(file){ - if(!(buf = cbreadfile(file, &bsiz))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&bsiz); - } - if(crc){ - sum = cbgetcrc(buf, bsiz); - for(i = 0; i < sizeof(int); i++){ - printf("%02x", sum / 0x1000000); - sum <<= 8; - } - putchar('\n'); - } else if(dec){ - if(!(res = gz ? cbgzdecode(buf, bsiz, &rsiz) : cbinflate(buf, bsiz, &rsiz))){ - fprintf(stderr, "%s: inflate failed\n", progname); - free(buf); - return 1; - } - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - free(res); - } else { - if(!(res = gz ? cbgzencode(buf, bsiz, &rsiz) : cbdeflate(buf, bsiz, &rsiz))){ - fprintf(stderr, "%s: deflate failed\n", progname); - free(buf); - return 1; - } - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - free(res); - } - free(buf); - return 0; -} - - -/* parse arguments of lzo command */ -int runlzo(int argc, char **argv){ - int i, bsiz, rsiz, dec; - char *file, *buf, *res; - dec = FALSE; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(file){ - if(!(buf = cbreadfile(file, &bsiz))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&bsiz); - } - if(dec){ - if(!(res = cblzodecode(buf, bsiz, &rsiz))){ - fprintf(stderr, "%s: decode failed\n", progname); - free(buf); - return 1; - } - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - free(res); - } else { - if(!(res = cblzoencode(buf, bsiz, &rsiz))){ - fprintf(stderr, "%s: encode failed\n", progname); - free(buf); - return 1; - } - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - free(res); - } - free(buf); - return 0; -} - - -/* parse arguments of bzip command */ -int runbzip(int argc, char **argv){ - int i, bsiz, rsiz, dec; - char *file, *buf, *res; - dec = FALSE; - file = NULL; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-d")){ - dec = TRUE; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(file){ - if(!(buf = cbreadfile(file, &bsiz))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&bsiz); - } - if(dec){ - if(!(res = cbbzdecode(buf, bsiz, &rsiz))){ - fprintf(stderr, "%s: decode failed\n", progname); - free(buf); - return 1; - } - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - free(res); - } else { - if(!(res = cbbzencode(buf, bsiz, &rsiz))){ - fprintf(stderr, "%s: encode failed\n", progname); - free(buf); - return 1; - } - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - free(res); - } - free(buf); - return 0; -} - - -/* parse arguments of iconv command */ -int runiconv(int argc, char **argv){ - CBDATUM *datum; - const char *rcode; - char *icode, *ocode, *ltype, *file, *buf, *res, *norm, *orig; - int i, cn, wc, bsiz, rsiz, nsiz, osiz, miss; - icode = NULL; - ocode = NULL; - ltype = NULL; - file = NULL; - cn = FALSE; - wc = FALSE; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-ic")){ - if(++i >= argc) usage(); - icode = argv[i]; - } else if(!strcmp(argv[i], "-oc")){ - if(++i >= argc) usage(); - ocode = argv[i]; - } else if(!strcmp(argv[i], "-ol")){ - if(++i >= argc) usage(); - ltype = argv[i]; - } else if(!strcmp(argv[i], "-cn")){ - cn = TRUE; - } else if(!strcmp(argv[i], "-wc")){ - wc = TRUE; - } else if(!strcmp(argv[i], "-um")){ - shouucsmap(); - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - buf = NULL; - if(file){ - if(!(buf = cbreadfile(file, &bsiz))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - buf = readstdin(&bsiz); - } - miss = 0; - if(cn){ - printf("%s\n", cbencname(buf, bsiz)); - } else if(wc){ - printf("%d\n", cbstrcountutf(buf)); - } else { - rcode = icode ? icode : cbencname(buf, bsiz); - if(!(res = cbiconv(buf, bsiz, rcode, ocode ? ocode : DEFCODE, - &rsiz, &miss))){ - fprintf(stderr, "%s: iconv failed\n", progname); - free(buf); - return 1; - } - if(miss > 0) fprintf(stderr, "%s: missing %d characters\n", progname, miss); - if(ltype && (!cbstricmp(ltype, "u") || !cbstricmp(ltype, "unix") || - !cbstricmp(ltype, "lf"))){ - ltype = "\n"; - } else if(ltype && (!cbstricmp(ltype, "d") || !cbstricmp(ltype, "dos") || - !cbstricmp(ltype, "crlf"))){ - ltype = "\r\n"; - } else if(ltype && (!cbstricmp(ltype, "m") || !cbstricmp(ltype, "mac") || - !cbstricmp(ltype, "cr"))){ - ltype = "\r"; - } else { - ltype = NULL; - } - if(ltype){ - if(!(norm = cbiconv(res, rsiz, ocode, "UTF-8", &nsiz, NULL))){ - fprintf(stderr, "%s: iconv failed\n", progname); - free(res); - free(buf); - return 1; - } - datum = cbdatumopen(NULL, -1); - for(i = 0; i < nsiz; i++){ - if(norm[i] == '\r'){ - if(norm[i+1] == '\n') i++; - cbdatumcat(datum, ltype, -1); - } else if(norm[i] == '\n'){ - cbdatumcat(datum, ltype, -1); - } else { - cbdatumcat(datum, norm + i, 1); - } - } - if(!(orig = cbiconv(cbdatumptr(datum), cbdatumsize(datum), "UTF-8", ocode, &osiz, NULL))){ - fprintf(stderr, "%s: iconv failed\n", progname); - cbdatumclose(datum); - free(norm); - free(res); - free(buf); - return 1; - } - for(i = 0; i < osiz; i++){ - putchar(orig[i]); - } - free(orig); - cbdatumclose(datum); - free(norm); - } else { - for(i = 0; i < rsiz; i++){ - putchar(res[i]); - } - } - free(res); - } - free(buf); - return miss > 0 ? 1 : 0; -} - - -/* parse arguments of date command */ -int rundate(int argc, char **argv){ - int i, wb, rb, utc, jl; - char *date, *res; - time_t t; - wb = FALSE; - rb = FALSE; - utc = FALSE; - date = NULL; - for(i = 2; i < argc; i++){ - if(!date && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-wf")){ - wb = TRUE; - } else if(!strcmp(argv[i], "-rf")){ - rb = TRUE; - } else if(!strcmp(argv[i], "-utc")){ - utc = TRUE; - } else { - usage(); - } - } else if(!date){ - date = argv[i]; - } else { - usage(); - } - } - jl = utc ? 0 : cbjetlag(); - if(date){ - t = cbstrmktime(date); - } else { - t = time(NULL); - } - if(wb){ - res = cbdatestrwww(t, jl); - } else if(rb){ - res = cbdatestrhttp(t, jl); - } else { - res = cbsprintf("%d", (int)t); - } - if(t >= 0){ - printf("%s\n", res); - } else { - if(date){ - fprintf(stderr, "%s: %s: invalid date format\n", progname, date); - } else { - fprintf(stderr, "%s: invalid time setting\n", progname); - } - } - free(res); - return 0; -} - - -/* show mapping of UCS-2 and exit. */ -void shouucsmap(void){ - unsigned char buf[2], *tmp; - int i, j, tsiz; - for(i = 0; i < 65536; i++){ - buf[0] = i / 256; - buf[1] = i % 256; - printf("%d\t", i); - printf("U+%02X%02X\t", buf[0], buf[1]); - printf("\"\\x%x\\x%x\"\t", buf[0], buf[1]); - if((tmp = (unsigned char *)cbiconv((char *)buf, 2, "UTF-16BE", "UTF-8", - &tsiz, NULL)) != NULL){ - if(tsiz > 0){ - printf("\""); - for(j = 0; j < tsiz; j++){ - printf("\\x%x", tmp[j]); - } - printf("\""); - } else { - printf("NULL"); - } - free(tmp); - } - printf("\n"); - } - exit(0); -} - - - -/* END OF FILE */ |