ustr man page on Cygwin

Man page or keyword search:  
man Server   22533 pages
apropos Keyword Search (all sections)
Output format
Cygwin logo
[printable version]

ustr(3)			      Ustr String Library		       ustr(3)

NAME
       ustr - ustr string library functions

SYNOPSIS
  #include "ustr.h"

  struct Ustr *USTR(void *);
  struct Ustrp *USTRP(void *);
  struct Ustr *USTR1(symbol, const char[]);
  struct Ustr *USTR2(symbol, symbol, const char[]);
  struct Ustr *USTR4(symbol, symbol, symbol, symbol, const char[]);
  struct Ustr *USTR1_CHK(symbol, const char[]);
  struct Ustr *USTR2_CHK(symbol, symbol, const char[]);
  struct Ustr *USTR4_CHK(symbol, symbol, symbol, symbol, const char[]);
  struct Ustr *USTRP1(symbol, const char[]);
  struct Ustr *USTRP2(symbol, symbol, const char[]);
  struct Ustrp *USTRP4(symbol, symbol, symbol, symbol, const char[]);
  struct Ustr *USTRP1_CHK(symbol, const char[]);
  struct Ustr *USTRP2_CHK(symbol, symbol, const char[]);
  struct Ustrp *USTRP4_CHK(symbol, symbol, symbol, symbol, const char[]);

  size_t USTR_SIZE_FIXED(size_t);
  struct Ustr *ustr_init_fixed(void *, size_t, int, size_t);
  struct Ustr *USTR_SC_INIT_AUTO(char[], int, size_t);
  struct Ustr *USTR_SC_INIT_AUTO_OSTR(char[], int, size_t);

  int ustr_assert_valid(Ustr *);
  int ustr_assert_valid_subustr(Ustr *, size_t,	 size_t);
  int USTR_CNTL_MALLOC_CHECK_BEG(int);
  int USTR_CNTL_MALLOC_CHECK_LVL(void);
  int USTR_CNTL_MALLOC_CHECK_MEM(void *);
  int USTR_CNTL_MALLOC_CHECK_MEM_SZ(void *, size_t);
  int USTR_CNTL_MALLOC_CHECK_MEM_MINSZ(void *, size_t);
  int USTR_CNTL_MALLOC_CHECK_MEM_USTR(Ustr *);
  int USTR_CNTL_MALLOC_CHECK_MEM_USTRP(Ustrp *);
  int USTR_CNTL_MALLOC_CHECK_END(void);
  int USTR_CNTL_MALLOC_CHECK_ADD(int);
  int USTR_CNTL_MALLOC_CHECK_DEL(int);

  size_t  ustr_init_size(size_t, size_t, int, size_t);
  struct  Ustr	*ustr_init_alloc(void  *,  size_t,  size_t,  size_t, int, int,
			       size_t);
  struct Ustr *ustr_dupx_empty(size_t, size_t, int, int);
  struct Ustr *ustr_dup_empty(void);
  struct Ustr *ustr_dupx_undef(size_t, size_t, int, int, size_t);
  struct Ustr *ustr_dup_undef(size_t);
  struct Ustr *ustr_dup(const struct Ustr *);
  struct Ustr *ustr_dupx(size_t, size_t, int, int, const struct Ustr *);
  struct Ustr *ustr_sc_dup(struct Ustr **);
  struct Ustr *ustr_sc_dupx(size_t, size_t, int, int, struct Ustr **);
  struct Ustr *ustr_dup_buf(const void *, size_t);
  struct Ustr *ustr_dupx_buf(size_t, size_t, int, int, const void *, size_t);
  struct Ustr *ustr_dup_cstr(const char *);
  struct Ustr *ustr_dupx_cstr(size_t, size_t, int, int, const char *);
  struct Ustr *USTR_DUP_OSTR(const char []);
  struct Ustr *USTR_DUP_OBJ(...);
  struct Ustr *ustr_dup_subustr(const struct Ustr *, size_t, size_t);
  struct Ustr *ustr_dupx_subustr(size_t, size_t, int, int, const  struct  Ustr
				 *, size_t, size_t);
  struct Ustr *ustr_dup_rep_chr(char, size_t);
  struct Ustr *ustr_dupx_rep_chr(size_t, size_t, int, int, char, size_t);
  struct  Ustr	*ustr_sc_vjoin(const struct Ustr *, const struct Ustr *, const
			     struct Ustr *, va_list);
  struct Ustr *ustr_sc_join(const struct Ustr *, const struct  Ustr  *,	 const
			    struct Ustr *, ...);
  struct  Ustr	*ustr_sc_vjoinx(size_t, size_t, int, int, const struct Ustr *,
			      const  struct  Ustr  *,  const  struct  Ustr  *,
			      va_list);
  struct  Ustr	*ustr_sc_joinx(size_t,	size_t, int, int, const struct Ustr *,
			     const struct Ustr *, const struct Ustr *, ...);
  struct Ustr *ustr_sc_vconcat(const struct Ustr *, va_list);
  struct Ustr *ustr_sc_concat(const struct Ustr *, ...);
  struct Ustr *ustr_sc_vconcatx(size_t, size_t, int, int, const struct Ustr *,
				va_list);
  struct  Ustr *ustr_sc_concatx(size_t, size_t, int, int, const struct Ustr *,
			       ...);

  void	ustr_free(struct Ustr *);
  void	ustrp_free(struct Ustr_pool *, struct Ustrp *);
  void	ustr_sc_free(struct Ustr **);
  void	ustr_sc_free2(struct Ustr **, struct Ustr *);
  void	ustr_sc_free_shared(struct Ustr **);
  int  ustr_del(struct Ustr **, size_t);
  int  ustr_del_subustr(struct Ustr **, size_t,	 size_t);
  void	ustr_sc_del(struct Ustr **);

  int ustr_add_undef(struct Ustr **, size_t);
  int ustr_add_buf(struct Ustr **, const void *, size_t);
  int  ustr_add_cstr(struct Ustr **, const char *);
  int  USTR_ADD_OSTR(struct Ustr **, const char []);
  int  USTR_ADD_OBJ(struct Ustr **, ...);
  int  ustr_add(struct Ustr **, const struct Ustr *);
  int  ustr_add_subustr(struct Ustr **, const struct Ustr *, size_t, size_t);
  int  ustr_add_rep_chr(struct Ustr **, char, size_t);

  int  ustr_set_undef(struct Ustr **,  size_t);
  int ustr_set_empty(struct Ustr **);
  int ustr_set_buf(struct Ustr **,  const void *, size_t);
  int ustr_set_cstr(struct Ustr **, const char *);
  int USTR_SET_OSTR(struct Ustr **, const char []);
  int USTR_SET_OBJ(struct Ustr **, ...);
  int ustr_set(struct Ustr **, const struct Ustr *);
  int ustr_set_subustr(struct Ustr **, const struct Ustr *, size_t, size_t);
  int ustr_set_rep_chr(struct Ustr **, char, size_t);

  int ustr_ins_undef(struct Ustr **, size_t, size_t);
  int ustr_ins_buf(struct Ustr **, size_t, const void *, size_t);
  int  ustr_ins_cstr(struct Ustr **, size_t, const char *);
  int  USTR_INS_OSTR(struct Ustr **, size_t, const char []);
  int  USTR_INS_OBJ(struct Ustr **, size_t, ...);
  int  ustr_ins(struct Ustr **, size_t, const struct Ustr *);
  int  ustr_ins_subustr(struct Ustr **, size_t, const struct Ustr  *,  size_t,
			size_t);
  int  ustr_ins_rep_chr(struct Ustr **, size_t, char, size_t);

  int  ustr_add_vfmt_lim(struct Ustr **, size_t, const char *, va_list);
  int  ustr_add_vfmt(struct Ustr **, const char *, va_list);
  int  ustr_add_fmt_lim(struct Ustr **, size_t, const char *, ...);
  int  ustr_add_fmt(struct Ustr **, const char *, ...);
  struct Ustr *ustr_dup_vfmt_lim(size_t, const char *, va_list);
  struct Ustr *ustr_dup_vfmt(size_t, const char *, va_list);
  struct Ustr *ustr_dup_fmt_lim(size_t, const char *, ...);
  struct Ustr *ustr_dup_fmt(const char *, ...);
  struct  Ustr *ustr_dupx_fmt_lim(size_t, size_t, int, int, size_t, const char
				 *, ...);
  struct Ustr *ustr_dupx_fmt(size_t, size_t, int, int, const char *, ...);
  int  ustr_set_vfmt_lim(struct Ustr **, size_t, const char *, va_list);
  int  ustr_set_vfmt(struct Ustr **, const char *, va_list);
  int  ustr_set_fmt_lim(struct Ustr **, size_t, const char *, ...);
  int  ustr_set_fmt(struct Ustr **, const char *, ...);
  int	ustr_ins_vfmt_lim(struct  Ustr	**,  size_t,  size_t,  const  char  *,
			 va_list);
  int  ustr_ins_vfmt(struct Ustr **, size_t, const char *, va_list);
  int  ustr_ins_fmt_lim(struct Ustr **, size_t, size_t, const char *, ...);
  int  ustr_ins_fmt(struct Ustr **, size_t, const char *, ...);
  int	ustr_sub_vfmt_lim(struct  Ustr	**,  size_t,  size_t,  const  char  *,
			 va_list);
  int  ustr_sub_vfmt(struct Ustr **, size_t, const char *, va_list);
  int  ustr_sub_fmt_lim(struct Ustr **, size_t, size_t, const char *, ...);
  int  ustr_sub_fmt(struct Ustr **, size_t, const char *, ...);
  int  ustr_sc_sub_vfmt_lim(struct Ustr **, size_t, size_t, size_t, const char
			    *, va_list);
  int	 ustr_sc_sub_vfmt(struct  Ustr	**,  size_t,  size_t,  const  char  *,
			va_list);
  int  ustr_sc_sub_fmt_lim(struct Ustr **, size_t, size_t, size_t, const  char
			   *, ...);
  int  ustr_sc_sub_fmt(struct Ustr **, size_t, size_t, const char *, ...);

  size_t  ustr_len(const struct Ustr *);
  const char *ustr_cstr(const struct Ustr *);
  char *ustr_wstr(struct Ustr *);
  int ustr_alloc(const struct Ustr *);
  int ustr_exact(const struct Ustr *);
  int  ustr_sized(const struct Ustr *);
  int ustr_ro(const struct Ustr *);
  int  ustr_fixed(const struct Ustr *);
  int  ustr_enomem(const struct Ustr *);
  int  ustr_shared(const struct Ustr *);
  int  ustr_limited(const struct Ustr *);
  int  ustr_owner(const struct Ustr *);
  size_t  ustr_size(const struct Ustr *);
  size_t  ustr_size_alloc(const struct Ustr *);
  size_t  ustr_size_overhead(const struct Ustr *);
  void	 ustr_conf(const  struct  Ustr *, size_t *, size_t *, int *, size_t *,
		  size_t *);

  int  ustr_setf_enomem_err(struct Ustr *);
  int  ustr_setf_enomem_clr(struct Ustr *);
  int  ustr_setf_share(struct Ustr *);
  int  ustr_setf_owner(struct Ustr *);

  int  ustr_cmp_buf(const struct Ustr *, const void *, size_t);
  int  ustr_cmp(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_subustr(const struct Ustr *,  const  struct  Ustr  *,  size_t,
			size_t);
  int  ustr_cmp_cstr(const struct Ustr *, const char *);
  int  ustr_cmp_fast_buf(const struct Ustr *, const void *, size_t);
  int  ustr_cmp_fast(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_fast_subustr(const struct Ustr *, const struct Ustr *, size_t,
			     size_t);
  int  ustr_cmp_fast_cstr(const struct Ustr *, const char *);
  int  ustr_cmp_case_buf(const struct Ustr *, const void *, size_t);
  int  ustr_cmp_case(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_case_subustr(const struct Ustr *, const struct Ustr *, size_t,
			     size_t);
  int  ustr_cmp_case_cstr(const struct Ustr *, const char *);
  int  ustr_cmp_eq(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_buf_eq(const struct Ustr *, const void *, size_t);
  int	ustr_cmp_subustr_eq(const  struct Ustr *, const struct Ustr *, size_t,
			   size_t);
  int  ustr_cmp_cstr_eq(const struct Ustr *, const char *);
  int  ustr_cmp_case_eq(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_case_buf_eq(const struct Ustr *, const void *, size_t);
  int  ustr_cmp_case_subustr_eq(const struct Ustr  *,  const  struct  Ustr  *,
				size_t, size_t);
  int  ustr_cmp_case_cstr_eq(const struct Ustr *, const char *);
  int  ustr_cmp_prefix_eq(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_prefix_buf_eq(const struct Ustr *, const void *, size_t);
  int  ustr_cmp_prefix_cstr_eq(const struct Ustr *, const char *);
  int	ustr_cmp_prefix_subustr_eq(const  struct  Ustr *, const struct Ustr *,
				  size_t, size_t);
  int  ustr_cmp_case_prefix_eq(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_case_prefix_buf_eq(const struct Ustr *, const void *, size_t);
  int  ustr_cmp_case_prefix_cstr_eq(const struct Ustr *, const char *);
  int  ustr_cmp_case_prefix_subustr_eq(const struct Ustr *, const struct  Ustr
				       *, size_t, size_t);
  int  ustr_cmp_suffix_eq(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_suffix_buf_eq(const struct Ustr *, const void *, size_t);
  int  ustr_cmp_suffix_cstr_eq(const struct Ustr *, const char *);
  int	ustr_cmp_suffix_subustr_eq(const  struct  Ustr *, const struct Ustr *,
				  size_t, size_t);
  int  ustr_cmp_case_suffix_eq(const struct Ustr *, const struct Ustr *);
  int  ustr_cmp_case_suffix_buf_eq(const struct Ustr *, const void *, size_t);
  int  ustr_cmp_case_suffix_cstr_eq(const struct Ustr *, const char *);
  int  ustr_cmp_case_suffix_subustr_eq(const struct Ustr *, const struct  Ustr
				       *, size_t, size_t);

  size_t  ustr_srch_chr_fwd(const struct Ustr *, size_t, char);
  size_t  ustr_srch_chr_rev(const struct Ustr *, size_t, char);
  size_t   ustr_srch_buf_fwd(const  struct  Ustr  *,  size_t,  const  void  *,
			    size_t);
  size_t   ustr_srch_buf_rev(const  struct  Ustr  *,  size_t,  const  void  *,
			    size_t);
  size_t  ustr_srch_fwd(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_srch_rev(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_srch_cstr_fwd(const struct Ustr *, size_t, const char *);
  size_t  ustr_srch_cstr_rev(const struct Ustr *, size_t, const char *);
  size_t  ustr_srch_subustr_fwd(const struct Ustr *, size_t, const struct Ustr
				*, size_t, size_t);
  size_t  ustr_srch_subustr_rev(const struct Ustr  *,	size_t,	 const	struct
				Ustr *, size_t, size_t);
  size_t  ustr_srch_case_chr_fwd(const struct Ustr *, size_t, char);
  size_t  ustr_srch_case_chr_rev(const struct Ustr *, size_t, char);
  size_t   ustr_srch_case_buf_fwd(const	 struct	 Ustr *, size_t, const void *,
				 size_t);
  size_t  ustr_srch_case_buf_rev(const struct Ustr *, size_t,  const  void  *,
				 size_t);
  size_t   ustr_srch_case_fwd(const  struct  Ustr *, size_t, const struct Ustr
			     *);
  size_t  ustr_srch_case_rev(const struct Ustr *, size_t,  const  struct  Ustr
			     *);
  size_t  ustr_srch_case_cstr_fwd(const struct Ustr *, size_t, const char *);
  size_t  ustr_srch_case_cstr_rev(const struct Ustr *, size_t, const char *);
  size_t  ustr_srch_case_subustr_fwd(const struct Ustr *, size_t, const struct
				     Ustr *, size_t, size_t);
  size_t   ustr_srch_case_subustr_rev(const  struct  Ustr  *,	size_t,	 const
				     struct Ustr *, size_t, size_t);

  size_t  ustr_spn_chr_fwd(const struct Ustr *, size_t, char);
  size_t  ustr_spn_chr_rev(const struct Ustr *, size_t, char);
  size_t   ustr_spn_chrs_fwd(const  struct  Ustr  *,  size_t,  const  char  *,
			    size_t);
  size_t   ustr_spn_chrs_rev(const  struct  Ustr  *,  size_t,  const  char  *,
			    size_t);
  size_t  ustr_spn_fwd(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_spn_rev(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_spn_cstr_fwd(const struct Ustr *, size_t, const char *);
  size_t  ustr_spn_cstr_rev(const struct Ustr *, size_t, const char *);
  size_t  ustr_cspn_chr_fwd(const struct Ustr *, size_t, char);
  size_t  ustr_cspn_chr_rev(const struct Ustr *, size_t, char);
  size_t   ustr_cspn_chrs_fwd(const  struct  Ustr  *,  size_t,	const  char *,
			     size_t);
  size_t  ustr_cspn_chrs_rev(const  struct  Ustr  *,  size_t,  const  char  *,
			     size_t);
  size_t  ustr_cspn_fwd(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_cspn_rev(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_cspn_cstr_fwd(const struct Ustr *, size_t, const char *);
  size_t  ustr_cspn_cstr_rev(const struct Ustr *, size_t, const char *);
  size_t   ustr_utf8_spn_chrs_fwd(const	 struct	 Ustr *, size_t, const char *,
				 size_t);
  size_t  ustr_utf8_spn_chrs_rev(const struct Ustr *, size_t,  const  char  *,
				 size_t);
  size_t  ustr_utf8_spn_fwd(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_utf8_spn_rev(const struct Ustr *, size_t, const struct Ustr *);
  size_t  ustr_utf8_spn_cstr_fwd(const struct Ustr *, size_t, const char *);
  size_t  ustr_utf8_spn_cstr_rev(const struct Ustr *, size_t, const char *);
  size_t   ustr_utf8_cspn_chrs_fwd(const  struct Ustr *, size_t, const char *,
				  size_t);
  size_t  ustr_utf8_cspn_chrs_rev(const struct Ustr *, size_t, const  char  *,
				  size_t);
  size_t   ustr_utf8_cspn_fwd(const  struct  Ustr *, size_t, const struct Ustr
			     *);
  size_t  ustr_utf8_cspn_rev(const struct Ustr *, size_t,  const  struct  Ustr
			     *);
  size_t  ustr_utf8_cspn_cstr_fwd(const struct Ustr *, size_t, const char *);
  size_t  ustr_utf8_cspn_cstr_rev(const struct Ustr *, size_t, const char *);

  int  ustr_io_get(struct Ustr **, FILE *, size_t, size_t *);
  int  ustr_io_getfile(struct Ustr **, FILE *);
  int  ustr_io_getfilename(struct Ustr **, const char *);
  int  ustr_io_getdelim(struct Ustr **, FILE *, char);
  int  ustr_io_getline(struct Ustr **, FILE *);
  int ustr_io_put(struct Ustr **, FILE *, size_t);
  int  ustr_io_putline(struct Ustr **, FILE *, size_t);
  int  ustr_io_putfile(struct Ustr **, FILE *);
  int  ustr_io_putfileline(struct Ustr **, FILE *);
  int  ustr_io_putfilename(struct Ustr **, const char *, const char *);

  int  ustr_sub_undef(struct Ustr **, size_t, size_t);
  int  ustr_sub_buf(struct Ustr **, size_t, const void *, size_t);
  int  ustr_sub_cstr(struct Ustr **, size_t, const char *);
  int  USTR_SUB_OSTR(struct Ustr **, size_t, const char []);
  int  USTR_SUB_OBJ(struct Ustr **, size_t, ...);
  int  ustr_sub(struct Ustr **, size_t, const struct Ustr *);
  int	ustr_sub_subustr(struct	 Ustr **, size_t, const struct Ustr *, size_t,
			size_t);
  int  ustr_sc_sub_undef(struct Ustr **, size_t, size_t, size_t);
  int  ustr_sc_sub_buf(struct Ustr **, size_t , size_t , const void *,	size_t
		       );
  int  ustr_sc_sub_cstr(struct Ustr **, size_t, size_t, const char *);
  int  ustr_sc_sub(struct Ustr **, size_t, size_t, const struct Ustr *);
  int	ustr_sc_sub_subustr(struct  Ustr **, size_t, size_t, const struct Ustr
			   *, size_t, size_t);
  int  USTR_SC_SUB_OSTR(struct Ustr **, size_t, size_t, const char []);
  int  USTR_SC_SUB_OBJ(struct Ustr **, size_t, size_t, ...);
  size_t  ustr_replace_buf(struct Ustr **, const void *, size_t, const void *,
			   size_t, size_t);
  size_t   ustr_replace_cstr(struct  Ustr  **,	const  char  *,	 const char *,
			    size_t);
  int  ustr_replace(struct Ustr **, const struct Ustr *, const struct Ustr  *,
		    size_t);
  size_t  ustr_replace_rep_chr(struct  Ustr  **ps1, char, size_t, char, size_t
			      nlen, size_t lim);

  struct Ustr *ustr_split_buf(const struct Ustr *, size_t  *,  const  void  *,
			      size_t, struct Ustr *, unsigned int);
  struct  Ustr *ustr_split(const struct Ustr *, size_t *, const struct Ustr *,
			  struct Ustr *, unsigned int);
  struct Ustr *ustr_split_cstr(const struct Ustr *, size_t *,  const  char  *,
			       struct Ustr *, unsigned int);
  struct  Ustr	*ustr_split_spn_chrs(const struct Ustr *, size_t *, const char
				   *, size_t, struct Ustr *, unsigned int);
  struct Ustr *ustr_split_spn_cstr(const struct Ustr *, size_t *,  const  char
				   *, struct Ustr *, unsigned int);
  struct Ustr *ustr_split_spn(const struct Ustr *, size_t *, const struct Ustr
			      *, struct Ustr *, unsigned int);

  int  ustr_utf8_valid(const struct Ustr *);
  size_t  ustr_utf8_len(const struct Ustr *);
  ssize_t  ustr_utf8_width(const struct Ustr *);
  size_t  ustr_utf8_chars2bytes(const struct Ustr *,  size_t,  size_t,	size_t
				*);
  size_t   ustr_utf8_bytes2chars(const	struct	Ustr *, size_t, size_t, size_t
				*);
  int ustr_sc_utf8_reverse(struct Ustr **);

  uintmax_t  ustr_parse_uintmaxx(const struct Ustr *,  size_t,	unsigned  int,
				 uintmax_t, uintmax_t, const char *, size_t *,
				 unsigned int *);
  uintmax_t  ustr_parse_uintmax(const struct Ustr  *,  size_t,	unsigned  int,
				size_t *, unsigned int *);
  intmax_t   ustr_parse_intmax(const  struct  Ustr  *,	size_t,	 unsigned int,
			      size_t *, unsigned int *);
  unsigned long	 ustr_parse_ulongx(const struct	 Ustr  *,   size_t,   unsigned
				   int,	  unsigned long,  unsigned long, const
				   char *,  size_t *, unsigned int *);
  unsigned long	 ustr_parse_ulong(const struct Ustr *, size_t,	unsigned  int,
				  size_t *, unsigned int *);
  long	 ustr_parse_long(const	struct Ustr *, size_t, unsigned int, size_t *,
			unsigned int *);
  unsigned int	ustr_parse_uint(const struct Ustr  *,  size_t,	unsigned  int,
				size_t *, unsigned int *);
  int	ustr_parse_int(const  struct  Ustr  *, size_t, unsigned int, size_t *,
		      unsigned int *);
  unsigned short  ustr_parse_ushort(const struct Ustr *, size_t, unsigned int,
				    size_t *, unsigned int *);
  short	 ustr_parse_short(const struct Ustr *, size_t, unsigned int, size_t *,
			  unsigned int *);

  int  ustr_sc_ensure_owner(struct Ustr **);
  char *ustr_sc_wstr(struct Ustr **);
  char *ustr_sc_export_subustr(const  struct  Ustr  *,	size_t,	 size_t,  void
			       *(*)(size_t));
  char *ustr_sc_export(const struct Ustr *, void *(*)(size_t));
  char	*ustrp_sc_export_subustrp(struct  Ustr_pool  *,	 const	struct Ustr *,
				 size_t, size_t, void *(*)(size_t));
  char	*ustrp_sc_export(struct	 Ustr_pool  *,	const  struct  Ustr  *,	  void
			*(*)(size_t));
  int  ustr_sc_reverse(struct Ustr **);
  int  ustr_sc_tolower(struct Ustr **);
  int  ustr_sc_toupper(struct Ustr **);
  int  ustr_sc_ltrim_chrs(struct Ustr **, const char *, size_t);
  int  ustr_sc_ltrim(struct Ustr **, const struct Ustr *);
  int  ustr_sc_ltrim_cstr(struct Ustr **, const char *);
  int  ustr_sc_rtrim_chrs(struct Ustr **, const char *, size_t);
  int  ustr_sc_rtrim(struct Ustr **, const struct Ustr *);
  int  ustr_sc_rtrim_cstr(struct Ustr **, const char *);
  int  ustr_sc_trim_chrs(struct Ustr **, const char *, size_t);
  int  ustr_sc_trim(struct Ustr **, const struct Ustr *);
  int  ustr_sc_trim_cstr(struct Ustr **, const char *);

  int  ustr_add_b_uint16(struct Ustr **, uint_least16_t);
  int  ustr_add_b_uint32(struct Ustr **, uint_least32_t);
  int  ustr_add_b_uint64(struct Ustr **, uint_least64_t);

  uint_least16_t  ustr_parse_b_uint16(const struct Ustr *, size_t);
  uint_least32_t  ustr_parse_b_uint32(const struct Ustr *, size_t);
  uint_least64_t  ustr_parse_b_uint64(const struct Ustr *, size_t);

  int ustr_realloc(struct Ustr **, size_t);
  int  ustr_cntl_opt(int, ...);

  struct Ustr_pool *ustr_pool_ll_make(void);
  struct Ustr_pool *ustr_pool_make_subpool(struct Ustr_pool *);
  void ustr_pool_free(struct Ustr_pool *);
  void ustr_pool_clear(struct Ustr_pool *);

DESCRIPTION
	A  very simple overview is that you can use ustr_dup_cstr() to convert
       a C-style to a Ustr, and ustr_cstr() to convert it back. You  can  also
       use    USTR1()	 to    create	 constant/read-only    strings,	   and
       USTR_SC_INIT_AUTO() to create strings that use stack space upto a  cer‐
       tain amount.
	Use is somewhat unique in that, by default, it has an average overhead
       of only 55% overhead over strdup(), for strings in the range of 0 to 20
       bytes. Or, to put it another way it only uses 8 bytes to store a 2 byte
       string where strdup() uses 3.

Creating read-only Ustr functions
     Function:	USTR()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Pointer to Ustr data
       Type[1]: void *

       Explanation:

	 This macro function is normally used with the empty string "".

       Note:

	 There is basically just a simple cast behind the macro.

     Function:	USTRP()
       Returns: Ustrp string
       Type: struct Ustrp *

       Parameter[1]: Pointer to Ustrp data
       Type[1]: void *

       Explanation:

	 This macro function is normally used with the empty string "".

       Note:

	 There is basically just a simple cast behind the macro.

     Function:	USTR1()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Data for Ustr string
       Type[2]: const char[]

       Explanation:

	 This  macro  function	simplifies  the	 creation  of  read-only  Ustr
       string's. And is normally used like...

	 USTR1(\x4, "abcd")

	...it is worth pointing out that running with debugging turned on
	(USTR_CONF_USE_ASSERT)	will complain if the length isn't encoded cor‐
       rectly, as in...

	 USTR1(\x3, "abcd")

	...here ustr_assert_valid() will fail, which  is  called  before  most
       functions do
	anything   in	debugging   mode.   Note  also	that  extra  debugging
       (USTR_CONF_USE_EOS_MARK) will still catch cases like...

	 USTR1(\x3, "abc\0d")

	...at least using debugging is esp. important if you are putting UTF-8
	characters into the strings.

       Note:

	 Having ustr_ro() return true means that the Ustr cannot be written to
       without	be  reallocated	 into allocation space ... not that ustr_add()
       etc. will fail.
	 There is now USTR1_CHK() which performs a compile time check  so  you
       can never have an invalid ustr.

     Function:	USTR2()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded 2nd byte of number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Encoded 1st byte of number of the length of Ustr string
       Type[2]: symbol

       Parameter[3]: Data for Ustr string
       Type[3]: const char[]

       Explanation:

	 This  function	 works in the same way as USTR1() but takes two length
       bytes, so the read-only string can be upto 65,535 (2**16 - 1) bytes  in
       length.

     Function:	USTR4()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded 4th byte of number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Encoded 3rd byte of number of the length of Ustr string
       Type[2]: symbol

       Parameter[3]: Encoded 2nd byte of number of the length of Ustr string
       Type[3]: symbol

       Parameter[4]: Encoded 1st byte of number of the length of Ustr string
       Type[4]: symbol

       Parameter[5]: Data for Ustr string
       Type[5]: const char[]

       Explanation:

	 This  function works in the same way as USTR1() but takes four length
       bytes, so the read-only string can be upto 2**32 - 1 bytes in length.

     Function:	USTR1_CHK()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Data for Ustr string
       Type[2]: const char[]

       Explanation:

	 This function works in the same way as USTR1() but it	does  a	 check
       against the length of (Parameter[2]) using sizeof() - 1.

       Note:

	 If  the  check fails the returned Ustr * will be "", so you can check
       ustr_len() to see if you screwed something up.

     Function:	USTR2_CHK()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded 2nd byte of number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Encoded 1st byte of number of the length of Ustr string
       Type[2]: symbol

       Parameter[3]: Data for Ustr string
       Type[3]: const char[]

       Explanation:

	 This function works in the same way as USTR2() but it	does  a	 check
       against the length of (Parameter[2]) using sizeof() - 1.

       Note:

	 If the check fails the returned Ustr * will be "".

     Function:	USTR4_CHK()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded 4th byte of number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Encoded 3rd byte of number of the length of Ustr string
       Type[2]: symbol

       Parameter[3]: Encoded 2nd byte of number of the length of Ustr string
       Type[3]: symbol

       Parameter[4]: Encoded 1st byte of number of the length of Ustr string
       Type[4]: symbol

       Parameter[5]: Data for Ustr string
       Type[5]: const char[]

       Explanation:

	 This  function	 works	in the same way as USTR4() but it does a check
       against the length of (Parameter[2]) using sizeof() - 1.

       Note:

	 If the check fails the returned Ustr * will be "".

     Function:	USTRP1()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Data for Ustr string
       Type[2]: const char[]

       Explanation:

	 This function works like USTR1(), but returns a Ustrp instead.

     Function:	USTRP2()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded 2nd byte of number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Encoded 1st byte of number of the length of Ustr string
       Type[2]: symbol

       Parameter[3]: Data for Ustr string
       Type[3]: const char[]

       Explanation:

	 This function works like USTR4(), but returns a Ustrp instead.

     Function:	USTRP4()
       Returns: Ustrp string
       Type: struct Ustrp *

       Parameter[1]: Encoded 4th byte of number of the length of Ustrp string
       Type[1]: symbol

       Parameter[2]: Encoded 3rd byte of number of the length of Ustrp string
       Type[2]: symbol

       Parameter[3]: Encoded 2nd byte of number of the length of Ustrp string
       Type[3]: symbol

       Parameter[4]: Encoded 1st byte of number of the length of Ustrp string
       Type[4]: symbol

       Parameter[5]: Data for Ustr string
       Type[5]: const char[]

       Explanation:

	 This function works like USTR2(), but returns a Ustrp instead.

     Function:	USTRP1_CHK()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Data for Ustr string
       Type[2]: const char[]

       Explanation:

	 This function works like USTR1_CHK(), but returns a Ustrp instead.

     Function:	USTRP2_CHK()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Encoded 2nd byte of number of the length of Ustr string
       Type[1]: symbol

       Parameter[2]: Encoded 1st byte of number of the length of Ustr string
       Type[2]: symbol

       Parameter[3]: Data for Ustr string
       Type[3]: const char[]

       Explanation:

	 This function works like USTR4_CHK(), but returns a Ustrp instead.

     Function:	USTRP4_CHK()
       Returns: Ustrp string
       Type: struct Ustrp *

       Parameter[1]: Encoded 4th byte of number of the length of Ustrp string
       Type[1]: symbol

       Parameter[2]: Encoded 3rd byte of number of the length of Ustrp string
       Type[2]: symbol

       Parameter[3]: Encoded 2nd byte of number of the length of Ustrp string
       Type[3]: symbol

       Parameter[4]: Encoded 1st byte of number of the length of Ustrp string
       Type[4]: symbol

       Parameter[5]: Data for Ustr string
       Type[5]: const char[]

       Explanation:

	 This function works like USTR2_CHK(), but returns a Ustrp instead.

Creating fixed Ustr functions
     Function:	USTR_SIZE_FIXED()
       Returns: Size of area of memory
       Type: size_t

       Parameter[1]: Size of area of memory
       Type[1]: size_t

       Explanation:

	 This macro function is replaced by a static conversion from  the  max
       length  desired	(Parameter[1])	to  the	 storage size needed. In other
       words it works out what ustr_size_overhead() will  be,  and  adds  that
       value.

       Note:

	 This  is useful is you want a small fixed size allocation, as you can
       declare it like so:

	 char buf[USTR_SIZE_FIXED(4)];
	...to give you exactly 4 bytes as a maximum, this is  esp.  useful  if
       you want
	a limited (ustr_limited() == USTR_TRUE) Ustr string.

     Function:	ustr_init_fixed()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Pointer to area of memory to use as a Ustr string
       Type[1]: void *

       Parameter[2]: Size of area of memory
       Type[2]: size_t

       Parameter[3]: Whether the fixed size Ustr should be limited
       Type[3]: int

       Parameter[4]: The initial length of the Ustr
       Type[4]: size_t

       Explanation:

	 This creates a new Ustr string, which is "fixed". This means the Ustr
       storage is managed outside of the ustr_* API,  it  is  often  used  for
       stack allocated strings.
	 As  you  add  data  to	 the Ustr past the size allowed via. the fixed
       storge the Ustr will automatically be converted into an allocated Ustr.
       So if this is possible you should always call ustr_free(), as this does
       nothing if given a fixed size Ustr.

       Note:

	 For simplicity	 you  probably	want  to  use  USTR_SC_INIT_AUTO()  or
       USTR_SC_INIT_AUTO() when possible.

     Function:	USTR_SC_INIT_AUTO()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Area of memory to use as a Ustr string
       Type[1]: char[]

       Parameter[2]: Whether the fixed size Ustr should be limited
       Type[2]: int

       Parameter[3]: The initial length of the Ustr
       Type[3]: size_t

       Explanation:

	 This calls ustr_init_fixed() with sizeof() the area of memory (Param‐
       eter[1]) as the second argument.

       Note:

	 This does mean that the first argument must be the correct  size,  as
       far as sizeof() is concerned, as in...

	char buf_sz[1024];
	Ustr *s1 = USTR_SC_INIT_AUTO(buf_sz, USTR_FALSE, 0);

	...so  passing	pointers  to  memory  from malloc() will probably just
       return NULL.

     Function:	USTR_SC_INIT_AUTO_OSTR()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Area of memory to use as a Ustr string
       Type[1]: char[]

       Parameter[2]: Whether the fixed size Ustr should be limited
       Type[2]: int

       Parameter[3]: The initial string in the buffer, as a constant string
       Type[3]: size_t

       Explanation:

	 This calls ustr_init_fixed() with sizeof() the area of memory (Param‐
       eter[1]) as the second argument, given as an "object string".

       Note:

	 This  does  mean that the first argument must be the correct size, as
       far as sizeof() is concerned, as in...

	char buf_sz[1024] = USTR_BEG_FIXED2 "abcd";
	Ustr *s1 = USTR_SC_INIT_AUTO_OSTR(buf_sz, USTR_FALSE, "abcd");

	...so passing pointers to memory  from	malloc()  will	probably  just
       return NULL.

Debugging functions
     Function:	ustr_assert_valid()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a Ustr string
       Type[1]: Ustr *

       Explanation:

	 This function asserts a few internal consistency checks, and can help
       point out when a Ustr is invalid.

       Note:

	 This calls ustr_assert_ret() so  that	when  USTR_DEBUG  if  off  the
       checks are still performed and the result is returned.

     Function:	ustr_assert_valid_subustr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a Ustr string
       Type[1]: Ustr *

       Parameter[2]: Position in the Ustr
       Type[2]: size_t

       Parameter[3]: Length to delete from the Ustr
       Type[3]:	 size_t

       Explanation:

	 This  function	 calls	ustr_assert_valid()  and  also checks that the
       position and length are within  the  Ustr.  If  they  aren't  valid  it
       returns 0, if they are valid it returns ustr_len().

     Function:	USTR_CNTL_MALLOC_CHECK_BEG()
       Returns: Success or failure
       Type: int

       Parameter[1]: Condition for begin malloc checking or not
       Type[1]: int

       Explanation:

	 This  function	 begins	 malloc checking, meaning all ustr allocations
       will go through the malloc check routines, but it fails if  the	condi‐
       tion check (Parameter[1]) fails.

       Note:

	 Turning malloc checking on after one or more allocations has happened
       will lead to false failures unless you really known what you are doing.
	 You  can  automatically  turn	malloc	checking  on  by  giving   the
       USTR_CNTL_MC environment variable the value of "1", "yes" or "on".

     Function:	USTR_CNTL_MALLOC_CHECK_LVL()
       Returns: Level of current malloc check
       Type: int

       Parameter[1]: Nothing
       Type[1]: void

       Explanation:

	 This function returns the current "level" of the malloc check, with 0
       indicating that malloc check isn't enabled.
	 The level goes up by  one  whenever  USTR_CNTL_MALLOC_CHECK_BEG()  or
       USTR_CNTL_MALLOC_CHECK_ADD()  returns  success,	and  goes  down by one
       whenever USTR_CNTL_MALLOC_CHECK_DEL()  or  USTR_CNTL_MALLOC_CHECK_END()
       returns success.

     Function:	USTR_CNTL_MALLOC_CHECK_MEM()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer returned from malloc check
       Type[1]: void *

       Explanation:

	 This  function	 asserts that the pointer (Parameter[1]) was allocated
       from malloc checking.

       Note:

	 Unless you are doing something special, or using a builtin  Ustr_pool
       it   is	 very	likely	 you   want   to   just	  call	USTR_CNTL_MAL‐
       LOC_CHECK_MEM_USTR().

     Function:	USTR_CNTL_MALLOC_CHECK_MEM_SZ()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer returned from malloc check
       Type[1]: void *

       Parameter[2]: Length of allocated memory
       Type[2]: size_t

       Explanation:

	 This function asserts that the pointer (Parameter[1])	was  allocated
       from malloc checking, and has the specified size (Parameter[2]).

       Note:

	 Unless	 you are doing something special, or using a builtin Ustr_pool
       it  is	very   likely	you   want   to	  just	 call	USTR_CNTL_MAL‐
       LOC_CHECK_MEM_USTR().

     Function:	USTR_CNTL_MALLOC_CHECK_MEM_MINSZ()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer returned from malloc check
       Type[1]: void *

       Parameter[2]: Length of allocated memory
       Type[2]: size_t

       Explanation:

	 This  function	 asserts that the pointer (Parameter[1]) was allocated
       from malloc checking, and has at	 least	the  specified	size  (Parame‐
       ter[2]).

       Note:

	 Unless	 you are doing something special, or using a builtin Ustr_pool
       it  is	very   likely	you   want   to	  just	 call	USTR_CNTL_MAL‐
       LOC_CHECK_MEM_USTR().

     Function:	USTR_CNTL_MALLOC_CHECK_MEM_USTR()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a Ustr string
       Type[1]: Ustr *

       Explanation:

	 This function asserts that the pointer (Parameter[1]) is a Ustr allo‐
       cated from malloc checking, if the Ustr is allocated (if not it returns
       TRUE).

       Note:

	 Because  of  the layering between the Ustr code and the pool code, if
       you allocate an implicity sized Ustrp from a pool and then delete  some
       data from it (which fails) the Ustr layer will think it has an implicit
       less than the actual size so this function  will	 fail.	This  is  what
       USTR_CNTL_MALLOC_CHECK_MEM_USTRP() is for.

     Function:	USTR_CNTL_MALLOC_CHECK_MEM_USTRP()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a Ustrp string
       Type[1]: Ustrp *

       Explanation:

	 This function asserts that the pointer (Parameter[1]) is a Ustr allo‐
       cated from a builtin pool using malloc checking, if the Ustr  is	 allo‐
       cated (if not it returns TRUE).

     Function:	USTR_CNTL_MALLOC_CHECK_END()
       Returns: Success or failure
       Type: int

       Parameter[1]: Nothing
       Type[1]: void

       Explanation:

	 This  macro  will cleanup any memory used by malloc check, and assert
       that no memory is left allocated.

       Note:

	 If any memory is left allocated, each one found is output  to	stderr
       with the file/line/function of the level it was allocated from.

     Function:	USTR_CNTL_MALLOC_CHECK_ADD()
       Returns: Success or failure
       Type: int

       Parameter[1]: Condition to begin malloc checking or not
       Type[1]: int

       Explanation:

	 This function works like USTR_CNTL_MALLOC_CHECK_END() but it fails if
       the  condition  check  (Parameter[1])  fails,  or   if	USTR_CNTL_MAL‐
       LOC_CHECK_LVL() is zero.

     Function:	USTR_CNTL_MALLOC_CHECK_DEL()
       Returns: Success or failure
       Type: int

       Parameter[1]: Condition to end malloc checking or not
       Type[1]: int

       Explanation:

	 This function works like USTR_CNTL_MALLOC_CHECK_END() but it fails if
       the  condition  check  (Parameter[1])  fails,  or   if	USTR_CNTL_MAL‐
       LOC_CHECK_LVL() is one.

       Note:

	 The condition (Parameter[1]) to this macro should almost certainly be
       the return value from USTR_CNTL_MALLOC_CHECK_ADD().

Creating allocated Ustr functions
     Function:	ustr_init_size()
       Returns: Size that needs to be allocated
       Type: size_t

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: Length of data in the Ustr
       Type[4]: size_t

       Explanation:

	 This function finds out the exact size of memory needed to store  the
       specified Ustr of the given configuration.

     Function:	ustr_init_alloc()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Pointer to area of memory to use as a Ustr string
       Type[1]: void *

       Parameter[2]: Size of area of memory
       Type[2]: size_t

       Parameter[3]: Whether Ustr should store the size
       Type[3]: size_t

       Parameter[4]: Number of bytes to use for references
       Type[4]: size_t

       Parameter[5]: Whether the Ustr should use exact allocations
       Type[5]: int

       Parameter[6]: Whether the Ustr should have the "enomem" flag set
       Type[6]: int

       Parameter[7]: The initial length of the Ustr
       Type[7]: size_t

       Explanation:

	 This  creates	a  new Ustr string, you should have allocated the data
       via.  USTR_CONF_MALLOC() or bad things will happen if the  Ustr	string
       is ever free'd or reallocated.

     Function:	ustr_dupx_empty()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocation flag
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Explanation:

	 This  function creates an empty Ustr, owned by you, that is allocated
       from system memory, or it returns NULL.
	 The size is the desired allocation size for the entire Ustr,  includ‐
       ing  overhead  for metadata. This value will be rounded up, if it's too
       small, so passing 1 as the size means you want a	 stored	 size  but  to
       allocate the smallest amount of memory possible.
	 The  exact memory allocation flag says if the Ustr should round allo‐
       cations up to the nearest half power of two or should be no  more  than
       needed.
	 The ENOMEM memory error flag sets the iniital state of the user visi‐
       ble   flag   for	  memory   allocation	errors.	  Eg.	ustr_enomem(),
       ustr_setf_enomem_clr() and ustr_setf_enomem_err()

       Note:

	 The  reference byte count can only be one of the following values: 0,
       1, 2 or 4, or 8 (on environments with a 64bit size_t).
	 It can be useful to ensure that the Ustr is in system memory, so that
       you can add things to it and check for errors with ustr_enomem().
	 If  you chose to store the allocated size in the Ustr then the number
       of bytes allocated for the reference count will be a minimum of 2.

     Function:	ustr_dup_empty()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Nothing
       Type[1]: void

       Explanation:

	 This function is the same as calling ustr_dupx_empty() with the  cur‐
       rent set of default options.

     Function:	ustr_dupx_undef()
       Returns: Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Length of new undefined data
       Type[5]: size_t

       Explanation:

	 This  function	 works	like  you  called  ustr_dupx_empty()  and then
       ustr_add_undef().

     Function:	ustr_dup_undef()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Length of new undefined data
       Type[1]: size_t

       Explanation:

	 This function is the same as calling ustr_dupx_undef() with the  cur‐
       rent set of default options.

     Function:	ustr_dup()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This  function	 tries	to  increase the reference count on the passed
       Ustr string, and if that succeeds returns that as an argument. If  that
       fails  it  tries	 creates a new Ustr string that looks identical to the
       old Ustr string, apart from the reference count.

       Note:

	 Because the new Ustr string is configured identically to the old Ustr
       string  this  means the result can be very different to what you get if
       you call ustr_dup_buf() with ustr_cstr() and ustr_len() from the origi‐
       nal string where the configuration would be whatever the default is.
	 Esp.  worth  of  note is that if you ustr_dup() a Ustr string with an
       explicit size of 900 but a length of 1, and the reference count is full
       the returned Ustr string will have a size of 900 bytes and so will have
       allocated a little over that. ustr_dup_buf(), even with a sized config‐
       uration	would  only  allocate  about 12 bytes and have a size a little
       less than that.

     Function:	ustr_dupx()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Pointer to a constant Ustr string
       Type[5]: const struct Ustr *

       Explanation:

	 This function tries to add a reference if the value of the size, ref‐
       erence bytes, exact memory allocations and ENOMEM are the same as those
       in the passed Ustr string (Parameter[5]). If the	 comparison  fails  or
       the  addition  of a reference fails it works like ustr_dupx_buf() using
       ustr_cstr() and ustr_len().

     Function:	ustr_sc_dup()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This function works like calling ustr_dup(),  but  if	the  reference
       count  is  maxed	 out  then and so a new Ustr string has been allocated
       then that is stored in the passed argument (Parameter[1]) and the "old"
       Ustr string is returned.

       Note:

	 The  reason  to  use  this  is	 that if you have a "main" Ustr string
       pointer that a lot of things are getting references too then  when  the
       reference  count	 maxes	out  you'll  degrade into worst case behaviour
       which acts as though there are no reference counts. This function stops
       that problem.
	 As  an example, if you have a 1 byte reference count and have 255 * 2
       references then using ustr_dup() will create  256  Ustr	strings	 using
       this function will create 4 Ustr strings.

     Function:	ustr_sc_dupx()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: A pointer to a pointer to a Ustr string
       Type[5]: struct Ustr **

       Explanation:

	 This  function	 works	like calling ustr_dupx(), but if the reference
       count is maxed out then and so a new Ustr string is allocated then that
       is  stored  in  the  passed  argument (Parameter[1]) and the "old" Ustr
       string is returned.
	 If the configurations of the new Ustr string and the old Ustr	string
       are not the same, this function works identically to ustr_dupx().

       Note:

	 The  reason  to  use  this  is	 that if you have a "main" Ustr string
       pointer that a lot of things are getting references too then  when  the
       reference  count	 maxes	out  you'll  degrade into worst case behaviour
       which acts as though there are no reference counts. This function stops
       that problem.
	 As  an example, if you have a 1 byte reference count and have 255 * 2
       references then using ustr_dupx() will create 256  Ustr	strings	 using
       this function will create 4 Ustr strings.

     Function:	ustr_dup_buf()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Pointer to data
       Type[1]: const void *

       Parameter[2]: Length of data
       Type[2]: size_t

       Explanation:

	 This  function	 works	as if you had called ustr_dup_undef() and then
       copied the data into the new undefined space.

     Function:	ustr_dupx_buf()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Pointer to data
       Type[5]: const void *

       Parameter[6]: Length of data
       Type[6]: size_t

       Explanation:

	 This function works as if you had called ustr_dupx_undef()  and  then
       copied the data into the new undefined space.

     Function:	ustr_dup_cstr()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Pointer to constant C-style string
       Type[1]: const char *

       Explanation:

	 This  function	 works	as if you had called ustr_dup_buf() and passed
       strlen() as the length.

     Function:	ustr_dupx_cstr()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Pointer to constant C-style string
       Type[5]: const char *

       Explanation:

	 This function works as if you had called ustr_dupx_buf()  and	passed
       strlen() as the length.

     Function:	USTR_DUP_OSTR()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: A constant C-style string
       Type[1]: const char []

       Explanation:

	 This  function	 works	as if you had called ustr_dup_buf() and passed
       sizeof() - 1 as the length.

     Function:	USTR_DUP_OBJ()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: A symbol
       Type[1]: ...

       Explanation:

	 This function works as if you had called  ustr_dup_buf()  and	passed
       sizeof() as the length.

       Note:

	 In most cases you'll want to use USTR_DUP_OSTR().

     Function:	ustr_dup_subustr()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Position in the Ustr
       Type[2]: size_t

       Parameter[3]: Length to add from the Ustr
       Type[3]: size_t

       Explanation:

	 This  function	 mostly works as if you had called ustr_dup_buf() with
       the ustr_cstr() + position - 1 and length values of the Ustr string  to
       be added.

       Note:

	 If  the position is 1 and the length is the length of the Ustr string
       then it just calls ustr_dup().

     Function:	ustr_dupx_subustr()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: A pointer to a constant Ustr string
       Type[5]: const struct Ustr *

       Parameter[6]: Position in the Ustr
       Type[6]: size_t

       Parameter[7]: Length to add from the Ustr
       Type[7]: size_t

       Explanation:

	 This function mostly works as if you had called ustr_dupx_buf()  with
       the  ustr_cstr() + position - 1 and length values of the Ustr string to
       be added.

       Note:

	 If the position is 1 and the length is the length of the Ustr	string
       then it just calls ustr_dupx().

     Function:	ustr_dup_rep_chr()
       Returns: A pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Byte value of data
       Type[1]: char

       Parameter[2]: Length of bytes as data
       Type[2]: size_t

       Explanation:

	 This  function	 works	as if you had called ustr_dup_undef() and then
       copied the byte value to each position.

     Function:	ustr_dupx_rep_chr()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Byte value of data
       Type[5]: char

       Parameter[6]: Length of bytes as data
       Type[6]: size_t

       Explanation:

	 This function works as if you had called ustr_dupx_undef()  and  then
       copied the byte value to each position.

     Function:	ustr_sc_vjoin()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Separator to go between Ustr strings
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to the first constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: A pointer to the second constant Ustr string
       Type[3]: const struct Ustr *

       Parameter[4]: Variable argument list variable, from va_start()
       Type[4]: va_list

       Explanation:

	 This  function	 works	as  if you called ustr_dup() on the first Ustr
       string (Parameter[2]), and then ustr_add() on  the  separator  (Parame‐
       ter[1])	followed  by  ustr_add()  on  the  second Ustr string (Parame‐
       ter[3]). This process then repeats for all  the	Ustr  strings  in  the
       variable argument list (Parameter[4]) until a USTR_NULL is reached.

       Note:

	 This  function	 doesn't  guarantee to just take a reference to one of
       the passed Ustr strings, even if that  is  what	would  happen  if  you
       called the above manually.

     Function:	ustr_sc_join()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Separator to go between Ustr strings
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to the first constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: A pointer to the second constant Ustr string
       Type[3]: const struct Ustr *

       Parameter[4]:  Zero  or more pointers to constant Ustr strings and then
       USTR_NULL
       Type[4]: ...

       Explanation:

	 This function calls va_start() to get a variable  argument  list  and
       then calls ustr_sc_vjoin().

       Note:

	 This  function	 doesn't  guarantee to just take a reference to one of
       the passed Ustr strings, even if that  is  what	would  happen  if  you
       called the above manually.

     Function:	ustr_sc_vjoinx()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Separator to go between Ustr strings
       Type[5]: const struct Ustr *

       Parameter[6]: A pointer to the first constant Ustr string
       Type[6]: const struct Ustr *

       Parameter[7]: A pointer to the second constant Ustr string
       Type[7]: const struct Ustr *

       Parameter[8]: Variable argument list variable, from va_start()
       Type[8]: va_list

       Explanation:

	 This  function	 works	as if you called ustr_dupx() on the first Ustr
       string (Parameter[2]), and then ustr_add() on  the  separator  (Parame‐
       ter[1])	followed  by  ustr_add()  on  the  second Ustr string (Parame‐
       ter[3]). This process then repeats for all  the	Ustr  strings  in  the
       variable argument list (Parameter[4]) until a USTR_NULL is reached.

       Note:

	 This  function	 doesn't  guarantee to just take a reference to one of
       the passed Ustr strings, even if that  is  what	would  happen  if  you
       called the above manually.

     Function:	ustr_sc_joinx()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Separator to go between Ustr strings
       Type[5]: const struct Ustr *

       Parameter[6]: A pointer to the first constant Ustr string
       Type[6]: const struct Ustr *

       Parameter[7]: A pointer to the second constant Ustr string
       Type[7]: const struct Ustr *

       Parameter[8]:  Zero  or more pointers to constant Ustr strings and then
       USTR_NULL
       Type[8]: ...

       Explanation:

	 This function calls va_start() to get a variable  argument  list  and
       then calls ustr_sc_vjoinx().

     Function:	ustr_sc_vconcat()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: A pointer to the first constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Variable argument list variable, from va_start()
       Type[2]: va_list

       Explanation:

	 This  function	 works	as  if you called ustr_dup() on the first Ustr
       string (Parameter[1]), and then ustr_add() on the  second  Ustr	string
       (Parameter[3]).	This  process then repeats for all the Ustr strings in
       the variable argument list (Parameter[4]) until a USTR_NULL is reached.

       Note:

	 This function doesn't guarantee to just take a reference  to  one  of
       the  passed  Ustr  strings,  even  if  that is what would happen if you
       called the above manually.

     Function:	ustr_sc_concat()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: A pointer to the first constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Zero or more pointers to constant Ustr strings  and  then
       USTR_NULL
       Type[2]: ...

       Explanation:

	 This  function	 calls	va_start() to get a variable argument list and
       then calls ustr_sc_vconcat().

     Function:	ustr_sc_vconcatx()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: A pointer to the first constant Ustr string
       Type[5]: const struct Ustr *

       Parameter[6]: Variable argument list variable, from va_start()
       Type[6]: va_list

       Explanation:

	 This function works as if you called ustr_dupx() on  the  first  Ustr
       string  (Parameter[1]),	and  then ustr_add() on the second Ustr string
       (Parameter[3]). This process then repeats for all the Ustr  strings  in
       the variable argument list (Parameter[4]) until a USTR_NULL is reached.

       Note:

	 This  function	 doesn't  guarantee to just take a reference to one of
       the passed Ustr strings, even if that  is  what	would  happen  if  you
       called the above manually.

     Function:	ustr_sc_concatx()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: A pointer to the first constant Ustr string
       Type[5]: const struct Ustr *

       Parameter[6]:  Zero  or more pointers to constant Ustr strings and then
       USTR_NULL
       Type[6]: ...

       Explanation:

	 This function calls va_start() to get a variable  argument  list  and
       then calls ustr_sc_vconcatx().

Deleting a Ustr, or data within a Ustr
     Function:	ustr_free()
       Returns: Nothing
       Type: void

       Parameter[1]: Pointer to a Ustr
       Type[1]: struct Ustr *

       Explanation:

	 This  function	 decrements the reference count on a Ustr, if there is
       one, and free's it if it is allocated and the reference	count  becomes
       zero.

       Note:

	 This function does nothing if passed USTR_NULL.

     Function:	ustrp_free()
       Returns: Nothing
       Type: void

       Parameter[1]: Pointer to a Ustr pool object
       Type[1]: struct Ustr_pool *

       Parameter[2]: Pointer to a Ustrp (pool allocated Ustr)
       Type[2]: struct Ustrp *

       Explanation:

	 This  function	 works like ustr_free() but calls the pool_free member
       function of the Ustr_pool (Parameter[1]) instead	 of  the  ustr	system
       free.

     Function:	ustr_sc_free()
       Returns: Nothing
       Type: void

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This  function	 calls	ustr_free() and then sets the pointer (Parame‐
       ter[1]) to USTR_NULL, which is a noop when passed to ustr_free().  This
       can be used to help prevent "double free" errors.

       Note:

	 While	the  point to the pointer must be non-NULL, this function also
       accepts a NULL ustr and does nothing. So you can pass the same  pointer
       to  this	 function  multiple  times and only the first one will do any‐
       thing.

     Function:	ustr_sc_free2()
       Returns: Nothing
       Type: void

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Pointer to a Ustr string
       Type[2]: struct Ustr *

       Explanation:

	 This function works like ustr_sc_free() but instead  of  setting  the
       pointer	(Parameter[1])	to  USTR_NULL  it  sets	 it to the Ustr string
       (Parameter[2]).

       Note:

	 While the point to the pointer must be non-NULL, this	function  also
       accepts	a NULL ustr to be free'd and does nothing. So you can pass the
       same pointer to ustr_sc_free() and then this function safely.
	 The passed value (Parameter[2]) shouldn't be USTR_NULL, and in debug‐
       ging mode the function will assert() that it isn't.

     Function:	ustr_sc_free_shared()
       Returns: Nothing
       Type: void

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This  function	 is a simple way to "free" a Ustr string that has been
       shared  (ustr_shared()  returns	USTR_TRUE),  normally  ustr_free()  is
       ignored	on  a  shared Ustr string. It just calls ustr_setf_owner() and
       then ustr_sc_free().

     Function:	ustr_del()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Length to delete from the Ustr
       Type[2]: size_t

       Explanation:

	 This function deletes data from the end of Ustr,  possibly  re-sizing
       the Ustr at the same time.

       Note:

	 The Ustr is never re-sized when the size is stored explicitly, so the
       pointer never changes.

     Function:	ustr_del_subustr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position in the Ustr
       Type[2]: size_t

       Parameter[3]: Length to delete from the Ustr
       Type[3]:	 size_t

       Explanation:

	 This function works like ustr_del() but can delete an arbitrary  sec‐
       tion of the Ustr.

     Function:	ustr_sc_del()
       Returns: Nothing
       Type: void

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This  function	 is  like  calling  ustr_del()	with ustr_len() as the
       length, however if that fails it does a ustr_free() and then  sets  the
       pointer to USTR("").

       Note:

	 While	the benifit is that you don't have to check for memory failure
       errors, if there is a memory failure and you have a non-default config‐
       uration the configuration will revert back to the default.

Adding data to a Ustr
     Function:	ustr_add_undef()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Length of new undefined data
       Type[2]: size_t

       Explanation:

	 The  Ustr  string  is	expanded (possibly reallocated) so that it can
       contain length (Parameter[2]) extra data, if the length is not zero the
       Ustr will be writable. Or it'll return USTR_FALSE (zero) on failure.

     Function:	ustr_add_buf()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Pointer to data
       Type[2]: const void *

       Parameter[3]: Length of data
       Type[3]: size_t

       Explanation:

	 This  function	 works	as if you had called ustr_add_undef() and then
       copied the data into the new undefined space.

     Function:	ustr_add_cstr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Pointer to constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works as if you had called  ustr_add_buf()  and	passed
       strlen() as the length.

     Function:	USTR_ADD_OSTR()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A constant C-style string
       Type[2]: const char []

       Explanation:

	 This  function	 works	as if you had called ustr_add_buf() and passed
       sizeof() - 1 as the length.

     Function:	USTR_ADD_OBJ()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A symbol
       Type[2]: ...

       Explanation:

	 This function works as if you had called  ustr_add_buf()  and	passed
       sizeof() as the length.

       Note:

	 In most cases you'll want to use USTR_ADD_OSTR().

     Function:	ustr_add()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This  function	 mostly works as if you had called ustr_add_buf() with
       the ustr_cstr() and ustr_len() values of the Ustr string to be added.

       Note:

	 If the Ustr string is zero length and isn't  writable	this  function
       may  just add a reference, this is fine for Ustr strings that are "con‐
       stant" because if the Ustr is read-only then the	 memory	 will  not  be
       written to.

     Function:	ustr_add_subustr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to add from the Ustr
       Type[4]: size_t

       Explanation:

	 This  function	 mostly works as if you had called ustr_add_buf() with
       the ustr_cstr() + position - 1 and length values of the Ustr string  to
       be  added.  The exception being if you add a ustr to itself, while only
       having a single reference count,	 the  simple  method  would  access  a
       free'd ustr, but this function just works.

       Note:

	 If  the position is 1 and the length is the length of the Ustr string
       then it just calls ustr_add().

     Function:	ustr_add_rep_chr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Byte value of data
       Type[2]: char

       Parameter[3]: Length of bytes as data
       Type[3]: size_t

       Explanation:

	 This function works as if you had called  ustr_add_undef()  and  then
       copied the byte value to each position.

Setting a Ustr to some data
     Function:	ustr_set_undef()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]:  size_t
       Type[2]:	 size_t

       Explanation:

	 This  function	 works	as if you had called ustr_del() for the entire
       string and the ustr_add_undef().

     Function:	ustr_set_empty()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This function works as if you had called ustr_del()  for  the	entire
       string, however the string will be allocated if this completes.

     Function:	ustr_set_buf()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Buffer containting data
       Type[2]:	 const void *

       Parameter[3]: Length of Buffer
       Type[3]: size_t

       Explanation:

	 This  function	 works	as if you had called ustr_del() for the entire
       string and the ustr_add_buf().

     Function:	ustr_set_cstr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works as if you had called ustr_del()  for  the	entire
       string and then ustr_add_cstr().

     Function:	USTR_SET_OSTR()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A constant C-style string
       Type[2]: const char []

       Explanation:

	 This  function	 works	as if you had called ustr_del() for the entire
       string and then USTR_ADD_OSTR().

     Function:	USTR_SET_OBJ()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A symbol
       Type[2]: ...

       Explanation:

	 This function works as if you had called ustr_del()  for  the	entire
       string and then USTR_ADD_OBJ().

       Note:

	 In most cases you'll want to use USTR_SET_OSTR().

     Function:	ustr_set()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This  function	 works	as if you had called ustr_del() for the entire
       string and the ustr_add().

     Function:	ustr_set_subustr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to set from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works as if you had called ustr_del()  for  the	entire
       string  and  the	 ustr_add_subustr().  The exception being if you set a
       ustr to itself, while only having a single reference count, the	simple
       method would access a free'd ustr data, but this function just works.

     Function:	ustr_set_rep_chr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Byte value of data
       Type[2]: char

       Parameter[3]: Length of bytes as data
       Type[3]: size_t

       Explanation:

	 This  function	 works	as if you had called ustr_del() for the entire
       string and the ustr_add_rep_chr().

Inserting data into a Ustr
     Function:	ustr_ins_undef()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: Length of new undefined data
       Type[3]: size_t

       Explanation:

	 The Ustr string is expanded (possibly reallocated)  so	 that  it  can
       contain length (Parameter[2]) extra data, from after the required posi‐
       tion. If the length is not zero the Ustr will  be  writable.  Or	 it'll
       return  USTR_FALSE  (zero) on failure. The data in the Ustr is moved as
       needed to put the new data at position (Parameter[2]) + 1.

     Function:	ustr_ins_buf()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: Pointer to data
       Type[3]: const void *

       Parameter[4]: Length of data
       Type[4]: size_t

       Explanation:

	 This function works as if you had called  ustr_ins_undef()  and  then
       copied the data into the new undefined space.

     Function:	ustr_ins_cstr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: Pointer to constant C-style string
       Type[3]: const char *

       Explanation:

	 This  function	 works	as if you had called ustr_ins_buf() and passed
       strlen() as the length.

     Function:	USTR_INS_OSTR()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: A constant C-style string
       Type[3]: const char []

       Explanation:

	 This function works as if you had called  ustr_ins_buf()  and	passed
       sizeof() - 1 as the length.

     Function:	USTR_INS_OBJ()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: A symbol
       Type[3]: ...

       Explanation:

	 This  function	 works	as if you had called ustr_ins_buf() and passed
       sizeof() as the length.

       Note:

	 In most cases you'll want to use USTR_INS_OSTR().

     Function:	ustr_ins()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string
       Type[3]: const struct Ustr *

       Explanation:

	 This function works as if you	had  called  ustr_ins_buf()  with  the
       ustr_cstr() and ustr_len() values of the Ustr string to be added.

     Function:	ustr_ins_subustr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to ins from the Ustr
       Type[4]: size_t

       Explanation:

	 This  function	 mostly	 as  if you had called ustr_ins_buf() with the
       ustr_cstr() + position - 1 and length values of the Ustr string	to  be
       insed.  The  exception being if you insert a ustr to itself, while only
       having a single reference count,	 the  simple  method  would  access  a
       free'd ustr data, but this function just works.

     Function:	ustr_ins_rep_chr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[2]: Byte value of data
       Type[2]: char

       Parameter[3]: Length of bytes as data
       Type[3]: size_t

       Explanation:

	 This  function	 works	as if you had called ustr_ins_undef() and then
       copied the byte value to each position.

Adding, duplicating and setting formatted data to a Ustr
     Function:	ustr_add_vfmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Limit of data to add
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Variable argument list variable, from va_start()
       Type[4]: va_list

       Explanation:

	 This function works like calling  the	system	vsnprintf()  with  the
       limit  (Parameter[2])  as  the  limit  to  vsnprintf() and then calling
       ustr_add_buf().

     Function:	ustr_add_vfmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Parameter[3]: Variable argument list variable, from va_start()
       Type[3]: va_list

       Explanation:

	 This function works like calling  the	system	vsnprintf()  and  then
       calling ustr_add_buf().

     Function:	ustr_add_fmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Limit of data to add
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Options depending on value of Parameter[3]
       Type[4]: ...

       Explanation:

	 This function works like calling the system snprintf() with the limit
       (Parameter[2])  as  the	limit	to   snprintf()	  and	then   calling
       ustr_add_buf().

     Function:	ustr_add_fmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Parameter[3]: Options depending on value of Parameter[2]
       Type[3]: ...

       Explanation:

	 This function works like calling the system snprintf() and then call‐
       ing ustr_add_buf().

     Function:	ustr_dup_vfmt_lim()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Limit of data to dup
       Type[1]: size_t

       Parameter[2]: Pointer to a constant Ustr string
       Type[2]: const char *

       Parameter[3]: Variable argument list variable, from va_start()
       Type[3]: va_list

       Explanation:

	 This function works like calling  the	system	vsnprintf()  with  the
       limit  (Parameter[2])  as  the  limit  to  vsnprintf() and then calling
       ustr_dup_buf().

     Function:	ustr_dup_vfmt()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Limit of data to dup
       Type[1]: size_t

       Parameter[2]: Pointer to a constant Ustr string
       Type[2]: const char *

       Parameter[3]: Variable argument list variable, from va_start()
       Type[3]: va_list

       Explanation:

	 This function works like calling  the	system	vsnprintf()  and  then
       calling ustr_dup_buf().

     Function:	ustr_dup_fmt_lim()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Limit of data to dup
       Type[1]: size_t

       Parameter[2]: Pointer to a constant Ustr string
       Type[2]: const char *

       Parameter[3]: Options depending on value of Parameter[2]
       Type[3]: ...

       Explanation:

	 This function works like calling the system snprintf() with the limit
       (Parameter[2])  as  the	limit	to   snprintf()	  and	then   calling
       ustr_dup_buf().

     Function:	ustr_dup_fmt()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Pointer to a constant Ustr string
       Type[1]: const char *

       Parameter[2]: Options depending on value of Parameter[1]
       Type[2]: ...

       Explanation:

	 This function works like calling the system snprintf() and then call‐
       ing ustr_dup_buf().

     Function:	ustr_dupx_fmt_lim()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Limit of data to dup
       Type[5]: size_t

       Parameter[6]: Pointer to a constant Ustr string
       Type[6]: const char *

       Parameter[7]: Options depending on value of Parameter[6]
       Type[7]: ...

       Explanation:

	 This function works like calling the system snprintf() with the limit
       (Parameter[2])	as   the   limit   to	snprintf()  and	 then  calling
       ustr_dupx_buf().

     Function:	ustr_dupx_fmt()
       Returns: Pointer to a Ustr string
       Type: struct Ustr *

       Parameter[1]: Size of allocated storage
       Type[1]: size_t

       Parameter[2]: Number of bytes to use for reference count
       Type[2]: size_t

       Parameter[3]: Exact memory allocations
       Type[3]: int

       Parameter[4]: ENOMEM, memory error flag
       Type[4]: int

       Parameter[5]: Pointer to a constant Ustr string
       Type[5]: const char *

       Parameter[6]: Options depending on value of Parameter[5]
       Type[6]: ...

       Explanation:

	 This function works like calling the system snprintf() and then call‐
       ing ustr_dup_bufx().

     Function:	ustr_set_vfmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Limit of data to set
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Variable argument list variable, from va_start()
       Type[4]: va_list

       Explanation:

	 This function works like calling ustr_del() for all the data and then
       ustr_add_vfmt_lim().

     Function:	ustr_set_vfmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Parameter[3]: Variable argument list variable, from va_start()
       Type[3]: va_list

       Explanation:

	 This function works like calling ustr_del() for all the data and then
       ustr_add_vfmt().

     Function:	ustr_set_fmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Limit of data to set
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Options depending on value of Parameter[3]
       Type[4]: ...

       Explanation:

	 This function works like calling ustr_del() for all the data and then
       ustr_add_fmt_lim().

     Function:	ustr_set_fmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Parameter[3]: Options depending on value of Parameter[2]
       Type[3]: ...

       Explanation:

	 This function works like calling ustr_del() for all the data and then
       ustr_add_fmt().

     Function:	ustr_ins_vfmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: Limit of data to insert
       Type[3]: size_t

       Parameter[4]: A pointer to a constant C-style string
       Type[4]: const char *

       Parameter[5]: Variable argument list variable, from va_start()
       Type[5]: va_list

       Explanation:

	 This  function	 works	like  calling  the system vsnprintf() with the
       limit (Parameter[3]) as the  limit  to  vsnprintf()  and	 then  calling
       ustr_ins_buf().

     Function:	ustr_ins_vfmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Variable argument list variable, from va_start()
       Type[4]: va_list

       Explanation:

	 This  function	 works	like  calling  the system vsnprintf() and then
       calling ustr_ins_buf().

     Function:	ustr_ins_fmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: Limit of data to insert
       Type[3]: size_t

       Parameter[4]: A pointer to a constant C-style string
       Type[4]: const char *

       Parameter[5]: Options depending on value of Parameter[4]
       Type[5]: ...

       Explanation:

	 This function works like calling the system snprintf() with the limit
       (Parameter[3])	as   the   limit   to	snprintf()  and	 then  calling
       ustr_ins_buf().

     Function:	ustr_ins_fmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position after which the data should be added
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Options depending on value of Parameter[3]
       Type[4]: ...

       Explanation:

	 This function works like calling the system snprintf() and then call‐
       ing ustr_ins_buf().

     Function:	ustr_sub_vfmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Limit of data to substitute
       Type[3]: size_t

       Parameter[4]: A pointer to a constant C-style string
       Type[4]: const char *

       Parameter[5]: Variable argument list variable, from va_start()
       Type[5]: va_list

       Explanation:

	 This  function	 works	like  calling  the system vsnprintf() with the
       limit (Parameter[3]) as the  limit  to  vsnprintf()  and	 then  calling
       ustr_sub_buf().

     Function:	ustr_sub_vfmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Variable argument list variable, from va_start()
       Type[4]: va_list

       Explanation:

	 This  function	 works	like  calling  the system vsnprintf() and then
       calling ustr_sub_buf().

     Function:	ustr_sub_fmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Limit of data to substitute
       Type[3]: size_t

       Parameter[4]: A pointer to a constant C-style string
       Type[4]: const char *

       Parameter[5]: Options depending on value of Parameter[4]
       Type[5]: ...

       Explanation:

	 This function works like calling the system snprintf() with the limit
       (Parameter[3])	as   the   limit   to	snprintf()  and	 then  calling
       ustr_sub_buf().

     Function:	ustr_sub_fmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string
       Type[3]: const char *

       Parameter[4]: Options depending on value of Parameter[3]
       Type[4]: ...

       Explanation:

	 This function works like calling the system snprintf() and then call‐
       ing ustr_sub_buf().

     Function:	ustr_sc_sub_vfmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: Limit of data to substitute
       Type[4]: size_t

       Parameter[5]: A pointer to a constant C-style string
       Type[5]: const char *

       Parameter[6]: Variable argument list variable, from va_start()
       Type[6]: va_list

       Explanation:

	 This  function	 works	like  calling  the system vsnprintf() with the
       limit (Parameter[4]) as the  limit  to  vsnprintf()  and	 then  calling
       ustr_sc_sub_buf().

     Function:	ustr_sc_sub_vfmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: A pointer to a constant C-style string
       Type[4]: const char *

       Parameter[5]: Variable argument list variable, from va_start()
       Type[5]: va_list

       Explanation:

	 This  function	 works	like  calling  the system vsnprintf() and then
       calling ustr_sc_sub_buf().

     Function:	ustr_sc_sub_fmt_lim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: Limit of data to substitute
       Type[4]: size_t

       Parameter[5]: A pointer to a constant C-style string
       Type[5]: const char *

       Parameter[6]: Options depending on value of Parameter[5]
       Type[6]: ...

       Explanation:

	 This function works like calling the system snprintf() with the limit
       (Parameter[3])	as   the   limit   to	snprintf()  and	 then  calling
       ustr_sc_sub_buf().

     Function:	ustr_sc_sub_fmt()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: A pointer to a constant C-style string
       Type[4]: const char *

       Parameter[5]: Options depending on value of Parameter[5]
       Type[5]: ...

       Explanation:

	 This function works like calling the system snprintf() and then call‐
       ing ustr_sc_sub_buf().

Accessing the variables of a Ustr
     Function:	ustr_len()
       Returns: The length of the Ustr
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This  function	 returns  the length of the data within the Ustr, much
       like strlen() but without getting the value wrong in the case of	 extra
       NIL bytes.

     Function:	ustr_cstr()
       Returns: Read-only pointer to the start of data in the Ustr
       Type: const char *

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function returns a read-only pointer to the start of the data of
       the Ustr string. Due to there always being a terminating NIL byte in  a
       Ustr, this is also a valid C-style string.

     Function:	ustr_wstr()
       Returns: Writable pointer to the start of data in the Ustr, or NULL
       Type: char *

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: struct Ustr *

       Explanation:

	 This  function returns a writable pointer to the start of the data of
       the Ustr string. Due to there always being a terminating NIL byte in  a
       Ustr, this is also a valid C-style string.
	 If  the ustr is read-only (ustr_ro() == USTR_TRUE) then this function
       will return NULL.

       Note:

	 Unless the string is owned (ustr_owner() == USTR_TRUE) it  can	 be  a
       very  bad  idea to use this to change data, as then all references will
       be updated. See ustr_sc_wstr().

     Function:	ustr_alloc()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if the Ustr is currently in allocated storage.

     Function:	ustr_exact()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if the Ustr is doing exact allocations, so as  the
       Ustr  grows it will only have storage allocated exactly as required and
       not in half powers of two.

       Note:

	 This will always be USTR_FALSE for read-only Ustr strings  (ustr_ro()
       == USTR_TRUE), even though the default may be to used exact sized allo‐
       cations when  adding data to them etc.

     Function:	ustr_sized()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if the Ustr stores an explicit allocation size, if
       not the size is implied as the next highest half power of two.

     Function:	ustr_ro()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if the Ustr is current in read-only storage.
	 Read-only  storage  is	 not  writable	but  can  be  referenced  via.
       ustr_dup() an infinite amount of times.

     Function:	ustr_fixed()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if the Ustr is current in fixed size storage.
	 Fixed size storage is writable but cannot be referenced.

       Note:

	 Fixed size storage always explicitly stores the size of the storage.

     Function:	ustr_enomem()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function just returns the value of the user settable flag in the
       Ustr.  It  can  be  set	via.  ustr_setf_enomem_err()  and  cleared  by
       ustr_setf_enomem_clr().
	 This function is automatically set to on whever a  memory  allocation
       failure happens for a Ustr.

       Note:

	 If  a	Ustr is referenced multiple times, ustr_setf_enomem_err() will
       fail.
	 This always fails for Ustr's in read-only storage.

     Function:	ustr_shared()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if the Ustr is in the "shared" mode. It can be set
       via.  ustr_setf_shared()	 and cleared by ustr_setf_owner() on allocated
       Ustr's.
	 Shared mode means that a Ustr can be referenced and  unreferenced  an
       infinite number of times.

       Note:

	 This always succeeds for Ustr's in read-only storage.
	 This always fails for Ustr's in fixed size storage.

     Function:	ustr_limited()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if the Ustr is currently in fixed size storage and
       cannot move to allocated storage.

       Note:

	 This always fails for Ustr's in allocated storage.
	 This always fails for Ustr's in read-only storage.

     Function:	ustr_owner()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function says if there is only a single reference	 to  the  Ustr
       string.

       Note:

	 This always fails for Ustr's in read-only storage.
	 This always succeeds for Ustr's in fixed size storage.

     Function:	ustr_size()
       Returns: size_t
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This  function	 calculates  the  maximum amount of data that could be
       stored (Ie. the max ustr_len()) without	having	to  re-size  the  Ustr
       string.

     Function:	ustr_size_alloc()
       Returns: size_t
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function returns the size of the storage for the Ustr.

     Function:	ustr_size_overhead()
       Returns: size_t
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This  function returns the difference between the size of the storage
       and the maximum amount of data that could be stored without  having  to
       re-size the Ustr string.

     Function:	ustr_conf()
       Returns: Nothing
       Type: void

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Return size allocated number
       Type[2]: size_t *

       Parameter[3]: Return number of bytes used in the reference count
       Type[3]: size_t *

       Parameter[4]: Return exact allocations flag
       Type[4]: int *

       Parameter[5]: Return number of bytes used in the length
       Type[5]: size_t *

       Parameter[5]: Return number of references to this Ustr
       Type[5]: size_t *

       Explanation:

	 This  function	 gives the configuration of the current Ustr needed to
       duplicate it via. the ustr_dupx_*() functions. It also gives the number
       of  bytes  used	for the length and the number of references, which are
       mainly informational.

       Note:

	 This function differs from calling the ustr_exact() etc. functions in
       that  it	 returns the global options if this Ustr isn't allocated, thus
       telling you what the configuration would be if the Ustr was turned into
       an allocated Ustr by adding data etc.
	 Zero references for an allocated Ustr with a non-zero number of bytes
       for a reference count means it's in "shared" mode).

Setting the flags of a Ustr
     Function:	ustr_setf_enomem_err()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a Ustr string
       Type[1]: struct Ustr *

       Explanation:

	 This function sets the enomem flag, which can be  observed  via.  the
       ustr_enomem() function.
	 The  implication  of  setting	this  flag  is that a memory error has
       occured in a previous function call on this Ustr.

       Note:

	 This function fails if ustr_owner() fails for the Ustr.

     Function:	ustr_setf_enomem_clr()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a Ustr string
       Type[1]: struct Ustr *

       Explanation:

	 This function clears the enomem flag, which can be observed via.  the
       ustr_enomem() function.
	 The  implication  of  this  flag being set is that a memory error has
       occured in a previous function call on this Ustr, so  on	 clearing  the
       flag you should know you have brought the Ustr back to a known state.

       Note:

	 This function fails if ustr_owner() fails for the Ustr.

     Function:	ustr_setf_share()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a Ustr string
       Type[1]: struct Ustr *

       Explanation:

	 This  function	 sets  the shared mode, which can be observed via. the
       ustr_shared() function.
	 This is used on a Ustr so that it can have more references than it is
       able  to	 hold in it's reference count. After this call the Ustr can be
       referenced and unreferenced an infinite number of times.

       Note:

	 After	this   call   the   Ustr   will	  never	  be   deleted	 until
       ustr_setf_owner() is called.
	 This function fails if ustr_alloc() fails for the Ustr.

     Function:	ustr_setf_owner()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a Ustr string
       Type[1]: struct Ustr *

       Explanation:

	 This function removes the shared mode, which can be observed via. the
       ustr_shared() function.
	 This is used so that a Ustr in shared mode can be free'd.

       Note:

	 This function fails if ustr_alloc() fails for the Ustr.

Comparing data in a Ustr
     Function:	ustr_cmp_buf()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like memcmp() on the Ustr and the passed data.

     Function:	ustr_cmp()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works  like  ustr_cmp_buf()  but	 with  the  data  from
       ustr_cstr() and the length from ustr_len().

     Function:	ustr_cmp_subustr()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like ustr_cmp() but with a limit on the data  and
       length.

     Function:	ustr_cmp_cstr()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works  like  ustr_cmp_buf()  but	 with  a  length  from
       strlen().

     Function:	ustr_cmp_fast_buf()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like ustr_cmp_buf() but the order	of  comparison
       is optimized for speed, but is much less friendly to humans.

     Function:	ustr_cmp_fast()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works like ustr_cmp_fast_buf() but with the  data  from
       ustr_cstr() and the length from ustr_len().

     Function:	ustr_cmp_fast_subustr()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like ustr_cmp_fast() but with a limit on the data
       and length.

     Function:	ustr_cmp_fast_cstr()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works like ustr_cmp_fast_buf() but with a  length  from
       strlen().

     Function:	ustr_cmp_case_buf()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like ustr_cmp_buf() but the order	of  comparison
       ignores ASCII case.

     Function:	ustr_cmp_case()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works like ustr_cmp_case_buf() but with the  data  from
       ustr_cstr() and the length from ustr_len().

     Function:	ustr_cmp_case_subustr()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like ustr_cmp_case() but with a limit on the data
       and length.

     Function:	ustr_cmp_case_cstr()
       Returns: Less then zero, zero or greater than zero depending on compar‐
       ison
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works like ustr_cmp_case_buf() but with a  length  from
       strlen().

     Function:	ustr_cmp_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works like comparing ustr_cmp() against 0.

     Function:	ustr_cmp_buf_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_buf() against 0.

     Function:	ustr_cmp_subustr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_subustr() against 0.

     Function:	ustr_cmp_cstr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works like comparing ustr_cmp_cstr() against 0.

     Function:	ustr_cmp_case_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works like comparing ustr_cmp_case() against 0.

     Function:	ustr_cmp_case_buf_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_case_buf() against 0.

     Function:	ustr_cmp_case_subustr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_case_subustr() against 0.

     Function:	ustr_cmp_case_cstr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works like comparing ustr_cmp_case_cstr() against 0.

     Function:	ustr_cmp_prefix_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works like comparing ustr_cmp() against 0, but the com‐
       parison is limited to the length of the right hand side.

     Function:	ustr_cmp_prefix_buf_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_buf() against 0, but  the
       comparison  is  limited	to  the length of the right hand side (Parame‐
       ter[3]).

     Function:	ustr_cmp_prefix_cstr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This function works like comparing ustr_cmp_cstr() against 0, but the
       comparison is limited to the length of the right hand side.

     Function:	ustr_cmp_prefix_subustr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This  function works like comparing ustr_cmp_subustr() against 0, but
       the comparison is limited to the given length (Parameter[4]).

     Function:	ustr_cmp_case_prefix_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works like comparing ustr_cmp_case() against 0, but the
       comparison is limited to the length of the right hand side.

     Function:	ustr_cmp_case_prefix_buf_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_case_buf() against 0, but
       the comparison is limited to the length of the right hand side (Parame‐
       ter[3]).

     Function:	ustr_cmp_case_prefix_cstr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This  function	 works	like comparing ustr_cmp_case_cstr() against 0,
       but the comparison is limited to the length of the right hand side.

     Function:	ustr_cmp_case_prefix_subustr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_case_subustr() against 0,
       but the comparison is limited to the given length (Parameter[4]).

     Function:	ustr_cmp_suffix_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This function works like ustr_cmp_prefix_eq() but compares the end of
       the left hand side.

     Function:	ustr_cmp_suffix_buf_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like ustr_cmp_prefix_buf_eq()  but	 compares  the
       end of the left hand side.

     Function:	ustr_cmp_suffix_cstr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This  function	 works like ustr_cmp_prefix_cstr_eq() but compares the
       end of the left hand side.

     Function:	ustr_cmp_suffix_subustr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_subustr() against 0,  but
       compares the end of the left hand side.

     Function:	ustr_cmp_case_suffix_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Explanation:

	 This  function	 works like ustr_cmp_case_prefix_eq() but compares the
       end of the left hand side.

     Function:	ustr_cmp_case_suffix_buf_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to constant bytes, to compare
       Type[2]: const void *

       Parameter[3]: Length of comparison bytes
       Type[3]: size_t

       Explanation:

	 This function works like ustr_cmp_case_prefix_buf_eq()	 but  compares
       the end of the left hand side.

     Function:	ustr_cmp_case_suffix_cstr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant C-style string
       Type[2]: const char *

       Explanation:

	 This  function works like ustr_cmp_case_prefix_cstr_eq() but compares
       the end of the left hand side.

     Function:	ustr_cmp_case_suffix_subustr_eq()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to compare from the Ustr
       Type[4]: size_t

       Explanation:

	 This function works like comparing ustr_cmp_case_subustr() against 0,
       but compares the end of the left hand side.

Searching for data in a Ustr
     Function:	ustr_srch_chr_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: Byte data to search for
       Type[3]: char

       Explanation:

	 This function searches for the data (Parameter[3]) in the Ustr, skip‐
       ping an offset (Parameter[2]) number of bytes.

     Function:	ustr_srch_chr_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: Byte data to search for
       Type[3]: char

       Explanation:

	 This function works like ustr_srch_chr_fwd() but it searches from the
       end of the string to the beginning.

       Note:

	 The searching starts from the end of the string, and so the offset is
       the offset from the end. However the position of a byte is always rela‐
       tive  to	 the  beginning, so to do a loop you need to take the position
       from the length.

     Function:	ustr_srch_buf_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to data to search for
       Type[3]: const void *

       Parameter[4]: Length of the data to search for
       Type[4]: size_t

       Explanation:

	 This function searches for the data (Parameter[3]) of length (Parame‐
       ter[4]) in the Ustr, skipping an offset (Parameter[2]) number of bytes.

     Function:	ustr_srch_buf_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to data to search for
       Type[3]: const void *

       Parameter[4]: Length of the data to search for
       Type[4]: size_t

       Explanation:

	 This function works like ustr_srch_buf_fwd() but it searches from the
       end of the string to the beginning.

       Note:

	 The searching starts from the end of the string, and so the offset is
       the offset from the end. However the position of a byte is always rela‐
       tive to the beginning, so to do a loop you need to  take	 the  position
       from the length.

     Function:	ustr_srch_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string, to search for
       Type[3]: const struct Ustr *

       Explanation:

	 This  function	 works	like  ustr_srch_buf_fwd() but it gets the data
       pointer by calling ustr_cstr() and the length by calling ustr_len()  on
       the passed Ustr (Parameter[3]).

     Function:	ustr_srch_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string, to search for
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_srch_fwd() but it searches from the end
       of the string to the beginning.

       Note:

	 The searching starts from the end of the string, and so the offset is
       the offset from the end. However the position of a byte is always rela‐
       tive to the beginning, so to do a loop you need to  take	 the  position
       from the length.

     Function:	ustr_srch_cstr_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to C-style string data, to search for
       Type[3]: const char *

       Explanation:

	 This  function	 works like ustr_srch_buf_fwd() but it gets the length
       by calling strlen() on the passed data (Parameter[3]).

     Function:	ustr_srch_cstr_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to C-style string data, to search for
       Type[3]: const char *

       Explanation:

	 This function works like ustr_srch_cstr_fwd() but  it	searches  from
       the end of the string to the beginning.

       Note:

	 The searching starts from the end of the string, and so the offset is
       the offset from the end. However the position of a byte is always rela‐
       tive  to	 the  beginning, so to do a loop you need to take the position
       from the length.

     Function:	ustr_srch_subustr_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string
       Type[3]: const struct Ustr *

       Parameter[4]: Position in the Ustr
       Type[4]: size_t

       Parameter[5]: Length of data to search, from the Ustr
       Type[5]: size_t

       Explanation:

	 This function works like ustr_srch_fwd() but it  moves	 the  data  to
       start at the correct position and limits the length to the value speci‐
       fied.

     Function:	ustr_srch_subustr_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]:	 size_t

       Parameter[3]: A pointer to a constant Ustr string
       Type[3]: const struct Ustr *

       Parameter[4]: Position in the Ustr
       Type[4]: size_t

       Parameter[5]: Length of data to search, from the Ustr
       Type[5]: size_t

       Explanation:

	 This function works like ustr_srch_rev() but it  moves	 the  data  to
       start at the correct position and limits the length to the value speci‐
       fied.

       Note:

	 The searching starts from the end of the string, and so the offset is
       the offset from the end. However the position of a byte is always rela‐
       tive to the beginning, so to do a loop you need to  take	 the  position
       from the length.

     Function:	ustr_srch_case_chr_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: Byte data to search for
       Type[3]: char

       Explanation:

	 This function works like ustr_srch_chr_fwd(), but treats ASCII upper‐
       case and lowercase as equivalent.

     Function:	ustr_srch_case_chr_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: Byte data to search for
       Type[3]: char

       Explanation:

	 This function works like ustr_srch_chr_fwd(), but treats ASCII upper‐
       case and lowercase as equivalent.

     Function:	ustr_srch_case_buf_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to data to search for
       Type[3]: const void *

       Parameter[4]: Length of the data to search for
       Type[4]: size_t

       Explanation:

	 This function works like ustr_srch_buf_fwd(), but treats ASCII upper‐
       case and lowercase as equivalent.

     Function:	ustr_srch_case_buf_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to data to search for
       Type[3]: const void *

       Parameter[4]: Length of the data to search for
       Type[4]: size_t

       Explanation:

	 This function works like ustr_srch_buf_rev(), but treats ASCII upper‐
       case and lowercase as equivalent.

     Function:	ustr_srch_case_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string, to search for
       Type[3]: const struct Ustr *

       Explanation:

	 This  function works like ustr_srch_fwd(), but treats ASCII uppercase
       and lowercase as equivalent.

     Function:	ustr_srch_case_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string, to search for
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_srch_rev(), but treats ASCII  uppercase
       and lowercase as equivalent.

     Function:	ustr_srch_case_cstr_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to C-style string data, to search for
       Type[3]: const char *

       Explanation:

	 This  function	 works	like  ustr_srch_cstr_fwd(),  but  treats ASCII
       uppercase and lowercase as equivalent.

     Function:	ustr_srch_case_cstr_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to C-style string data, to search for
       Type[3]: const char *

       Explanation:

	 This function	works  like  ustr_srch_cstr_rev(),  but	 treats	 ASCII
       uppercase and lowercase as equivalent.

     Function:	ustr_srch_case_subustr_fwd()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string
       Type[3]: const struct Ustr *

       Parameter[4]: Position in the Ustr
       Type[4]: size_t

       Parameter[5]: Length of data to search, from the Ustr
       Type[5]: size_t

       Explanation:

	 This  function	 works	like ustr_srch_subustr_fwd(), but treats ASCII
       uppercase and lowercase as equivalent.

     Function:	ustr_srch_case_subustr_rev()
       Returns: Position in the Ustr, or zero if not found
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start searching at
       Type[2]:	 size_t

       Parameter[3]: A pointer to a constant Ustr string
       Type[3]: const struct Ustr *

       Parameter[4]: Position in the Ustr
       Type[4]: size_t

       Parameter[5]: Length of data to search, from the Ustr
       Type[5]: size_t

       Explanation:

	 This function works like ustr_srch_subustr_rev(),  but	 treats	 ASCII
       uppercase and lowercase as equivalent.

Span lengths of data in a Ustr
     Function:	ustr_spn_chr_fwd()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]: Byte data
       Type[3]: char

       Explanation:

	 This  function	 returns  the length of the start of the Ustr (Parame‐
       ter[1]) that only contains bytes that are equal to  the	data  (Parame‐
       ter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_spn_chr_rev()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]: Byte data
       Type[3]: char

       Explanation:

	 This  function	 returns  the  length  of the end of the Ustr (Parame‐
       ter[1]) that only contains bytes that are equal to  the	data  (Parame‐
       ter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_spn_chrs_fwd()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]: Array of byte data, for spanning
       Type[3]: const char *

       Parameter[4]: Length of byte data, for spanning
       Type[4]: size_t

       Explanation:

	 This  function	 returns  the length of the start of the Ustr (Parame‐
       ter[1]) that only contains bytes that are equal to any byte in the data
       (Parameter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_spn_chrs_rev()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]: Array of byte data
       Type[3]: const char *

       Parameter[4]: Length of byte data
       Type[4]: size_t

       Explanation:

	 This  function	 returns  the  length  of the end of the Ustr (Parame‐
       ter[1]) that only contains bytes that are equal to any byte in the data
       (Parameter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_spn_fwd()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant Ustr string, containing spanning
       bytes
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_spn_buf_fwd() but  passing  ustr_cstr()
       and ustr_len()

     Function:	ustr_spn_rev()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant Ustr string, containing spanning
       bytes
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_spn_buf_rev() but  passing  ustr_cstr()
       and ustr_len()

     Function:	ustr_spn_cstr_fwd()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant C-style string, containing span‐
       ning bytes
       Type[3]: const char *

       Explanation:

	 This function works like ustr_spn_buf_fwd() but passing strlen()  for
       the length.

     Function:	ustr_spn_cstr_rev()
       Returns: Number of bytes in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant C-style string, containing span‐
       ning bytes
       Type[3]: const char *

       Explanation:

	 This function works like ustr_spn_buf_rev() but passing strlen()  for
       the length.

     Function:	ustr_cspn_chr_fwd()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start compliment spanning from
       Type[2]: size_t

       Parameter[3]: Byte data
       Type[3]: char

       Explanation:

	 This  function	 returns  the length of the start of the Ustr (Parame‐
       ter[1]) that only contains bytes that are not equal to the data (Param‐
       eter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_cspn_chr_rev()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start compliment spanning from
       Type[2]: size_t

       Parameter[3]: Byte data
       Type[3]: char

       Explanation:

	 This  function	 returns  the  length  of the end of the Ustr (Parame‐
       ter[1]) that only contains bytes that are not equal to the data (Param‐
       eter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_cspn_chrs_fwd()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start compliment spanning from
       Type[2]: size_t

       Parameter[3]: Array of byte data
       Type[3]: const char *

       Parameter[4]: Length of byte data
       Type[4]: size_t

       Explanation:

	 This  function	 returns  the length of the start of the Ustr (Parame‐
       ter[1]) that only contains bytes that are not equal to any byte in  the
       data (Parameter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_cspn_chrs_rev()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start compliment spanning from
       Type[2]: size_t

       Parameter[3]: Array of byte data
       Type[3]: const char *

       Parameter[4]: Length of byte data
       Type[4]: size_t

       Explanation:

	 This  function	 returns  the  length  of the end of the Ustr (Parame‐
       ter[1]) that only contains bytes that are not equal to any byte in  the
       data (Parameter[3]), skipping offset (Parameter[2]) bytes.

     Function:	ustr_cspn_fwd()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start compliment spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant Ustr string, containing spanning
       bytes
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_cspn_buf_fwd() but passing  ustr_cstr()
       and ustr_len()

     Function:	ustr_cspn_rev()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start compliment spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant Ustr string, containing spanning
       bytes
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_cspn_buf_rev() but passing  ustr_cstr()
       and ustr_len()

     Function:	ustr_cspn_cstr_fwd()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start compliment spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant C-style string, containing span‐
       ning bytes
       Type[3]: const char *

       Explanation:

	 This function works like ustr_cspn_buf_fwd() but passing strlen() for
       the length.

     Function:	ustr_cspn_cstr_rev()
       Returns: Number of bytes not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, to start spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to a constant C-style string, containing span‐
       ning bytes
       Type[3]: const char *

       Explanation:

	 This function works like ustr_cspn_buf_rev() but passing strlen() for
       the length.

     Function:	ustr_utf8_spn_chrs_fwd()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start span‐
       ning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style UTF-8 string
       Type[3]: const char *

       Parameter[4]: Length of the C-style UTF-8 string
       Type[4]: size_t

       Explanation:

	 This function works like ustr_spn_chrs_fwd() but  the	return	value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_spn_chrs_fwd() but given "xy" as a
       multi-byte UTF-8 character it understands that the span over "xyxz"  is
       1 UTF-8 character and not 3 bytes.

     Function:	ustr_utf8_spn_chrs_rev()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start span‐
       ning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style UTF-8 string
       Type[3]: const char *

       Parameter[4]:
       Type[4]: size_t

       Explanation:

	 This function works like ustr_spn_chrs_rev() but  the	return	value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_spn_chrs_rev() but given "xy" as a
       multi-byte UTF-8 character it understands that the span over "xyxz"  is
       1 UTF-8 character and not 3 bytes.

     Function:	ustr_utf8_spn_fwd()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start span‐
       ning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr UTF-8 string
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_spn_fwd() but the return value, offset,
       and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_spn_fwd()  but  given  "xy"	 as  a
       multi-byte UTF-8 character it understands that the span over "xyxz"  is
       1 UTF-8 character and not 3 bytes.

     Function:	ustr_utf8_spn_rev()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start span‐
       ning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr UTF-8 string
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_spn_rev() but the return value, offset,
       and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_spn_rev()  but  given  "xy"	 as  a
       multi-byte UTF-8 character it understands that the span over "xyxz"  is
       1 UTF-8 character and not 3 bytes.

     Function:	ustr_utf8_spn_cstr_fwd()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start span‐
       ning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style UTF-8 string
       Type[3]: const char *

       Explanation:

	 This function works like ustr_spn_cstr_fwd() but  the	return	value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_spn_cstr_fwd() but given "xy" as a
       multi-byte UTF-8 character it understands that the span over "xyxz"  is
       1 UTF-8 character and not 3 bytes.

     Function:	ustr_utf8_spn_cstr_rev()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start span‐
       ning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style UTF-8 string
       Type[3]: const char *

       Explanation:

	 This function works like ustr_spn_cstr_rev() but  the	return	value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_spn_cstr_rev() but given "xy" as a
       multi-byte UTF-8 character it understands that the span over "xyxz"  is
       1 UTF-8 character and not 3 bytes.

     Function:	ustr_utf8_cspn_chrs_fwd()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]:  Offset within string, in UTF-8 characters, to start com‐
       pliment spanning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style UTF-8 string
       Type[3]: const char *

       Parameter[4]: Length of the C-style UTF-8 string
       Type[4]: size_t

       Explanation:

	 This function works like ustr_cspn_chrs_fwd() but the	return	value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than ustr_cspn_chrs_fwd() but given "xy" as a
       multi-byte UTF-8 character it understands that the compliment span over
       "xzxy" is 1 UTF-8 character and not 0 bytes.

     Function:	ustr_utf8_cspn_chrs_rev()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]:  Offset within string, in UTF-8 characters, to start com‐
       pliment spanning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style UTF-8 string
       Type[3]: const char *

       Parameter[4]: Length of the C-style UTF-8 string
       Type[4]: size_t

       Explanation:

	 This function works like ustr_cspn_chrs_rev() but the	return	value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than ustr_cspn_chrs_rev() but given "xy" as a
       multi-byte UTF-8 character it understands that the compliment span over
       "xzxy" is 1 UTF-8 character and not 0 bytes.

     Function:	ustr_utf8_cspn_fwd()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]:  Offset within string, in UTF-8 characters, to start com‐
       pliment spanning from
       Type[2]: size_t

       Parameter[3]: A pointer to a constant  Ustr  UTF-8  string,  containing
       spanning data
       Type[3]: const struct Ustr *

       Explanation:

	 This  function	 works like ustr_cspn_fwd() but the return value, off‐
       set, and length all use UTF-8 characters and not bytes.

       Note:

	 This is  much	slower	than  ustr_cspn_fwd()  but  given  "xy"	 as  a
       multi-byte UTF-8 character it understands that the compliment span over
       "xzxy" is 1 UTF-8 character and not 0 bytes.

     Function:	ustr_utf8_cspn_rev()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start  com‐
       pliment spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to constant Ustr UTF-8 string data, containing
       spanning data
       Type[3]: const struct Ustr *

       Explanation:

	 This function works like ustr_cspn_rev() but the return  value,  off‐
       set, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_cspn_rev()	but  given  "xy"  as a
       multi-byte UTF-8 character it understands that the compliment span over
       "xzxy" is 1 UTF-8 character and not 0 bytes.

     Function:	ustr_utf8_cspn_cstr_fwd()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]:  Offset within string, in UTF-8 characters, to start com‐
       pliment spanning from
       Type[2]: size_t

       Parameter[3]: A pointer to constant C-style UTF-8 string data, contain‐
       ing spanning data
       Type[3]: const char *

       Explanation:

	 This  function	 works like ustr_cspn_cstr_fwd() but the return value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This is much slower than ustr_cspn_cstr_fwd() but  given  "xy"	 as  a
       multi-byte UTF-8 character it understands that the compliment span over
       "xzxy" is 1 UTF-8 character and not 0 bytes.

     Function:	ustr_utf8_cspn_cstr_rev()
       Returns: Number of UTF-8 characters not in the span
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr UTF-8 string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string, in UTF-8 characters, to start  com‐
       pliment spanning from
       Type[2]: size_t

       Parameter[3]:  A pointer to C-style UTF-8 string data, containing span‐
       ning data
       Type[3]: const char *

       Explanation:

	 This function works like ustr_cspn_cstr_rev() but the	return	value,
       offset, and length all use UTF-8 characters and not bytes.

       Note:

	 This  is  much	 slower	 than  ustr_spn_cstr_rev() but given "xy" as a
       multi-byte UTF-8 character it understands that the compliment span over
       "xzxy" is 1 UTF-8 character and not 0 bytes.

Doing IO from or to a Ustr
     Function:	ustr_io_get()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Parameter[3]: Number of bytes to read
       Type[3]: size_t

       Parameter[4]: Returned number of bytes read
       Type[4]: size_t *

       Explanation:

	 This  function	 tries to read a minimum number of bytes from the file
       object, into the Ustr string. The exact number read is returned, unless
       (Parameter[4]) is NULL.

     Function:	ustr_io_getfile()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Explanation:

	 This function calls ustr_io_get() rpeatedly until EOF is encountered.

       Note:

	 The errno value when this function ends could either be from fopen(),
       fread(), or if both of the those succeeded from fclose().

     Function:	ustr_io_getfilename()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A C-style string of a filename
       Type[2]: const char *

       Explanation:

	 This function opens a specified file,	and  then  calls  ustr_io_get‐
       file(). Finally closing the FILE * object.

     Function:	ustr_io_getdelim()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Parameter[3]: A delimiter byte to stop reading at
       Type[3]: char

       Explanation:

	 This  function	 reads bytes from the file until it hits the delimiter
       byte.

       Note:

	 The delimiter is included, use ustr_del() to remove 1 byte  from  the
       end if you don't want it.
	 This function assumes a delimiter will happen every 80 bytes or so.

     Function:	ustr_io_getline()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Explanation:

	 This  function works like calling ustr_io_getdelim() with '\n' as the
       delimiter.

     Function:	ustr_io_put()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Parameter[3]: Number of bytes to write
       Type[3]: size_t

       Explanation:

	 This function is the opposite of ustr_io_get(), taking bytes from the
       beginning of the Ustr and writing them to the file.

       Note:

	 Deleting  bytes from the beginning of a Ustr string is the most inef‐
       ficient thing to do, so it is recommended to use ustr_io_putfile().

     Function:	ustr_io_putline()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Parameter[3]: Number of bytes to write
       Type[3]: size_t

       Explanation:

	 This function works like calling ustr_io_put(), and  then  writing  a
       '\n' to the file.

       Note:

	 This doesn't write a line from the Ustr to the file, if you want that
       call ustr_io_put() directly, using the return from  ustr_srch_chr_fwd()
       (with a '\n') as the number of bytes argument.

     Function:	ustr_io_putfile()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Explanation:

	 This function works like calling ustr_io_put() with ustr_len() as the
       number of bytes.

     Function:	ustr_io_putfileline()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a C file object
       Type[2]: FILE *

       Explanation:

	 This function works like calling ustr_io_putline() with ustr_len() as
       the number of bytes.

     Function:	ustr_io_putfilename()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A C-style string of a filename
       Type[2]: const char *

       Parameter[3]:  A	 C-style  string of a filemode (the second argument to
       fopen)
       Type[3]: const char *

       Explanation:

	 This function opens a specified file,	and  then  calls  ustr_io_put‐
       file(). Finally closing the FILE * object.

       Note:

	 The errno value when this function ends could either be from fopen(),
       fwrite(), or if both of the those succeeded from fclose().

String substitution/replacement
     Function:	ustr_sub_undef()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of undefined data
       Type[3]: size_t

       Explanation:

	 The Ustr string is expanded as	 required  (possibly  reallocated)  so
       that it can contain length (Parameter[2]) data, from the required posi‐
       tion. If the length is not zero the Ustr will  be  writable.  Or	 it'll
       return USTR_FALSE (zero) on failure.

       Note:

	 You can think of the operation as two separate tasks, one which makes
       the current data in the Ustr undefined and the second which adds	 unde‐
       fined data to the ustr to accommodate the desired length.

     Function:	ustr_sub_buf()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Buffer containing substitution string
       Type[3]: const void *

       Parameter[4]: Length of buffer
       Type[4]: size_t

       Explanation:

	 This  function	 works	as if you had called ustr_sub_undef() and then
       copied the data into the new undefined space.

     Function:	ustr_sub_cstr()
       Returns: success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: A pointer to a constant C-style string, which is the sub‐
       stitution
       Type[3]: const char *

       Explanation:

	 This  function works like ustr_sub_buf() but the length is worked out
       automatically by strlen().

     Function:	USTR_SUB_OSTR()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: A constant C-style string
       Type[3]: const char []

       Explanation:

	 This function works as if you had called  ustr_sub_buf()  and	passed
       sizeof() - 1 as the length.

     Function:	USTR_SUB_OBJ()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: A symbol
       Type[3]: ...

       Explanation:

	 This  function	 works	as if you had called ustr_sub_buf() and passed
       sizeof() as the length.

       Note:

	 In most cases you'll want to use USTR_SUB_OSTR().

     Function:	ustr_sub()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string
       Type[3]: const struct Ustr *

       Explanation:

	 This function works as if you	had  called  ustr_sub_buf()  with  the
       ustr_cstr()  and	 ustr_len() values of the Ustr string to be added. The
       exception being if you substitute a ustr into itself, while only having
       a  single reference count, the simple method could access a free'd ustr
       data, but this function just works.

     Function:	ustr_sub_subustr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: A pointer to a constant Ustr string
       Type[3]: const struct Ustr *

       Parameter[4]: Position in the Ustr
       Type[4]: size_t

       Parameter[5]: Length to substitute from the Ustr
       Type[5]: size_t

       Explanation:

	 This function mostly as if you had  called  ustr_sub_buf()  with  the
       ustr_cstr()  +  position - 1 and length values of the Ustr string to be
       insed. The exception being if you insert a ustr to itself,  while  only
       having  a  single  reference  count,  the  simple method would access a
       free'd ustr data, but this function just works.

     Function:	ustr_sc_sub_undef()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: Length of undefined data
       Type[4]: size_t

       Explanation:

	 This function works as if you had done ustr_del_subustr() followed by
       ustr_ins_undef(), however it is significantly more efficient.

     Function:	ustr_sc_sub_buf()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: Buffer containting substitute data
       Type[4]: const void *

       Parameter[5]: Length of Buffer
       Type[5]: size_t

       Explanation:

	 This  function	 will  substitute a specific number of characters in a
       Ustr with the data from a buffer, this function does the job of one  or
       more of ustr_add_buf(), ustr_sub_buf() and ustr_del().

     Function:	ustr_sc_sub_cstr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start replacement
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]:  A pointer to a constant C-style string, containing span‐
       ning bytes
       Type[4]: const char *

       Explanation:

	 This function works like ustr_sc_sub_buf() but the length  is	worked
       out automatically by strlen().

     Function:	ustr_sc_sub()
       Returns: success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: Pointer to a Ustr containing the substitute string
       Type[4]: const struct Ustr *

       Explanation:

	 This  function	 works as if you had called ustr_sc_sub_buf() with the
       ustr_cstr() and ustr_len() values of the Ustr string to be  added.  The
       exception being if you substitute a ustr into itself, while only having
       a single reference count, the simple method could access a free'd  ustr
       data, but this function just works.

     Function:	ustr_sc_sub_subustr()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: A pointer to a constant Ustr string
       Type[4]: const struct Ustr *

       Parameter[5]: Position in the Ustr
       Type[5]: size_t

       Parameter[6]: Length to substitute from the Ustr
       Type[6]: size_t

       Explanation:

	 This  function mostly as if you had called ustr_sc_sub_buf() with the
       ustr_cstr() + position - 1 and length values of the Ustr string	to  be
       insed.  The  exception being if you insert a ustr to itself, while only
       having a single reference count,	 the  simple  method  would  access  a
       free'd ustr data, but this function just works.

     Function:	USTR_SC_SUB_OSTR()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: A constant C-style string
       Type[4]: const char []

       Explanation:

	 This function works as if you had called ustr_sc_sub_buf() and passed
       sizeof() - 1 as the length.

     Function:	USTR_SC_SUB_OBJ()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Position where to start substitution
       Type[2]: size_t

       Parameter[3]: Length of substitution
       Type[3]: size_t

       Parameter[4]: A symbol
       Type[4]: ...

       Explanation:

	 This function works as if you had called ustr_sc_sub_buf() and passed
       sizeof() as the length.

       Note:

	 In most cases you'll want to use USTR_SUB_OSTR().

     Function:	ustr_replace_buf()
       Returns: Number of tokens replaced
       Type: size_t

       Parameter[1]: Pointer to a pointer to a Ustr (haystack)
       Type[1]: struct Ustr **

       Parameter[2]: Buffer containting search data
       Type[2]: const void *

       Parameter[3]: Length of search buffer
       Type[3]: size_t

       Parameter[4]: Buffer containting replacement data
       Type[4]: const void *

       Parameter[5]: Length of replacement buffer
       Type[5]: size_t

       Parameter[6]: Maximum number of matches to replace (0 for unlimited)
       Type[6]: size_t

       Explanation:

	 This  function	 scans	the  "haystack"	 (Parameter[1])	 for  "needle"
       (Parameter[2]) and  replaces  max_replacements  (Parameter[6])  matches
       with the "replacement" (Parameter[4]).

       Note:

	 If  max_replacements  (Parameter[6]) is 0, this function will replace
       ALL occurrences.

     Function:	ustr_replace_cstr()
       Returns: Number of tokens replaced
       Type: size_t

       Parameter[1]: Pointer to a pointer to a Ustr (haystack)
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant C-style string, containing search
       bytes
       Type[2]: const char *

       Parameter[3]:  A	 pointer  to  a	 constant  C-style  string, containing
       replacement bytes
       Type[3]: const char *

       Parameter[4]: Maximum number of matches to replace (0 for unlimited)
       Type[4]: size_t

       Explanation:

	 This function works like ustr_replace_buf() but gets the lengths  for
       the buffer automatically from strlen().

     Function:	ustr_replace()
       Returns: Number of tokens replaced
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr (haystack)
       Type[1]: struct Ustr **

       Parameter[2]: Ustr to search for (needle)
       Type[2]: const struct Ustr *

       Parameter[3]: Ustr to replace needle with
       Type[3]: const struct Ustr *

       Parameter[4]: Maximum number of matches to replace (0 for unlimited)
       Type[4]: size_t

       Explanation:

	 This function works like ustr_replace_buf() but gets the lengths from
       the ustr automatically.

     Function:	ustr_replace_rep_chr()
       Returns: number of replacements made
       Type: size_t

       Parameter[1]: pointer to a pointer to a Ustr to be modified
       Type[1]: struct Ustr **ps1

       Parameter[2]: character to replace
       Type[2]: char

       Parameter[3]: number of characters to replace
       Type[3]: size_t

       Parameter[4]: character to replace with
       Type[4]: char

       Parameter[5]: number of characters to replace with
       Type[5]: size_t nlen

       Parameter[6]: maximum number of replacements to make (use 0 for	unlim‐
       ited)
       Type[6]: size_t lim

       Explanation:

	 This  function	 replaces  a  repeating	 sequence  of  characters with
       another repeating sequence of characters.
	 For example...

	 Ustr *data = ustr_dup_cstr("xxxBxxCxDxxx");
	 ustr_replace_rep_chr(&data,'x',2,'y',1, 0)

	...would change data to be "yxByCxDyx".

       Note:

	 Changing the same letter the same number of  times  is	 considered  a
       No-op  since  it is a vast performance improvement this way. So passing
       in  (&data,'y',2,'y',2 ,0) will have a return value of 0 and the string
       will be unchanged.

Splitting a Ustr
     Function:	ustr_split_buf()
       Returns: pointer to a Ustr representing the next token
       Type: struct Ustr *

       Parameter[1]: Pointer to a constant Ustr to be split
       Type[1]: const struct Ustr *

       Parameter[2]: Pointer to an offset
       Type[2]: size_t *

       Parameter[3]: Buffer to use as split search pattern
       Type[3]: const void *

       Parameter[4]: Length of buffer
       Type[4]: size_t

       Parameter[5]: Pointer to a Ustr to be used as the return value
       Type[5]: struct Ustr *

       Parameter[6]: Flags with the prefix USTR_FLAG_SPLIT_
       Type[6]: unsigned int

       Explanation:

	 This  function	 works	in a manner similar to strtok(). Each time the
       function is called, the string inside of the buffer  (Parameter[3])  is
       used  as	 a  search  pattern  at	 which to split. If the pattern is not
       found, the entire string will be returned.  A  USTR_NULL	 return	 value
       indicates there are no more tokens remaining.
	 Parameter[5]  is a a pointer to a Ustr where the return value will be
       placed. Passing a USTR_NULL to this parameter will cause the string  to
       be  allocated  and  MUST	 be freed manually. If, however, you pass in a
       non-null Ustr to this parameter, each  call  to	ustr_split_buf()  will
       free  what  is  in  this	 pointer  and  place the new token there (when
       USTR_NULL is returned, nothing  needs  to  be  free'd).	 For  example,
       given...

	 Ustr *data = ...;
	 Ustr *tok = USTR_NULL;
	 const char *sep = ",";
	 size_t off = 0;
	 unsigned int flags = USTR_FLAGS_SPLIT_DEF;

	...there are two options...

	 while	((tok  =  ustr_split_buf(data,	&off,  sep,  strlen(sep), tok,
       flags)))
	 {
	   /* Do something with tok -- but next iteration  of  the  loop  will
       free
	    * and overwrite tok, so you must ustr_dup() if you want to keep it
       */
	 }
	 /* tok is now NULL again after the loop */

	...or...

	 while ((tok = ustr_split_buf(data, &off, sep, strlen(sep), USTR_NULL,
       flags)))
	 {
	   /*  Do  something  with  tok,  and it will NOT be freed in the next
       iteration of
	    * the loop */
	     ustr_free(tok); /* have to free to avoid mem leaks */
	 }

	...the former of which being the safer option.

       Note:

	 There are several flags that will alter the behaviour of  this	 func‐
       tion,   all   of	  which	  have	 a   common  with  the	default	 being
       USTR_FLAG_SPLIT_DEF.
	 If you are calling this function directly, it	is  very  likely  that
       you'd want to use ustr_split_cstr() instead.

     Function:	ustr_split()
       Returns: Pointer to a Ustr representing the next token
       Type: struct Ustr *

       Parameter[1]: Pointer to a constant Ustr to be split
       Type[1]: const struct Ustr *

       Parameter[2]: Pointer to an offset variable
       Type[2]: size_t *

       Parameter[3]:  Pointer  to  a  constant Ustr to use as the split search
       pattern
       Type[3]: const struct Ustr *

       Parameter[4]: Pointer to a Ustr where the return value will be placed
       Type[4]: struct Ustr *

       Parameter[5]: Flags
       Type[5]: unsigned int

       Explanation:

	  Works like ustr_split_buf() but takes a Ustr	as  the	 split	search
       pattern
	 instead.

     Function:	ustr_split_cstr()
       Returns: Pointer to a Ustr representing the next token
       Type: struct Ustr *

       Parameter[1]: Pointer to a constant Ustr to be split
       Type[1]: const struct Ustr *

       Parameter[2]: Pointer to an offset variable
       Type[2]: size_t *

       Parameter[3]: C string to use as split search pattern
       Type[3]: const char *

       Parameter[4]: Pointer to a Ustr where the return value will be placed
       Type[4]: struct Ustr *

       Parameter[5]: Flags
       Type[5]: unsigned int

       Explanation:

	 Works	like ustr_split_buf() but takes a C string as the split search
       pattern, and so gets the length via. strlen().

     Function:	ustr_split_spn_chrs()
       Returns: Pointer to a Ustr representing the next token
       Type: struct Ustr *

       Parameter[1]: Pointer to a Ustr to be split
       Type[1]: const struct Ustr *

       Parameter[2]: Pointer to an offset variable
       Type[2]: size_t *

       Parameter[3]: String representing a set of bytes to use as split chars
       Type[3]: const char *

       Parameter[4]: Length of the string of set of bytes
       Type[4]: size_t

       Parameter[5]: Pointer to a Ustr where the return value will be placed
       Type[5]: struct Ustr *

       Parameter[6]: flags
       Type[6]: unsigned int

       Explanation:

	 Works like ustr_split_buf() but uses the individual  ASCII  bytes  in
       the  separator  string (Parameter[3]) as search patterns. It will split
       if ANY of these individual characters are matched (much like strtok()).
       For  example:  if splitting "this, is,a test" with the separator string
       ", " the tokens returned would be {"this" "is" "a" "test"};

       Note:

	 If you are calling this function directly, it	is  very  likely  that
       you'd want to use ustr_split_spn_cstr() instead.

     Function:	ustr_split_spn_cstr()
       Returns: Pointer to a Ustr representing the next token
       Type: struct Ustr *

       Parameter[1]: Pointer to a Ustr to be split
       Type[1]: const struct Ustr *

       Parameter[2]: Pointer to an offset variable
       Type[2]: size_t *

       Parameter[3]: String representing a set of bytes to use as split chars
       Type[3]: const char *

       Parameter[4]: Pointer to a Ustr where the return value will be placed
       Type[4]: struct Ustr *

       Parameter[5]: flags
       Type[5]: unsigned int

       Explanation:

	 Works	like  ustr_split_spn_chrs()  but gets the length automatically
       via. strlen().

     Function:	ustr_split_spn()
       Returns: Pointer to a Ustr representing the next token
       Type: struct Ustr *

       Parameter[1]: Pointer to a constant Ustr to be split
       Type[1]: const struct Ustr *

       Parameter[2]: Pointer to an offset variable
       Type[2]: size_t *

       Parameter[3]: Pointer to a constant Ustr to use	as  the	 split	search
       pattern
       Type[3]: const struct Ustr *

       Parameter[4]: Pointer to a Ustr where the return value will be placed
       Type[4]: struct Ustr *

       Parameter[5]: Flags
       Type[5]: unsigned int

       Explanation:

	 Works	like ustr_split_spn_chrs() but takes a Ustr as the split chars
       instead.

Dealing with UTF-8 in a Ustr
     Function:	ustr_utf8_valid()
       Returns: A boolean flag of either USTR_TRUE or USTR_FALSE
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function tries it's best to find out if the string  is  a	 valid
       utf-8 string.

     Function:	ustr_utf8_len()
       Returns: The number of the utf-8 characters in the Ustr
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function counts the number of utf-8 characters inn the Ustr.

       Note:

	 This  function	 gives	undefined answers on strings that aren't utf-8
       valid.

     Function:	ustr_utf8_width()
       Returns: ssize_t
       Type: ssize_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Explanation:

	 This function returns the visible width of the string, assuming it is
       a  valid	 utf-8	string. This is like converting to wide characters and
       using wcwidth().

     Function:	ustr_utf8_chars2bytes()
       Returns: Length of span in bytes
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Position of a span in utf-8 characters
       Type[2]: size_t

       Parameter[3]: Length of a span in utf-8 characters
       Type[3]: size_t

       Parameter[4]: Returns the position of the span in bytes
       Type[4]: size_t *

       Explanation:

	 This function converts a span, in utf-8 characters, to the same  span
       in bytes.

     Function:	ustr_utf8_bytes2chars()
       Returns: Returns the position of a span in utf-8 characters
       Type: size_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Position of a span in bytes
       Type[2]: size_t

       Parameter[3]: Length of a span in bytes
       Type[3]: size_t

       Parameter[4]: Returns length of a span in utf-8 characters
       Type[4]: size_t *

       Explanation:

	 This  function	 converts  a span, in bytes, to the same span in utf-8
       characters.

       Note:

	 Because a byte span can start or end within a utf-8  character,  con‐
       verting	the return values back into bytes via. ustr_utf8_chars2bytes()
       may make the span be slightly bigger (position  slightly	 earlier,  and
       the length slightly longer).

     Function:	ustr_sc_utf8_reverse()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This  function	 reverses  the	utf-8  characters  in the Ustr string,
       assuming it is a valid utf-8 string, so the last one becomes the	 first
       and the second to last becomes the second etc.

Parsing ASCII integer numbers from a Ustr
     Function:	ustr_parse_uintmaxx()
       Returns: Parsed number, or zero on error
       Type: uintmax_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Absolute minimum value
       Type[4]: uintmax_t

       Parameter[5]: Absolute maximum value
       Type[5]: uintmax_t

       Parameter[6]: Thousands separator
       Type[6]: const char *

       Parameter[7]: Return length of parsed number
       Type[7]: size_t *

       Parameter[8]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[8]: unsigned int *

       Explanation:

	 This  function parses an ASCII representation of a number from a Ustr
       (Parameter[1]) starting at the offset (Parameter[2]).

       Note:

	 If stdint.h isn't available this function won't be available.

     Function:	ustr_parse_uintmax()
       Returns: Parsed number, or zero on error
       Type: uintmax_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This function works like ustr_parse_uintmaxx() with the  minimum  and
       maximum	values taken as 0 and UINTMAX_MAX, and the thousands separator
       as "_".

       Note:

	 If stdint.h isn't available this function won't be available.

     Function:	ustr_parse_intmax()
       Returns: Parsed number, or zero on error
       Type: intmax_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This function works like ustr_parse_uintmaxx() with the  minimum  and
       maximum	values	taken as -INTMAX_MIN and INTMAX_MAX, and the thousands
       separator as "_".

       Note:

	 If stdint.h isn't available this function won't be available.

     Function:	ustr_parse_ulongx()
       Returns: Parsed number, or zero on error
       Type: unsigned long

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]:	 size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]:	 unsigned int

       Parameter[4]: Absolute minimum value
       Type[4]:	 unsigned long

       Parameter[5]: Absolute maximum value
       Type[5]:	 unsigned long

       Parameter[6]: Thousands separator
       Type[6]: const char *

       Parameter[7]: Return length of parsed number
       Type[7]:	 size_t *

       Parameter[8]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[8]: unsigned int *

       Explanation:

	 This  function	 works	like  ustr_parse_uintmaxx()  but  returns   an
       unsigned long, it is always available even when stdint.h isn't.

     Function:	ustr_parse_ulong()
       Returns: Parsed number, or zero on error
       Type: unsigned long

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This  function	 works	like  ustr_parse_ulongx() with the minimum and
       maximum values taken as 0 and ULONG_MAX, and the thousands separator as
       "_".

     Function:	ustr_parse_long()
       Returns: Parsed number, or zero on error
       Type: long

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This  function	 works	like  ustr_parse_ulongx() with the minimum and
       maximum values taken as -LONG_MIN and LONG_MAX, and the thousands sepa‐
       rator as "_".

     Function:	ustr_parse_uint()
       Returns: Parsed number, or zero on error
       Type: unsigned int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This  function	 works	like  ustr_parse_ulongx() with the minimum and
       maximum values taken as 0 and UINT_MAX, and the thousands separator  as
       "_".

     Function:	ustr_parse_int()
       Returns: Parsed number, or zero on error
       Type: int

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This  function	 works	like  ustr_parse_ulongx() with the minimum and
       maximum values taken as -INT_MIN and INT_MAX, and the thousands separa‐
       tor as "_".

     Function:	ustr_parse_ushort()
       Returns: Parsed number, or zero on error
       Type: unsigned short

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This  function	 works	like  ustr_parse_ulongx() with the minimum and
       maximum values taken as 0 and USHRT_MAX, and the thousands separator as
       "_".

     Function:	ustr_parse_short()
       Returns: Parsed number, or zero on error
       Type: short

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Parameter[3]: Base (2-36) and flags, starting with USTR_FLAG_PARSE_NUM_
       Type[3]: unsigned int

       Parameter[4]: Return length of parsed number
       Type[4]: size_t *

       Parameter[5]: Return error code, starting with USTR_TYPE_PARSE_NUM_ERR_
       Type[5]: unsigned int *

       Explanation:

	 This  function	 works	like  ustr_parse_ulongx() with the minimum and
       maximum values taken as -SHRT_MIN and SHRT_MAX, and the thousands sepa‐
       rator as "_".

Misc shortcut helper functions for Ustrs
     Function:	ustr_sc_ensure_owner()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This  function	 makes	sure  that  the	 Ustr  string is owned when it
       returns (Ie. ustr_owner() returns USTR_TRUE), or it fails to allocate.

     Function:	ustr_sc_wstr()
       Returns: Writable pointer to the start of data in the Ustr, or NULL
       Type: char *

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This function works like calling ustr_sc_ensure_owner(), to make sure
       the   Ustr  string  is  writable,  and  if  that	 succeeds  it  returns
       ustr_wstr(). On failure it returns NULL.

     Function:	ustr_sc_export_subustr()
       Returns: A pointer to newly allocated block of memory
       Type: char *

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Position in the Ustr
       Type[2]: size_t

       Parameter[3]: Length to export from the Ustr
       Type[3]: size_t

       Parameter[4]: Allocation function (like malloc)
       Type[4]: void *(*)(size_t)

       Explanation:

	 This function allocates a block of memory  of	size  Length  (Parame‐
       ter[3])	+ 1  using the provided allocation function (Parameter[4]) and
       copies the data starting from Position (Parameter[2]) within the ustr.

     Function:	ustr_sc_export()
       Returns: A pointer to newly allocated block of memory
       Type: char *

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Allocation function (like malloc)
       Type[2]: void *(*)(size_t)

       Explanation:

	 This function works  like  calling  ustr_sc_export_subustr()  with  a
       position of 1 and a length of ustr_len().

     Function:	ustrp_sc_export_subustrp()
       Returns: A pointer to newly allocated block of memory
       Type: char *

       Parameter[1]: Pointer to a Ustr pool object
       Type[1]: struct Ustr_pool *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Position in the Ustr
       Type[3]: size_t

       Parameter[4]: Length to export from the Ustr
       Type[4]: size_t

       Parameter[5]: Allocation function (like malloc), or NULL
       Type[5]: void *(*)(size_t)

       Explanation:

	 This  function	 allocates  a  block of memory of size Length (Parame‐
       ter[4]) + 1  using either the  provided	allocation  function  (Parame‐
       ter[5]), or from the pool object if the allocation function is NUL, and
       copies the data starting from Position (Parameter[3]) within the ustr.

     Function:	ustrp_sc_export()
       Returns: A pointer to newly allocated block of memory
       Type: char *

       Parameter[1]: Pointer to a Ustr pool object
       Type[1]: struct Ustr_pool *

       Parameter[2]: A pointer to a constant Ustr string
       Type[2]: const struct Ustr *

       Parameter[3]: Allocation function (like malloc)
       Type[3]: void *(*)(size_t)

       Explanation:

	 This function works like calling  ustrp_sc_export_subustrp()  with  a
       position of 1 and a length of ustrp_len().

     Function:	ustr_sc_reverse()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This  function reverses all the bytes in the Ustr string, so the last
       one becomes the first and the second to last becomes the second etc.

     Function:	ustr_sc_tolower()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This function changes any ASCII upper case  bytes  into  ASCII	 lower
       case bytes.

     Function:	ustr_sc_toupper()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Explanation:

	 This  function	 changes  any  ASCII lower case bytes into ASCII upper
       case bytes.

     Function:	ustr_sc_ltrim_chrs()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Array of bytes, containing trimming data
       Type[2]: const char *

       Parameter[3]: Length of byte data
       Type[3]: size_t

       Explanation:

	 This function deletes the bytes at the beginning of the Ustr (Parame‐
       ter[1])	that  are  in the span (Parameter[2]) of the specificed length
       (parameter[2]).

     Function:	ustr_sc_ltrim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant Ustr string, containing  trimming
       bytes
       Type[2]: const struct Ustr *

       Explanation:

	 This  function	 works	as  if you had called ustr_sc_ltrim_chrs() and
       passed ustr_cstr() and ustr_len() values of the	Ustr  string  (Parame‐
       ter[2]).

     Function:	ustr_sc_ltrim_cstr()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]:  A pointer to a constant C-style string, containing trim‐
       ming bytes
       Type[2]: const char *

       Explanation:

	 This function works as if you	had  called  ustr_sc_ltrim_chrs()  and
       passed strlen() as the length.

     Function:	ustr_sc_rtrim_chrs()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Array of bytes, containing trimming data
       Type[2]: const char *

       Parameter[3]: Length of byte data
       Type[3]: size_t

       Explanation:

	 This function deletes the bytes at the end of the Ustr (Parameter[1])
       that are in the span (Parameter[2]) of the specificed  length  (parame‐
       ter[2]).

     Function:	ustr_sc_rtrim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]:  A pointer to a constant Ustr string, containing trimming
       bytes
       Type[2]: const struct Ustr *

       Explanation:

	 This function works as if you	had  called  ustr_sc_rtrim_chrs()  and
       passed  ustr_cstr()  and	 ustr_len() values of the Ustr string (Parame‐
       ter[2]).

     Function:	ustr_sc_rtrim_cstr()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant C-style string, containing	 trim‐
       ming bytes
       Type[2]: const char *

       Explanation:

	 This  function	 works	as  if you had called ustr_sc_rtrim_chrs() and
       passed strlen() as the length.

     Function:	ustr_sc_trim_chrs()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Array of bytes, containing trimming data
       Type[2]: const char *

       Parameter[3]: Length of byte data
       Type[3]: size_t

       Explanation:

	 This function deletes the bytes at the beginning or end of  the  Ustr
       (Parameter[1])  that  are  in the span (Parameter[2]) of the specificed
       length (parameter[2]).

       Note:

	 Calling  this	function  is  much   more   efficient	than   calling
       ustr_sc_rtrim_chrs()  and  then	ustr_sc_ltrim_chrs(), as both ends are
       trimmed in a single pass.

     Function:	ustr_sc_trim()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: A pointer to a constant Ustr string, containing  trimming
       bytes
       Type[2]: const struct Ustr *

       Explanation:

	 This  function	 works	as  if	you had called ustr_sc_trim_chrs() and
       passed ustr_cstr() and ustr_len() values of the	Ustr  string  (Parame‐
       ter[2]).

     Function:	ustr_sc_trim_cstr()
       Returns: Success or failure
       Type: int

       Parameter[1]: A pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]:  A pointer to a constant C-style string, containing trim‐
       ming bytes
       Type[2]: const char *

       Explanation:

	 This function works as if  you	 had  called  ustr_sc_trim_chrs()  and
       passed strlen() as the length.

Adding binary data to a Ustr
     Function:	ustr_add_b_uint16()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Binary value to add to the Ustr
       Type[2]: uint_least16_t

       Explanation:

	 This  function adds a binary representation of a value (Parameter[2])
       to the Ustr (Parameter[1]).

     Function:	ustr_add_b_uint32()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Binary value to add to the Ustr
       Type[2]: uint_least32_t

       Explanation:

	 This function adds a binary representation of a value	(Parameter[2])
       to the Ustr (Parameter[1]).

     Function:	ustr_add_b_uint64()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Binary value to add to the Ustr
       Type[2]: uint_least64_t

       Explanation:

	 This  function adds a binary representation of a value (Parameter[2])
       to the Ustr (Parameter[1]).

Parsing binary data from a Ustr
     Function:	ustr_parse_b_uint16()
       Returns: uint_least16_t
       Type: uint_least16_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Explanation:

	 This function parses a binary representation  from  a	Ustr  (Parame‐
       ter[1])	starting at the offset (Parameter[2]).

     Function:	ustr_parse_b_uint32()
       Returns: uint_least32_t
       Type: uint_least32_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Explanation:

	 This  function	 parses	 a  binary representation from a Ustr (Parame‐
       ter[1])	starting at the offset (Parameter[2]).

     Function:	ustr_parse_b_uint64()
       Returns: uint_least64_t
       Type: uint_least64_t

       Parameter[1]: A pointer to a constant Ustr string
       Type[1]: const struct Ustr *

       Parameter[2]: Offset within string to start parsing at
       Type[2]: size_t

       Explanation:

	 This function parses a binary representation  from  a	Ustr  (Parame‐
       ter[1])	starting at the offset (Parameter[2]).

Misc. functions
     Function:	ustr_realloc()
       Returns: Success or failure
       Type: int

       Parameter[1]: Pointer to a pointer to a Ustr string
       Type[1]: struct Ustr **

       Parameter[2]: Size of allocation
       Type[2]: size_t

       Explanation:

	 This  function	 is  re-sizes  the Ustr to the specified size (Parame‐
       ter[2]).
	 This is mostly used to shrink a sized Ustr that is now	 significantly
       smaller than it once was. Although this function can also grow a Ustr.

       Note:

	 To have a size that isn't implied from the length the Ustr must store
       a size value as well as a length (ustr_sized() must return USTR_TRUE).

     Function:	ustr_cntl_opt()
       Returns: Success or failure
       Type: int

       Parameter[1]: Optional value starting with USTR_CNTL_OPT_
       Type[1]: int

       Parameter[2]: Arugments to option
       Type[2]: ...

       Explanation:

	 This function views and/or changes global Ustr options, like  whether
       ustr's have an implicit or explicit size (USTR_CNTL_OPT_GET_HAS_SIZE).

Simple Ustr pool API
     Function:	ustr_pool_ll_make()
       Returns: Pointer to a Ustr pool object
       Type: struct Ustr_pool *

       Parameter[1]: Nothing
       Type[1]: void

       Explanation:

	 This  allocates  a  new  pool	using the "linked list" strategy, each
       allocation in the pool is added to a linked list ...  and  any  alloca‐
       tions  not  freed  directly are freed by the pool when it is cleared or
       freed.

     Function:	ustr_pool_make_subpool()
       Returns: Pointer to a Ustr pool object
       Type: struct Ustr_pool *

       Parameter[1]: struct Ustr_pool *
       Type[1]: struct Ustr_pool *

       Explanation:

	 This allocates a new pool as a child of the passed in	pool  (Parame‐
       ter[1]),	 The pool can be freed and cleared independantly of the parent
       pool however free and clear operations on the parent pool are automati‐
       cally applied to all child pools.

     Function:	ustr_pool_free()
       Returns: Nothing
       Type: void

       Parameter[1]: Pointer to a Ustr pool object
       Type[1]: struct Ustr_pool *

       Explanation:

	 This deallocates a pool, and all sub-pools.

       Note:

	 This also operates on all sub-pools.

     Function:	ustr_pool_clear()
       Returns: Nothing
       Type: void

       Parameter[1]: Pointer to a Ustr pool object
       Type[1]: struct Ustr_pool *

       Explanation:

	 This  allows  all the data in the pool to be reused, it may also free
       some/all of the data in the pool, from the pool API.

       Note:

	 This also operates on all sub-pools.

SEE ALSO
       ustr_const(3)

Ustr 1.0.4			  05-Mar-2008			       ustr(3)
[top]

List of man pages available for Cygwin

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net