1 | /*
|
---|
2 | * Copyright (c) 1995-1997, Index Data.
|
---|
3 | * See the file LICENSE for details.
|
---|
4 | * Sebastian Hammer, Adam Dickmeiss
|
---|
5 | *
|
---|
6 | * $Log$
|
---|
7 | * Revision 1.1 2000/08/03 03:11:37 johnmcp
|
---|
8 | * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
|
---|
9 | *
|
---|
10 | * Revision 1.6 1999/11/30 13:47:12 adam
|
---|
11 | * Improved installation. Moved header files to include/yaz.
|
---|
12 | *
|
---|
13 | * Revision 1.5 1999/10/21 12:06:29 adam
|
---|
14 | * Retrieval module no longer uses ctype.h - functions.
|
---|
15 | *
|
---|
16 | * Revision 1.4 1997/09/17 12:10:38 adam
|
---|
17 | * YAZ version 1.4.
|
---|
18 | *
|
---|
19 | * Revision 1.3 1995/12/15 16:57:11 quinn
|
---|
20 | * Added formatted-text.
|
---|
21 | *
|
---|
22 | * Revision 1.2 1995/11/01 13:54:49 quinn
|
---|
23 | * Minor adjustments
|
---|
24 | *
|
---|
25 | * Revision 1.1 1995/11/01 11:56:09 quinn
|
---|
26 | * Added Retrieval (data management) functions en masse.
|
---|
27 | *
|
---|
28 | *
|
---|
29 | */
|
---|
30 |
|
---|
31 | #include <yaz/data1.h>
|
---|
32 |
|
---|
33 | #define NTOBUF_INDENT 2
|
---|
34 | #define NTOBUF_MARGIN 75
|
---|
35 |
|
---|
36 | static int wordlen(char *b)
|
---|
37 | {
|
---|
38 | int l = 0;
|
---|
39 |
|
---|
40 | while (*b && !d1_isspace(*b))
|
---|
41 | l++, b++;
|
---|
42 | return l;
|
---|
43 | }
|
---|
44 |
|
---|
45 | static int nodetobuf(data1_node *n, int select, WRBUF b, int indent, int col)
|
---|
46 | {
|
---|
47 | data1_node *c;
|
---|
48 | char line[1024];
|
---|
49 |
|
---|
50 | for (c = n->child; c; c = c->next)
|
---|
51 | {
|
---|
52 | char *tag;
|
---|
53 |
|
---|
54 | if (c->which == DATA1N_tag)
|
---|
55 | {
|
---|
56 | if (select && !c->u.tag.node_selected)
|
---|
57 | continue;
|
---|
58 | if (c->u.tag.element && c->u.tag.element->tag)
|
---|
59 | tag = c->u.tag.element->tag->names->name; /* first name */
|
---|
60 | else
|
---|
61 | tag = c->u.tag.tag; /* local string tag */
|
---|
62 | if (data1_matchstr(tag, "wellknown")) /* skip wellknown */
|
---|
63 | {
|
---|
64 | if (col)
|
---|
65 | wrbuf_putc(b, '\n');
|
---|
66 | sprintf(line, "%*s%s:", indent * NTOBUF_INDENT, "", tag);
|
---|
67 | wrbuf_write(b, line, strlen(line));
|
---|
68 | col = strlen(line);
|
---|
69 | }
|
---|
70 | if (nodetobuf(c, select, b, indent+1, col) < 0)
|
---|
71 | return 0;
|
---|
72 | }
|
---|
73 | else if (c->which == DATA1N_data)
|
---|
74 | {
|
---|
75 | char *p = c->u.data.data;
|
---|
76 | int l = c->u.data.len;
|
---|
77 | int first = 0;
|
---|
78 |
|
---|
79 | if (c->u.data.what == DATA1I_text && c->u.data.formatted_text)
|
---|
80 | {
|
---|
81 | wrbuf_putc(b, '\n');
|
---|
82 | wrbuf_write(b, c->u.data.data, c->u.data.len);
|
---|
83 | sprintf(line, "%*s", indent * NTOBUF_INDENT, "");
|
---|
84 | wrbuf_write(b, line, strlen(line));
|
---|
85 | col = indent * NTOBUF_INDENT;
|
---|
86 | }
|
---|
87 | else if (c->u.data.what == DATA1I_text)
|
---|
88 | {
|
---|
89 | while (l)
|
---|
90 | {
|
---|
91 | int wlen;
|
---|
92 |
|
---|
93 | while (l && d1_isspace(*p))
|
---|
94 | p++, l--;
|
---|
95 | if (!l)
|
---|
96 | break;
|
---|
97 | /* break if we'll cross margin and word is not too long */
|
---|
98 | if (col + (wlen = wordlen(p)) > NTOBUF_MARGIN && wlen <
|
---|
99 | NTOBUF_MARGIN - indent * NTOBUF_INDENT)
|
---|
100 | {
|
---|
101 | sprintf(line, "\n%*s", indent * NTOBUF_INDENT, "");
|
---|
102 | wrbuf_write(b, line, strlen(line));
|
---|
103 | col = indent * NTOBUF_INDENT;
|
---|
104 | first = 1;
|
---|
105 | }
|
---|
106 | if (!first)
|
---|
107 | {
|
---|
108 | wrbuf_putc(b, ' ');
|
---|
109 | col++;
|
---|
110 | }
|
---|
111 | while (l && !d1_isspace(*p))
|
---|
112 | {
|
---|
113 | if (col > NTOBUF_MARGIN)
|
---|
114 | {
|
---|
115 | wrbuf_putc(b, '=');
|
---|
116 | wrbuf_putc(b, '\n');
|
---|
117 | sprintf(line, "%*s", indent * NTOBUF_INDENT, "");
|
---|
118 | wrbuf_write(b, line, strlen(line));
|
---|
119 | col = indent * NTOBUF_INDENT;
|
---|
120 | }
|
---|
121 | wrbuf_putc(b, *p);
|
---|
122 | p++;
|
---|
123 | l--;
|
---|
124 | col++;
|
---|
125 | }
|
---|
126 | first = 0;
|
---|
127 | }
|
---|
128 | }
|
---|
129 | else if (c->u.data.what == DATA1I_num)
|
---|
130 | {
|
---|
131 | wrbuf_putc(b, ' ');
|
---|
132 | wrbuf_write(b, c->u.data.data, c->u.data.len);
|
---|
133 | }
|
---|
134 | }
|
---|
135 | }
|
---|
136 | return 0;
|
---|
137 | }
|
---|
138 |
|
---|
139 | /*
|
---|
140 | * Return area containing SUTRS-formatted data. Ownership of this data
|
---|
141 | * remains in this module, and the buffer is reused on next call. This may
|
---|
142 | * need changing.
|
---|
143 | */
|
---|
144 |
|
---|
145 | char *data1_nodetobuf (data1_handle dh, data1_node *n, int select, int *len)
|
---|
146 | {
|
---|
147 | WRBUF b = data1_get_wrbuf (dh);
|
---|
148 |
|
---|
149 | wrbuf_rewind(b);
|
---|
150 | if (nodetobuf(n, select, b, 0, 0))
|
---|
151 | return 0;
|
---|
152 | wrbuf_putc(b, '\n');
|
---|
153 | *len = wrbuf_len(b);
|
---|
154 | return wrbuf_buf(b);
|
---|
155 | }
|
---|