NAME
kxml_push
,
kxml_pushattrs
—
open an element scope for
kcgixml
LIBRARY
library “libkcgixml”
SYNOPSIS
#include
<sys/types.h>
#include <stdarg.h>
#include <stdint.h>
#include <kcgi.h>
#include <kcgixml.h>
enum kcgi_err
kxml_push
(struct kxmlreq *req,
size_t elem);
enum kcgi_err
kxml_pushattrs
(struct kxmlreq
*req, size_t elem,
...);
DESCRIPTION
Open a new scope of element index elem on the current element stack of req, initialised with kxml_open(3). The element must be in the element array passed to kxml_open(3). Scopes are closed with kxml_popall(3), kxml_pop(3). or kxml_close(3).
The
kxml_pushattrs
()
form accepts pairs of character string arguments, the first being an
attribute name, the second its value. This list must be terminated by a
NULL
pointer. Attribute names are left as-is: the
caller must make sure that keys are valid XML. Attribute values are XML
escaped to prevent content from breaking out of the attribute string.
RETURN VALUES
Returns an enum kcgi_err indicating the error state.
KCGI_OK
- Success (not an error).
KCGI_ENOMEM
- Internal memory allocation failure, including reaching the maximum number of possible JSON scopes.
KCGI_HUP
- The output connection has been terminated. For FastCGI connections, the current connection should be released with khttp_free(3) and parse loop reentered.
KCGI_FORM
- The connection is still expecting headers with khttp_head(3). Indicates that khttp_body(3) did not return with success or was not invoked. For FastCGI connections, the current connection should be released with khttp_free(3) and parse loop reentered.
KCGI_SYSTEM
- Internal system error writing to the output stream.
KCGI_WRITER
- The elem is not a valid element index.
EXAMPLES
The following outputs a simple XML page. It assumes r is a struct kreq pointer. For brevity, it does not do any error checking.
const char *const elems[] = { "foo", "bar", "baz" }; khttp_head(r, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]); khttp_head(r, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_XML]); khttp_body(r); kxml_open(&req, r, elems, 3); kxml_push(&req, 0); /* foo */ kxml_puts(&req, "Hello, world"); kxml_pop(&req); kxml_pushattrs(&req, 1, "baz", "xyzzy", NULL); /* bar */ kxml_puts(&req, "Hello, world"); kxml_pop(&req); kxml_close(&req);
SEE ALSO
AUTHORS
Written by Kristaps Dzonsons <kristaps@bsd.lv>.