Towards GPL
[idzebra-moved-to-github.git] / index / zsets.c
index 7297d02..6db021b 100644 (file)
@@ -1,10 +1,26 @@
-/*
- * Copyright (C) 1994-2002, Index Data
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: zsets.c,v 1.35 2002-04-16 22:31:42 adam Exp $
- */
+/* $Id: zsets.c,v 1.38 2002-08-02 19:26:56 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+   Index Data Aps
+
+This file is part of the Zebra server.
+
+Zebra is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Zebra 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 General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Zebra; see the file LICENSE.zebra.  If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+*/
+
+
 #include <stdio.h>
 #include <assert.h>
 #ifdef WIN32
@@ -119,20 +135,56 @@ void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type,
 }
 
 
-const char *zebra_resultSetTerms (ZebraHandle zh, const char *setname, 
-                                  int no, int *count, int *no_max)
+int zebra_resultSetTerms (ZebraHandle zh, const char *setname, 
+                          int no, int *count, 
+                          int *type, char *out, size_t *len)
 {
     ZebraSet s = resultSetGet (zh, setname);
+    int no_max = 0;
 
-    *count = 0;
-    *no_max = 0;
+    if (count)
+        *count = 0;
     if (!s || !s->rset)
         return 0;
-    *no_max = s->rset->no_rset_terms;
-    if (no < 0 || no >= *no_max)
+    no_max = s->rset->no_rset_terms;
+    if (no < 0 || no >= no_max)
         return 0;
-    *count = s->rset->rset_terms[no]->count;
-    return s->rset->rset_terms[no]->name;
+    if (count)
+        *count = s->rset->rset_terms[no]->count;
+    if (type)
+        *type = s->rset->rset_terms[no]->type;
+    
+    if (out)
+    {
+        char *inbuf = s->rset->rset_terms[no]->name;
+        size_t inleft = strlen(inbuf);
+        size_t outleft = *len - 1;
+       int converted = 0;
+#if HAVE_ICONV_H
+        if (zh->iconv_from_utf8 != (iconv_t)(-1))
+        {
+            char *outbuf = out;
+            size_t ret;
+            
+            ret = iconv(zh->iconv_from_utf8, &inbuf, &inleft,
+                        &outbuf, &outleft);
+            if (ret == (size_t)(-1))
+                *len = 0;
+            else
+                *len = outbuf - out;
+           converted = 1;
+        }
+#endif
+        if (!converted)
+        {
+            if (inleft > outleft)
+                inleft = outleft;
+            *len = inleft;
+            memcpy (out, inbuf, *len);
+        }
+        out[*len] = 0;
+    }
+    return no_max;
 }
 
 
@@ -679,7 +731,6 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset)
        do
        {
            kno++;
-            yaz_log (LOG_LOG, "%d:%d", key.sysno, key.seqno);
            if (key.sysno != psysno)
            {
                score = (*rc->calc) (handle, psysno);