Added const to some char pointer arguments.
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 27 Feb 1998 14:08:04 +0000 (14:08 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 27 Feb 1998 14:08:04 +0000 (14:08 +0000)
Reworked data1_read_node so that it doesn't create a tree with
pointers to original "SGML"-buffer.

CHANGELOG
include/data1.h
retrieval/d1_absyn.c
retrieval/d1_read.c

index 259eb2b..d6e9fee 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,19 @@
 Possible compatibility problems with earlier versions marked with '*'.
 
 Possible compatibility problems with earlier versions marked with '*'.
 
+* Added 'const' to some of the char pointer arguments for the
+functions, data1_read_node, data1_getelementbytagname,
+data1_insert_taggeddata, data1_getesetbyname, data1_getelementbyname,
+data1_get_absyn.
+
+Fixed bug in data1_insert_taggeddata - the last_child member of
+parent wasn't initialised.
+
+* Changed data1_read_record and data1_read_node so that the supplied
+"SGML"-buffer is read-only. In particular the resulting data1 - tree
+doesn't refer to any parts of the "SGML"-buffer.
+
+Fixed bug in server library (Windows version of statserv_remove).
+
 * Changed code so that it compiles as C++. The type definition
 of Odr_fun which is a member of Odr_arm was changed. The result is,
 that an explicit typecast is needed for the fun pointer when
 * Changed code so that it compiles as C++. The type definition
 of Odr_fun which is a member of Odr_arm was changed. The result is,
 that an explicit typecast is needed for the fun pointer when
index 4178b55..f001246 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 1995-1997, Index Data.
+ * Copyright (c) 1995-1998, Index Data.
  *
  * Permission to use, copy, modify, distribute, and sell this software and
  * its documentation, in whole or in part, for any purpose, is hereby granted,
  *
  * Permission to use, copy, modify, distribute, and sell this software and
  * its documentation, in whole or in part, for any purpose, is hereby granted,
  * OF THIS SOFTWARE.
  *
  * $Log: data1.h,v $
  * OF THIS SOFTWARE.
  *
  * $Log: data1.h,v $
- * Revision 1.33  1997-12-18 10:51:30  adam
+ * Revision 1.34  1998-02-27 14:08:04  adam
+ * Added const to some char pointer arguments.
+ * Reworked data1_read_node so that it doesn't create a tree with
+ * pointers to original "SGML"-buffer.
+ *
+ * Revision 1.33  1997/12/18 10:51:30  adam
  * Implemented sub-trees feature for schemas - including forward
  * references.
  *
  * Implemented sub-trees feature for schemas - including forward
  * references.
  *
@@ -420,7 +425,7 @@ typedef struct data1_node
 YAZ_EXPORT data1_handle data1_create (void);
 YAZ_EXPORT void data1_destroy(data1_handle dh);
 YAZ_EXPORT data1_node *get_parent_tag(data1_handle dh, data1_node *n);
 YAZ_EXPORT data1_handle data1_create (void);
 YAZ_EXPORT void data1_destroy(data1_handle dh);
 YAZ_EXPORT data1_node *get_parent_tag(data1_handle dh, data1_node *n);
-YAZ_EXPORT data1_node *data1_read_node(data1_handle dh, char **buf,
+YAZ_EXPORT data1_node *data1_read_node(data1_handle dh, const char **buf,
                                       data1_node *parent,
                                       int *line, data1_absyn *absyn, NMEM m);
 YAZ_EXPORT data1_node *data1_read_record(data1_handle dh, 
                                       data1_node *parent,
                                       int *line, data1_absyn *absyn, NMEM m);
 YAZ_EXPORT data1_node *data1_read_record(data1_handle dh, 
@@ -433,7 +438,7 @@ YAZ_EXPORT data1_tagset *data1_read_tagset(data1_handle dh, char *file);
 YAZ_EXPORT data1_element *data1_getelementbytagname(data1_handle dh, 
                                                    data1_absyn *abs,
                                                    data1_element *parent,
 YAZ_EXPORT data1_element *data1_getelementbytagname(data1_handle dh, 
                                                    data1_absyn *abs,
                                                    data1_element *parent,
-                                                   char *tagname);
+                                                   const char *tagname);
 YAZ_EXPORT Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n,
                                           int select, ODR o,
                                           int *len);
 YAZ_EXPORT Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n,
                                           int select, ODR o,
                                           int *len);
@@ -445,7 +450,10 @@ YAZ_EXPORT char *data1_nodetobuf(data1_handle dh, data1_node *n,
 YAZ_EXPORT data1_node *data1_insert_taggeddata(data1_handle dh,
                                               data1_node *root,
                                               data1_node *at,
 YAZ_EXPORT data1_node *data1_insert_taggeddata(data1_handle dh,
                                               data1_node *root,
                                               data1_node *at,
-                                              char *tagname, NMEM m);
+                                              const char *tagname, NMEM m);
+YAZ_EXPORT data1_node *data1_add_taggeddata(data1_handle dh, data1_node *root,
+                                           data1_node *at,
+                                           const char *tagname, NMEM m);
 YAZ_EXPORT data1_datatype data1_maptype(data1_handle dh, char *t);
 YAZ_EXPORT data1_varset *data1_read_varset(data1_handle dh, const char *file);
 YAZ_EXPORT data1_vartype *data1_getvartypebyct(data1_handle dh,
 YAZ_EXPORT data1_datatype data1_maptype(data1_handle dh, char *t);
 YAZ_EXPORT data1_varset *data1_read_varset(data1_handle dh, const char *file);
 YAZ_EXPORT data1_vartype *data1_getvartypebyct(data1_handle dh,
@@ -454,12 +462,13 @@ YAZ_EXPORT data1_vartype *data1_getvartypebyct(data1_handle dh,
 YAZ_EXPORT Z_Espec1 *data1_read_espec1(data1_handle dh, const char *file);
 YAZ_EXPORT int data1_doespec1(data1_handle dh, data1_node *n, Z_Espec1 *e);
 YAZ_EXPORT data1_esetname *data1_getesetbyname(data1_handle dh, 
 YAZ_EXPORT Z_Espec1 *data1_read_espec1(data1_handle dh, const char *file);
 YAZ_EXPORT int data1_doespec1(data1_handle dh, data1_node *n, Z_Espec1 *e);
 YAZ_EXPORT data1_esetname *data1_getesetbyname(data1_handle dh, 
-                                              data1_absyn *a, char *name);
+                                              data1_absyn *a,
+                                              const char *name);
 YAZ_EXPORT data1_element *data1_getelementbyname(data1_handle dh,
                                                 data1_absyn *absyn,
 YAZ_EXPORT data1_element *data1_getelementbyname(data1_handle dh,
                                                 data1_absyn *absyn,
-                                                char *name);
+                                                const char *name);
 YAZ_EXPORT data1_node *data1_mk_node(data1_handle dh, NMEM m);
 YAZ_EXPORT data1_node *data1_mk_node(data1_handle dh, NMEM m);
-YAZ_EXPORT data1_absyn *data1_get_absyn(data1_handle dh, char *name);
+YAZ_EXPORT data1_absyn *data1_get_absyn(data1_handle dh, const char *name);
 YAZ_EXPORT data1_maptab *data1_read_maptab(data1_handle dh, const char *file);
 YAZ_EXPORT data1_node *data1_map_record(data1_handle dh, data1_node *n,
                                        data1_maptab *map, NMEM m);
 YAZ_EXPORT data1_maptab *data1_read_maptab(data1_handle dh, const char *file);
 YAZ_EXPORT data1_node *data1_map_record(data1_handle dh, data1_node *n,
                                        data1_maptab *map, NMEM m);
@@ -486,7 +495,10 @@ YAZ_EXPORT char **data1_get_map_buf (data1_handle dp, int **lenp);
 YAZ_EXPORT data1_absyn_cache *data1_absyn_cache_get (data1_handle dh);
 YAZ_EXPORT NMEM data1_nmem_get (data1_handle dh);
 YAZ_EXPORT void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out);
 YAZ_EXPORT data1_absyn_cache *data1_absyn_cache_get (data1_handle dh);
 YAZ_EXPORT NMEM data1_nmem_get (data1_handle dh);
 YAZ_EXPORT void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out);
-
+YAZ_EXPORT char *data1_insert_string (data1_handle dh, data1_node *res,
+                                     NMEM m, const char *str);
+YAZ_EXPORT data1_node *data1_read_sgml (data1_handle dh, NMEM m,
+                                       const char *buf);
 #ifdef __cplusplus
 }
 #endif
 #ifdef __cplusplus
 }
 #endif
index 006bb58..a06ecdc 100644 (file)
@@ -1,10 +1,15 @@
 /*
 /*
- * Copyright (c) 1995-1997, Index Data.
+ * Copyright (c) 1995-1998, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: d1_absyn.c,v $
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: d1_absyn.c,v $
- * Revision 1.17  1998-02-11 11:53:34  adam
+ * Revision 1.18  1998-02-27 14:08:04  adam
+ * Added const to some char pointer arguments.
+ * Reworked data1_read_node so that it doesn't create a tree with
+ * pointers to original "SGML"-buffer.
+ *
+ * Revision 1.17  1998/02/11 11:53:34  adam
  * Changed code so that it compiles as C++.
  *
  * Revision 1.16  1997/12/18 10:51:30  adam
  * Changed code so that it compiles as C++.
  *
  * Revision 1.16  1997/12/18 10:51:30  adam
@@ -114,7 +119,7 @@ data1_absyn *data1_absyn_add (data1_handle dh, const char *name)
     return p->absyn;
 }
 
     return p->absyn;
 }
 
-data1_absyn *data1_get_absyn (data1_handle dh, char *name)
+data1_absyn *data1_get_absyn (data1_handle dh, const char *name)
 {
     data1_absyn *absyn;
 
 {
     data1_absyn *absyn;
 
@@ -124,7 +129,7 @@ data1_absyn *data1_get_absyn (data1_handle dh, char *name)
 }
 
 data1_esetname *data1_getesetbyname(data1_handle dh, data1_absyn *a,
 }
 
 data1_esetname *data1_getesetbyname(data1_handle dh, data1_absyn *a,
-                                   char *name)
+                                   const char *name)
 {
     data1_esetname *r;
 
 {
     data1_esetname *r;
 
@@ -136,7 +141,7 @@ data1_esetname *data1_getesetbyname(data1_handle dh, data1_absyn *a,
 
 data1_element *data1_getelementbytagname (data1_handle dh, data1_absyn *abs,
                                          data1_element *parent,
 
 data1_element *data1_getelementbytagname (data1_handle dh, data1_absyn *abs,
                                          data1_element *parent,
-                                         char *tagname)
+                                         const char *tagname)
 {
     data1_element *r;
 
 {
     data1_element *r;
 
@@ -157,7 +162,7 @@ data1_element *data1_getelementbytagname (data1_handle dh, data1_absyn *abs,
 }
 
 data1_element *data1_getelementbyname (data1_handle dh, data1_absyn *absyn,
 }
 
 data1_element *data1_getelementbyname (data1_handle dh, data1_absyn *absyn,
-                                      char *name)
+                                      const char *name)
 {
     data1_element *r;
     assert (absyn->main_elements);
 {
     data1_element *r;
     assert (absyn->main_elements);
index fa2c3f9..2239279 100644 (file)
@@ -1,10 +1,15 @@
 /*
 /*
- * Copyright (c) 1995-1997, Index Data.
+ * Copyright (c) 1995-1998, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: d1_read.c,v $
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: d1_read.c,v $
- * Revision 1.20  1998-02-11 11:53:35  adam
+ * Revision 1.21  1998-02-27 14:08:05  adam
+ * Added const to some char pointer arguments.
+ * Reworked data1_read_node so that it doesn't create a tree with
+ * pointers to original "SGML"-buffer.
+ *
+ * Revision 1.20  1998/02/11 11:53:35  adam
  * Changed code so that it compiles as C++.
  *
  * Revision 1.19  1997/12/09 16:17:09  adam
  * Changed code so that it compiles as C++.
  *
  * Revision 1.19  1997/12/09 16:17:09  adam
@@ -167,7 +172,7 @@ char *data1_insert_string (data1_handle dh, data1_node *res,
 {
     int len = strlen(str);
 
 {
     int len = strlen(str);
 
-    if (len > DATA1_LOCALDATA-1)
+    if (len >= DATA1_LOCALDATA)
         return nmem_strdup (m, str);
     else
     {
         return nmem_strdup (m, str);
     else
     {
@@ -176,44 +181,82 @@ char *data1_insert_string (data1_handle dh, data1_node *res,
     }
 }
 
     }
 }
 
-/*
- * Insert a tagged node into the record root as first child of the node at
- * which should be root or tag itself). Returns pointer to the data node,
- * which can then be modified.
- */
-data1_node *data1_insert_taggeddata(data1_handle dh, data1_node *root,
-                                   data1_node *at,
-                                   char *tagname, NMEM m)
+
+data1_node *data1_add_insert_taggeddata(data1_handle dh, data1_node *root,
+                                       data1_node *at,
+                                       const char *tagname, NMEM m,
+                                       int first_flag)
 {
 {
+    data1_node *partag = get_parent_tag (dh, at);
     data1_node *tagn = data1_mk_node (dh, m);
     data1_node *tagn = data1_mk_node (dh, m);
+    data1_element *e = NULL;
     data1_node *datn;
 
     tagn->which = DATA1N_tag;
     tagn->line = -1;
     data1_node *datn;
 
     tagn->which = DATA1N_tag;
     tagn->line = -1;
-    tagn->u.tag.tag = 0;
+    tagn->u.tag.tag = data1_insert_string (dh, tagn, m, tagname);
     tagn->u.tag.node_selected = 0;
     tagn->u.tag.make_variantlist = 0;
     tagn->u.tag.no_data_requested = 0;
     tagn->u.tag.get_bytes = -1;
     tagn->u.tag.node_selected = 0;
     tagn->u.tag.make_variantlist = 0;
     tagn->u.tag.no_data_requested = 0;
     tagn->u.tag.get_bytes = -1;
-    if (!(tagn->u.tag.element =
-          data1_getelementbytagname (dh, root->u.root.absyn, 0, tagname)))
-       return 0;
-    tagn->child = datn = data1_mk_node (dh, m);
+
+    if (partag)
+       e = partag->u.tag.element;
+    tagn->u.tag.element =
+       data1_getelementbytagname (dh, root->u.root.absyn, e, tagname);
+    tagn->last_child = tagn->child = datn = data1_mk_node (dh, m);
     datn->parent = tagn;
     datn->root = root;
     datn->which = DATA1N_data;
     datn->u.data.formatted_text = 0;
     datn->parent = tagn;
     datn->root = root;
     datn->which = DATA1N_data;
     datn->u.data.formatted_text = 0;
-    tagn->next = at->child;
     tagn->parent = at;
     tagn->parent = at;
-    at->child = tagn;
+
+    if (first_flag)
+    {
+       tagn->next = at->child;
+       if (!tagn->next)
+           at->last_child = tagn;
+       at->child = tagn;
+    }
+    else
+    {
+       if (!at->child)
+           at->child = tagn;
+       else
+       {
+           assert (at->last_child);
+           at->last_child->next = tagn;
+       }
+       at->last_child = tagn;
+    }
     return datn;
 }
 
     return datn;
 }
 
+data1_node *data1_add_taggeddata(data1_handle dh, data1_node *root,
+                                data1_node *at,
+                                const char *tagname, NMEM m)
+{
+    return data1_add_insert_taggeddata (dh, root, at, tagname, m, 0);
+}
+
+
+/*
+ * Insert a tagged node into the record root as first child of the node at
+ * which should be root or tag itself). Returns pointer to the data node,
+ * which can then be modified.
+ */
+data1_node *data1_insert_taggeddata(data1_handle dh, data1_node *root,
+                                   data1_node *at,
+                                   const char *tagname, NMEM m)
+{
+    return data1_add_insert_taggeddata (dh, root, at, tagname, m, 1);
+}
+
 /*
  * Ugh. Sometimes functions just grow and grow on you. This one reads a
  * 'node' and its children.
  */
 /*
  * Ugh. Sometimes functions just grow and grow on you. This one reads a
  * 'node' and its children.
  */
-data1_node *data1_read_node (data1_handle dh, char **buf,
+data1_node *data1_read_node (data1_handle dh, const char **buf,
                             data1_node *parent, int *line,
                             data1_absyn *absyn, NMEM m)
 {
                             data1_node *parent, int *line,
                             data1_absyn *absyn, NMEM m)
 {
@@ -233,7 +276,7 @@ data1_node *data1_read_node (data1_handle dh, char **buf,
        char tag[64];
        char args[256];
        int i;
        char tag[64];
        char args[256];
        int i;
-       char *t = (*buf) + 1;
+       const char *t = (*buf) + 1;
        data1_node **pp;
        data1_element *elem = 0;
        
        data1_node **pp;
        data1_element *elem = 0;
        
@@ -369,39 +412,53 @@ data1_node *data1_read_node (data1_handle dh, char **buf,
     }
     else /* != '<'... this is a body of text */
     {
     }
     else /* != '<'... this is a body of text */
     {
-       int len = 0;
-       char *data = *buf, *pp = *buf;
+       const char *src;
+       char *dst;
+       int len, prev_char = 0;
 
 
-        if (!parent)      /* abort if abstract syntax is undefined */
-            return 0;
+       if (!parent)
+           return 0;
 
 
-       /* Determine length and remove newlines/extra blanks */
-       while (**buf && **buf != '<')
-       {
-           if (**buf == '\n')
-               (*line)++;
-           if (isspace(**buf))
-           {
-               *(pp++) = ' ';
-               (*buf)++;
-               while (isspace(**buf))
-                   (*buf)++;
-           }
-           else
-               *(pp++) = *((*buf)++);
-           len++;
-       }
-       while (isspace(data[len-1]))
-           len--;
        res = data1_mk_node(dh, m);
        res->parent = parent;
        res->which = DATA1N_data;
        res->u.data.what = DATA1I_text;
        res = data1_mk_node(dh, m);
        res->parent = parent;
        res->which = DATA1N_data;
        res->u.data.what = DATA1I_text;
-       assert (len >= 0);
-       res->u.data.len = len;
-       res->u.data.data = data;
        res->u.data.formatted_text = 0;
        res->root = parent->root;
        res->u.data.formatted_text = 0;
        res->root = parent->root;
+
+       /* determine length of "data" */
+       src = strchr (*buf, '<');
+       if (src)
+           len = src - *buf;
+       else
+           len = strlen (*buf);
+
+       /* use local buffer of nmem if too large */
+       if (len >= DATA1_LOCALDATA)
+           res->u.data.data = nmem_malloc (m, len);
+       else
+           res->u.data.data = res->lbuf;
+
+       /* read "data" and transfer while removing white space */
+       dst = res->u.data.data;
+       for (src = *buf; --len >= 0; src++)
+       {
+           if (*src == '\n')
+               (*line)++;
+           if (isspace (*src))
+               prev_char = ' ';
+           else
+           {
+               if (prev_char)
+               {
+                   *dst++ = prev_char;
+                   prev_char = 0;
+               }
+               *dst++ = *src;
+           }
+       }
+       *buf = src;
+       res->u.data.len = dst - res->u.data.data;
     }
     return res;
 }
     }
     return res;
 }
@@ -415,7 +472,7 @@ data1_node *data1_read_record(data1_handle dh,
 {
     int *size;
     char **buf = data1_get_read_buf (dh, &size);
 {
     int *size;
     char **buf = data1_get_read_buf (dh, &size);
-    char *bp;
+    const char *bp;
     int rd = 0, res;
     int line = 0;
     
     int rd = 0, res;
     int line = 0;
     
@@ -439,3 +496,10 @@ data1_node *data1_read_record(data1_handle dh,
        rd += res;
     }
 }
        rd += res;
     }
 }
+
+data1_node *data1_read_sgml (data1_handle dh, NMEM m, const char *buf)
+{
+    const char *bp = buf;
+    int line = 0;
+    return data1_read_node (dh, &bp, 0, &line, 0, m);
+}