kxml_pushnull
,
kxml_pushnullattrs
— write a
null element for kcgixml
#include
<sys/types.h>
#include <stdarg.h>
#include <stdint.h>
#include <kcgi.h>
#include <kcgixml.h>
enum kcgi_err
kxml_pushnull
(struct kxmlreq
*req, size_t elem);
enum kcgi_err
kxml_pushnullattrs
(struct kxmlreq
*req, size_t elem,
...);
Write a null (self-closing) element 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).
The
kxml_pushnullattrs
()
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.
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.
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_pushnull(&req, 0); /* foo */
kxml_pushnullattrs(&req, 1, "key", "val", NULL); /* bar */
kxml_close(&req);