source: trunk/gsdl/packages/yaz/retrieval/d1_sutrs.c@ 1343

Last change on this file since 1343 was 1343, checked in by johnmcp, 24 years ago

Added the YAZ toolkit source to the packages directory (for z39.50 stuff)

  • Property svn:keywords set to Author Date Id Revision
File size: 3.5 KB
Line 
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
36static int wordlen(char *b)
37{
38 int l = 0;
39
40 while (*b && !d1_isspace(*b))
41 l++, b++;
42 return l;
43}
44
45static 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
145char *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}
Note: See TracBrowser for help on using the repository browser.