/*  svn_xml.h:  xml code shared by various Subversion libraries.
 *
 * ====================================================================
 * Copyright (c) 2000-2002 CollabNet.  All rights reserved.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution.  The terms
 * are also available at http://subversion.tigris.org/license-1.html.
 * If newer versions of this license are posted there, you may use a
 * newer version instead, at your option.
 *
 * This software consists of voluntary contributions made by many
 * individuals.  For exact contribution history, see the revision
 * history and logs, available at http://subversion.tigris.org/.
 * ====================================================================
 */



#ifndef SVN_XML_H
#define SVN_XML_H

#include <apr.h>
#include <apr_pools.h>
#include <apr_hash.h>

#include "xmlparse.h"

#include "svn_error.h"
#include "svn_delta.h"
#include "svn_string.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


#define SVN_XML_NAMESPACE "svn:"

/* Used as style argument to svn_xml_make_open_tag() and friends. */
enum svn_xml_open_tag_style {
  svn_xml_normal = 1,           /* <tag ...> */
  svn_xml_protect_pcdata,       /* <tag ...>, no cosmetic newline */
  svn_xml_self_closing          /* <tag .../>  */
};


/* Create or append in *OUTSTR an xml-escaped version of STRING,
 * suitable for output as character data or as an attribute value.
 * If *OUTSTR is NULL, store a new stringbuf, else append to the
 * existing stringbuf there.
 */
void svn_xml_escape_stringbuf (svn_stringbuf_t **outstr,
                               const svn_stringbuf_t *string,
                               apr_pool_t *pool);

/* Same as `svn_xml_escape_stringbuf', but STRING is an svn_string_t.
 */
void svn_xml_escape_string (svn_stringbuf_t **outstr,
                            const svn_string_t *string,
                            apr_pool_t *pool);

/* Same as `svn_xml_escape_stringbuf', but STRING is a null-terminated
 * C string.
 */
void svn_xml_escape_nts (svn_stringbuf_t **outstr,
                         const char *string,
                         apr_pool_t *pool);


/* Create or append in *OUTSTR the unescaped version of the
 * xml-escaped string STRING.  If *OUTSTR is NULL, store a new
 * stringbuf, else append to the existing stringbuf there.
 *
 * NOTE:  This function recognizes only the following XML escapes:
 *
 *    &amp;    - &
 *    &apos;   - '
 *    &gt;     - >
 *    &lt;     - <
 *    &quot;   - "
 */
void svn_xml_unescape_stringbuf (svn_stringbuf_t **outstr,
                                 const svn_stringbuf_t *string,
                                 apr_pool_t *pool);

/* Same as `svn_xml_unescape_stringbuf', but STRING is an svn_string_t.
 */
void svn_xml_unescape_string (svn_stringbuf_t **outstr,
                              const svn_string_t *string,
                              apr_pool_t *pool);

/* Same as `svn_xml_unescape_stringbuf', but STRING is a
 * null-terminated C string.
 */
void svn_xml_unescape_nts (svn_stringbuf_t **outstr,
                           const char *string,
                           apr_pool_t *pool);



/*---------------------------------------------------------------*/

/*** Generalized Subversion XML Parsing ***/

/* A generalized Subversion XML parser object */
typedef struct svn_xml_parser_t
{
  XML_Parser parser;         /* the expat parser */
  svn_error_t *error;        /* if non-NULL, an error happened while parsing */
  apr_pool_t *pool;          /* where this object is allocated, so we
                                can free it easily */

} svn_xml_parser_t;


/* Create a general Subversion XML parser */
svn_xml_parser_t *svn_xml_make_parser (void *userData,
                                       XML_StartElementHandler  start_handler,
                                       XML_EndElementHandler    end_handler,
                                       XML_CharacterDataHandler data_handler,
                                       apr_pool_t *pool);


/* Free a general Subversion XML parser */
void svn_xml_free_parser (svn_xml_parser_t *svn_parser);


/* Push LEN bytes of xml data in BUF at SVN_PARSER.  

   If this is the final push, IS_FINAL must be set.  

   An error will be returned if there was a syntax problem in the XML,
   or if any of the callbacks set an error using
   svn_xml_signal_bailout().  

   If an error is returned, the svn_xml_parser_t will have been freed
   automatically, so the caller should not call svn_xml_free_parser(). */ 
svn_error_t *svn_xml_parse (svn_xml_parser_t *parser,
                            const char *buf,
                            apr_size_t len,
                            svn_boolean_t is_final);



/* The way to officially bail out of xml parsing:
   Store ERROR in SVN_PARSER and set all expat callbacks to NULL. */
void svn_xml_signal_bailout (svn_error_t *error,
                             svn_xml_parser_t *svn_parser);





/*** Helpers for dealing with the data Expat gives us. ***/

/* Return the value associated with NAME in expat attribute array ATTS,
 * else return NULL.  (There could never be a NULL attribute value in
 * the XML, although the empty string is possible.)
 * 
 * ATTS is an array of c-strings: even-numbered indexes are names,
 * odd-numbers hold values.  If all is right, it should end on an
 * even-numbered index pointing to NULL.
 */
const char *svn_xml_get_attr_value (const char *name, const char **atts);



/*** Converting between Expat attribute lists and APR hash tables. ***/


/* Create an attribute hash from va_list AP. 
 * The contents of AP are alternating char *'s and svn_stringbuf_t *'s,
 * terminated by a final null falling on an odd index (zero-based).
 */
apr_hash_t *svn_xml_ap_to_hash (va_list ap, apr_pool_t *pool);

/* Create a hash that corresponds to Expat xml attribute list ATTS.
 * The hash's keys will be char *'s, the values svn_stringbuf_t *'s.
 *
 * ATTS may be null, in which case you just get an empty hash back
 * (this makes life more convenient for some callers).
 */
apr_hash_t *svn_xml_make_att_hash (const char **atts, apr_pool_t *pool);


/* Like svn_xml_make_att_hash(), but takes a hash and preserves any
   key/value pairs already in it. */
void svn_xml_hash_atts_preserving (const char **atts,

                                   apr_hash_t *ht,
                                   apr_pool_t *pool);

/* Like svn_xml_make_att_hash(), but takes a hash and overwrites
   key/value pairs already in it that also appear in ATTS. */
void svn_xml_hash_atts_overlaying (const char **atts,
                                   apr_hash_t *ht,
                                   apr_pool_t *pool);



/*** Printing XML ***/

/* Fully-formed XML documents should start out with a header,
   something like 
           <?xml version="1.0" encoding="utf-8"?>
   
   This function returns such a header.  *STR must either be NULL, in
   which case a new string is created, or it must point to an existing
   string to be appended to.  */
void svn_xml_make_header (svn_stringbuf_t **str, apr_pool_t *pool);


/* Makes an XML open tag named TAGNAME.  Varargs are used to specify a
   NULL-terminated list of alternating const char *Key and
   svn_stringbuf_t *Val.

   STYLE must be one of the enumerated styles in svn_xml_open_tag_style. */
void svn_xml_make_open_tag (svn_stringbuf_t **str,
			    apr_pool_t *pool,
			    enum svn_xml_open_tag_style style,
			    const char *tagname,
			    ...);


/* Like svn_xml_make_open_tag, but takes a va_list instead of being
   variadic. */
void svn_xml_make_open_tag_v (svn_stringbuf_t **str,
			      apr_pool_t *pool,
			      enum svn_xml_open_tag_style style,
			      const char *tagname,
			      va_list ap);


/* Like svn_xml_make_tag, but takes a hash table of attributes. 
 *
 * You might ask, why not just provide svn_xml_make_tag_atts()?
 *
 * The reason is that a hash table is the most natural interface to an
 * attribute list; the fact that Expat uses char **atts instead is
 * certainly a defensible implementation decision, but since we'd have
 * to have special code to support such lists throughout Subversion
 * anyway, we might as well write that code for the natural interface
 * (hashes) and then convert in the few cases where conversion is
 * needed.  Someday it might even be nice to change expat-lite to work
 * with apr hashes.
 *
 * See conversion functions svn_xml_make_att_hash() and
 * svn_xml_make_att_hash_overlaying().  Callers should use those to
 * convert Expat attr lists into hashes when necessary.
 */
void svn_xml_make_open_tag_hash (svn_stringbuf_t **str,
				 apr_pool_t *pool,
				 enum svn_xml_open_tag_style style,
				 const char *tagname,
				 apr_hash_t *attributes);


/* Makes a close tag.  */
void svn_xml_make_close_tag (svn_stringbuf_t **str,
			     apr_pool_t *pool,
			     const char *tagname);



#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SVN_XML_H */

/* ----------------------------------------------------------------
 * local variables:
 * eval: (load-file "../../tools/dev/svn-dev.el")
 * end: 
 */
