2 * Copyright (c) 1995-2006, Index Data
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of Index Data nor the names of its contributors
13 * may be used to endorse or promote products derived from this
14 * software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 /* $Id: marcdisp.h,v 1.22 2006-12-15 12:37:17 adam Exp $ */
31 * \brief MARC conversion
37 #include <yaz/yconfig.h>
39 #include <yaz/wrbuf.h>
42 #include <yaz/xmltypes.h>
46 /** \brief a yaz_marc_t handle (private content) */
47 typedef struct yaz_marc_t_ *yaz_marc_t;
49 /** \brief construct yaz_marc_t handle */
50 YAZ_EXPORT yaz_marc_t yaz_marc_create(void);
52 /** \brief destroy yaz_marc_t handle */
53 YAZ_EXPORT void yaz_marc_destroy(yaz_marc_t mt);
55 /** \brief set XML mode YAZ_MARC_LINE, YAZ_MARC_SIMPLEXML, ... */
56 YAZ_EXPORT void yaz_marc_xml(yaz_marc_t mt, int xmlmode);
58 /** \brief Output format: Line-format */
59 #define YAZ_MARC_LINE 0
60 /** \brief Output format: simplexml (no longer supported) */
61 #define YAZ_MARC_SIMPLEXML 1
62 /** \brief Output format: OAI-MARC (no longer supported) */
63 #define YAZ_MARC_OAIMARC 2
64 /** \brief Output format: MARCXML */
65 #define YAZ_MARC_MARCXML 3
66 /** \brief Output format: ISO2709 */
67 #define YAZ_MARC_ISO2709 4
68 /** \brief Output format: MarcXchange */
69 #define YAZ_MARC_XCHANGE 5
70 /** \brief Output format: check only (no marc output) */
71 #define YAZ_MARC_CHECK 6
73 /** \brief supply iconv handle for character set conversion .. */
74 YAZ_EXPORT void yaz_marc_iconv(yaz_marc_t mt, yaz_iconv_t cd);
76 /** \brief set debug level
78 \param level level, where 0=lowest, 1 more debug, 2 even more
80 YAZ_EXPORT void yaz_marc_debug(yaz_marc_t mt, int level);
82 /** \brief decodes ISO2709 buffer using straight buffers
84 \param buf input buffer
85 \param bsize size of buffer or (-1 if "any size")
86 \param result result to be stored here (allocate before use!)
87 \param rsize size of result (set before calling)
89 Decodes MARC in buf of size bsize.
90 On success, result in *result with size *rsize.
91 Returns -1 on error, or size of input record (>0) if OK
93 YAZ_EXPORT int yaz_marc_decode_buf(yaz_marc_t mt, const char *buf, int bsize,
94 char **result, int *rsize);
96 /** \brief decodes ISO2709/MARC buffer and stores result in WRBUF
98 \param buf input buffer
99 \param bsize size of buffer (-1 if "any size")
100 \param wrbuf WRBUF for output
102 Decodes MARC in buf of size bsize.
103 On success, result in wrbuf
104 Returns -1 on error, or size of input record (>0) if OK
106 YAZ_EXPORT int yaz_marc_decode_wrbuf(yaz_marc_t mt, const char *buf,
107 int bsize, WRBUF wrbuf);
109 /** \brief depricated */
110 YAZ_EXPORT int marc_display(const char *buf, FILE *outf);
111 /** \brief depricated */
112 YAZ_EXPORT int marc_display_ex(const char *buf, FILE *outf, int debug);
113 /** \brief depricated */
114 YAZ_EXPORT int marc_display_exl(const char *buf, FILE *outf, int debug,
116 /** \brief depricated */
117 YAZ_EXPORT int marc_display_wrbuf(const char *buf, WRBUF wr, int debug,
119 /** \brief depricated */
120 YAZ_EXPORT int yaz_marc_decode(const char *buf, WRBUF wr,
121 int debug, int bsize, int xml);
123 YAZ_EXPORT void yaz_marc_subfield_str(yaz_marc_t mt, const char *s);
124 YAZ_EXPORT void yaz_marc_endline_str(yaz_marc_t mt, const char *s);
126 /** \brief modifies part of the MARC leader */
127 YAZ_EXPORT void yaz_marc_modify_leader(yaz_marc_t mt, size_t off,
130 /** \brief like atoi(3) except that it reads exactly len characters */
131 YAZ_EXPORT int atoi_n(const char *buf, int len);
133 /** \brief MARC control char: record separator (29 Dec, 1D Hex) */
134 #define ISO2709_RS 035
135 /** \brief MARC control char: field separator (30 Dec, 1E Hex) */
136 #define ISO2709_FS 036
137 /** \brief MARC control char: identifier-field separator (31 Dec, 1F Hex) */
138 #define ISO2709_IDFS 037
140 /** \brief read ISO2709/MARC record from buffer
142 \param buf ISO2709 buffer of size bsize
143 \param bsize size of buffer (-1 for unlimited size)
145 Parses ISO2709 record from supplied buffer
146 Returns > 0 for OK (same as length), -1=ERROR
148 YAZ_EXPORT int yaz_marc_read_iso2709(yaz_marc_t mt,
149 const char *buf, int bsize);
151 /** \brief read MARC lineformat from stream
153 \param getbyte get one byte handler
154 \param ungetbyte unget one byte handler
155 \param client_data opaque data for handers
157 Parses MARC line record from stream
158 Returns > 0 for OK (same as length), -1=ERROR
161 int yaz_marc_read_line(yaz_marc_t mt,
162 int (*getbyte)(void *client_data),
163 void (*ungetbyte)(int b, void *client_data),
166 /** \brief parses MARCXML/MarcXchange record from xmlNode pointer
168 \param ptr is a pointer to root xml node
170 Returns 0=OK, -1=ERROR
172 YAZ_EXPORT int yaz_marc_read_xml(yaz_marc_t mt, const xmlNode *ptr);
174 /** \brief writes record in line format
176 \param wrbuf WRBUF for output
178 Returns 0=OK, -1=ERROR
180 YAZ_EXPORT int yaz_marc_write_line(yaz_marc_t mt, WRBUF wrbuf);
182 /** \brief writes record in MARCXML format
184 \param wrbuf WRBUF for output
186 Sets leader[9]='a' . Returns 0=OK, -1=ERROR .
188 YAZ_EXPORT int yaz_marc_write_marcxml(yaz_marc_t mt, WRBUF wrbuf);
190 /** \brief writes record in MarcXchange XML
192 \param wrbuf WRBUF for output
193 \param format record format (e.g. "MARC21")
194 \param type record type (e.g. Bibliographic)
196 Returns 0=OK, -1=ERROR
198 YAZ_EXPORT int yaz_marc_write_marcxchange(yaz_marc_t mt, WRBUF wrbuf,
202 /** \brief writes record in ISO2709 format
204 \param wrbuf WRBUF for output
205 Returns 0=OK, -1=ERROR
207 YAZ_EXPORT int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wrbuf);
209 /** \brief writes record in mode - given by yaz_marc_xml mode
211 \param wrbuf WRBUF for output
212 This function calls yaz_marc_write_iso2709, yaz_marc_write_marcxml,
213 etc.. depending on mode given by yaz_marc_xml.
214 Returns 0=OK, -1=ERROR
216 YAZ_EXPORT int yaz_marc_write_mode(yaz_marc_t mt, WRBUF wrbuf);
218 /** \brief sets leader spec (for modifying bytes in 24 byte leader)
224 Spec takes form pos=val,pos=val,...
225 where value is either a number (decimal char value) or a
226 string in 'a', e.g. 9='a'
229 YAZ_EXPORT int yaz_marc_leader_spec(yaz_marc_t mt, const char *leader_spec);
232 /** \brief sets leader, validates it, and returns important values
234 \param leader of the 24 byte leader to be set
235 \param indicator_length indicator length (returned value)
236 \param identifier_length identifier length (returned value)
237 \param base_address base address (returned value)
238 \param length_data_entry length of data entry (returned value)
239 \param length_starting length of starting
240 \param length_implementation length of implementation defined data
243 void yaz_marc_set_leader(yaz_marc_t mt, const char *leader_c,
244 int *indicator_length,
245 int *identifier_length,
247 int *length_data_entry,
248 int *length_starting,
249 int *length_implementation);
252 /** \brief adds MARC comment string
254 \param comment comment to be added)
257 void yaz_marc_add_comment(yaz_marc_t mt, char *comment);
259 /** \brief adds MARC annotation - printf interface
261 \param fmt printf format string
264 void yaz_marc_cprintf(yaz_marc_t mt, const char *fmt, ...);
266 /** \brief adds subfield to MARC structure
268 \param code_data code data buffer
269 \param code_data_len length of code data
272 void yaz_marc_add_subfield(yaz_marc_t mt,
273 const char *code_data, size_t code_data_len);
276 /** \brief adds controlfield to MARC structure
278 \param tag (e.g. "001"
279 \param data value for this tag
280 \param data_len length of data
283 void yaz_marc_add_controlfield(yaz_marc_t mt, const char *tag,
284 const char *data, size_t data_len);
287 /** \brief adds controlfield to MARC structure using xml Nodes
289 \param ptr_tag value of tag (TEXT xmlNode)
290 \param ptr_data value of data (TEXT xmlNode)
293 void yaz_marc_add_controlfield_xml(yaz_marc_t mt, const xmlNode *ptr_tag,
294 const xmlNode *ptr_data);
297 /** \brief adds datafield to MARC structure using strings
299 \param tag value of tag as string
300 \param indicator indicator string
301 \param indicator_len length of indicator string
304 void yaz_marc_add_datafield(yaz_marc_t mt, const char *tag,
305 const char *indicator, size_t indicator_len);
307 /** \brief adds datafield to MARC structure using xml Nodes
309 \param ptr_tag value of tag (TEXT xmlNode)
310 \param indicator indicator string
311 \param indicator_len length of indicator string
314 void yaz_marc_add_datafield_xml(yaz_marc_t mt, const xmlNode *ptr_tag,
315 const char *indicator, size_t indicator_len);
318 /** \brief returns memory for MARC handle
320 \retval NMEM handle for MARC system
323 NMEM yaz_marc_get_nmem(yaz_marc_t mt);
325 /** \brief clears memory and MARC record
329 void yaz_marc_reset(yaz_marc_t mt);
331 /** \brief gets debug level for MARC system
335 int yaz_marc_get_debug(yaz_marc_t mt);
343 * indent-tabs-mode: nil
345 * vim: shiftwidth=4 tabstop=8 expandtab