Implemented odr_strdup. Added Reference ID to backend server API.
[yaz-moved-to-github.git] / client / client.c
index 8d4cba5..33fcfdd 100644 (file)
@@ -1,10 +1,46 @@
 /*
- * Copyright (c) 1995-1998, Index Data.
+ * Copyright (c) 1995-1999, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: client.c,v $
- * Revision 1.68  1998-07-20 12:37:06  adam
+ * Revision 1.80  1999-03-31 11:18:24  adam
+ * Implemented odr_strdup. Added Reference ID to backend server API.
+ *
+ * Revision 1.79  1999/03/23 14:14:25  adam
+ * Yet another fix.
+ *
+ * Revision 1.78  1999/03/18 12:57:18  adam
+ * Minor fix.
+ *
+ * Revision 1.77  1999/03/11 15:26:51  adam
+ * Fixed bug (introduced by previous commit).
+ *
+ * Revision 1.76  1999/03/11 11:12:07  adam
+ * Added GNU readline support. HTML display in client.
+ *
+ * Revision 1.75  1999/02/01 15:37:32  adam
+ * Fixed minor bug introduced by previous commit.
+ *
+ * Revision 1.74  1999/02/01 15:35:21  adam
+ * Added XML display.
+ *
+ * Revision 1.73  1998/10/20 13:55:43  quinn
+ * Fixed Scan bug in asn and client
+ *
+ * Revision 1.72  1998/10/20 13:23:15  quinn
+ * changed preferred pos to 1
+ *
+ * Revision 1.71  1998/10/20 13:21:43  adam
+ * Fixed scan response handler.
+ *
+ * Revision 1.70  1998/09/22 09:40:37  adam
+ * Minor changes in sort spec.
+ *
+ * Revision 1.69  1998/08/19 16:10:06  adam
+ * Changed som member names of DeleteResultSetRequest/Response.
+ *
+ * Revision 1.68  1998/07/20 12:37:06  adam
  * Added 'delete <resultset>' command. Changed open command so that
  * it reconnects if already connected.
  *
 #include <yaz-ccl.h>
 #endif
 
+#if HAVE_READLINE_READLINE_H
+#include <readline/readline.h>
+#endif
+#if HAVE_READLINE_HISTORY_H
+#include <readline/history.h>
+#endif
+
 #define C_PROMPT "Z> "
 
 static ODR out, in, print;              /* encoding and decoding streams */
@@ -644,10 +687,22 @@ static void display_record(Z_DatabaseRecord *p)
         printf("%.*s", r->u.octet_aligned->len, r->u.octet_aligned->buf);
     else if (r->which == Z_External_octet && p->u.octet_aligned->len)
     {
-        const char *marc_buf = (char*)p->u.octet_aligned->buf;
-        marc_display (marc_buf, NULL);
+        const char *octet_buf = (char*)p->u.octet_aligned->buf;
+       if (ent->value == VAL_TEXT_XML || ent->value == VAL_APPLICATION_XML ||
+            ent->value == VAL_HTML)
+       {
+            int i;
+            for (i = 0; i<p->u.octet_aligned->len; i++)
+                if (octet_buf[i] > 126 || octet_buf[i] < 7)
+                    printf ("<%02X>", octet_buf[i]);
+                else
+                    fputc (octet_buf[i], stdout);
+           printf ("\n");
+        }
+       else
+            marc_display (octet_buf, NULL);
         if (marcdump)
-            fwrite (marc_buf, strlen (marc_buf), 1, marcdump);
+            fwrite (octet_buf, 1, p->u.octet_aligned->len, marcdump);
     }
     else if (ent && ent->value == VAL_SUTRS)
     {
@@ -763,7 +818,7 @@ static int send_deleteResultSetRequest(char *arg)
 
     req->referenceId = set_refid (out);
 
-    req->num_ids = 1;
+    req->num_resultSetList = 1;
     req->resultSetList = (char **)
        odr_malloc (out, sizeof(*req->resultSetList));
     *req->resultSetList = arg;
@@ -1160,7 +1215,7 @@ static int cmd_itemorder(char *arg)
     fflush(stdout);
 
     send_itemorder(arg);
-    return(1);
+    return(2);
 }
 
 static int cmd_find(char *arg)
@@ -1406,7 +1461,8 @@ int send_sortrequest(char *arg, int newset)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest);
     Z_SortRequest *req = apdu->u.sortRequest;
-    Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)odr_malloc (out, sizeof(*sksl));
+    Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
+        odr_malloc (out, sizeof(*sksl));
     char setstring[32];
     char sort_string[32], sort_flags[32];
     int off;
@@ -1424,9 +1480,7 @@ int send_sortrequest(char *arg, int newset)
     req->num_inputResultSetNames = 1;
     req->inputResultSetNames = (Z_InternationalString **)
        odr_malloc (out, sizeof(*req->inputResultSetNames));
-    req->inputResultSetNames[0] = (char *)
-       odr_malloc (out, strlen(setstring)+1);
-    strcpy (req->inputResultSetNames[0], setstring);
+    req->inputResultSetNames[0] = odr_strdup (out, setstring);
 #else
     req->inputResultSetNames =
        (Z_StringList *)odr_malloc (out, sizeof(*req->inputResultSetNames));
@@ -1434,15 +1488,13 @@ int send_sortrequest(char *arg, int newset)
     req->inputResultSetNames->strings =
        (char **)odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
     req->inputResultSetNames->strings[0] =
-       (char *)odr_malloc (out, strlen(setstring)+1);
-    strcpy (req->inputResultSetNames->strings[0], setstring);
+       odr_strdup (out, setstring);
 #endif
 
     if (newset && setnumber >= 0)
        sprintf (setstring, "%d", ++setnumber);
 
-    req->sortedResultSetName = (char *)odr_malloc (out, strlen(setstring)+1);
-    strcpy (req->sortedResultSetName, setstring);
+    req->sortedResultSetName = odr_strdup (out, setstring);
 
     req->sortSequence = sksl;
     sksl->num_specs = 0;
@@ -1489,8 +1541,7 @@ int send_sortrequest(char *arg, int newset)
        else
        {
            sk->which = Z_SortKey_sortField;
-           sk->u.sortField = (char *)odr_malloc (out, strlen(sort_string)+1);
-           strcpy (sk->u.sortField, sort_string);
+           sk->u.sortField = odr_strdup (out, sort_string);
        }
        sks->sortRelation = (int *)odr_malloc (out, sizeof(*sks->sortRelation));
        *sks->sortRelation = Z_SortRelation_ascending;
@@ -1511,12 +1562,12 @@ int send_sortrequest(char *arg, int newset)
            case 'a':
            case 'A':
            case '>':
-               *sks->sortRelation = Z_SortRelation_ascending;
+               *sks->sortRelation = Z_SortRelation_descending;
                break;
            case 'd':
            case 'D':
            case '<':
-               *sks->sortRelation = Z_SortRelation_descending;
+               *sks->sortRelation = Z_SortRelation_ascending;
                break;
            case 'i':
            case 'I':
@@ -1567,33 +1618,22 @@ void process_scanResponse(Z_ScanResponse *res)
         printf("Scan returned code %d\n", *res->scanStatus);
     if (!res->entries)
         return;
-#ifdef ASN_COMPILED
     if ((entries = res->entries->entries))
        num_entries = res->entries->num_entries;
-#else
-    if (res->entries->which == Z_ListEntries_entries)
-    {
-        entries = res->entries->u.entries->entries;
-       num_entries = res->entries->u.entries->num_entries;
-    }
-#endif
     for (i = 0; i < num_entries; i++)
+    {
+        int pos_term = res->positionOfTerm ? *res->positionOfTerm : -1;
        if (entries[i]->which == Z_Entry_termInfo)
        {
-           printf("%c ", i + 1 == *res->positionOfTerm ? '*' : ' ');
+           printf("%c ", i + 1 == pos_term ? '*' : ' ');
            display_term(entries[i]->u.termInfo);
        }
        else
            display_diagrecs(&entries[i]->u.surrogateDiagnostic, 1);
-#ifdef ASN_COMPILED
+    }
     if (res->entries->nonsurrogateDiagnostics)
        display_diagrecs (res->entries->nonsurrogateDiagnostics,
                          res->entries->num_nonsurrogateDiagnostics);
-#else
-    if (res->entries->which == Z_ListEntries_nonSurrogateDiagnostics)
-        display_diagrecs(&res->entries->
-                        u.nonSurrogateDiagnostics->diagRecs[0], 1);
-#endif
 }
 
 void process_sortResponse(Z_SortResponse *res)
@@ -1668,7 +1708,7 @@ int cmd_scan(char *arg)
     }
     if (*arg)
     {
-        if (send_scanrequest(arg, 5, 20) < 0)
+        if (send_scanrequest(arg, 1, 20) < 0)
             return 0;
     }
     else
@@ -1867,13 +1907,27 @@ static int client(int wait)
 #else
        if (!wait)
 #endif
-           {
-            /* quick & dirty way to get a command line. */
-               char *end_p;
-               if (!fgets(line, 1023, stdin))
-                   break;
-               if ((end_p = strchr (line, '\n')))
-                   *end_p = '\0';
+       {
+#if HAVE_READLINE_READLINE_H
+           char* line_in;
+           line_in=readline(C_PROMPT);
+            if (!line_in)
+                break;
+#if HAVE_READLINE_HISTORY_H
+            if (*line_in)
+               add_history(line_in);
+#endif
+           strcpy(line,line_in);
+            free (line_in);
+#else    
+           char *end_p;
+            printf (C_PROMPT);
+           fflush(stdout);
+           if (!fgets(line, 1023, stdin))
+               break;
+           if ((end_p = strchr (line, '\n')))
+               *end_p = '\0';
+#endif 
             if ((res = sscanf(line, "%s %[^;]", word, arg)) <= 0)
             {
                 strcpy(word, last_cmd);
@@ -1898,7 +1952,6 @@ static int client(int wait)
             }
             if (res < 2)
            {
-                printf(C_PROMPT);
                continue;
            }
         }
@@ -1987,8 +2040,6 @@ static int client(int wait)
                 }
             }
             while (conn && cs_more(conn));
-           printf(C_PROMPT);
-           fflush(stdout);
         }
     }
     return 0;
@@ -2030,10 +2081,7 @@ int main(int argc, char **argv)
         }
     }
     if (!opened)
-    {
        initialize ();
-        printf (C_PROMPT);
-    }
     return client (opened);
 }