Indicator field moved to 'struct iso2709_dir' from 'struct
[egate.git] / util / iso2709.c
index 62cb8fe..927df07 100644 (file)
@@ -4,9 +4,14 @@
    Europagate, 1994-1995.
 
    $Log: iso2709.c,v $
-   Revision 1.1  1995/02/09 17:27:10  adam
-   Initial revision
-
+   Revision 1.2  1995/02/10 16:50:32  adam
+   Indicator field moved to 'struct iso2709_dir' from 'struct
+   iso2709_field'.
+   Function iso2709_rm implemented - to delete a MARC record.
+
+ * Revision 1.1.1.1  1995/02/09  17:27:11  adam
+ * Initial version of email gateway under CVS control.
+ *
  */
 
 #include <stdlib.h>
@@ -78,6 +83,7 @@ Iso2709Rec iso2709_cvt (const char *buf)
     if (!(p = malloc (sizeof(*p))))
         return NULL;
 
+    /* deal with record label (24 characters) */
     p->record_length = atoin (buf, 5);
     strncpyx (p->record_status, buf+5, 1);
     strncpyx (p->implementation_codes, buf+6, 4);
@@ -91,8 +97,8 @@ Iso2709Rec iso2709_cvt (const char *buf)
     p->length_implementation = atoin (buf+22, 1);
     strncpyx (p->future_use, buf+23, 1);
 
+    /* deal with directory */
     dpp = &p->directory;
-
     *dpp = NULL;
     while (buf[pos] != ISO2709_FS)
     {
@@ -108,6 +114,7 @@ Iso2709Rec iso2709_cvt (const char *buf)
         dpp = &(*dpp)->next;
     }
     pos++;
+    /* deal with datafields */
 #if 0
     fprintf (stderr, "indicator_len=%d, identifier_len=%d\n", 
              p->indicator_length, p->identifier_length);
@@ -117,7 +124,6 @@ Iso2709Rec iso2709_cvt (const char *buf)
         int tag00;
         struct iso2709_field **fpp;
         int dpos = pos+dp->offset;
-        char *save_indicator = NULL;
 
         fpp = &dp->fields;
 
@@ -125,18 +131,20 @@ Iso2709Rec iso2709_cvt (const char *buf)
         (*fpp)->next = NULL;
         if (p->indicator_length && memcmp (dp->tag, "00", 2))
         {
-            (*fpp)->indicator = malloc (p->indicator_length+1);
-            strncpyx ((*fpp)->indicator, buf+dpos, p->indicator_length);
+            dp->indicator = malloc (p->indicator_length+1);
+            strncpyx (dp->indicator, buf+dpos, p->indicator_length);
             dpos += p->indicator_length;
         }
         else
-            (*fpp)->indicator = NULL;
+            dp->indicator = NULL;
 
         if (memcmp (dp->tag, "00", 2))
             tag00 = 0;
         else
             tag00 = 1;
         fprintf (stderr, "%s", dp->tag);
+        if (dp->indicator)
+            fprintf (stderr, " %s", dp->indicator);
         while (1)
         {
             int dpos_n;
@@ -158,21 +166,38 @@ Iso2709Rec iso2709_cvt (const char *buf)
             strncpyx ((*fpp)->data, buf+dpos, dpos_n - dpos);
             dpos = dpos_n;
             
-            if (!save_indicator && (*fpp)->indicator)
-                fprintf (stderr, " %s", (*fpp)->indicator);
             if ((*fpp)->identifier)
                 fprintf (stderr, " *%s", (*fpp)->identifier);
             fprintf (stderr, " %s", (*fpp)->data);
             if (buf[dpos] == ISO2709_FS)
                 break;
             
-            save_indicator = (*fpp)->indicator;
             fpp = &(*fpp)->next;
             *fpp = malloc (sizeof(**fpp));
             (*fpp)->next = NULL;
-            (*fpp)->indicator = save_indicator;
         }
         fprintf (stderr, "\n");
     }
     return p;
 }
+
+void iso2709_rm (Iso2709Rec rec)
+{
+    struct iso2709_dir *dir, *dir1;
+
+    for (dir = rec->directory; dir; dir = dir1)
+    {
+        struct iso2709_field *field, *field1;
+
+        for (field = dir->fields; field; field = field1)
+        {
+            free (field->identifier);
+            free (field->data);
+            field1 = field->next;
+            free (field);
+        }
+        free (dir->indicator);
+        dir1 = dir->next;
+        free (dir);
+    }
+}