marcdisp.c File Reference

Implements MARC conversion utilities. More...

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <yaz/marcdisp.h>
#include <yaz/wrbuf.h>
#include <yaz/yaz-util.h>
#include <yaz/nmem_xml.h>
#include <yaz/snprintf.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

Go to the source code of this file.

Data Structures

struct  yaz_marc_datafield
 represets a data field More...
struct  yaz_marc_controlfield
 represents a control field More...
struct  yaz_marc_comment
 a comment node More...
struct  yaz_marc_node
 MARC node. More...
struct  yaz_marc_subfield
 represents a subfield More...
struct  yaz_marc_t_
 the internals of a yaz_marc_t handle More...

Enumerations

enum  yaz_collection_state { no_collection, collection_first, collection_second }
enum  YAZ_MARC_NODE_TYPE { YAZ_MARC_DATAFIELD, YAZ_MARC_CONTROLFIELD, YAZ_MARC_COMMENT, YAZ_MARC_LEADER }
 

node types for yaz_marc_node

More...

Functions

yaz_marc_t yaz_marc_create (void)
 construct yaz_marc_t handle
void yaz_marc_destroy (yaz_marc_t mt)
 destroy yaz_marc_t handle
NMEM yaz_marc_get_nmem (yaz_marc_t mt)
 returns memory for MARC handle
static void marc_iconv_reset (yaz_marc_t mt, WRBUF wr)
static int marc_exec_leader (const char *leader_spec, char *leader, size_t size)
static struct yaz_marc_nodeyaz_marc_add_node (yaz_marc_t mt)
void yaz_marc_add_controlfield_xml (yaz_marc_t mt, const xmlNode *ptr_tag, const xmlNode *ptr_data)
 adds controlfield to MARC structure using xml Nodes
void yaz_marc_add_comment (yaz_marc_t mt, char *comment)
 adds MARC comment string
void yaz_marc_cprintf (yaz_marc_t mt, const char *fmt,...)
 adds MARC annotation - printf interface
int yaz_marc_get_debug (yaz_marc_t mt)
 gets debug level for MARC system
void yaz_marc_add_leader (yaz_marc_t mt, const char *leader, size_t leader_len)
void yaz_marc_add_controlfield (yaz_marc_t mt, const char *tag, const char *data, size_t data_len)
 adds controlfield to MARC structure
void yaz_marc_add_datafield (yaz_marc_t mt, const char *tag, const char *indicator, size_t indicator_len)
 adds datafield to MARC structure using strings
void yaz_marc_add_datafield_xml (yaz_marc_t mt, const xmlNode *ptr_tag, const char *indicator, size_t indicator_len)
 adds datafield to MARC structure using xml Nodes
void yaz_marc_add_subfield (yaz_marc_t mt, const char *code_data, size_t code_data_len)
 adds subfield to MARC structure
void yaz_marc_set_leader (yaz_marc_t mt, const char *leader_c, int *indicator_length, int *identifier_length, int *base_address, int *length_data_entry, int *length_starting, int *length_implementation)
 sets leader, validates it, and returns important values
void yaz_marc_subfield_str (yaz_marc_t mt, const char *s)
void yaz_marc_endline_str (yaz_marc_t mt, const char *s)
static size_t cdata_one_character (yaz_marc_t mt, const char *buf)
void yaz_marc_reset (yaz_marc_t mt)
 clears memory and MARC record
int yaz_marc_write_check (yaz_marc_t mt, WRBUF wr)
static size_t get_subfield_len (yaz_marc_t mt, const char *data, int identifier_length)
int yaz_marc_write_line (yaz_marc_t mt, WRBUF wr)
 writes record in line format
int yaz_marc_write_trailer (yaz_marc_t mt, WRBUF wr)
 flushes records
void yaz_marc_enable_collection (yaz_marc_t mt)
 enables record collection output
int yaz_marc_write_mode (yaz_marc_t mt, WRBUF wr)
 writes record in mode - given by yaz_marc_xml mode
static int yaz_marc_write_marcxml_ns1 (yaz_marc_t mt, WRBUF wr, const char *ns, const char *format, const char *type)
 common MARC XML/Xchange writer
static int yaz_marc_write_marcxml_ns (yaz_marc_t mt, WRBUF wr, const char *ns, const char *format, const char *type)
int yaz_marc_write_marcxml (yaz_marc_t mt, WRBUF wr)
 writes record in MARCXML format
int yaz_marc_write_marcxchange (yaz_marc_t mt, WRBUF wr, const char *format, const char *type)
 writes record in MarcXchange XML (ISO25577)
int yaz_marc_write_xml (yaz_marc_t mt, xmlNode **root_ptr, const char *ns, const char *format, const char *type)
 writes MARC record as libxml2 tree
int yaz_marc_write_iso2709 (yaz_marc_t mt, WRBUF wr)
 writes record in ISO2709 format
int yaz_marc_decode_wrbuf (yaz_marc_t mt, const char *buf, int bsize, WRBUF wr)
 decodes ISO2709/MARC buffer and stores result in WRBUF
int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize, const char **result, size_t *rsize)
 decodes ISO2709 buffer using straight buffers
void yaz_marc_xml (yaz_marc_t mt, int xmlmode)
 set XML mode YAZ_MARC_LINE, YAZ_MARC_SIMPLEXML, ...
void yaz_marc_debug (yaz_marc_t mt, int level)
 set debug level
void yaz_marc_iconv (yaz_marc_t mt, yaz_iconv_t cd)
 set iconv handle for character set conversion
yaz_iconv_t yaz_marc_get_iconv (yaz_marc_t mt)
 supply iconv handle for character set conversion
void yaz_marc_modify_leader (yaz_marc_t mt, size_t off, const char *str)
 modifies part of the MARC leader
int yaz_marc_leader_spec (yaz_marc_t mt, const char *leader_spec)
 sets leader spec (for modifying bytes in 24 byte leader)
int yaz_marc_decode_formatstr (const char *arg)
 Converts MARC format type to format type(YAZ_MARC_..).
void yaz_marc_write_using_libxml2 (yaz_marc_t mt, int enable)
 Enables or disables writing of MARC XML records using Libxml2.

Detailed Description

Implements MARC conversion utilities.

Definition in file marcdisp.c.


Enumeration Type Documentation

Enumerator:
no_collection 
collection_first 
collection_second 

Definition at line 35 of file marcdisp.c.

node types for yaz_marc_node

Enumerator:
YAZ_MARC_DATAFIELD 
YAZ_MARC_CONTROLFIELD 
YAZ_MARC_COMMENT 
YAZ_MARC_LEADER 

Definition at line 42 of file marcdisp.c.


Function Documentation

static size_t cdata_one_character ( yaz_marc_t  mt,
const char *  buf 
) [static]

Definition at line 362 of file marcdisp.c.

References yaz_marc_t_::iconv_cd, and yaz_iconv().

Referenced by get_subfield_len().

static size_t get_subfield_len ( yaz_marc_t  mt,
const char *  data,
int  identifier_length 
) [static]
static int marc_exec_leader ( const char *  leader_spec,
char *  leader,
size_t  size 
) [static]

Definition at line 1026 of file marcdisp.c.

Referenced by yaz_marc_add_leader(), and yaz_marc_leader_spec().

static void marc_iconv_reset ( yaz_marc_t  mt,
WRBUF  wr 
) [static]
void yaz_marc_add_comment ( yaz_marc_t  mt,
char *  comment 
)

adds MARC comment string

Parameters:
mt handle
comment comment to be added)

Definition at line 167 of file marcdisp.c.

References yaz_marc_node::comment, yaz_marc_t_::nmem, nmem_strdup(), yaz_marc_node::u, yaz_marc_node::which, yaz_marc_add_node(), and YAZ_MARC_COMMENT.

Referenced by yaz_marc_add_controlfield(), yaz_marc_add_subfield(), and yaz_marc_cprintf().

void yaz_marc_add_controlfield ( yaz_marc_t  mt,
const char *  tag,
const char *  data,
size_t  data_len 
)

adds controlfield to MARC structure

Parameters:
mt handle
tag (e.g. "001"
data value for this tag
data_len length of data

Definition at line 198 of file marcdisp.c.

References yaz_marc_node::controlfield, yaz_marc_controlfield::data, yaz_marc_t_::debug, yaz_marc_t_::nmem, nmem_strdup(), nmem_strdupn(), yaz_marc_controlfield::tag, yaz_marc_node::u, yaz_marc_node::which, yaz_marc_add_comment(), yaz_marc_add_node(), and YAZ_MARC_CONTROLFIELD.

Referenced by yaz_marc_read_iso2709(), and yaz_marc_read_line().

void yaz_marc_add_controlfield_xml ( yaz_marc_t  mt,
const xmlNode *  ptr_tag,
const xmlNode *  ptr_data 
)

adds controlfield to MARC structure using xml Nodes

Parameters:
mt handle
ptr_tag value of tag (TEXT xmlNode)
ptr_data value of data (TEXT xmlNode)

Definition at line 156 of file marcdisp.c.

References yaz_marc_node::controlfield, yaz_marc_controlfield::data, yaz_marc_t_::nmem, nmem_text_node_cdata(), yaz_marc_controlfield::tag, yaz_marc_node::u, yaz_marc_node::which, yaz_marc_add_node(), and YAZ_MARC_CONTROLFIELD.

Referenced by yaz_marc_read_xml_fields().

void yaz_marc_add_datafield ( yaz_marc_t  mt,
const char *  tag,
const char *  indicator,
size_t  indicator_len 
)

adds datafield to MARC structure using strings

Parameters:
mt handle
tag value of tag as string
indicator indicator string
indicator_len length of indicator string

Definition at line 219 of file marcdisp.c.

References yaz_marc_node::datafield, yaz_marc_datafield::indicator, yaz_marc_t_::nmem, nmem_strdup(), nmem_strdupn(), yaz_marc_t_::subfield_pp, yaz_marc_datafield::subfields, yaz_marc_datafield::tag, yaz_marc_node::u, yaz_marc_node::which, yaz_marc_add_node(), and YAZ_MARC_DATAFIELD.

Referenced by yaz_marc_read_iso2709(), and yaz_marc_read_line().

void yaz_marc_add_datafield_xml ( yaz_marc_t  mt,
const xmlNode *  ptr_tag,
const char *  indicator,
size_t  indicator_len 
)

adds datafield to MARC structure using xml Nodes

Parameters:
mt handle
ptr_tag value of tag (TEXT xmlNode)
indicator indicator string
indicator_len length of indicator string

Definition at line 234 of file marcdisp.c.

References yaz_marc_node::datafield, yaz_marc_datafield::indicator, yaz_marc_t_::nmem, nmem_strdupn(), nmem_text_node_cdata(), yaz_marc_t_::subfield_pp, yaz_marc_datafield::subfields, yaz_marc_datafield::tag, yaz_marc_node::u, yaz_marc_node::which, yaz_marc_add_node(), and YAZ_MARC_DATAFIELD.

Referenced by yaz_marc_read_xml_fields().

void yaz_marc_add_leader ( yaz_marc_t  mt,
const char *  leader,
size_t  leader_len 
)
static struct yaz_marc_node* yaz_marc_add_node ( yaz_marc_t  mt  )  [static, read]
void yaz_marc_add_subfield ( yaz_marc_t  mt,
const char *  code_data,
size_t  code_data_len 
)

adds subfield to MARC structure

Parameters:
mt handle
code_data code data buffer
code_data_len length of code data

Definition at line 249 of file marcdisp.c.

References yaz_marc_subfield::code_data, yaz_marc_t_::debug, yaz_marc_subfield::next, yaz_marc_t_::nmem, nmem_malloc(), nmem_strdupn(), yaz_marc_t_::subfield_pp, and yaz_marc_add_comment().

Referenced by yaz_marc_read_iso2709(), yaz_marc_read_line(), and yaz_marc_read_xml_subfields().

void yaz_marc_cprintf ( yaz_marc_t  mt,
const char *  fmt,
  ... 
)

adds MARC annotation - printf interface

Parameters:
mt handle
fmt printf format string

Definition at line 174 of file marcdisp.c.

References yaz_marc_add_comment(), and yaz_vsnprintf().

Referenced by yaz_marc_read_iso2709(), yaz_marc_read_line(), yaz_marc_read_xml(), yaz_marc_read_xml_fields(), yaz_marc_read_xml_leader(), yaz_marc_read_xml_subfields(), and yaz_marc_set_leader().

yaz_marc_t yaz_marc_create ( void   ) 
void yaz_marc_debug ( yaz_marc_t  mt,
int  level 
)

set debug level

Parameters:
mt handle
level level, where 0=lowest, 1 more debug, 2 even more

Definition at line 983 of file marcdisp.c.

References yaz_marc_t_::debug.

int yaz_marc_decode_buf ( yaz_marc_t  mt,
const char *  buf,
int  bsize,
const char **  result,
size_t *  rsize 
)

decodes ISO2709 buffer using straight buffers

Parameters:
mt marc handle
buf input buffer
bsize size of buffer or (-1 if "any size")
result result to be stored here
rsize size of result (memory "owned" by yaz_marc_mt handle)

Decodes MARC in buf of size bsize. On success, result in *result with size *rsize. Returns -1 on error, or size of input record (>0) if OK

Definition at line 963 of file marcdisp.c.

References yaz_marc_t_::m_wr, wrbuf_cstr(), wrbuf_len, wrbuf_rewind(), and yaz_marc_decode_wrbuf().

Referenced by dummy_xml_record().

int yaz_marc_decode_formatstr ( const char *  arg  ) 

Converts MARC format type to format type(YAZ_MARC_..).

Parameters:
arg string
Return values:
-1 unknown format (bad arg)
>= 0 OK (one of YAZ_MARC - values)

Definition at line 1069 of file marcdisp.c.

References YAZ_MARC_ISO2709, YAZ_MARC_LINE, YAZ_MARC_MARCXML, and YAZ_MARC_XCHANGE.

int yaz_marc_decode_wrbuf ( yaz_marc_t  mt,
const char *  buf,
int  bsize,
WRBUF  wrbuf 
)

decodes ISO2709/MARC buffer and stores result in WRBUF

Parameters:
mt handle
buf input buffer
bsize size of buffer (-1 if "any size")
wrbuf WRBUF for output

Decodes MARC in buf of size bsize. On success, result in wrbuf Returns -1 on error, or size of input record (>0) if OK

Definition at line 952 of file marcdisp.c.

References yaz_marc_read_iso2709(), and yaz_marc_write_mode().

Referenced by return_marc_record(), yaz_marc_decode_buf(), and yaz_opac_decode_wrbuf().

void yaz_marc_destroy ( yaz_marc_t  mt  ) 
void yaz_marc_enable_collection ( yaz_marc_t  mt  ) 

enables record collection output

Parameters:
mt handle

Definition at line 519 of file marcdisp.c.

References collection_first, and yaz_marc_t_::enable_collection.

void yaz_marc_endline_str ( yaz_marc_t  mt,
const char *  s 
)

Definition at line 355 of file marcdisp.c.

References yaz_marc_t_::endline_str.

int yaz_marc_get_debug ( yaz_marc_t  mt  ) 

gets debug level for MARC system

Parameters:
mt handle

Definition at line 185 of file marcdisp.c.

References yaz_marc_t_::debug.

Referenced by yaz_marc_read_iso2709().

yaz_iconv_t yaz_marc_get_iconv ( yaz_marc_t  mt  ) 

supply iconv handle for character set conversion

Definition at line 994 of file marcdisp.c.

References yaz_marc_t_::iconv_cd.

Referenced by yaz_opac_decode_wrbuf().

NMEM yaz_marc_get_nmem ( yaz_marc_t  mt  ) 

returns memory for MARC handle

Parameters:
mt handle
Return values:
NMEM handle for MARC system

Definition at line 131 of file marcdisp.c.

References yaz_marc_t_::nmem.

Referenced by yaz_marc_read_xml_subfields().

void yaz_marc_iconv ( yaz_marc_t  mt,
yaz_iconv_t  cd 
)

set iconv handle for character set conversion

Definition at line 989 of file marcdisp.c.

References yaz_marc_t_::iconv_cd.

Referenced by return_marc_record(), return_opac_record(), yaz_record_conv_opac_record(), and yaz_record_conv_record_rule().

int yaz_marc_leader_spec ( yaz_marc_t  mt,
const char *  leader_spec 
)

sets leader spec (for modifying bytes in 24 byte leader)

Parameters:
mt handle
leader_spec 
Return values:
0 OK
-1 ERROR

Spec takes form pos=val,pos=val,... where value is either a number (decimal char value) or a string in 'a', e.g. 9='a'

Definition at line 1012 of file marcdisp.c.

References yaz_marc_t_::leader_spec, marc_exec_leader(), xfree, and xstrdup.

void yaz_marc_modify_leader ( yaz_marc_t  mt,
size_t  off,
const char *  str 
)

modifies part of the MARC leader

Definition at line 999 of file marcdisp.c.

References yaz_marc_node::leader, yaz_marc_node::next, yaz_marc_t_::nodes, yaz_marc_node::u, yaz_marc_node::which, and YAZ_MARC_LEADER.

Referenced by yaz_marc_write_marcxml().

void yaz_marc_reset ( yaz_marc_t  mt  ) 

clears memory and MARC record

Parameters:
mt handle

Definition at line 385 of file marcdisp.c.

References yaz_marc_t_::nmem, nmem_reset(), yaz_marc_t_::nodes, yaz_marc_t_::nodes_pp, and yaz_marc_t_::subfield_pp.

Referenced by yaz_marc_create(), yaz_marc_read_iso2709(), yaz_marc_read_line(), and yaz_marc_read_xml().

void yaz_marc_set_leader ( yaz_marc_t  mt,
const char *  leader,
int *  indicator_length,
int *  identifier_length,
int *  base_address,
int *  length_data_entry,
int *  length_starting,
int *  length_implementation 
)

sets leader, validates it, and returns important values

Parameters:
mt handle
leader of the 24 byte leader to be set
indicator_length indicator length (returned value)
identifier_length identifier length (returned value)
base_address base address (returned value)
length_data_entry length of data entry (returned value)
length_starting length of starting
length_implementation length of implementation defined data

Definition at line 277 of file marcdisp.c.

References atoi_n_check(), yaz_marc_t_::debug, yaz_marc_add_leader(), and yaz_marc_cprintf().

Referenced by yaz_marc_read_iso2709(), yaz_marc_read_line(), and yaz_marc_read_xml_leader().

void yaz_marc_subfield_str ( yaz_marc_t  mt,
const char *  s 
)

Definition at line 349 of file marcdisp.c.

References yaz_marc_t_::subfield_str.

int yaz_marc_write_check ( yaz_marc_t  mt,
WRBUF  wr 
)
int yaz_marc_write_iso2709 ( yaz_marc_t  mt,
WRBUF  wrbuf 
)
int yaz_marc_write_line ( yaz_marc_t  mt,
WRBUF  wrbuf 
)
int yaz_marc_write_marcxchange ( yaz_marc_t  mt,
WRBUF  wrbuf,
const char *  format,
const char *  type 
)

writes record in MarcXchange XML (ISO25577)

Parameters:
mt handle
wrbuf WRBUF for output
format record format (e.g. "MARC21")
type record type (e.g. Bibliographic)
Return values:
0 OK
-1 ERROR

Definition at line 701 of file marcdisp.c.

References yaz_marc_write_marcxml_ns().

Referenced by yaz_marc_write_mode().

int yaz_marc_write_marcxml ( yaz_marc_t  mt,
WRBUF  wrbuf 
)

writes record in MARCXML format

Parameters:
mt handle
wrbuf WRBUF for output
Return values:
0 OK
-1 ERROR

Sets leader[9]='a' .

Definition at line 691 of file marcdisp.c.

References yaz_marc_t_::leader_spec, yaz_marc_modify_leader(), and yaz_marc_write_marcxml_ns().

Referenced by yaz_marc_write_mode().

static int yaz_marc_write_marcxml_ns ( yaz_marc_t  mt,
WRBUF  wr,
const char *  ns,
const char *  format,
const char *  type 
) [static]
static int yaz_marc_write_marcxml_ns1 ( yaz_marc_t  mt,
WRBUF  wr,
const char *  ns,
const char *  format,
const char *  type 
) [static]
int yaz_marc_write_mode ( yaz_marc_t  mt,
WRBUF  wrbuf 
)

writes record in mode - given by yaz_marc_xml mode

Parameters:
mt handle
wrbuf WRBUF for output
Return values:
0 OK
-1 ERROR

This function calls yaz_marc_write_iso2709, yaz_marc_write_marcxml, etc.. depending on mode given by yaz_marc_xml.

Definition at line 524 of file marcdisp.c.

References yaz_marc_t_::xml, YAZ_MARC_CHECK, YAZ_MARC_ISO2709, YAZ_MARC_LINE, YAZ_MARC_MARCXML, yaz_marc_write_check(), yaz_marc_write_iso2709(), yaz_marc_write_line(), yaz_marc_write_marcxchange(), yaz_marc_write_marcxml(), and YAZ_MARC_XCHANGE.

Referenced by yaz_marc_decode_wrbuf(), and yaz_record_conv_record_rule().

int yaz_marc_write_trailer ( yaz_marc_t  mt,
WRBUF  wr 
)

flushes records

Parameters:
mt handle
wr WRBUF for output
Return values:
0 OK
-1 ERROR

Definition at line 502 of file marcdisp.c.

References collection_second, yaz_marc_t_::enable_collection, wrbuf_printf(), yaz_marc_t_::xml, YAZ_MARC_MARCXML, and YAZ_MARC_XCHANGE.

void yaz_marc_write_using_libxml2 ( yaz_marc_t  mt,
int  enable 
)

Enables or disables writing of MARC XML records using Libxml2.

Parameters:
mt handle
enable 0=disable, 1=enable

Definition at line 1083 of file marcdisp.c.

References yaz_marc_t_::write_using_libxml2.

int yaz_marc_write_xml ( yaz_marc_t  mt,
xmlNode **  root_ptr,
const char *  ns,
const char *  format,
const char *  type 
)

writes MARC record as libxml2 tree

Parameters:
mt handle
root_ptr pointer to record node
ns namespace of record (such as "http://www.loc.gov/MARC21/slim")
format MarcXchange format (NULL for none)
type MarcXchange format (NULL for none)
Return values:
0 Creation successful and *root_ptr is "record" node
-1 ERROR

Definition at line 712 of file marcdisp.c.

References atoi_n_check(), yaz_marc_subfield::code_data, yaz_marc_node::comment, yaz_marc_node::controlfield, yaz_marc_controlfield::data, yaz_marc_node::datafield, get_subfield_len(), yaz_marc_t_::iconv_cd, yaz_marc_datafield::indicator, yaz_marc_node::leader, marc_iconv_reset(), yaz_marc_subfield::next, yaz_marc_node::next, yaz_marc_t_::nodes, yaz_marc_datafield::subfields, yaz_marc_controlfield::tag, yaz_marc_datafield::tag, yaz_marc_node::u, yaz_marc_node::which, wrbuf_alloc(), wrbuf_cstr(), wrbuf_destroy(), wrbuf_iconv_puts(), wrbuf_iconv_write(), wrbuf_rewind(), YAZ_MARC_COMMENT, YAZ_MARC_CONTROLFIELD, YAZ_MARC_DATAFIELD, and YAZ_MARC_LEADER.

Referenced by yaz_marc_write_marcxml_ns().

void yaz_marc_xml ( yaz_marc_t  mt,
int  xmlmode 
)

set XML mode YAZ_MARC_LINE, YAZ_MARC_SIMPLEXML, ...

Definition at line 977 of file marcdisp.c.

References yaz_marc_t_::xml.

Referenced by dummy_xml_record(), return_marc_record(), return_opac_record(), yaz_record_conv_opac_record(), and yaz_record_conv_record_rule().


Generated on Tue Mar 9 10:29:54 2010 for YAZ by  doxygen 1.6.1