Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
KHTTP_TEMPLATEX(3)	    Library Functions Manual	    KHTTP_TEMPLATEX(3)

NAME
       khttp_templatex,	  khttp_templatex_buf,	 khttp_templatex_fd   --  emit
       filled-in templates for kcgi

LIBRARY
       library "libkcgi"

SYNOPSIS
       #include	<sys/types.h>
       #include	<stdarg.h>
       #include	<stdint.h>
       #include	<kcgi.h>

       enum kcgi_err
       khttp_templatex(const struct ktemplate *t,	 const char *filename,
	   const struct	ktemplatex *x, void *arg);

       enum kcgi_err
       khttp_templatex_buf(const struct	ktemplate *t,	      const char *buf,
	   size_t sz, const struct ktemplatex *x, void *arg);

       enum kcgi_err
       khttp_templatex_fd(const	struct ktemplate *t,		       int fd,
	   const char *filename, const struct ktemplatex *x, void *arg);

DESCRIPTION
       Modify  input  by  replacing  keys in a template.  This generalises the
       khttp_template(3) family	of functions with generic  writing  functions.
       All functions accept a template t consisting of the following fields:

       const char *const *key
	       An array	of keys	to be replaced in the template.

       size_t keysz
	       The number of keys in t->key.

       void *arg
	       An optional argument passed to t->cb.

       int (*cb)(size_t	index, void *arg)
	       The  callback  function	invoked	 when a	key at position	index,
	       which is	always less than t->keysz, is found  in	 t->key.   The
	       optional	 arg is	passed the function.  The function must	return
	       zero on failure,	non-zero on success.

       They further accept an extension	x consisting of	the following:

       writer  A writing function for writing input that does  not  match  key
	       sequences.   If	it  is	invoked	 and  the  return value	is not
	       KCGI_OK,	templating stops and the return	value is  returned  to
	       the caller.

       fbk     A  fall-back  function invoked if a key sequences was not found
	       in the c->key array.  This accepts the key sequence, length  of
	       the  sequence,  and  arg.  If NULL, key sequences not found are
	       passed to writer.

       If t is NULL, the input is passed through to x->writer without any pro-
       cessing.

       Otherwise, the input is passed to x->writer until a key sequence	in en-
       countered matching a key	in t->key.  The	callback t->cb is then invoked
       instead of printing the key sequence.  If there are  multiple  matching
       keys  in	t->key,	only one is used (which	is not yet fixed).  If the key
       sequence	is not found in	t->key,	it is passed to	x->fbk,	if  not	 NULL,
       or passed directly to x->writer otherwise.

       The different input types are khttpx_template(),	which reads input from
       the  file  filename;  khttpx_template_buf(),  which reads from a	binary
       buffer buf of length sz;	and khttpx_template_fd(), which	reads  from  a
       file  descriptor	fd with	optional file-name fname used only for logging
       purposes.

SYNTAX
       Each substring of the input beginning and ending	with a	pair  of  "at"
       signs,  @@key@@,	is called a "key sequence".  Zero-length keys @@@@ are
       allowed and match empty template	keys.  If the @@ pair is escaped  with
       a  single  backslash, \@@, the backslash	is removed and it's emitted as
       @@.

       A key sequence may not contain an escaped pair: this  is	 parsed	 as  a
       backslash followed by the trailing pair.

RETURN VALUES
       These return an enum kcgi_err indicating	the error state:

       KCGI_OK	    No error occurred.

       KCGI_ENOMEM  Memory allocation failed.

       KCGI_SYSTEM  A  system call failed.  For	example, writing to the	output
		    stream  failed,  or	 khttp_template()  failed  to  open(2)
		    filename.

       KCGI_FORM    t->cb returned 0.

       If the x->writer	function returns anything but KCGI_OK, the return code
       is passed as the	return value.

EXAMPLES
       The  following  simple  example	takes a	buffer buf and applies the re-
       placement template of two values, writing it  to	 the  current  context
       req.  It	stores the result in the given buffer out.

	     static int	writer(size_t idx, void	*arg)
	     {
	       struct kcgi_buf *p = arg;
	       if (idx == 0)
		 kcgi_buf_puts(p, "foo-value");
	       else if (idx == 1)
		 kcgi_buf_puts(p, "bar-value");
	       return 1;
	     }

	     enum kcgi_err format(struct kcgi_buf *out)
	     {
	       const char *const keys[]	= { "foo", "bar" };
	       struct ktemplate	t = {
		 .key =	keys,
		 .keysz	= 2,
		 .arg =	out,
		 .cb = writer
	       };
	       struct ktemplatex x = {
		 .writer = kcgi_buf_write,
		 .fbk =	NULL
	       };
	       const char *in =	"foo=@@foo@@, bar=@@bar@@";

	       memset(out, 0, sizeof(struct kcgi_buf));
	       return khttp_templatex_buf
		 (&t, in, strlen(in), &x, out);
	     }

       The function will produce "foo=foo-value, bar=bar-value".

SEE ALSO
       kcgi(3),	     khttp_body(3),	khttp_parse(3),	    khttp_template(3),
       khttp_write(3)

AUTHORS
       Written by Kristaps Dzonsons <kristaps@bsd.lv>.

FreeBSD	Ports 14.quarterly	  $Mdocdate$		    KHTTP_TEMPLATEX(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=khttp_templatex&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help