Read works. Forward missing (but safe to commit, as not used from anywhere)
[idzebra-moved-to-github.git] / data1 / d1_absyn.c
index a913e4b..83d44ae 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: d1_absyn.c,v 1.10 2004-08-04 08:35:22 adam Exp $
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+/* $Id: d1_absyn.c,v 1.12 2004-09-28 10:15:02 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
    Index Data Aps
 
 This file is part of the Zebra server.
@@ -27,11 +27,15 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include <yaz/oid.h>
 #include <yaz/log.h>
-#include <data1.h>
+#include <idzebra/data1.h>
 #include <zebra_xpath.h>
+#include <d1_absyn.h>
 
 #define D1_MAX_NESTING  128
 
+#if PRIVATE_DATA1_ABSYN
+#endif
+
 struct data1_systag {
     char *name;
     char *value;
@@ -362,28 +366,57 @@ const char * mk_xpath_regexp (data1_handle dh, char *expr)
    pop, 2002-12-13
  */
 static int parse_termlists (data1_handle dh, data1_termlist ***tpp,
-                           char *p, const char *file, int lineno,
+                           char *cp, const char *file, int lineno,
                            const char *element_name, data1_absyn *res,
                            int xpelement)
 {
     data1_termlist **tp = *tpp;
-    do
+    while(1)
     {
        char attname[512], structure[512];
        char *source;
-       int r;
-       
-       if (!(r = sscanf(p, "%511[^:,]:%511[^,]", attname,
-                        structure)))
+       int r, i;
+       int level = 0;
+       structure[0] = '\0';
+       for (i = 0; cp[i] && i<sizeof(attname)-1; i++)
+           if (strchr(":,", cp[i]))
+               break;
+           else
+               attname[i] = cp[i];
+       if (i == 0)
        {
-           yaz_log(LOG_WARN,
-                   "%s:%d: Syntax error in termlistspec '%s'",
-                   file, lineno, p);
-           return -1;
+           if (*cp)
+               yaz_log(LOG_WARN,
+                       "%s:%d: Syntax error in termlistspec '%s'",
+                       file, lineno, cp);
+           break;
        }
+       attname[i] = '\0';
+       r = 1;
+       cp += i;
+       if (*cp == ':')
+           cp++;
+
+       for (i = 0; cp[i] && i<sizeof(structure)-1; i++)
+           if (level == 0 && strchr(",", cp[i]))
+               break;
+           else
+           {
+               structure[i] = cp[i];
+               if (cp[i] == '(')
+                   level++;
+               else if (cp[i] == ')')
+                   level--;
+           }
+       structure[i] = '\0';
+       if (i)
+           r = 2;
+       cp += i;
+       if (*cp)
+           cp++;  /* skip , */
 
        *tp = (data1_termlist *)
-         nmem_malloc(data1_nmem_get(dh), sizeof(**tp));
+           nmem_malloc(data1_nmem_get(dh), sizeof(**tp));
        (*tp)->next = 0;
         
        if (!xpelement) {
@@ -416,7 +449,7 @@ static int parse_termlists (data1_handle dh, data1_termlist ***tpp,
                nmem_strdup (data1_nmem_get (dh), structure);
        tp = &(*tp)->next;
     }
-    while ((p = strchr(p, ',')) && *(++p));
+
     *tpp = tp;
     return 0;
 }
@@ -472,6 +505,16 @@ int read_absyn_line(FILE *f, int *lineno, char *line, int len,
     return argc;
 }
 
+data1_marctab *data1_absyn_getmarctab(data1_handle dh, data1_absyn *absyn)
+{
+    return absyn->marc;
+}
+
+YAZ_EXPORT data1_element *data1_absyn_getelements(data1_handle dh,
+                                                 data1_absyn *absyn)
+{
+    return absyn->main_elements;
+}
 
 data1_absyn *data1_read_absyn (data1_handle dh, const char *file,
                                int file_must_exist)