Fix printing of some non-zero terminated strings. WS updates.
[yaz-moved-to-github.git] / client / client.c
index e0ac407..602dde8 100644 (file)
@@ -1,20 +1,33 @@
 /* 
- * Copyright (c) 1995-2005, Index Data
+ * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.266 2005-01-09 21:52:48 adam Exp $
+ * $Id: client.c,v 1.272 2005-01-27 09:05:09 adam Exp $
  */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>
+#include <time.h>
+#include <ctype.h>
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
 #if HAVE_LOCALE_H
 #include <locale.h>
 #endif
-
 #if HAVE_LANGINFO_H
 #include <langinfo.h>
 #endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
 
 #if HAVE_OPENSSL_SSL_H
 #include <openssl/bio.h>
 #include <openssl/err.h>
 #endif
 
-#include <time.h>
-#include <ctype.h>
-
 #ifdef WIN32
+#include <sys/stat.h>
 #include <io.h>
+#include <windows.h>
 #define S_ISREG(x) (x & _S_IFREG)
 #define S_ISDIR(x) (x & _S_IFDIR)
-#else
-#include <unistd.h>
 #endif
 
 #include <yaz/yaz-util.h>
@@ -62,7 +72,6 @@
 #include <readline/history.h>
 #endif
 
-#include <sys/stat.h>
 
 #include "admin.h"
 #include "tabcomplete.h"
@@ -377,14 +386,18 @@ static int process_initResponse(Z_InitResponse *res)
            render_initUserInfo(uif->u.userInfo1);
        } else {
            printf("UserInformationfield:\n");
-           if (!z_External(print, (Z_External**)&uif, 0, 0)) {
+           if (!z_External(print, (Z_External**)&uif, 0, 0))
+           {
                odr_perror(print, "Printing userinfo\n");
                odr_reset(print);
            }
            if (uif->which == Z_External_octet) {
                printf("Guessing visiblestring:\n");
-               printf("'%s'\n", uif->u. octet_aligned->buf);
-           } else if (uif->which == Z_External_single) {
+               printf("'%.*s'\n", uif->u.octet_aligned->len,
+                      uif->u.octet_aligned->buf);
+           }
+           else if (uif->which == Z_External_single) 
+           {
                Odr_any *sat = uif->u.single_ASN1_type;
                oident *oid = oid_getentbyoid(uif->direct_reference);
                if (oid->value == VAL_OCLCUI) {
@@ -402,7 +415,8 @@ static int process_initResponse(Z_InitResponse *res)
                else
                {
                    /* Peek at any private Init-diagnostic APDUs */
-                   printf("### NAUGHTY: External is '%.*s'\n", sat->len, sat->buf);
+                   printf("### NAUGHTY: External is '%.*s'\n",
+                          sat->len, sat->buf);
                }
            }
            odr_reset (print);
@@ -456,11 +470,20 @@ static void render_initUserInfo(Z_OtherInformation *ui1) {
        Z_OtherInformationUnit *unit = ui1->list[i];
        printf("  %d: otherInfo unit contains ", i+1);
        if (unit->which == Z_OtherInfo_externallyDefinedInfo &&
+           unit->information.externallyDefinedInfo &&
            unit->information.externallyDefinedInfo->which ==
            Z_External_diag1) {
            render_diag(unit->information.externallyDefinedInfo->u.diag1);
-       } else {
-           printf("unsupported otherInfo unit type %d\n", unit->which);
+       } 
+       else if (unit->which != Z_OtherInfo_externallyDefinedInfo)
+       {
+           printf("unsupported otherInfo unit->which = %d\n", unit->which);
+       }
+       else 
+       {
+           printf("unsupported otherInfo unit external %d\n",
+                  unit->information.externallyDefinedInfo ? 
+                  unit->information.externallyDefinedInfo->which : -2);
        }
     }
 }
@@ -1253,11 +1276,11 @@ static int send_srw(Z_SRW_PDU *sr)
 #endif
 
 #if HAVE_XML2
-static int send_SRW_scanRequest(const char *arg, int num, int pos)
+static int send_SRW_scanRequest(const char *arg, int pos, int num)
 {
     Z_SRW_PDU *sr = 0;
     
-    /* regular request .. */
+    /* regular requestse .. */
     sr = yaz_srw_get(out, Z_SRW_scan_request);
 
     switch(queryType)
@@ -2856,8 +2879,16 @@ int cmd_scan(const char *arg)
             cmd_open(0);
        if (!conn)
            return 0;
-        if (send_SRW_scanRequest(arg, 20, 0) < 0)
-            return 0;
+       if (*arg)
+       {
+           if (send_SRW_scanRequest(arg, scan_position, 20) < 0)
+               return 0;
+       }
+       else
+       {
+           if (send_SRW_scanRequest(last_scan_line, 1, 20) < 0)
+               return 0;
+       }
        return 2;
 #else
         return 0;
@@ -3531,6 +3562,8 @@ static void handle_srw_scan_term(Z_SRW_scanTerm *term)
        printf(" %s", term->whereInList);
     if (term->value && term->displayTerm)
        printf(" %s", term->value);
+
+    strcpy(last_scan_line, term->value);
     printf("\n");
 }