Put local variables footer in all c, h files.
[idzebra-moved-to-github.git] / data1 / d1_absyn.c
index e380610..1df3e3f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: d1_absyn.c,v 1.19 2005-01-15 19:38:18 adam Exp $
+/* $Id: d1_absyn.c,v 1.24 2006-05-10 08:13:17 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -439,65 +439,74 @@ void fix_element_ref (data1_handle dh, data1_absyn *absyn, data1_element *e)
 
  */
 
-const char * mk_xpath_regexp (data1_handle dh, char *expr) 
+static const char * mk_xpath_regexp (data1_handle dh, const char *expr) 
 {
-    char *p = expr;
-    char *pp;
-    char *s;
+    const char *p = expr;
     int abs = 1;
-    int i;
-    int j;
-    int e=0;
-    int is_predicate = 0;
-    
-    static char *stack[32];
-    static char res[1024];
-    char *r = "";
+    int e = 0;
+    char *stack[32];
+    char *res_p, *res = 0;
+    size_t res_size = 1;
     
-    if (*p != '/') { return (""); }
+    if (*p != '/')
+       return ("");
     p++;
-    if (*p == '/') { abs=0; p++; }
-    
-    while (*p) {
-        i=0;
-        while (*p && !strchr("/",*p)) { 
-         i++; p++; 
-       }
-        stack[e] = (char *) nmem_malloc (data1_nmem_get (dh), i+1);
+    if (*p == '/') 
+    { 
+       abs =0;
+       p++;
+    }
+    while (*p)
+    {
+       int is_predicate = 0;
+       char *s;
+       int i, j;
+        for (i = 0; *p && !strchr("/",*p); i++, p++)
+           ;
+       res_size += (i+3); /* we'll add / between later .. */
+        stack[e] = (char *) nmem_malloc(data1_nmem_get(dh), i+1);
        s = stack[e];
-       for (j=0; j< i; j++) {
-         pp = p-i+j;
-         if (*pp == '[') {
-           is_predicate=1;
-         }
-         else if (*pp == ']') {
-           is_predicate=0;
-         }
-         else {
-           if (!is_predicate) {
-             if (*pp == '*') 
-                *s++ = '.';
-             *s++ = *pp;
+       for (j = 0; j < i; j++)
+       {
+           const char *pp = p-i+j;
+           if (*pp == '[')
+               is_predicate=1;
+           else if (*pp == ']')
+               is_predicate=0;
+           else 
+           {
+               if (!is_predicate) {
+                   if (*pp == '*') 
+                       *s++ = '.';
+                   *s++ = *pp;
+               }
            }
-         }
        }
        *s = 0;
         e++;
-        if (*p) {p++;}
+        if (*p)
+           p++;
     }
-    e--;  p = &res[0]; i=0;
-    sprintf (p, "^"); p++;
-    while (e >= 0) {
-        /* !!! res size is not checked !!! */
-        sprintf (p, "%s/",stack[e]);
-        p += strlen(stack[e]) + 1;
-        e--;
+    res_p = res = nmem_malloc(data1_nmem_get(dh), res_size + 10);
+
+    if (stack[e-1][0] == '@')  /* path/@attr spec (leaf is attribute) */
+       strcpy(res_p, "/");
+    else
+       strcpy(res_p, "[^@]*/");  /* path .. (index all cdata below it) */
+    res_p = res_p + strlen(res_p);
+    while (--e >= 0) {
+       sprintf(res_p, "%s/", stack[e]);
+       res_p += strlen(stack[e]) + 1;
     }
-    if (!abs) { sprintf (p, ".*"); p+=2; }
-    sprintf (p, "$"); p++;
-    r = nmem_strdup (data1_nmem_get (dh), res);
-    yaz_log(YLOG_DEBUG,"Got regexp: %s",r);
-    return (r);
+    if (!abs)
+    {
+       sprintf(res_p, ".*"); 
+       res_p += 2;
+    }
+    sprintf (res_p, "$");
+    res_p++;
+    yaz_log(YLOG_DEBUG, "Got regexp: %s", res);
+    return res;
 }
 
 /* *ostrich*
@@ -561,12 +570,17 @@ static int parse_termlists (data1_handle dh, data1_termlist ***tpp,
            nmem_malloc(data1_nmem_get(dh), sizeof(**tp));
        (*tp)->next = 0;
         
+#if NATTR
+       (*tp)->index_name = nmem_strdup(data1_nmem_get(dh), element_name);
+       if (*attname == '!' && xpelement)
+           (*tp)->index_name = 0;
+#else
        if (!xpelement) {
             if (*attname == '!')
                 strcpy(attname, element_name);
        }
-       if (!((*tp)->att = data1_getattbyname(dh, res->attset,
-                                              attname))) {
+       if (!((*tp)->att = data1_getattbyname(dh, res->attset, attname))) 
+       {
             if ((!xpelement) || (*attname != '!')) {
                 yaz_log(YLOG_WARN,
                         "%s:%d: Couldn't find att '%s' in attset",
@@ -576,7 +590,7 @@ static int parse_termlists (data1_handle dh, data1_termlist ***tpp,
                 (*tp)->att = 0;
             }
        }
-        
+#endif   
        if (r == 2 && (source = strchr(structure, ':')))
            *source++ = '\0';   /* cut off structure .. */
        else
@@ -1037,6 +1051,9 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file,
        }
        else if (!strcmp(cmd, "attset"))
        {
+#if NATTR
+           yaz_log(YLOG_WARN, "%s:%d: attset obsolete", file, lineno);
+#else
            char *name;
            data1_attset *attset;
            
@@ -1058,6 +1075,7 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file,
            (*attset_childp)->child = attset;
            (*attset_childp)->next = 0;
            attset_childp = &(*attset_childp)->next;
+#endif
        }
        else if (!strcmp(cmd, "tagset"))
        {
@@ -1209,3 +1227,11 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file,
     yaz_log(YLOG_DEBUG, "%s: data1_read_absyn end", file);
     return res;
 }
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+