Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_subr/xml.c view on Meta::CPAN
/*** Creating attribute hashes. ***/
/* Combine an existing attribute list ATTS with a HASH that itself
represents an attribute list. Iff PRESERVE is true, then no value
already in HASH will be changed, else values from ATTS will
override previous values in HASH. */
static void
amalgamate(const char **atts,
apr_hash_t *ht,
svn_boolean_t preserve,
apr_pool_t *pool)
{
const char *key;
if (atts)
for (key = *atts; key; key = *(++atts))
{
const char *val = *(++atts);
size_t keylen;
assert(key != NULL);
/* kff todo: should we also insist that val be non-null here?
Probably. */
keylen = strlen(key);
if (preserve && ((apr_hash_get(ht, key, keylen)) != NULL))
continue;
else
apr_hash_set(ht, apr_pstrndup(pool, key, keylen), keylen,
val ? apr_pstrdup(pool, val) : NULL);
}
}
apr_hash_t *
svn_xml_ap_to_hash(va_list ap, apr_pool_t *pool)
{
apr_hash_t *ht = apr_hash_make(pool);
const char *key;
while ((key = va_arg(ap, char *)) != NULL)
{
const char *val = va_arg(ap, const char *);
svn_hash_sets(ht, key, val);
}
return ht;
}
apr_hash_t *
svn_xml_make_att_hash(const char **atts, apr_pool_t *pool)
{
apr_hash_t *ht = apr_hash_make(pool);
amalgamate(atts, ht, 0, pool); /* third arg irrelevant in this case */
return ht;
}
void
svn_xml_hash_atts_overlaying(const char **atts,
apr_hash_t *ht,
apr_pool_t *pool)
{
amalgamate(atts, ht, 0, pool);
}
void
svn_xml_hash_atts_preserving(const char **atts,
apr_hash_t *ht,
apr_pool_t *pool)
{
amalgamate(atts, ht, 1, pool);
}
/*** Making XML tags. ***/
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)
{
apr_hash_index_t *hi;
apr_size_t est_size = strlen(tagname) + 4 + apr_hash_count(attributes) * 30;
if (*str == NULL)
*str = svn_stringbuf_create_ensure(est_size, pool);
svn_stringbuf_appendcstr(*str, "<");
svn_stringbuf_appendcstr(*str, tagname);
for (hi = apr_hash_first(pool, attributes); hi; hi = apr_hash_next(hi))
{
const void *key;
void *val;
apr_hash_this(hi, &key, NULL, &val);
assert(val != NULL);
svn_stringbuf_appendcstr(*str, "\n ");
svn_stringbuf_appendcstr(*str, key);
svn_stringbuf_appendcstr(*str, "=\"");
svn_xml_escape_attr_cstring(str, val, pool);
svn_stringbuf_appendcstr(*str, "\"");
}
if (style == svn_xml_self_closing)
svn_stringbuf_appendcstr(*str, "/");
svn_stringbuf_appendcstr(*str, ">");
if (style != svn_xml_protect_pcdata)
svn_stringbuf_appendcstr(*str, "\n");
}
void
( run in 1.193 second using v1.01-cache-2.11-cpan-39bf76dae61 )