X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=3db21cf8f8051dea85d461d7d3af13f34b5d9923;hb=65efc4dd0a947e1b4620d93c88d771b83bc32dac;hp=b7b7e12e1ac525585bb79f14f372b2c2eb119c1f;hpb=64f113142ce1f847896e50a43707d220681faf6b;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index b7b7e12..3db21cf 100644 --- a/client/client.c +++ b/client/client.c @@ -2,11 +2,19 @@ * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.174 2002-11-08 12:23:38 adam Exp $ + * $Id: client.c,v 1.177 2002-12-16 13:30:41 adam Exp $ */ #include #include +#if HAVE_LOCALE_H +#include +#endif + +#if HAVE_LANGINFO_H +#include +#endif + #include #include @@ -49,6 +57,8 @@ #define C_PROMPT "Z> " +static char *codeset = 0; /* character set for output */ + static ODR out, in, print; /* encoding and decoding streams */ static FILE *apdu_file = 0; static COMSTACK conn = 0; /* our z-association */ @@ -156,8 +166,6 @@ void do_hex_dump(char* buf,int len) #endif } - - void add_otherInfos(Z_APDU *a) { Z_OtherInformation **oi; @@ -472,7 +480,11 @@ int cmd_open(char *arg) { printf ("error = %s\n", cs_strerror(conn)); if (conn->cerrno == CSYSERR) - perror("system"); + { + char msg[256]; + yaz_strerror(msg, sizeof(msg)); + printf ("%s\n", msg); + } cs_close(conn); conn = 0; return 0; @@ -647,13 +659,64 @@ static void display_record(Z_External *r) #endif ) { - if (marc_display_exl (octet_buf, NULL, 0 /* debug */, - r->u.octet_aligned->len) <= 0) + char *result; + int rlen; + yaz_iconv_t cd = 0; + yaz_marc_t mt = yaz_marc_create(); + + if (yaz_marc_decode_buf(mt, octet_buf,r->u.octet_aligned->len, + &result, &rlen)> 0) + { + char *from = 0; + if (ent->value == VAL_USMARC) + { + if (octet_buf[9] == 'a') + from = "UTF-8"; + else + from = "MARC8"; + } + else + from = "ISO-8859-1"; + + if (codeset && from) + { + printf ("convert from %s to %s\n", from, codeset); + cd = yaz_iconv_open(codeset, from); + } + if (!cd) + fwrite (result, 1, rlen, stdout); + else + { + char outbuf[12]; + size_t inbytesleft = rlen; + const char *inp = result; + + while (inbytesleft) + { + size_t outbytesleft = sizeof(outbuf); + char *outp = outbuf; + size_t r = yaz_iconv (cd, (char**) &inp, + &inbytesleft, + &outp, &outbytesleft); + if (r == (size_t) (-1)) + { + int e = yaz_iconv_error(cd); + if (e != YAZ_ICONV_E2BIG) + break; + } + fwrite (outbuf, outp - outbuf, 1, stdout); + } + } + } + else { printf ("bad MARC. Dumping as it is:\n"); print_record((const unsigned char*) octet_buf, - r->u.octet_aligned->len); - } + r->u.octet_aligned->len); + } + yaz_marc_destroy(mt); + if (cd) + yaz_iconv_close(cd); } else { @@ -3235,7 +3298,15 @@ int main(int argc, char **argv) char *arg; int ret; - while ((ret = options("k:c:a:m:v:p:u:", argv, argc, &arg)) != -2) +#if HAVE_LOCALE_H + if (!setlocale(LC_CTYPE, "")) + fprintf (stderr, "setlocale failed\n"); +#endif +#if HAVE_LANGINFO_H + codeset = nl_langinfo(CODESET); +#endif + + while ((ret = options("k:c:a:m:v:p:u:t:", argv, argc, &arg)) != -2) { switch (ret) { @@ -3257,19 +3328,22 @@ int main(int argc, char **argv) exit (1); } break; - case 'c': - strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); - ccl_fields[sizeof(ccl_fields)-1] = '\0'; - break; + case 't': + codeset = arg; + break; + case 'c': + strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); + ccl_fields[sizeof(ccl_fields)-1] = '\0'; + break; case 'a': if (!strcmp(arg, "-")) apdu_file=stderr; else apdu_file=fopen(arg, "a"); break; - case 'p': - yazProxy=strdup(arg); - break; + case 'p': + yazProxy=strdup(arg); + break; case 'u': if (!auth_command) {