Changed header.
[egate.git] / fml / fmlmarc.c
1 /*
2  * FML interpreter. Europagate, 1995
3  *
4  * $Log: fmlmarc.c,v $
5  * Revision 1.4  1995/02/23 08:32:05  adam
6  * Changed header.
7  *
8  * Revision 1.2  1995/02/10  16:52:08  adam
9  * Indicator field moved in MARC structure. The FML list representation
10  * of a MARC record has changed.
11  *
12  * Revision 1.1  1995/02/10  15:50:56  adam
13  * MARC interface implemented. Minor bugs fixed. fmltest can
14  * be used to format single MARC records. New function '\list'
15  * implemented.
16  *
17  */
18
19 #include <assert.h>
20 #include <stdlib.h>
21 #include <stdio.h>
22
23 #include <fmlmarc.h>
24 #include <iso2709p.h>
25
26 #include "fmlp.h"
27
28 #if 0
29 struct fml_node *marc_to_fml (Fml fml, Iso2709Rec rec)
30 {
31     struct fml_node *ptr_0 = NULL, *ptr_1;
32     struct iso2709_dir *dir;
33
34     for (dir = rec->directory; dir; dir=dir->next)
35     {
36         struct fml_node *ptr;
37
38         ptr = fml_node_alloc (fml);
39         if (ptr_0)
40             ptr_1->p[1] = ptr;
41         else
42             ptr_0 = ptr_1 = ptr;
43
44         ptr_1 = ptr;
45
46         if (dir->fields)
47         {
48             struct iso2709_field *fields = dir->fields;
49
50             ptr = fml_node_alloc (fml);
51             ptr->p[0] = fml_atom_alloc (fml, fields->data);
52             ptr->is_atom = 1;
53             
54             while ((fields = fields->next))
55             {
56                 ptr = ptr->p[0] = fml_node_alloc (fml);
57                 ptr->p[0] = fml_atom_alloc (fml, fields->data);
58                 ptr->is_atom = 1;
59             }
60         }
61     }
62     return ptr_0;
63 }
64 #endif
65
66 static void add_string (const char *str, char **buf, int *max, int *size)
67 {
68     if (*size + strlen(str) >= *max)
69     {
70         char *nbuf;
71         int nsize = *size + strlen(str) + 2048;
72
73         nbuf = malloc (nsize);
74         assert (nbuf);
75         if (*buf)
76             strcpy (nbuf, *buf);
77         else
78             *nbuf = '\0';
79         free (*buf);
80         *buf = nbuf;
81         *max = nsize;
82     }
83     strcpy (*buf + *size, str);
84     *size += strlen(str);
85 }
86
87 char *marc_to_str (Fml fml, Iso2709Rec rec)
88 {
89     struct iso2709_dir *dir;
90     static char *buf = NULL;
91     static int max = 0;
92     int size = 0;
93
94     add_string ("{", &buf, &max, &size);
95     for (dir = rec->directory; dir; dir=dir->next)
96     {
97         struct iso2709_field *fields;
98
99         add_string ("{\'", &buf, &max, &size);
100         add_string (dir->tag, &buf, &max, &size);
101         add_string ("\'",&buf, &max, &size);
102         if (dir->indicator)
103         {
104             add_string ("\'", &buf, &max, &size);
105             add_string (dir->indicator, &buf, &max, &size);
106             add_string ("\'", &buf, &max, &size);
107         }
108         else
109             add_string ("{}", &buf, &max, &size);
110         add_string ("{", &buf, &max, &size);
111         for (fields = dir->fields; fields; fields=fields->next)
112         {
113             add_string ("{", &buf, &max, &size);
114             if (fields->identifier)
115             {
116                 add_string ("\'", &buf, &max, &size);
117                 add_string (fields->identifier, &buf, &max, &size);
118                 add_string ("\'", &buf, &max, &size);
119             }
120             else
121                 add_string ("{}", &buf, &max, &size);
122             add_string (" \'", &buf, &max, &size);
123             add_string (fields->data, &buf, &max, &size);
124             add_string ("\'}", &buf, &max, &size);
125         }
126         add_string ("}}\n", &buf, &max, &size);
127     }
128     add_string ("}", &buf, &max, &size);
129     return buf;
130 }